<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2964319896839059376</id><updated>2012-01-29T08:28:42.021+05:30</updated><category term='sms notification'/><category term='libnotify'/><category term='installation'/><category term='javascript'/><category term='pastebin'/><category term='rsync'/><category term='cyberoam'/><category term='apple'/><category term='macbookpro'/><category term='C'/><category term='dcpp'/><category term='eiskaltdcpp'/><category term='perl'/><category term='MBP'/><category term='mouse PS2'/><category term='ADSL'/><category term='last.fm'/><category term='sprunge'/><category term='curl'/><category term='dbus'/><category term='process name'/><category term='webmail'/><category term='C++'/><category term='daemon'/><category term='synchronize'/><category term='pys60'/><category term='download'/><category term='trackers'/><category term='python'/><category term='dwm'/><category term='iPod'/><category term='symbian'/><category term='torrent'/><category term='mpd'/><category term='script'/><category term='Reliance'/><category term='email'/><category term='background'/><category term='vim'/><category term='web server'/><category term='urllib'/><category term='font rendering'/><category term='crontab'/><category term='tata photon'/><category term='linux'/><category term='cronjob'/><category term='artwork'/><category term='shell scripting'/><category term='wallpaper'/><category term='REST'/><category term='character encoding'/><category term='wakeup'/><category term='programming'/><category term='modem'/><category term='package manager'/><category term='multiget'/><category term='free sms'/><category term='gtk'/><category term='unix programming'/><category term='bash'/><category term='goo.gl'/><category term='fork'/><category term='mpd. delete'/><category term='operator overloading'/><category term='google dictionary'/><category term='prctl'/><category term='terminal'/><category term='mycantos'/><category term='dictionary'/><category term='archlinux'/><category term='iPod Manager'/><category term='udev'/><category term='songbird'/><category term='ubuntu'/><category term='clipboard'/><category term='assignment'/><category term='nokia mount obex'/><category term='gmail'/><category term='google apps'/><title type='text'>A LINUX Junky BLOG - by SHADYabhi (Abhijeet Rastogi)</title><subtitle type='html'>Diary of a Linux user.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>50</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8610707265862959759</id><published>2012-01-19T20:04:00.002+05:30</published><updated>2012-01-19T20:13:47.844+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='javascript'/><category scheme='http://www.blogger.com/atom/ns#' term='google apps'/><title type='text'>Email reminder for new TV Series episodes using Google Apps script</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Since a long time, I wanted to find a service that mails you to remind about the new episode to be aired. &amp;nbsp;As I couldn't find one, I sat and wrote one for myself using Google Apps script.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Why I chose Google Apps script?&lt;br /&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;I could use a RSS feed but it also contains info about the episodes I am not intereseted in. To use the RSS and filter the episodes I wanted and get them mailed to me is also a choice but for that I would need a computer on which the script will be running. So, it won't work if my desktop/laptop is switched off.&lt;/li&gt;&lt;li&gt;I don't own a VPS so I cannot run the script on that too. This script runs on google's servers.&lt;/li&gt;&lt;li&gt;I wanted to get started with javascript. (So, my code may look crappy to an experienced javascript programmer)&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;Basically, I use macros in Google Docs spreadsheet to do the stuff.&amp;nbsp;&lt;/div&gt;&lt;div&gt;Using the macros, I read the name of the series from the cells (column 1) &amp;amp; then use tvrage.com to scrap the data from. Other cells are also updated accordingly.&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Video of script in action (Sorry for thu blurry video, youtube is the culprit):-&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;object class="BLOGGER-youtube-video" classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0" data-thumbnail-src="http://i.ytimg.com/vi/4rH-R3s-4go/0.jpg" height="266" width="320"&gt;&lt;param name="movie" value="http://www.youtube.com/v/4rH-R3s-4go?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" /&gt;&lt;param name="bgcolor" value="#FFFFFF" /&gt;&lt;embed width="320" height="266"  src="http://www.youtube.com/v/4rH-R3s-4go?version=3&amp;f=user_uploads&amp;c=google-webdrive-0&amp;app=youtube_gdata" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Requirements:-&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Name of the series should be according to the link of tvrage. For ex, for Breaking Bad, it should be &lt;b&gt;Breaking_Bad.&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-C4SgPxsZa0g/TxgVclCoW5I/AAAAAAAACY4/GdstcTr2P5I/s1600/t.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/-C4SgPxsZa0g/TxgVclCoW5I/AAAAAAAACY4/GdstcTr2P5I/s1600/t.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;br /&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;A typical spreadsheet looks like this:&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/-IufJvjyp9Qw/TxgWLdjTZLI/AAAAAAAACZA/NAccU5cGZHQ/s1600/spread.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="222" src="http://1.bp.blogspot.com/-IufJvjyp9Qw/TxgWLdjTZLI/AAAAAAAACZA/NAccU5cGZHQ/s400/spread.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;Setting Up:-&amp;nbsp;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Goto this &lt;a href="https://docs.google.com/spreadsheet/ccc?key=0Aj5PTCmbPL4adDY5bDJJdTJmaU9UTzY2VUtMNWVIUVE&amp;amp;hl=en_US#gid=0" target="_blank"&gt;link&lt;/a&gt; and do &lt;b&gt;File-&amp;gt;Make a copy&lt;/b&gt;.&lt;/li&gt;&lt;li&gt;Before running the script first time, make sure that column D is empty because values from that column are used to see if the email should be sent or not.&amp;nbsp;&lt;/li&gt;&lt;li&gt;First time you run it, you will need to &lt;b&gt;authorize&lt;/b&gt; the script. It's a one time only thing.&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-BWq5Y7kJQSA/TxgbWZLRemI/AAAAAAAACZY/j9s816Nns1I/s1600/authorize.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="216" src="http://4.bp.blogspot.com/-BWq5Y7kJQSA/TxgbWZLRemI/AAAAAAAACZY/j9s816Nns1I/s400/authorize.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Goto GDocs spreadsheet menu and select &lt;b&gt;Tools-&amp;gt;Script Editor. &lt;/b&gt;Then, &lt;b&gt;Triggers-&amp;gt;Current Script Triggers.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;Add a trigger as shown in the image. It just means that run the main function every 6 hours. (main function actually checks from the site and send the email).&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-n3nwkk6g8Eg/TxgXU-EGxqI/AAAAAAAACZM/W54mZ9-z4ac/s1600/triggers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="116" src="http://4.bp.blogspot.com/-n3nwkk6g8Eg/TxgXU-EGxqI/AAAAAAAACZM/W54mZ9-z4ac/s400/triggers.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Now, goto Run-&amp;gt;main to execute the main function. As it's the first time, Column D should not anything Row 2 onwards. I have configured the script to send an email around 24 hours prior to starting of episode. You can play with the time_limit variable &amp;amp; Triggers to suit your needs.&lt;/li&gt;&lt;li&gt;After the main function is executed, Column D should now be filled with EMAIL_SENT or EMAIL_NOT_SENT. All the series for which the time remeaning is less than time_limit, an email will also be sent to your email id.&amp;nbsp;&lt;/li&gt;&lt;li&gt;If a script is run again, email will not be sent again because now the cell has EMAIL_SENT written.&lt;/li&gt;&lt;/ul&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-L66_YdMKgg4/TxgsEklOqSI/AAAAAAAACZk/JbydJYUYkFE/s1600/s.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="30" src="http://4.bp.blogspot.com/-L66_YdMKgg4/TxgsEklOqSI/AAAAAAAACZk/JbydJYUYkFE/s400/s.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;If you want to have a quick look at the script:-&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div&gt;&lt;pre class="prettyprint"&gt;var emailAddress = Session.getUser().getEmail();&lt;br /&gt;var time_limit = 24 //In hours&lt;br /&gt;var ep_no = Array() //I know it's dirty but be it.&lt;br /&gt;var time_rem = Array()&lt;br /&gt;var sheet = SpreadsheetApp.getActiveSheet();&lt;br /&gt;&lt;br /&gt;function onOpen() {&lt;br /&gt;  var ss = SpreadsheetApp.getActiveSpreadsheet();&lt;br /&gt;  var menuEntries = [ {name: "Calculate", functionName: "main"}];&lt;br /&gt;  ss.addMenu("Manual", menuEntries);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function getEpisodeList(){&lt;br /&gt;  var sheet = SpreadsheetApp.getActiveSheet();  &lt;br /&gt;  var all_episodes = new Array();&lt;br /&gt;  for (var i=2; i&amp;lt;=sheet.getLastRow(); i++) //This loop gets all the labels&lt;br /&gt;  {&lt;br /&gt;    var cell = sheet.getRange("A"+i);&lt;br /&gt;    all_episodes = all_episodes.concat(cell.getValue());&lt;br /&gt;  }&lt;br /&gt;  return all_episodes;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function main() {&lt;br /&gt;  var all_episodes = getEpisodeList();&lt;br /&gt;  sheet.getRange("B2:C"+sheet.getLastRow()).setValue("Calculating...");&lt;br /&gt;&lt;br /&gt;  SpreadsheetApp.flush();&lt;br /&gt;  for (var i=2; i&amp;lt;=all_episodes.length+1; i++){&lt;br /&gt;     time_rem = getTimeRemaining(all_episodes[i-2]);&lt;br /&gt;     sheet.getRange(i,2).setValue(time_rem);&lt;br /&gt;     sheet.getRange(i,3).setValue(ep_no);&lt;br /&gt;&lt;br /&gt;    if (isSendNoti(time_rem,i) == true){&lt;br /&gt;      if (sheet.getRange(i,4).getValue() != "EMAIL_SENT"){&lt;br /&gt;         sendEmail(all_episodes[i-2], ep_no, time_rem); &lt;br /&gt;         sheet.getRange(i,4).setValue("EMAIL_SENT");&lt;br /&gt;      }      &lt;br /&gt;    }&lt;br /&gt;    else sheet.getRange(i,4).setValue("EMAIL_NOT_SENT");&lt;br /&gt;    SpreadsheetApp.flush();&lt;br /&gt;  }&lt;br /&gt;  &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function getTimeRemaining(series_name){&lt;br /&gt;  var response = UrlFetchApp.fetch("http://www.tvrage.com/"+series_name);&lt;br /&gt;  var content = response.getContentText();&lt;br /&gt;  var pos = content.search(series_name+"/episodes");&lt;br /&gt;  var link_end_pos = pos+series_name.length+20;&lt;br /&gt;  link = content.substring(pos,link_end_pos);&lt;br /&gt;  ep_no = content.substring(link_end_pos+2,link_end_pos+6);&lt;br /&gt;  var response = UrlFetchApp.fetch("http://www.tvrage.com/"+link);&lt;br /&gt;  var content = response.getContentText();&lt;br /&gt;  var start = content.search("Voting Closed") + 67;&lt;br /&gt;  if (start == 66) return "Season recently finished";&lt;br /&gt;  var end = content.indexOf("&amp;lt;",start);&lt;br /&gt;  return content.substring(start,end);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;function isSendNoti(time_left,i){&lt;br /&gt;&lt;br /&gt;  var days = time_left.match(/^(\d+) Days/i);    &lt;br /&gt;  var hours = time_left.match(/^(\d+) Hours/i);&lt;br /&gt;  var mins = time_left.match(/(\d+) Min.$/i);&lt;br /&gt;  &lt;br /&gt;  if (days != null) {&lt;br /&gt;  //Means reset the email thing&lt;br /&gt;  sheet.getRange(i,4).setValue("EMAIL_NOT_SENT");&lt;br /&gt;  return false; //No notification if no_of_days included in time remaining&lt;br /&gt;  }&lt;br /&gt;  if ((hours == null) &amp;amp;&amp;amp; (mins == null)) return false;&lt;br /&gt;&lt;br /&gt;  if (parseInt(hours[1]) &amp;lt;= time_limit) return true; &lt;br /&gt;  else return false;&lt;br /&gt;  }&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;function sendEmail(series_name, ep_no){&lt;br /&gt;  Logger.log(series_name, ep_no);&lt;br /&gt;  MailApp.sendEmail(emailAddress, "EPISODE ALERT: " +series_name+ " : "+ep_no, "Episode to be aired in : "+time_rem);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8610707265862959759?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8610707265862959759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2012/01/email-reminder-for-new-tv-series.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8610707265862959759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8610707265862959759'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2012/01/email-reminder-for-new-tv-series.html' title='Email reminder for new TV Series episodes using Google Apps script'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-C4SgPxsZa0g/TxgVclCoW5I/AAAAAAAACY4/GdstcTr2P5I/s72-c/t.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-3164315978244102372</id><published>2011-11-06T13:37:00.000+05:30</published><updated>2011-11-07T00:04:59.981+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='google dictionary'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Google Dictionary API example in python - gets primaries and webDefinitions</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;As pointed out earlier by google, it has an official dictionary API.&lt;br /&gt;&lt;br /&gt;The response that comes from the server is json string. I wrote two scripts define.py (that gets the meaning and converts it to dictionary) &amp;amp; pretty_print.py(print the meanings in a pretty way).&lt;br /&gt;&lt;br /&gt;These scripts are a part of a GUI software which is under deveopment. You can also get the sources from&amp;nbsp; &lt;a href="https://github.com/shadyabhi/godict" target="_blank"&gt;https://github.com/shadyabhi/godict&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;define.py&lt;/u&gt; &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#!/usr/bin/python2&lt;br /&gt;&lt;br /&gt;import json&lt;br /&gt;import urllib&lt;br /&gt;import re&lt;br /&gt;import binascii&lt;br /&gt;&lt;br /&gt;def asciirepl(match):&lt;br /&gt;&amp;nbsp; s = match.group()&amp;nbsp; &lt;br /&gt;&amp;nbsp; return '\\u00' + match.group()[2:]&lt;br /&gt;&lt;br /&gt;def get_meaning(query):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = urllib.urlopen('http://www.google.com/dictionary/json?callback=a&amp;amp;q='+query+'&amp;amp;sl=en&amp;amp;tl=en&amp;amp;restrict=pr,de&amp;amp;client=te')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; page = p.read()[2:-10] #As its returned as a function call&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #To replace hex characters with ascii characters&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; p = re.compile(r'\\x(\w{2})')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ascii_string = p.sub(asciirepl, page)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Now decoding cleaned json response&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = json.loads(ascii_string)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Assumes that we always recieve a webDefinitions. ??Yet to check??&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if "webDefinitions" not in data:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return None&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; no_of_meanings = len(data['webDefinitions'][0]['entries']) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; all_meanings = dict()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; all_meanings['primaries'] = dict()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; all_meanings['webDefinitions'] = list()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if 'primaries') in data:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Creating list() for each types: adj, verb, noun&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for bunch in data['primaries']:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #This list contains meanings and examples&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; all_meanings['primaries'][bunch['terms'][0]['labels'][0]['text']] = list()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; means = all_meanings['primaries'][bunch['terms'][0]['labels'][0]['text']]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(len(bunch['entries'])):&lt;br /&gt;&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; #Choosen meaning, others can be related&lt;br /&gt;&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; if bunch['entries'][i]['type'] != "meaning": continue&lt;br /&gt;&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; meaning = bunch['entries'][i]['terms'][0]['text']&lt;br /&gt;&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; try:&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&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; example = list()&lt;br /&gt;&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; #Examples start with ZERO index&lt;br /&gt;&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; for i_ex in range(0, len(bunch['entries'][i]['entries'])):&lt;br /&gt;&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; example.append(bunch['entries'][i]['entries'][i_ex]['terms'][0]['text'])&lt;br /&gt;&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; &lt;br /&gt;&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; except:&lt;br /&gt;&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; example = None&lt;br /&gt;&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; means.append([meaning, example])&lt;br /&gt;&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; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Web definitions&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for meaning in data['webDefinitions'][0]['entries']:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; all_meanings['webDefinitions'].append(meaning['terms'][0]['text'])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return all_meanings&lt;/pre&gt;&lt;br /&gt;The test script for the above module.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;pretty_print.py&lt;/u&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;#!/usr/bin/python2&lt;br /&gt;&lt;br /&gt;import define&lt;br /&gt;import sys&lt;br /&gt;import httplib&lt;br /&gt;import xml.dom.minidom&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;means = define.get_meaning(sys.argv[1])&lt;br /&gt;&lt;br /&gt;if means is not None:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Short Summary&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for sec in means['primaries'].keys():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; meanings = means['primaries'][sec]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print sec, "\n---------------"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; for m in meanings:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "\n\t", m[0]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try: &lt;br /&gt;&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; for e in m[1]: print "\t\t--",e&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; except: pass&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Web Definitions&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "\nWeb Definitions","\n---------------"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for defs in means['webDefinitions']:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "\t",defs&lt;br /&gt;else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Word not found. These are he suggestions"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data = """ &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;spellrequest textalreadyclipped="0" ignoredups="0" ignoredigits="1" ignoreallcaps="1"&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;text&amp;gt; %s &amp;lt;/text&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/spellrequest&amp;gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; word_to_spell = sys.argv[1]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; con = httplib.HTTPSConnection("www.google.com")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; con.request("POST", "/tbproxy/spell?lang=en", data % word_to_spell)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; response = con.getresponse()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dom = xml.dom.minidom.parseString(response.read())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; dom_data = dom.getElementsByTagName('spellresult')[0]&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for child_node in dom_data.childNodes:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; result = child_node.firstChild.data.split()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print result&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;When i execute pretty_print,&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/-jgoGie3tyvg/TrY_RU5s8NI/AAAAAAAABT4/bXV3xP9BiTM/s1600/test.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="188" src="http://4.bp.blogspot.com/-jgoGie3tyvg/TrY_RU5s8NI/AAAAAAAABT4/bXV3xP9BiTM/s320/test.png" width="320" /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;In a few days, I plan to make a GUi to this that also reminds of the words searched &amp;amp; hence help improving vocabulary. &lt;/div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-3164315978244102372?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/3164315978244102372/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/11/google-dictionary-api-example-in-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3164315978244102372'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3164315978244102372'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/11/google-dictionary-api-example-in-python.html' title='Google Dictionary API example in python - gets primaries and webDefinitions'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/-jgoGie3tyvg/TrY_RU5s8NI/AAAAAAAABT4/bXV3xP9BiTM/s72-c/test.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-3061935562800380297</id><published>2011-10-14T19:38:00.000+05:30</published><updated>2011-10-14T22:29:36.991+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='urllib'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='trackers'/><title type='text'>Get torrent info like seeds/peers/completed from tracker (UDP) aka scraping torrent</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;The previous script I made adds trackers to a .torrent file. After I made that I thought that it would be if I could remove all the dead torrents by checking how many seeds/peers are available according to a particular tracker.So, the following script finds seeds/peers information if we have tracker url &amp;amp; torrent hash. It also finds the torrent name from the torrent hash using torrentz.me&amp;nbsp;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;You can read more about the protocol from here: &lt;/div&gt;&lt;pre class="prettyprint"&gt;http://bittorrent.org/beps/bep_0015.html#udp-tracker-protocol&lt;/pre&gt;&lt;div class="separator" style="clear: both; text-align: left;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Code:&lt;pre class="prettyprint"&gt;"""&lt;br /&gt;Author: shadyabhi abhijeet.1989@gmail.com&lt;br /&gt;For protocol description(not mine), check http://bittorrent.org/beps/bep_0015.html#udp-tracker-protocol&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;import socket&lt;br /&gt;import struct   &lt;br /&gt;from random import randrange #to generate random transaction_id&lt;br /&gt;from urllib import urlopen&lt;br /&gt;import re&lt;br /&gt;&lt;br /&gt;tracker = "tracker.istole.it"&lt;br /&gt;port = 80&lt;br /&gt;torrent_hash = ["3ebde329f208b9e2e81c8e0f80d14384d5f416e4", "3ac9002ce1a7d5dde2c02b7cf9dc9e0f15eda7cb", "00e058f6629a19b42458af4dea5f6b9e2ebe8e25"]&lt;br /&gt;torrent_details = {}&lt;br /&gt;&lt;br /&gt;def get_torrent_name(infohash):&lt;br /&gt;    url = "http://torrentz.me/" + infohash&lt;br /&gt;    p = urlopen(url)&lt;br /&gt;    page = p.read()&lt;br /&gt;    c = re.compile(r'&amp;lt;h2&amp;gt;&amp;lt;span&amp;gt;(.*?)&amp;lt;/span&amp;gt;')&lt;br /&gt;    return c.search(page).group(1)&lt;br /&gt;&lt;br /&gt;def pretty_show(infohash):&lt;br /&gt;    print "Torrent Hash: ", infohash&lt;br /&gt;    try:&lt;br /&gt;        print "Torrent Name (from torrentz): ", get_torrent_name(infohash)&lt;br /&gt;    except:&lt;br /&gt;        print "Coundn'f find torrent name"&lt;br /&gt;    print "Seeds, Leechers, Completed", torrent_details[infohash] &lt;br /&gt;    print&lt;br /&gt;&lt;br /&gt;#Create the socket&lt;br /&gt;clisocket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)&lt;br /&gt;clisocket.connect((tracker, port))&lt;br /&gt;&lt;br /&gt;#Protocol says to keep it that way&lt;br /&gt;connection_id=0x41727101980&lt;br /&gt;#We should get the same in response&lt;br /&gt;transaction_id = randrange(1,65535)&lt;br /&gt;&lt;br /&gt;packet=struct.pack("&amp;gt;QLL",connection_id, 0,transaction_id)&lt;br /&gt;clisocket.send(packet)&lt;br /&gt;res = clisocket.recv(16)&lt;br /&gt;action,transaction_id,connection_id=struct.unpack("&amp;gt;LLQ",res)&lt;br /&gt;&lt;br /&gt;packet_hashes = ""&lt;br /&gt;for infohash in torrent_hash:&lt;br /&gt;    packet_hashes = packet_hashes + infohash.decode('hex')&lt;br /&gt;&lt;br /&gt;packet = struct.pack("&amp;gt;QLL", connection_id, 2, transaction_id) + packet_hashes&lt;br /&gt;&lt;br /&gt;clisocket.send(packet)&lt;br /&gt;res = clisocket.recv(8 + 12*len(torrent_hash))&lt;br /&gt;&lt;br /&gt;index = 8&lt;br /&gt;for infohash in torrent_hash:&lt;br /&gt;    seeders, completed, leechers = struct.unpack("&amp;gt;LLL", res[index:index+12])&lt;br /&gt;    torrent_details[infohash] = (seeders, leechers, completed)&lt;br /&gt;    pretty_show(infohash)&lt;br /&gt;    index = index + 12&amp;nbsp;&lt;/pre&gt;&lt;br /&gt;Usage (The above script has 3 hashes for demonstration, you can change them):&lt;br /&gt;&lt;pre class="prettyprint"&gt; shadyabhi@archlinux ~ $ python2 check_trackers.py &lt;br /&gt;Torrent Hash:&amp;nbsp; 3ebde329f208b9e2e81c8e0f80d14384d5f416e4&lt;br /&gt;Torrent Name (from torrentz):&amp;nbsp; House.S08E02.HDTV.XviD-LOL.avi&lt;br /&gt;Seeds, Leechers, Completed (10297, 1051, 172274)&lt;br /&gt;&lt;br /&gt;Torrent Hash:&amp;nbsp; 3ac9002ce1a7d5dde2c02b7cf9dc9e0f15eda7cb&lt;br /&gt;Torrent Name (from torrentz):&amp;nbsp; Dexter.S06E02.Once.Upon.a.Time.HDTV.XviD-FQM.avi&lt;br /&gt;Seeds, Leechers, Completed (10962, 1328, 248032)&lt;br /&gt;&lt;br /&gt;Torrent Hash:&amp;nbsp; 00e058f6629a19b42458af4dea5f6b9e2ebe8e25&lt;br /&gt;Torrent Name (from torrentz):&amp;nbsp; Breaking.Bad.S04E13.Face.Off.HDTV.XviD-FQM.avi&lt;br /&gt;Seeds, Leechers, Completed (7751, 495, 183809)&lt;br /&gt;&lt;br /&gt;shadyabhi@archlinux ~ $ &lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-3061935562800380297?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/3061935562800380297/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/10/get-seeds-peers-completed-info-from.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3061935562800380297'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3061935562800380297'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/10/get-seeds-peers-completed-info-from.html' title='Get torrent info like seeds/peers/completed from tracker (UDP) aka scraping torrent'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-4365047972105089641</id><published>2011-10-14T02:32:00.001+05:30</published><updated>2011-10-17T02:01:04.716+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='trackers'/><category scheme='http://www.blogger.com/atom/ns#' term='torrent'/><title type='text'>Add trackers to .torrent files in linux</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Windows users have BEncode Editor to edit their torrent files without changing info hash of the torrent file. But, linux hasn't yet had a torrent editor.&lt;br /&gt;&lt;br /&gt;I use rtorrent for downloading torrents and it doesn't have the feature of adding trackers. To me, that is very necessary because in my institute, many trackers are blocked and I have to reply on UDP trackers to get the seeds/peers stats.&lt;br /&gt;&lt;br /&gt;There is a python library named &lt;a href="http://www.blogger.com/Windows%20users%20have%20BEncode%20Editor%20to%20edit%20their%20torrent%20files%20without%20changing%20info%20hash%20of%20the%20torrent%20file.%20But,%20linux%20hasn%27t%20yet%20had%20a%20torrent%20editor.%20%20I%20use%20rtorrent%20for%20downloading%20torrents%20and%20it%20doesn%27t%20have%20the%20feature%20of%20adding%20trackers.%20To%20me,%20that%20is%20very%20necessary%20because%20in%20my%20institute,%20many%20trackers%20are%20blocked%20and%20I%20have%20to%20reply%20on%20UDP%20trackers%20to%20get%20the%20seeds/peers%20stats.%20%20There%20is%20a%20python%20library%20named%3Ca%20href=%22%20http://pypi.python.org/pypi/BitTorrent-bencode/5.0.8%22%3E%20bencode%3C/a%3E%20that"&gt;bencode&lt;/a&gt; that helps you editing the torrent file but there is no usage given on the internet.&lt;br /&gt;&lt;br /&gt;So, here is an example script to add torrents to a .torrent file using bencode.&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;This script assumes that you have a file that contains the list of trackers separated by new-lines. (first argument to the script)&lt;/li&gt;&lt;li&gt;This script creates a new torrent file in the current directory with the added trackers.&amp;nbsp;&lt;/li&gt;&lt;li&gt;The script takes the input torrent file as the second argument.&lt;/li&gt;&lt;/ul&gt;WARNING: Use it only on public trackers, otherwise it will get you banned. &lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;/ul&gt;&lt;pre class="prettyprint"&gt;#!/usr/bin/python2&lt;br /&gt;&lt;br /&gt;"""&lt;br /&gt;Author: shadyabhi (abhijeet[dot]1989[at]gmail[dot]com)&lt;br /&gt;&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;import bencode&lt;br /&gt;import sys&lt;br /&gt;from os import path&lt;br /&gt;&lt;br /&gt;if len(sys.argv) &amp;lt; 2:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "First argument: File containing trackers"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Second argument: .torrent file"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit(0)&lt;br /&gt;&lt;br /&gt;tracker_file = open(sys.argv[1])&lt;br /&gt;torrent_file = open(sys.argv[2])&lt;br /&gt;&lt;br /&gt;trackers_list = []&lt;br /&gt;#Creating the list of trackers.&lt;br /&gt;trackers_list[:] = (value for value in tracker_file.read().split("\n") if value != '')&lt;br /&gt;decoded_data = bencode.bdecode(torrent_file.read())&lt;br /&gt;&lt;br /&gt;print "Trackers Before: "&lt;br /&gt;for tracker in decoded_data['announce-list']:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print tracker&lt;br /&gt;&lt;br /&gt;for tracker in trackers_list:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if tracker not in decoded_data['announce-list']:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; decoded_data['announce-list'].append([tracker])&lt;br /&gt;&lt;br /&gt;print "Now, the trackers in the torrent are: "&lt;br /&gt;for tracker in decoded_data['announce-list']:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print tracker&lt;br /&gt;&lt;br /&gt;#Writing the torrent file&lt;br /&gt;f = open("new_"+path.basename(sys.argv[2]), "w")&lt;br /&gt;f.write(bencode.bencode(decoded_data))&lt;br /&gt;f.close() &lt;/pre&gt;&lt;br /&gt;Sample Usage:&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;shadyabhi@archlinux ~/github/bencode_py $ python2 add_tracker.py /media/abhijeet/Misc/trackers ~/house.torrent &lt;br /&gt;Trackers Before: &lt;br /&gt;['http://10.rarbg.com:80/announce']&lt;br /&gt;['http://9.rarbg.com:2710/announce']&lt;br /&gt;['udp://11.rarbg.com:80/announce']&lt;br /&gt;Now, the trackers in the torrent are: &lt;br /&gt;['http://10.rarbg.com:80/announce']&lt;br /&gt;['http://9.rarbg.com:2710/announce']&lt;br /&gt;['udp://11.rarbg.com:80/announce']&lt;br /&gt;['udp://tracker.openbittorrent.com:80']&lt;br /&gt;['udp://tracker.publicbt.com:80']&lt;br /&gt;['udp://tracker.ccc.de:80']&lt;br /&gt;['udp://tracker.istole.it:80']&lt;br /&gt;['udp://tracker.1337x.org:80/announce']&lt;br /&gt;['udp://tracker.torrentbox.com:2710']&lt;br /&gt;['udp://tracker.openbittorrent.com:80']&lt;br /&gt;['udp://tracker.torrentbox.com:2710']&lt;br /&gt;['udp://tracker.openbittorrent.com:80/announce']&lt;br /&gt;['udp://tracker.publicbt.com:80/announce']&lt;br /&gt;shadyabhi@archlinux ~/github/bencode_py $ ls&lt;br /&gt;total 36K&lt;br /&gt;-rwxr-xr-x 1 shadyabhi users  960 Oct 14 02:20 add_tracker.py&lt;br /&gt;-rw-r--r-- 1 shadyabhi users 3.2K Oct 13 20:12 bencode.py&lt;br /&gt;-rw-r--r-- 1 shadyabhi users 4.4K Oct 13 20:12 bencode.pyc&lt;br /&gt;-rw-r--r-- 1 shadyabhi users  786 Oct 14 02:05 check_trackers.py&lt;br /&gt;-rw-r--r-- 1 shadyabhi users  15K Oct 14 02:51 new_house.torrent&lt;br /&gt;shadyabhi@archlinux ~/github/bencode_py $&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&amp;nbsp;You can also get the script at &lt;a href="https://github.com/shadyabhi/Bencode-Torrent-Editor"&gt;https://github.com/shadyabhi/Bencode-Torrent-Editor.&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-4365047972105089641?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/4365047972105089641/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/10/add-trackers-to-torrent-files-in-linux.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4365047972105089641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4365047972105089641'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/10/add-trackers-to-torrent-files-in-linux.html' title='Add trackers to .torrent files in linux'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-1056625840395814808</id><published>2011-09-11T00:21:00.001+05:30</published><updated>2011-10-08T19:55:40.423+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>pLibraryOrganizer - Manage your music library like iTunes does</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;span style="font-size: small;"&gt;I made a script to manage my music. By managing, I mean it will sort the files according to the rules you give as a command-line argument. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size: small;"&gt;Project page:-&lt;/span&gt;&lt;span style="color: white;"&gt; &lt;/span&gt;&lt;span style="font-size: small;"&gt;&lt;a href="https://github.com/shadyabhi/pLibraryOrganizer" style="background-color: #f3f3f3; color: #444444; font-family: inherit;"&gt;https://github.com/shadyabhi/pLibraryOrganizer&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;shadyabhi@archlinux ~/github/pLibraryOrganizer $ ./pLibraryOrganizer.py -h&lt;br /&gt;usage: pLibraryOrganizer.py [-h] -f FORMAT -d DIRECTORY [-D FINALDIRECTORY]&lt;br /&gt;                            [-v] [-et EDITTITLE EDITTITLE]&lt;br /&gt;                            [-ea EDITARTIST EDITARTIST]&lt;br /&gt;                            [-eA EDITALBUM EDITALBUM] [-dr]&lt;br /&gt;&lt;br /&gt;Organizes your library&lt;br /&gt;&lt;br /&gt;optional arguments:&lt;br /&gt;  -h, --help            show this help message and exit&lt;br /&gt;  -f FORMAT, --format FORMAT&lt;br /&gt;                        Enter format for organizing the music&lt;br /&gt;  -d DIRECTORY, --directory DIRECTORY&lt;br /&gt;                        Enter the directory root.&lt;br /&gt;  -D FINALDIRECTORY, --finaldirectory FINALDIRECTORY&lt;br /&gt;                        Directory to finally move the mp3 files too&lt;br /&gt;  -v, --verbose         For more verbose output&lt;br /&gt;  -et EDITTITLE EDITTITLE, --edittitle EDITTITLE EDITTITLE&lt;br /&gt;                        Replace in Title&lt;br /&gt;  -ea EDITARTIST EDITARTIST, --editartist EDITARTIST EDITARTIST&lt;br /&gt;                        Replace in Artist&lt;br /&gt;  -eA EDITALBUM EDITALBUM, --editalbum EDITALBUM EDITALBUM&lt;br /&gt;                        Replace in Album&lt;br /&gt;  -dr, --dryrun         Don't move the files. Just show what you are doing&lt;br /&gt;shadyabhi@archlinux ~/github/pLibraryOrganizer $ &lt;br /&gt;&lt;/pre&gt;&lt;hr /&gt;&lt;span style="font-size: large;"&gt;&lt;u&gt;Usage:-&lt;/u&gt;&lt;/span&gt;&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;If you want delete all the folders and keep all the mp3 files in root with name %artist% - %title%, execute:&lt;/li&gt;&lt;/ul&gt;&lt;pre class="prettyprint"&gt;python2 pLibraryOrganizer.py -f "%artist% - %title%" -d "/home/shadyabhi/music/"&lt;/pre&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;Suppose, you want your music sorted such that all the mp3s have name as %artist% - %title% and each artist should have a different folder.Also, in the process you want to remove or replace " - www.Songs.PK" in the titles. [All files downloaded from songs.Pk have that annoying titles]&lt;/li&gt;&lt;/ul&gt;&lt;pre class="prettyprint"&gt;python2 pLibraryOrganizer.py -f "%artist%/%artist% - %title%" -d "/home/shadyabhi/music/" -et " - www.Songs.PK" ""&lt;br /&gt;&lt;/pre&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;If you want your music to move to a new directory, lets say /tmp/music:&amp;nbsp;&lt;/li&gt;&lt;/ul&gt;&lt;pre class="prettyprint"&gt;python2 pLibraryOrganizer.py -f "%artist%/%artist% - %title%" -d "/home/shadyabhi/music/" -D "/tmp/music/"&lt;/pre&gt;&lt;br /&gt;&lt;u&gt;Known issues&lt;/u&gt;: If your music directory has files other than *mp3 file, this script will fail to delete that directory. You can remove all files from a directory other than mp3 by using this command (removes all *.jpg files): [ &lt;u&gt;Caution&lt;/u&gt;: Run this command from the root of your music directory only. It deletes file recursively starting from the current folder ]&lt;br /&gt;&lt;pre class="prettyprint"&gt;find -type f -name ".jpg" -exec rm -v {} \;&lt;br /&gt;&lt;/pre&gt;Hope that script will be of use to you. :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-1056625840395814808?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/1056625840395814808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/09/plibraryorganizer-manage-your-music.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1056625840395814808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1056625840395814808'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/09/plibraryorganizer-manage-your-music.html' title='pLibraryOrganizer - Manage your music library like iTunes does'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-3346567023621382730</id><published>2011-09-08T23:29:00.000+05:30</published><updated>2011-10-09T10:50:27.966+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='mpd'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Love current track in MPD on last.fm (Also delete current song)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;script language="javascript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/prettify.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script language="javascript" src="http://google-code-prettify.googlecode.com/svn/trunk/src/lang-css.js" type="text/javascript"&gt;&lt;/script&gt;&lt;script type="text/javascript"&gt;function addLoadEvent(func) {  var oldonload = window.onload;  if (typeof window.onload != 'function') {    window.onload = func;  } else {    window.onload = function() {      if (oldonload) {        oldonload();      }      func();    }  }}addLoadEvent(prettyPrint);&lt;/script&gt;&lt;style type="text/css"&gt;/* Pretty printing styles. Used with prettify.js. */.str { color: #080; }.kwd { color: #008; }.com { color: #800; }.typ { color: #606; }.lit { color: #066; }.pun { color: #660; }.pln { color: #000; }.tag { color: #008; }.atn { color: #606; }.atv { color: #080; }.dec { color: #606; }pre.prettyprint { padding: 2px; border: 1px solid #888; overflow: auto }@media print {  .str { color: #060; }  .kwd { color: #006; font-weight: bold; }  .com { color: #600; font-style: italic; }  .typ { color: #404; font-weight: bold; }  .lit { color: #044; }  .pun { color: #440; }  .pln { color: #000; }  .tag { color: #006; font-weight: bold; }  .atn { color: #404; }  .atv { color: #060; }}&lt;/style&gt;&lt;br /&gt;&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/-PjF1io8vjWo/TpAsY-AEGxI/AAAAAAAABTI/Kq_tnK21VJ8/s1600/Screenshot+at+2011-10-08+16%253A18%253A23.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="141" src="http://3.bp.blogspot.com/-PjF1io8vjWo/TpAsY-AEGxI/AAAAAAAABTI/Kq_tnK21VJ8/s400/Screenshot+at+2011-10-08+16%253A18%253A23.png" width="400" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python2 &lt;br /&gt;&lt;br /&gt;import gtk&lt;br /&gt;import pynotify&lt;br /&gt;import os&lt;br /&gt;import pylast&lt;br /&gt;&lt;br /&gt;MPD_LIBRARY_LOCATION = "/var/lib/mpd/music/"&lt;br /&gt;API_KEY = "your api key"&lt;br /&gt;API_SECRET = "your secret"&lt;br /&gt;username = "shadyabhi"&lt;br /&gt;#Enter the hash directly.&lt;br /&gt;password_hash = pylast.md5("mysupersecret")&lt;br /&gt;&lt;br /&gt;class MPDTest:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Initing the pynotif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pynotify.init("mpd")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n = pynotify.Notification("Action for current song", "What do you wanna do?")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.set_urgency(pynotify.URGENCY_LOW)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.set_timeout(2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.add_action("action_delete", "Delete", self.deleteSong)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.add_action("no_dontdelete", "Hide", self.doNothing)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.add_action("love_on_lastfm", "Love on Last.fm", self.love_on_lastfm) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.connect("closed", self.closeit)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.show()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gtk.main()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def deleteSong(self, notifyObj, action):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Deleting the song"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mpcProcess = os.popen("mpc -f %file%")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # [:-1] to delete the trailing newline&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.remove(MPD_LIBRARY_LOCATION+mpcProcess.readline()[:-1])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Deleting song from playlist&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.popen("mpc del $(mpc -f %position% | head -n 1)")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; except:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Something really went wrong"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notifyObj.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gtk.main_quit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def doNothing(self,notifyObj, action):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notifyObj.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gtk.main_quit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def closeit(self, notifyObj):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notifyObj.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gtk.main_quit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def love_on_lastfm(self, notifyObj, action):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Loving track on last.fm"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; network = pylast.LastFMNetwork(api_key = API_KEY, api_secret = API_SECRET, username = username, password_hash = password_hash)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; artist = os.popen('mpc -f "%artist%" | head -n 1').read()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; title = os.popen('mpc -f "%title%" | head -n 1').read()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; track = network.get_track(artist, title)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notifyObj.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gtk.main_quit()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; track.love()&lt;br /&gt;&amp;nbsp;&lt;br /&gt;        #Confirming the user that the track has been loved by retrieving the last loved track from last.fm&lt;br /&gt;        last_loved_track = str(network.get_user(username).get_loved_tracks(limit=1)[0][0])&lt;br /&gt;        love_notification = pynotify.Notification("Last loved track confirmation", last_loved_track + " is your last loved track")&lt;br /&gt;        love_notification.set_timeout(1)&lt;br /&gt;        love_notification.show()&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = MPDTest()&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-3346567023621382730?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/3346567023621382730/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/09/love-current-track-in-mpd-also-delete.html#comment-form' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3346567023621382730'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3346567023621382730'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/09/love-current-track-in-mpd-also-delete.html' title='Love current track in MPD on last.fm (Also delete current song)'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-PjF1io8vjWo/TpAsY-AEGxI/AAAAAAAABTI/Kq_tnK21VJ8/s72-c/Screenshot+at+2011-10-08+16%253A18%253A23.png' height='72' width='72'/><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-1672782004792659212</id><published>2011-09-08T22:35:00.000+05:30</published><updated>2011-11-08T10:07:07.328+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='libnotify'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Adding buttons(actions) while using python-notify (libnotify) + An example</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Python wrapper for libnotify ie python-notify lacks &lt;i&gt;any&lt;/i&gt; documentation.&lt;br /&gt;&lt;br /&gt;Well, the only thing for documentation is to read pynotify.defs and pynotify.c from the /src directory of source code.&lt;br /&gt;&lt;br /&gt;I made a script while ago to &lt;b&gt;delete current song in mpd in bash&lt;/b&gt;. I then thought of using libnotify for the same script in python.&lt;br /&gt;&lt;br /&gt;There is not much information about adding buttons to notifications while using python-notify so hopefully it will help someone :)&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python2&lt;br /&gt;&lt;br /&gt;import gtk&lt;br /&gt;import pynotify&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;MPD_LIBRARY_LOCATION = "/var/lib/mpd/music/"&lt;br /&gt;&lt;br /&gt;class DelSongMPD:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def __init__(self):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Initing the pynotif&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; pynotify.init("mpd")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n = pynotify.Notification("Deleting a song", "Do you really want to delete the song")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.set_urgency(pynotify.URGENCY_LOW)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.add_action("action_delete", "Delete", self.deleteSong)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.add_action("no_dontdelete", "No delete", self.doNothing)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n.show()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gtk.main()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def deleteSong(self, notifyObj, action):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Deleting the song"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mpcProcess = os.popen("mpc -f %file%")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; # [:-1] to delete the trailing newline&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.remove(MPD_LIBRARY_LOCATION+mpcProcess.readline()[:-1])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Deleting song from playlist&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; os.popen("mpc del $(mpc -f %position% | head -n 1)")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; except:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Something really went wrong"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notifyObj.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gtk.main_quit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; def doNothing(self,notifyObj, action):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Do not delete"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notifyObj.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; gtk.main_quit()&lt;br /&gt;&lt;br /&gt;if __name__ == "__main__":&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; obj = DelSongMPD()&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-1672782004792659212?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/1672782004792659212/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/09/adding-buttons-while-using-python.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1672782004792659212'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1672782004792659212'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/09/adding-buttons-while-using-python.html' title='Adding buttons(actions) while using python-notify (libnotify) + An example'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-5728132396553913336</id><published>2011-08-12T03:06:00.000+05:30</published><updated>2011-08-12T03:06:40.785+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='archlinux'/><category scheme='http://www.blogger.com/atom/ns#' term='macbookpro'/><category scheme='http://www.blogger.com/atom/ns#' term='udev'/><title type='text'>PROBLEM - Interface name changes after sleep on Macbook Pro</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Strangely, broadcom-wl driver by defaults names the wireless card as eth1 (assuming I already had eth0 running).&lt;br /&gt;&lt;br /&gt;At first, I thought that I could do with it. But, later when I put my mbp to sleep, after resuming the interface names got swapped which was really annoying. This stopped my network meter in conky.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;To solve the problem, use udev rules. Primary job of udev is to manage device nodes.&lt;br /&gt;&lt;br /&gt;Create a file /etc/udev/rules.d/10-network.rules with contents&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;code&gt;SUBSYSTEM=="net", ATTR{address}=="mac-addr1", NAME="eth0"&lt;br /&gt;SUBSYSTEM=="net", ATTR{address}=="mac-addr2", NAME="wlan0"&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;&amp;nbsp;Make sure that you have mac-addresses written in lower case.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-5728132396553913336?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/5728132396553913336/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/08/problem-interface-name-changes-after_12.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/5728132396553913336'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/5728132396553913336'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/08/problem-interface-name-changes-after_12.html' title='PROBLEM - Interface name changes after sleep on Macbook Pro'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-6809949634751192489</id><published>2011-08-11T13:44:00.000+05:30</published><updated>2011-09-30T21:17:36.527+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='font rendering'/><title type='text'>Perfect font rendering in Arch</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;So, one drawbacl of using windows managers instead of fully featured desktop managers is that when you are on WM, you have to do few things on your own.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In Arch, there are no fonr rendering patches. If you install a desktop environment, it handles this stuf by itself.&lt;br /&gt;&lt;br /&gt;On openbox, I was getting very ugly fonts due to no font rendering. I looked up the ArchWiki which is a very good source but unfortunately I was not satisfied with the results.&lt;br /&gt;&lt;br /&gt;While searching on forums, someone suggested to install ubuntu patched versions of some packages. So, these are the packages that you have to install for getting perfect font rendering. No other settings required.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;fontconfig-ubuntu 2.8.0-1&lt;br /&gt;freetype2-ubuntu 2.4.6-1&lt;br /&gt;libxft-ubuntu 2.2.0-1&lt;/blockquote&gt;&lt;br /&gt;I would also recommend you to install ttf-mac-fonts &amp;amp; ttf-ms-fonts too.&lt;br /&gt;&lt;br /&gt;Also, remove these packages if you installed them&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;span style="font-size: small;"&gt;&lt;code&gt;pacman -R xorg-fonts-75dpi xorg-fonts-100dpi&lt;/code&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-6809949634751192489?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/6809949634751192489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/08/perfect-font-rendering-in-arch.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/6809949634751192489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/6809949634751192489'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/08/perfect-font-rendering-in-arch.html' title='Perfect font rendering in Arch'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8153729329683853944</id><published>2011-08-05T00:45:00.000+05:30</published><updated>2011-10-11T17:37:56.697+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='macbookpro'/><category scheme='http://www.blogger.com/atom/ns#' term='installation'/><category scheme='http://www.blogger.com/atom/ns#' term='MBP'/><category scheme='http://www.blogger.com/atom/ns#' term='apple'/><title type='text'>Triple-boot Archlinux, Windows 7 and Mac OSX</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;First of all, &lt;a href="http://www.youtube.com/watch?v=gqyYqzgeZNU"&gt;watch these three videos&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This will give you a rough idea as to what you are going to do &amp;amp; believe me, there is more to know than just this.&lt;br /&gt;&lt;br /&gt;I will add only the points which are not covered in the video. If you have been a Mac OSX for a while you might also be having your BOOTCAMP partition. Sadly, you would have to get rid of your Windows install..&lt;br /&gt;&lt;br /&gt;To do that, start your "Boot Camp Assistant" and select proper options to remove the BOOTCAMP partition. Once that partition is removed, you will now be having only one partition (visible).&lt;br /&gt;&lt;br /&gt;Now install rEFIT. And open terminal and type the following commands:- &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;$cd /efi/refit&lt;br /&gt;$./enable-always.sh&lt;/pre&gt;&lt;br /&gt;These two comamnds basically enable rEFIT menu to come everytime you start your computer which is not the case by default. There are cases when the DVD you inserted don't come in the menu. In that cases, just select REBOOT from the menu, then keep OPTION button pressed while starting up of the MBP and select refit. This solves the problem, dont know how!!&lt;br /&gt;&lt;br /&gt;Now, do as told in the first two videos by that guy. As in the video, make sure that windows partition is the last partition in the HDD. There will be no issues as the process is pretty straight forward..&lt;br /&gt;&lt;br /&gt;Without any issues, now you will have a dual boot Windows &amp;amp; Mac install. Don't forget to install the BOOTCAMP drivers by inserting the official MAC disk in Windows.&lt;br /&gt;&lt;br /&gt;Now, here comes the hard part. The video shows how to install ubuntu linux which is actually installed without any issues or commands. But, the case is not the same with ArchLinux.&lt;br /&gt;&lt;br /&gt;First of all, being a reddit user, I had heard some guy few days earlier that older arch isos were not working with the latest macbook pros. So, without taking any chances, I download the latest version from the official website. For the record, I used DVD-RW to boot from the CD. So, try your look using the USB disk, but I did it simply using DVD.&lt;br /&gt;&lt;br /&gt;Now, same as before, restart the system, select the Arch DVD from the menu &amp;amp; install the Arch as you do in a normal PC. Make sure that when the option to Prepare Drives come, don't use the linux's partition tool to partition as we have already done it using Disk Utility in Mac OSX. Just choose the third (or fourth, I dont remember) which asks you "which method to choose; uuid, or partition number or label... &amp;amp; format it with ext4 partition type. &lt;br /&gt;&lt;br /&gt;You might face some doubts regarding where to install and get scared, so I have put screenshot for some critical steps.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i.imgur.com/pPsI1.jpg"&gt;&lt;img border="0" height="240" src="http://i.imgur.com/AurIh.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Now, make sure that while you are configuring your arch system during the setup, add usbinput HOOK &lt;a href="https://wiki.archlinux.org/index.php/MacBook"&gt;as said in the official archwiki&lt;/a&gt;. If you forget to do this, in case your system fails to boot the kernel and drops to the recovery shell, you won't be able to type anything &amp;amp; will be forced to do a hard reset.&lt;br /&gt;&lt;br /&gt;When the option to install the GRUB comes, please dont install it. We will leave it for later. Now, that you have completed the setup, do a reboot. We still have to do a job, which we never do in PCs. We have to resync the tables.&lt;br /&gt;&lt;br /&gt;Do a reboot and let the rEFIT boot menu load, select the option to start the partition editor and sync the tables. (It should already be showing that you need to resync the tables). In case you are curious to know as to what happends if you dont sync the tables. It happened with as I didn't know about resyncing tables. fdisk and parted were showing different partition types for the same /dev/sda3. See the screenshot below. &lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i.imgur.com/upiWa.jpg"&gt;&lt;img border="0" height="240" src="http://2.bp.blogspot.com/-cGLqhAGANxM/TjroXY-4j2I/AAAAAAAABQ0/Q0NI6zbpQWk/s320/04082011337.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;So, this is the reason, we have to sync the table as without doing that you wont be able to install the GRUB.&lt;br /&gt;&lt;br /&gt;Now, that you have dont resynced the tables, run the livecd of arch linux again and type GRUB in prompt and type the following commands.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;root (hd0,2)&lt;br /&gt;setup (hd0,2)&lt;/pre&gt;&lt;br /&gt;Make sure that you install GRUb in the partition you installed ArchLinux otherwise you will fuck your system.&lt;br /&gt;&lt;br /&gt;Hopefully, your GRUb will be installed. My GRUB looked like this.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i.imgur.com/qVWDq.jpg"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-hbLggdGcdJM/TjrptYNiM3I/AAAAAAAABQ8/QEfrkJCdan0/s320/04082011340.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Now, try to boot. &lt;br /&gt;&lt;br /&gt;BTW, I got this error while booting on my MBP 7.1&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://i.imgur.com/BTZEf.jpg"&gt;&lt;img border="0" height="240" src="http://4.bp.blogspot.com/-XGRWc8w1CA4/Tjrp1rVVLfI/AAAAAAAABRE/ngp28rN3teY/s320/04082011341.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Look at that error, that means that its not able to find /dev/sda3. So, its strange, isn't it? The live cd is able to find /dev/sda3 but not the install.&lt;br /&gt;After researching a bit, I came to know that it was being caused because of the autodetect HOOK. What this HOOK does is that, it autodetects which modules are not required and accordingly strips down the size of the generated kernel image. In this process, image somehow got damaged to boot on my MBP. To solve this error, I restarted the computer using the arch livecd and wrote the following commands. &lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;mkdir /mnt/chroot&lt;br /&gt;mount /dev/disk/[YOUR ROOT PARTITION] /mnt/chroot&lt;br /&gt;cd /mnt/chroot&lt;br /&gt;mkdir boot&lt;br /&gt;mount /dev/disk/[YOUR BOOT PARTITION] boot&lt;br /&gt;mount -t proc proc proc/&lt;br /&gt;mount -t sysfs sys sys/&lt;br /&gt;mount -o bind /dev dev/&lt;br /&gt;chroot . /bin/bash&lt;br /&gt;&lt;br /&gt;#Remove autodetect from HOOKS in /etc/mkinitcpio.conf&lt;br /&gt;#Then execute the command below.&lt;br /&gt;&lt;br /&gt;mkinitcpio -p kernel26&lt;/pre&gt;&lt;br /&gt;Now, you restart and keep your fingers crossed. After this, I was successfully able to boot my arch.&lt;br /&gt;&lt;br /&gt;NOW, setting up arch perfectly..&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;To get the keyboard backlight, I installed &lt;a href="http://aur.archlinux.org/packages.php?ID=14833"&gt;pommed&lt;/a&gt;. Also, make sure to edit the PKGBUILD, by adding the line &lt;/li&gt;&lt;/ul&gt;&lt;pre class="prettyprint"&gt;find . -name "*" -exec sed -i 's/nvidia_backlight/apple_backlight/' '{}' \;&lt;/pre&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; as instructed in the ArchWiki.&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;To be able to change the brightness, I installed &lt;a href="http://aur.archlinux.org/packages.php?ID=25467"&gt;nvidia-bl package&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;&lt;b&gt;&lt;/b&gt;For getting the wireless to work, I had to install &lt;a href="http://aur.archlinux.org/packages.php?ID=19514"&gt;broadcom-wl package&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Now, both keyboard backlight, wifi &amp;amp; changing screen brightness; all should work.&lt;br /&gt;&lt;ul style="text-align: left;"&gt;&lt;li&gt;That last thing that bugged me was the sound. I was unable to get the sound via internal speaker of my Macbook Pro 7.1. For that I had to create a file &lt;b&gt;/etc/modprobe.d/50-sound.conf&lt;/b&gt; and add &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;pre class="prettyprint"&gt;options snd_hda_intel model=intel-mac-auto&lt;/pre&gt;&lt;br /&gt;Then, restart the system or reload the module again (whichever seems more easy to you).&lt;br /&gt;&lt;br /&gt;Even now, sound from internal speaker was not working. But, I was able to hear sound from my earphones or headphones. Later, I figured out that, there are actually 2 speakers in MBP 7.1 and they were muted. To unmute them, use &lt;b&gt;gnome-alsamixer&lt;/b&gt;. Make sure, &lt;b&gt;there are two speakers to enable to hear the full sound.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So, now, I had a fully working linux. (and a triple boot too)...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8153729329683853944?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8153729329683853944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/08/triple-boot-archlinux-windows-7-and-mac.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8153729329683853944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8153729329683853944'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/08/triple-boot-archlinux-windows-7-and-mac.html' title='Triple-boot Archlinux, Windows 7 and Mac OSX'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/-cGLqhAGANxM/TjroXY-4j2I/AAAAAAAABQ0/Q0NI6zbpQWk/s72-c/04082011337.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-6101423393283387556</id><published>2011-07-26T12:24:00.005+05:30</published><updated>2011-10-08T15:06:18.035+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='Reliance'/><title type='text'>Reliance broadband login script - 2011</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;This is a script which can be run as a cronjob to login to Reliance connection automatically.&lt;br /&gt;&lt;br /&gt;You can get the code here&amp;nbsp;&lt;b&gt;http://sprunge.us/eMLG&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python2&lt;br /&gt;&lt;br /&gt;__author__ = """&lt;br /&gt;NAME: Abhijeet Rastogi (shadyabhi)&lt;br /&gt;Profile: http://www.google.com/profiles/abhijeet.1989&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;import cookielib&lt;br /&gt;import urllib2&lt;br /&gt;from getpass import getpass&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;#Enter your username &amp; password here.&lt;br /&gt;username = "myuser"&lt;br /&gt;password = "secert"&lt;br /&gt;&lt;br /&gt;#Logging into the SMS Site&lt;br /&gt;url = 'http://reliancebroadband.co.in/reliance/login.do'&lt;br /&gt;&lt;br /&gt;#Remember, Cookies are to be handled&lt;br /&gt;cj = cookielib.CookieJar()&lt;br /&gt;opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))&lt;br /&gt;&lt;br /&gt;# To fool way2sms as if a Web browser is visiting the site&lt;br /&gt;opener.addheaders = [('User-Agent','Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0')]&lt;br /&gt;try:&lt;br /&gt;    #For sake of taking cookies which will be sent in second request&lt;br /&gt;    usock = opener.open(url)&lt;br /&gt;except IOError:&lt;br /&gt;    print "Check your ethernet cable"&lt;br /&gt;    sys.exit(1)&lt;br /&gt;&lt;br /&gt;#Sending login request&lt;br /&gt;request_url = 'http://reliancebroadband.co.in/reliance/login.do?action=doLoginSubmit'&lt;br /&gt;request_data = 'userId='+username+'&amp;password='+password&lt;br /&gt;opener.addheaders = [('Referer','http://reliancebroadband.co.in/reliance/login.do?action=doLoginSubmit')]&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;    sms_sent_page = opener.open(request_url,request_data)&lt;br /&gt;except IOError:&lt;br /&gt;    print "Oops, reliance connection taking too much time to respond. Try again."&lt;br /&gt;    sys.exit(1)&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-6101423393283387556?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/6101423393283387556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/07/reliance-broadband-login-script-2011.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/6101423393283387556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/6101423393283387556'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/07/reliance-broadband-login-script-2011.html' title='Reliance broadband login script - 2011'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8062460255501105851</id><published>2011-02-16T22:17:00.002+05:30</published><updated>2011-02-16T22:35:45.689+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='mpd. delete'/><title type='text'>Delete a currently playing song in mpd</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;So here a quick script to delete a currently playing song in mpd music player daemon&amp;nbsp; of which I am a big fan!&lt;br /&gt;&lt;div style="color: red;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;span style="color: red; font-size: x-small;"&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;kdialog --title "Removing the song" --yesno "Do you really want to delete the song \n$(mpc | head -n 1)?"&lt;br /&gt;&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: red; font-size: x-small;"&gt;#If Yes, then 0 is returned, else 1&lt;br /&gt;reply=$(echo $?)&lt;br /&gt;&lt;br /&gt;if [[ reply -eq 0 ]];then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; song_to_remove=$(mpc | head -n 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; playlist_pos=$(mpc -f %position% | head -n 1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Delete the song&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; rm "$(mpc -f %file% | head -n 1 | sed 's/^/\/media\/Data\/mpdLibrary\//')"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Remove the song from playlist&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; mpc del $playlist_pos&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Write to log file&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; echo "[`date`] -&amp;gt; --$song_to_remove-- is now deleted..." &amp;gt;&amp;gt; ~/.mpdremove.log&lt;br /&gt;fi&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Here, I have my music directory as /media/Data/mpdLibrary, change it according to your needs..&lt;br /&gt;Save the above script in your home directory with name, lets say removesong.sh and then make it executable by&lt;br /&gt;&lt;blockquote&gt;$chmod +x removesong.sh&lt;/blockquote&gt;You can assign the script to Shortcut keys according to your desktop environment. (In KDE 4.6, its in System Settings-&amp;gt;Shortcuts &amp;amp; Gestures).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8062460255501105851?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8062460255501105851/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2011/02/delete-currently-playing-song-in-mpd.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8062460255501105851'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8062460255501105851'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2011/02/delete-currently-playing-song-in-mpd.html' title='Delete a currently playing song in mpd'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8222949357634925184</id><published>2010-12-03T21:20:00.002+05:30</published><updated>2012-01-19T00:19:14.991+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='tata photon'/><title type='text'>Setting up Tata Photon+ on Arch Linux or any other linux (ex. Ubuntu)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;So, &amp;nbsp;setting up TATA Photon+ is easy.&lt;br /&gt;&lt;br /&gt;Most of the guides out there are for the Huawei Modem. But, at the time I bought TATA Photon+ (ie today), it came with Olive Modem V-ME101 USB Modem.&lt;br /&gt;Setting up that modem is pretty straight forward. I didnt try using networkmanager client nm-applet for installing as I dont use a desktop manager so I didnt have it (For the time being, I am a tiling managers fan, and now I am using dwm form suckless.org). I went the command line way.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$sudo wvdialconf /etc/wvdial.conf&lt;/blockquote&gt;Now, a new file /etc/wvdial.conf will be created. We will have to change the settings a bit.&lt;br /&gt;&lt;br /&gt;Contents of wvdial.conf file:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Init2 = ATQ0 V1 E1 S0=0 &amp;amp;C1 &amp;amp;D2 +FCLASS=0&lt;br /&gt;Modem Type = USB Modem&lt;br /&gt;Phone = #777&lt;br /&gt;Username = internet&lt;br /&gt;Init1 = ATZ&lt;br /&gt;Password = internet&lt;br /&gt;Modem = /dev/ttyUSB0&lt;br /&gt;Baud = 3250586&lt;br /&gt;Stupid Mode = 1&lt;br /&gt;&lt;br /&gt;Now, load usbserial kernel module with proper options:-&lt;br /&gt;&lt;blockquote&gt;sudo modprobe usbserial vendor=0x201e product=0x2009&lt;/blockquote&gt;If you wanna know, how I got those magical figures 0x201e blah blah.. I used lsusb to get the vendor and product id.&lt;br /&gt;&lt;br /&gt;Ok. Thats it. Now you can connect to internet using command&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;blockquote&gt;$sudo wvdial&lt;/blockquote&gt;You will be asked to enter the password, and if you dont want to enter the password everytime you connect to internet, you can add wvdial to your /etc/sudoers with NOPASSWD option.&lt;br /&gt;&lt;br /&gt;A typical sudo wvdial session looks like (Just for reference)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;shadyabhi@archlinux-N210 ~ $ sudo wvdial&lt;br /&gt;--&amp;gt; WvDial: Internet dialer version 1.61&lt;br /&gt;--&amp;gt; Cannot get information for serial port.&lt;br /&gt;--&amp;gt; Initializing modem.&lt;br /&gt;--&amp;gt; Sending: ATZ&lt;br /&gt;ATZ&lt;br /&gt;OK&lt;br /&gt;--&amp;gt; Sending: ATQ0 V1 E1 S0=0 &amp;amp;C1 &amp;amp;D2 +FCLASS=0&lt;br /&gt;ATQ0 V1 E1 S0=0 &amp;amp;C1 &amp;amp;D2 +FCLASS=0&lt;br /&gt;OK&lt;br /&gt;--&amp;gt; Modem initialized.&lt;br /&gt;--&amp;gt; Sending: ATDT#777&lt;br /&gt;--&amp;gt; Waiting for carrier.&lt;br /&gt;ATDT#777&lt;br /&gt;CONNECT 3100000&lt;br /&gt;--&amp;gt; Carrier detected. &amp;nbsp;Starting PPP immediately.&lt;br /&gt;--&amp;gt; Starting pppd at Fri Dec &amp;nbsp;3 21:27:38 2010&lt;br /&gt;--&amp;gt; Pid of pppd: 17015&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;--&amp;gt; Using interface ppp0&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;--&amp;gt; local &amp;nbsp;IP address 14.96.17.95&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;--&amp;gt; remote IP address 172.29.244.49&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;--&amp;gt; primary &amp;nbsp; DNS address 121.242.190.210&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;--&amp;gt; secondary DNS address 121.242.190.180&lt;br /&gt;--&amp;gt; pppd: I[7f]&lt;br /&gt;&lt;br /&gt;Note: modemmanager can conflict and try to intialize the modem his way, so make sure you kill that before doing all this.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8222949357634925184?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8222949357634925184/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/12/setting-up-tata-photon-on-arch-linux-or.html#comment-form' title='22 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8222949357634925184'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8222949357634925184'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/12/setting-up-tata-photon-on-arch-linux-or.html' title='Setting up Tata Photon+ on Arch Linux or any other linux (ex. Ubuntu)'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>22</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-3789821221869643148</id><published>2010-11-14T04:20:00.007+05:30</published><updated>2011-10-08T15:07:13.593+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='dwm'/><title type='text'>Get both pertag &amp; bottom stack working in dwm</title><content type='html'>After I bought my &lt;a href="http://www.bestnetbooksdeals.com/images/Samsung-N210.jpg"&gt;Samsung N210 netbook&lt;/a&gt;, even though the Indian version of this netbook comes with 2GB RAM, I thought of trying Tiling Managers about which I had been listening since long on #archlinux. &amp;nbsp;People generally use Window Managers instead if Desktop Environment because it lets you control everything using your keyboard &amp;amp; is also very low on resources.&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;div&gt;So, I started with DWM (Desktop Window Manager). The first time when I was reading about it, I could not believe what I was reading from my eyes, it was written that you have recompile every time you want to change the configuration of DWM. Changing the configuration would require changing the source code.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I kind of thought why would I use it. But, still I tried. It took me around half an hour to figure out how to configure dwm &amp;amp; basic structure of dwm.c&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I currently have dwm.c with bstack &amp;amp; pertag patch compiled. Well, if you are on this blog, you might already be having an issue of using both of these patches together.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Well, so download the source code of dwm from the &lt;a href="http://dl.suckless.org/dwm/dwm-5.8.2.tar.gz"&gt;official site&lt;/a&gt;. Also, download the two patches, &lt;a href="http://dwm.suckless.org/patches/dwm-5.8.2-bstack.diff"&gt;bstack&lt;/a&gt;&amp;nbsp;&amp;amp; &lt;a href="http://dwm.suckless.org/patches/dwm-5.8.2-pertag.diff"&gt;pertag&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To apply the patch, first unzip the dwm tar file and then copy both patched in that directory. Now, the patched and dwm.c &amp;amp; config,def.h will all be in the same directory,&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;To apply the two patch, goto that dw. directory and type:&lt;/div&gt;&lt;blockquote&gt;patch &amp;lt;&amp;nbsp;dwm-5.8.2-bstack.diff&amp;nbsp;&lt;/blockquote&gt;&lt;blockquote&gt;patch &amp;lt; dwm-5.8.2-pertag.difff&lt;/blockquote&gt;&lt;br /&gt;Now, we will have a source code that would not compile. :(. Wait dont worry, there is a solution to that.&lt;br /&gt;To make the code compilable, make sure you have not included bstack.c in your config.h ie you should not have "#include "bstack.c" in your config.h file.&lt;br /&gt;Now, put "#include "bstack.c" just after struct Monitor{ ... } in dwm.c&lt;br /&gt;Also, add the two prototypes,&lt;br /&gt;&lt;blockquote&gt;static void bstack(Monitor *m);&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span" style="-webkit-border-horizontal-spacing: 2px; -webkit-border-vertical-spacing: 2px;"&gt;static void bstackhoriz(Monitor *m);&lt;/span&gt;&lt;/blockquote&gt;in the prototype area.&lt;br /&gt;Now, the code is compilable.. :)&lt;br /&gt;&lt;br /&gt;I am in love with this dwm, this is so light. I use cairo-compmgr as my composition manager to make it soothe my eyes.&lt;br /&gt;&lt;br /&gt;Well, if you want my configuration files of dwm, here are those. I have done a lot of job configuring it for my Samsung N210. All the Fn keys, all shortcuts work perfectly with these settings.&lt;br /&gt;&lt;br /&gt;Here is my DWM screenshot :-&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_JjJOh0rb2yI/TN8a0dX3EHI/AAAAAAAABM4/9IGyx1AQqOE/s1600/2010-11-14-04-39-10.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="187" src="http://2.bp.blogspot.com/_JjJOh0rb2yI/TN8a0dX3EHI/AAAAAAAABM4/9IGyx1AQqOE/s320/2010-11-14-04-39-10.jpg" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;br /&gt;&lt;b&gt;DWM pre_startup script (startdwm.sh):-&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/bin/bash&lt;br /&gt;# Set up DE environment for apps that need one&lt;br /&gt;export DE=xfce&lt;br /&gt;&lt;br /&gt;#Enable Composition&lt;br /&gt;cairo-compmgr &amp;amp;&lt;br /&gt;&lt;br /&gt;# Autostart apps&lt;br /&gt;dropboxd &amp;amp;&lt;br /&gt;nitrogen --restore &amp;amp;&lt;br /&gt;anamnesis --start &lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;#Clipboard Manager&lt;br /&gt;&lt;br /&gt;# Start DWM and set status&lt;br /&gt;while true ; do&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;xsetroot -name "wlan0: $(/home/shadyabhi/netbook/checkwireless.sh | awk '{print $1}') | blue: $(/home/shadyabhi/netbook/checkwireless.sh | awk '{print $2}') | BAT: $( acpi -b | awk '{ print $4 }' | tr -d ',' ) | VOL: $( amixer get Master | tail -1 |&lt;br /&gt;awk '{print $4}' | tr -d '[]') | $( date +"%a %d %b @ %R" )"&lt;br /&gt;&lt;span class="Apple-tab-span" style="white-space: pre;"&gt; &lt;/span&gt;sleep 1m&lt;br /&gt;done &amp;amp;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;.xinitrc file&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/bin/sh&lt;br /&gt;#&lt;br /&gt;# ~/.xinitrc&lt;br /&gt;#&lt;br /&gt;# Executed by startx (run your window manager from here)&lt;br /&gt;&lt;br /&gt;# exec gnome-session&lt;br /&gt;# ck-launch-session startkde&lt;br /&gt;# exec startxfce4&lt;br /&gt;#DWM configuration&lt;br /&gt;&lt;br /&gt;sh $HOME/startdwm.sh &amp;amp;&lt;br /&gt;exec ck-launch-session dwm&lt;br /&gt;#ck-launch-session awesome&lt;br /&gt;&lt;br /&gt;#sh $HOME/startxmonad.sh &amp;amp;&lt;br /&gt;#ck-launch-session xmonad&lt;br /&gt;# ...or the Window Manager of your choice&lt;/pre&gt;&lt;pre class="C" name="code"&gt;&lt;/pre&gt;&lt;pre class="C" name="code"&gt;&lt;/pre&gt;&lt;blockquote&gt;config.h file &lt;a href="http://sprunge.us/jHbJ"&gt;&lt;span class="Apple-style-span" style="color: red;"&gt;here&lt;/span&gt;&lt;/a&gt;&lt;/blockquote&gt;&lt;pre class="C" name="code"&gt;&lt;div&gt;&lt;/div&gt;&lt;/pre&gt;&lt;br /&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-3789821221869643148?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/3789821221869643148/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/11/get-both-pertag-bstack-working-again-in.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3789821221869643148'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3789821221869643148'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/11/get-both-pertag-bstack-working-again-in.html' title='Get both pertag &amp; bottom stack working in dwm'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JjJOh0rb2yI/TN8a0dX3EHI/AAAAAAAABM4/9IGyx1AQqOE/s72-c/2010-11-14-04-39-10.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-3125202841271169259</id><published>2010-11-03T13:32:00.000+05:30</published><updated>2010-11-03T13:32:28.631+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='ADSL'/><category scheme='http://www.blogger.com/atom/ns#' term='Reliance'/><title type='text'>Accessing router settings from LINUX</title><content type='html'>Simply opening your browser and going to http://192.168.1.1 will not get to the settings page. Atleast that was the case with me (on Reliance ADSL with ZXDSL 831 Series).&lt;br /&gt;&lt;br /&gt;My ifconfig said:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: x-small;"&gt;&lt;br /&gt;eth0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Link encap:Ethernet&amp;nbsp; HWaddr 00:19:D1:3C:74:6E &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet addr:123.*.*.*&amp;nbsp; Bcast:123.237.135.255&amp;nbsp; Mask:255.255.248.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet6 addr: fe80::219:*:*:*/64 Scope:Link&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UP BROADCAST RUNNING MULTICAST&amp;nbsp; MTU:1500&amp;nbsp; Metric:1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX packets:10950498 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TX packets:6864372 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collisions:0 txqueuelen:1000 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX bytes:7221735642 (6887.1 Mb)&amp;nbsp; TX bytes:1314931540 (1254.0 Mb)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Interrupt:20 Memory:90300000-90320000 &lt;br /&gt;&lt;br /&gt;lo&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Link encap:Local Loopback &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet addr:127.0.0.1&amp;nbsp; Mask:255.0.0.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; inet6 addr: ::1/128 Scope:Host&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; UP LOOPBACK RUNNING&amp;nbsp; MTU:16436&amp;nbsp; Metric:1&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX packets:46637 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TX packets:46637 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; collisions:0 txqueuelen:0 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; RX bytes:4759514 (4.5 Mb)&amp;nbsp; TX bytes:4759514 (4.5 Mb)&lt;/span&gt;&lt;/blockquote&gt;&amp;nbsp;So, that means that my ip shown is not a LOCAL address (I am not behind NAT).&lt;br /&gt;&lt;br /&gt;To access router which is probably 192.168.1.1, I would have to be in the same class of ip address as the router. Thats it.&lt;br /&gt;&lt;br /&gt;A quick command to do that is:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: x-small;"&gt;sudo ifconfig eth0:1 192.168.1.10 netmask 255.255.255.0&lt;/span&gt;&lt;/blockquote&gt;Now, my ifconfig looks something like:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;eth0      Link encap:Ethernet  HWaddr 00:19:D1:3C:74:6E  &lt;br /&gt;          inet addr:123.237.*.*  Bcast:123.237.135.255  Mask:255.255.248.0&lt;br /&gt;          inet6 addr: fe80::219:*:*:*/64 Scope:Link&lt;br /&gt;          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1&lt;br /&gt;          RX packets:8628562 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;          TX packets:5663529 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;          collisions:0 txqueuelen:1000 &lt;br /&gt;          RX bytes:6011401968 (5732.9 Mb)  TX bytes:1037953220 (989.8 Mb)&lt;br /&gt;          Interrupt:20 Memory:90300000-90320000 &lt;br /&gt;&lt;br /&gt;eth0:1    Link encap:Ethernet  HWaddr 00:19:D1:3C:74:6E  &lt;br /&gt;          inet addr:192.168.1.10  Bcast:192.168.1.255  Mask:255.255.255.0&lt;br /&gt;          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1&lt;br /&gt;          Interrupt:20 Memory:90300000-90320000 &lt;br /&gt;&lt;br /&gt;lo        Link encap:Local Loopback  &lt;br /&gt;          inet addr:127.0.0.1  Mask:255.0.0.0&lt;br /&gt;          inet6 addr: ::1/128 Scope:Host&lt;br /&gt;          UP LOOPBACK RUNNING  MTU:16436  Metric:1&lt;br /&gt;          RX packets:37184 errors:0 dropped:0 overruns:0 frame:0&lt;br /&gt;          TX packets:37184 errors:0 dropped:0 overruns:0 carrier:0&lt;br /&gt;          collisions:0 txqueuelen:0 &lt;br /&gt;          RX bytes:3305323 (3.1 Mb)  TX bytes:3305323 (3.1 Mb)&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Now, that I am in the class &amp;amp; my routing table looks like:-&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;shadyabhi@ArchLinux ~ $ ip route show&lt;br /&gt;192.168.1.0/24 dev eth0  proto kernel  scope link  src 192.168.1.10 &lt;br /&gt;123.237.128.0/21 dev eth0  proto kernel  scope link  src 123.237.133.161  metric 1 &lt;br /&gt;default via 123.237.128.1 dev eth0  proto static &lt;br /&gt;shadyabhi@ArchLinux ~ $ &lt;/pre&gt;&lt;/blockquote&gt;&amp;nbsp;Thats it. Now, you can access your router page through browser.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-3125202841271169259?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/3125202841271169259/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/11/accessing-router-settings-from-linux.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3125202841271169259'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3125202841271169259'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/11/accessing-router-settings-from-linux.html' title='Accessing router settings from LINUX'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-3158503381001303680</id><published>2010-10-18T21:37:00.000+05:30</published><updated>2011-10-08T15:08:30.928+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='process name'/><category scheme='http://www.blogger.com/atom/ns#' term='prctl'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Changing process name of python script in linux</title><content type='html'>Whenever you run a python script, it comes with the name "python" in system monitor, which is not very desirable. &lt;br /&gt;The well know way of changing name of process in C is changing the argv[0] value. But, that wont work in python.&lt;br /&gt;&lt;br /&gt;To change the process name is python, you have no other way but to load the shared C library and call its function. Well, to do so, we are provided with ctypes in python.&lt;br /&gt;&lt;br /&gt;Here is the function which will takes its argument as the new name. I used "man prctl" &amp;amp; content of this "/usr/include/linux/prctl.h" &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;def set_procname(newname):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; from ctypes import cdll, byref, create_string_buffer&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; libc = cdll.LoadLibrary('libc.so.6')&amp;nbsp;&amp;nbsp;&amp;nbsp; #Loading a 3rd party library C&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; buff = create_string_buffer(len(newname)+1) #Note: One larger than the name (man prctl says that)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; buff.value = newname &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Null terminated string as it should be&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; libc.prctl(15, byref(buff), 0, 0, 0) #Refer to "#define" of "/usr/include/linux/prctl.h" for the misterious value 16 &amp;amp; arg[3..5] are zero as the man page says.&lt;/pre&gt;&lt;br /&gt;All the relevant documentation is available here http://docs.python.org/library/ctypes.html &amp;amp; rest is written as comments..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-3158503381001303680?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/3158503381001303680/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/10/changing-process-name-of-python-script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3158503381001303680'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3158503381001303680'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/10/changing-process-name-of-python-script.html' title='Changing process name of python script in linux'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-5439854005784100960</id><published>2010-10-18T01:19:00.001+05:30</published><updated>2010-10-18T01:21:02.136+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='clipboard'/><category scheme='http://www.blogger.com/atom/ns#' term='sprunge'/><category scheme='http://www.blogger.com/atom/ns#' term='pastebin'/><title type='text'>Nice pastebin replacement</title><content type='html'>I just came across this site http://sprunge.us/&lt;br /&gt;&lt;br /&gt;To make things easier, append this to your .bashrc file:-&lt;br /&gt;&lt;blockquote&gt;alias psprunge="curl -s -F 'sprunge=&amp;lt;-' http://sprunge.us | xclip -i -selection clipboard" &lt;/blockquote&gt;Now, to post something (make sure you open the new terminal):-&lt;br /&gt;&lt;blockquote&gt;$cat foo.txt | psprunge&lt;br /&gt;$ls | psprunge&lt;/blockquote&gt;The URL will be &lt;b&gt;automatically copied to yout clipboard&lt;/b&gt;. And if suppose the URL is &lt;b&gt;http://sprunge.us/XhaL&lt;/b&gt; and you want to apply "python" syntax formatting, simply change the URL to &lt;b&gt;http://sprunge.us/XhaL?python&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Nice &amp;amp; easy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-5439854005784100960?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/5439854005784100960/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/10/nice-pastebin-replacement.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/5439854005784100960'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/5439854005784100960'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/10/nice-pastebin-replacement.html' title='Nice pastebin replacement'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-1615018904137375819</id><published>2010-10-15T23:52:00.001+05:30</published><updated>2011-10-08T15:09:03.200+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='cronjob'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><title type='text'>Debugging the cronjobs</title><content type='html'>Cronjobs are famous to run successfully from shell but failing to run as a cronjob.&lt;br /&gt;Well from my experience and looking at the issues at stackoverflow.com and superuser.com, I can say that there are mainly two issues:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;cronjob have their own environment variables. for ex. they dont have PATH variables.&lt;/li&gt;&lt;li&gt;Other issues happen when you try to run a GUI app in a cronjob to give a high priority alert to a user.&lt;/li&gt;&lt;/ul&gt;So, basically you should always run a binary by giving its full path else its very likely that it will fail. You should also will have to the display when running a GUI app. For ex, to run a kdialog:&lt;br /&gt;&lt;blockquote&gt;DISPLAY:0 /usr/bin/kdialog -title "Test" --msgbox "Test message"&amp;nbsp;&lt;/blockquote&gt;Well, that was just general guidelines. So, debug a cronjob, you can modify the cronjob code like:&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/bin/bash&lt;br /&gt;{&lt;br /&gt;.&lt;br /&gt;. &lt;br /&gt;#your actual code goes here&lt;br /&gt;.&lt;br /&gt;.&lt;br /&gt;} &amp;gt;&amp;gt; /tmp/cronthatfailed.out 2&amp;gt;&amp;amp;1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That will actually redirect all the output to a file (/tmp/cronthatfailed.out) so that you can debug as to what happened. "2&amp;gt;&amp;amp;1" tells STDERR to redirect to STDOUT. Well, for information, in unix, 2 represents STDERR, 1 represents STDOUT and 0 represents STDIN. &lt;br /&gt;&lt;br /&gt;So, that it. Next time your cronjob fail, just follow the above method. That always work for me.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-1615018904137375819?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/1615018904137375819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/10/debugging-cronjobs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1615018904137375819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1615018904137375819'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/10/debugging-cronjobs.html' title='Debugging the cronjobs'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8394728678382470648</id><published>2010-10-13T23:43:00.001+05:30</published><updated>2010-10-13T23:46:06.144+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='character encoding'/><category scheme='http://www.blogger.com/atom/ns#' term='eiskaltdcpp'/><category scheme='http://www.blogger.com/atom/ns#' term='dcpp'/><title type='text'>Cannot download file list of DC users and PM few users</title><content type='html'>A minor issue but its not mentioned anywhere so I decided of writing about it. &lt;br /&gt;&lt;br /&gt;Linux users may come accross an issue of not able to download from some users and also that their PM dont reach to some users. That happens due to the mismatch between the character encoding used by your client (UTF-8) &amp;amp; that of the HUB (if on windows, uses CP1252).&lt;br /&gt;&lt;br /&gt;In my case, the HUB server runs on windows machine so they were using CP1252 encoding and I use linux, which uses UTF-8. So, there is a mismatch here.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Changing the character encoding in settings of eiskaltdcpp solved the issue.&lt;/blockquote&gt;Below screenshots show you where do those settings lie in Eiskaltdcpp (Its my favourite dc client on linux).&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_JjJOh0rb2yI/TLX2fGe-zWI/AAAAAAAABMw/mqvPWj4P1L0/s1600/eiskaltdcpp1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://1.bp.blogspot.com/_JjJOh0rb2yI/TLX2fGe-zWI/AAAAAAAABMw/mqvPWj4P1L0/s200/eiskaltdcpp1.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_JjJOh0rb2yI/TLX2p_4rlZI/AAAAAAAABM0/tcQMdg1E4uY/s1600/eiskaltdcpp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="125" src="http://2.bp.blogspot.com/_JjJOh0rb2yI/TLX2p_4rlZI/AAAAAAAABM0/tcQMdg1E4uY/s200/eiskaltdcpp.png" width="200" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8394728678382470648?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8394728678382470648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/10/cannot-download-file-list-of-dc-users.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8394728678382470648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8394728678382470648'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/10/cannot-download-file-list-of-dc-users.html' title='Cannot download file list of DC users and PM few users'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JjJOh0rb2yI/TLX2fGe-zWI/AAAAAAAABMw/mqvPWj4P1L0/s72-c/eiskaltdcpp1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-4408331493901935198</id><published>2010-10-13T12:27:00.002+05:30</published><updated>2011-10-08T15:09:51.887+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='curl'/><category scheme='http://www.blogger.com/atom/ns#' term='cronjob'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='crontab'/><title type='text'>Guide to add a cronjob - Simplified!</title><content type='html'>So, whats cronjob? Its basically used to run periodic tasks on linux. System administrators use it for making backups, log rotations, etc..&lt;br /&gt;&lt;br /&gt;I will deal with dcron. Its the default that comes with Arch Linux, so I am going to stick with that.&lt;br /&gt;At the end of the post, I will add a script to cronjon that &lt;b&gt;checks on a webpage for update and alerts the user.&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So, to see the list of current cronjobs, you simply do&lt;br /&gt;&lt;blockquote&gt;$crontab -l&lt;/blockquote&gt;Now, each user can has its own set of cronjobs. It all depends as to with what user previlidge, you are running &lt;b&gt;crontab&lt;/b&gt;. On my machine, when I did &lt;b&gt;$crontab -l&lt;/b&gt;, I just got an open text fill with nothing in it. Thats the case, all the cronjobs on my machine were running with root prevelidge.&lt;br /&gt;&lt;br /&gt;So, as I said earlier, too see the cronjobs of root, you have to do:-&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: xx-small;"&gt;&lt;b&gt;shadyabhi@ArchLinux ~ $ sudo crontab -l&lt;br /&gt;Password: &lt;br /&gt;# root crontab&lt;br /&gt;# DO NOT EDIT THIS FILE MANUALLY! USE crontab -e INSTEAD&lt;br /&gt;&lt;br /&gt;# man 1 crontab for acceptable formats:&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;minute&gt; &lt;hour&gt; &lt;day&gt; &lt;month&gt; &lt;dow&gt; &lt;tags and="" command=""&gt;&lt;br /&gt;#&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;@freq&amp;gt; &lt;tags and="" command=""&gt;&lt;br /&gt;&lt;br /&gt;#SYSTEM DAILY/WEEKLY/... FOLDERS&lt;br /&gt;@hourly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID=sys-hourly&amp;nbsp;&amp;nbsp; /usr/sbin/run-cron /etc/cron.hourly&lt;br /&gt;@daily&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID=sys-daily&amp;nbsp;&amp;nbsp;&amp;nbsp; /usr/sbin/run-cron /etc/cron.daily&lt;br /&gt;@weekly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID=sys-weekly&amp;nbsp;&amp;nbsp; /usr/sbin/run-cron /etc/cron.weekly&lt;br /&gt;@monthly&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; ID=sys-monthly&amp;nbsp; /usr/sbin/run-cron /etc/cron.monthly&lt;br /&gt;shadyabhi@ArchLinux ~ $ &lt;/tags&gt;&lt;/tags&gt;&lt;/dow&gt;&lt;/month&gt;&lt;/day&gt;&lt;/hour&gt;&lt;/minute&gt;&lt;/b&gt;&lt;/span&gt;&lt;/blockquote&gt;Basically an entry in crontab file looks like this:-&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="mycode"&gt;* * * * * /bin/execute/this/script.sh&lt;/pre&gt;&lt;/blockquote&gt;And the stars(*) mean:-&lt;br /&gt;&lt;blockquote&gt;&lt;ol&gt;&lt;li&gt;&lt;b&gt;every&lt;/b&gt; minute&lt;/li&gt;&lt;li&gt;of &lt;b&gt;every&lt;/b&gt; hour&lt;/li&gt;&lt;li&gt;of &lt;b&gt;every&lt;/b&gt; day of the month&lt;/li&gt;&lt;li&gt;of &lt;b&gt;every&lt;/b&gt; month&lt;/li&gt;&lt;li&gt;and &lt;b&gt;every&lt;/b&gt; day in the week.&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;&amp;nbsp;Woah!!, but my file didnt look anythin like it. It has all this "@something" in the beginning and no *(stars). Thats because there is not only one way to describe a cronjob.&lt;br /&gt;&lt;br /&gt;The formats like @hourly,&amp;nbsp; @daily, @weekly, @monthly,&amp;nbsp; @yearly, @reboot are also recognised which mean the obvious.&lt;br /&gt;So, my file says that run the command "/usr/sbin/run-cron /etc/cron.hourly" @hourly. The full path to the binary "run-cron" is given because these cronjobs dont really have a PATH variable defined. (well, it can be defined too, but why take risk). The argument to that command is a directory and all the commands in that directory are executed.&lt;br /&gt;&lt;br /&gt;Suppose, you want to run a command every 30 minutes you will write the something like &lt;b&gt;"30 * * * *"&lt;/b&gt; instead of @hourly.&lt;br /&gt;&lt;br /&gt;Lets take an example:-&lt;br /&gt;&lt;blockquote&gt;0 1 * * 1-5 /bin/execute/this/script.sh&lt;/blockquote&gt;says to run a command Mon-Friday at 1AM. That lines says that run that script.sh every 0minute,1hour,EVERY day of month, EVERY month, but only on weekdays 1 to 5. It will be run exactly at 01:00:01.&lt;br /&gt;&lt;br /&gt;Another way that crontab provides for simplicity is&lt;br /&gt;&lt;blockquote&gt;&lt;pre class="mycode"&gt;&lt;span style="color: #cc66cc;"&gt;0&lt;/span&gt;,&lt;span style="color: #cc66cc;"&gt;20&lt;/span&gt;,&lt;span style="color: #cc66cc;"&gt;&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;40&lt;/span&gt;&lt;span style="color: #cc66cc;"&gt;&lt;/span&gt; * * * * /bin/execute/this/script.sh is same as &lt;br /&gt;*/&lt;span style="color: #cc66cc;"&gt;20&lt;/span&gt; * * * * /bin/execute/this/script.sh&lt;/pre&gt;&lt;/blockquote&gt;The above lines are equivalent. They run the command at every 20 minutes of all days in any year.&lt;br /&gt;&lt;br /&gt;One more example from the manpage says:-&lt;br /&gt;&lt;blockquote&gt;&amp;nbsp;# run every two hours between 11 pm and 7 am, and again at 8 am&lt;br /&gt;&amp;nbsp;0 23-7/2,8 * * * date&lt;/blockquote&gt;I dont think, I need to explain that.&lt;br /&gt;&lt;br /&gt;So, what use it is? Well, it is very useful. Like in Arch Linux, we arch linux use it to create a Statistics page for all the arch users.&lt;br /&gt;&lt;blockquote&gt;https://www.archlinux.de/?page=Statistics &lt;/blockquote&gt;This cronjob is added as soon as you install &lt;b&gt;pkgstats&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Well, I will take one more example in which I use it. I study in a institute and all the mails that arrive for a student are collected by our hostel supervisor and then the status is posted on our intranet hostel website.&lt;br /&gt;So, we are forced to check it from time to time, and there is a chance that you can miss it because we dont have email notification for that. My roomie (&lt;a href="http://www.facebook.com/ranveer.raghuwanshi"&gt;Ranveer&lt;/a&gt;) gave me the idea of making a script that will check periodically for new mails. So, I fired up the terminal &amp;amp; decided of making a cronjob that will check for new entries added to the website and alert me with a GUI dialog as soon as I recieve the mail.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/bin/bash&lt;br /&gt;&lt;br /&gt;ROOM_NO="G104"&lt;br /&gt;&lt;br /&gt;echo `date`": " &amp;gt;&amp;gt; $HOME/.snailmailog&lt;br /&gt;&lt;br /&gt;for pg in {1..10}; &lt;br /&gt;do &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add_to_log=`curl -s "http://hostel.daiict.ac.in/index.php?option=com_eventtableedit&amp;amp;Itemid=2&amp;amp;limit=30&amp;amp;page=$pg" | html2text -nobs | grep $ROOM_NO`&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if [ $? -eq 0 ];then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; add_to_log=`echo $add_to_log | sed -e 's/^.*$ROOM_NO *//g' -e 's/ *//g' -e 's/^.//g'` #-&amp;gt;1. grep ROOM_NO -&amp;gt;2.Removing SPACES -&amp;gt;3. Remove the first Serial number (To make it a unique entry"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; grep "$add_to_log" $HOME/.snailmailog&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if [ $? -eq 1 ]&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; then&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; kdialog --display :0 --title "MAIL RECIEVED" --msgbox "$ROOM_NO mail recieved!! Rush to the supervisor. "&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; echo $add_to_log &amp;gt;&amp;gt; $HOME/.snailmailog&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; fi&lt;br /&gt;done&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I added to the cronjob with normal user and not root. So, I have only one entry for shadyabhi. This job executes every hour.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;shadyabhi@ArchLinux ~/cronjobs $ crontab -l&lt;br /&gt;#CronJobs located in $HOME/cronjobs/*&lt;br /&gt;&lt;br /&gt;0 * * * * /home/shadyabhi/cronjobs/snailmail.sh&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-4408331493901935198?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/4408331493901935198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/10/guide-to-add-cronjob-simplified.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4408331493901935198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4408331493901935198'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/10/guide-to-add-cronjob-simplified.html' title='Guide to add a cronjob - Simplified!'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-7713612332039232217</id><published>2010-10-09T15:58:00.003+05:30</published><updated>2011-10-08T20:01:49.275+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='google dictionary'/><category scheme='http://www.blogger.com/atom/ns#' term='dictionary'/><title type='text'>Google Dictionary - Command line version..</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;EDIT: Not working now due to change from the Google's side. Will fix it soon. :) &lt;br /&gt;&lt;br /&gt;Well, this is not done using google's API. Its a simple bash script that takes a word to be searched as parameter...&lt;br /&gt;&lt;br /&gt;Its a very simple bash script, nothing fancy.&lt;br /&gt;&lt;br /&gt;Steps involved in fetching the meaning:- &lt;br /&gt;&lt;ol&gt;&lt;li&gt;Use curl to fetch the page's HTML&lt;/li&gt;&lt;li&gt;Pipe it to html2text that converts to text.&lt;/li&gt;&lt;li&gt;The returned test is saved to $HOME/dict.&lt;/li&gt;&lt;li&gt;Also. a history file is made named $HOME/dict/dicthistory&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;The script saves all the meanings in /dict folder in home directory. If the folder is not present, then its created. To search for a word simply do "$dict word" &amp;amp; to delete a word, do "$dictdelete wird".&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;dict() { &lt;br /&gt;if [ ! -d $HOME/dict ];then &lt;br /&gt;mkdir $HOME/dict;&lt;br /&gt;fi&lt;br /&gt;cat $HOME/dict/dicthistory | grep " $1$" 1&amp;gt;/dev/null 2&amp;gt;/dev/null;&lt;br /&gt;if [ $? -eq 0 ]&lt;br /&gt;then&lt;br /&gt; less $HOME/dict/$1;&lt;br /&gt; return;&lt;br /&gt;fi&lt;br /&gt; echo `date`" -&amp;gt; ""$1" &amp;gt;&amp;gt; $HOME/dict/dicthistory;&lt;br /&gt; curl -s "http://www.google.com/dictionary?aq=f&amp;amp;langpair=en|en&amp;amp;q="$1"&amp;amp;hl=en" | html2text -nobs | sed '1,/^ *Dictionary\]/d' | head -n -5 &amp;gt; $HOME/dict/$1;&lt;br /&gt; stat_data=`stat $HOME/dict/$1 -t | awk '{print $2}'`&lt;br /&gt; echo -n "Bytes transferred: "&lt;br /&gt; echo $stat_data&lt;br /&gt; sleep 1;&lt;br /&gt; less $HOME/dict/$1;&lt;br /&gt; echo "::Last searched words.."&lt;br /&gt; cat $HOME/dict/dicthistory;&lt;br /&gt;}&lt;br /&gt;dictdelete()&lt;br /&gt;{&lt;br /&gt; rm $HOME/dict/$1;&lt;br /&gt; cat $HOME/dict/dicthistory | grep -v " $1$" &amp;gt; $HOME/dict/dicthistory.bk;&lt;br /&gt; mv $HOME/dict/dicthistory.bk $HOME/dict/dicthistory;&lt;br /&gt; echo ":: Requested item $1 successfully deleted";&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I appended the above code to my ~.bashrc file.&lt;/pre&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-7713612332039232217?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/7713612332039232217/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/10/google-dictionary-command-line-version.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/7713612332039232217'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/7713612332039232217'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/10/google-dictionary-command-line-version.html' title='Google Dictionary - Command line version..'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-6580062354437991540</id><published>2010-08-15T20:24:00.000+05:30</published><updated>2010-08-15T20:24:17.895+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='download'/><category scheme='http://www.blogger.com/atom/ns#' term='multiget'/><title type='text'>Multiget: Best download Manager.. (After my PATCH :P)</title><content type='html'>Multiget is the best download manager on linux with GUI.&lt;br /&gt;&lt;br /&gt;But, I found 2 issues with it.&lt;br /&gt;&lt;ol&gt;&lt;li&gt; Doesnt save the download list automatically&amp;nbsp;&lt;/li&gt;&lt;li&gt;Doesnt support URLs that are larger than 256 character.&lt;/li&gt;&lt;/ol&gt;I started the search for other download managers but didnt find anyone which actually works flawlessly and segmented downlaoding support.&lt;br /&gt;&lt;br /&gt;I also posted on forums to get the answer but no success.&lt;br /&gt;So, I took the job in my hands and created the patch myself. That solved the above two stated problems.&lt;br /&gt;&lt;br /&gt;Thats the power of open source. its FREE!! in every sense.. &lt;br /&gt;&lt;br /&gt;You can download the &lt;a href="http://docs.google.com/leaf?id=0Bz5PTCmbPL4aMThiZmIxN2UtZDVmZC00M2E3LWJjNTgtZjFjYTdlYjgyNDQ4&amp;amp;hl=en"&gt;patch &lt;/a&gt;from here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-6580062354437991540?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/6580062354437991540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/08/multiget-best-download-manager-after-my.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/6580062354437991540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/6580062354437991540'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/08/multiget-best-download-manager-after-my.html' title='Multiget: Best download Manager.. (After my PATCH :P)'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-7050626360170193004</id><published>2010-04-17T18:37:00.001+05:30</published><updated>2011-10-08T15:11:48.250+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='urllib'/><category scheme='http://www.blogger.com/atom/ns#' term='REST'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Script to update your STATUS of various social networking websites (facebook,twitter,google buzz) all at once</title><content type='html'>You might be aware of the site ping.fm. This site provides support to updating to various social networking sites by just updating at one place.&lt;br /&gt;&lt;br /&gt;So, just sign up to that service and you can sync all your posts..&lt;br /&gt;&lt;br /&gt;But, when I started using this site, I felt even logging into the site and then posting is also a long process so decided of using the ping.fm API to write a script in python to update my statuses..&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;blockquote&gt;&lt;b&gt;This post can also act as a example on how to use REST via HTTP using python..&lt;/b&gt;&lt;/blockquote&gt;&lt;/blockquote&gt;&lt;br /&gt;First of all, I looked at the documentation of the API:-&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;&lt;b&gt;user.post&lt;/b&gt; &lt;br /&gt;&lt;br /&gt;Posts a message to the user’s Ping.fm services.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;URL:&lt;/b&gt; http://api.ping.fm/v1/user.post&lt;br /&gt;&lt;b&gt;Parameters:&lt;/b&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family: Symbol;"&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;api_key&lt;/span&gt;&amp;nbsp; – Your developer's API key&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol;"&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;user_app_key &lt;/span&gt;– User’s application key&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol;"&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;post_method &lt;/span&gt;– Posting method.&amp;nbsp; Either "default", "blog", "microblog" or "status."&amp;nbsp; &lt;b&gt;Please refer to the section of this documentation that covers service method limitations.&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: Symbol;"&gt;&lt;/span&gt;&lt;span style="font-size: 10pt;"&gt;body &lt;/span&gt;– Message body&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;b&gt;Optional parameters:&lt;/b&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt; &lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;title – Title of the posted message.&amp;nbsp; This will only appear if the specified &lt;span highlight="Search"&gt;service&lt;/span&gt; supports a title field.&amp;nbsp; Otherwise, it will be discarded.&amp;nbsp; &lt;b&gt;Title is required for "blog" post method.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;&lt;span highlight="Search"&gt;service&lt;/span&gt; – A single &lt;span highlight="Search"&gt;service&lt;/span&gt; to post to.&amp;nbsp; &lt;b&gt;This used to support multiple &lt;span highlight="Search"&gt;service&lt;/span&gt;s separated by a comma.&amp;nbsp; Posting to multiple &lt;span highlight="Search"&gt;service&lt;/span&gt;s has been deprecated as of June 2008.&amp;nbsp; Posting to a single &lt;span highlight="Search"&gt;service&lt;/span&gt; is still functional.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;location &lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;–&lt;/span&gt;&lt;/span&gt; The user's current location.&lt;/li&gt;&lt;li&gt;tags &lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;–&lt;/span&gt;&lt;/span&gt; comma-separated list of tag words to include with the post.&amp;nbsp; i.e. "tag1,tag2"&lt;/li&gt;&lt;li&gt;mood &lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;– &lt;/span&gt;&lt;/span&gt;string literal mood.&amp;nbsp; i.e. "happy"&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;media &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;– base64 encoded media data.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;encoding &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;– Set to "base64" to have the API decode before posting.&amp;nbsp; Useful when posting unicode or non URL encoded data.&amp;nbsp; If set, "title", "body", "location", "tags" and "mood" parameters are expected to be base64 encoded.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;exclude &lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;–&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt; comma separated values of &lt;span highlight="Search"&gt;service&lt;/span&gt; IDs &lt;b&gt;(IDs returned from user.&lt;span highlight="Search"&gt;service&lt;/span&gt;s, user.triggers, user.latest and system.&lt;span highlight="Search"&gt;service&lt;/span&gt;s)&lt;/b&gt; to exclude from the post.&amp;nbsp; &lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;debug – Set this value to "1" to avoid posting test data.&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;checksum&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;– Set this variable to pass a data checksum to confirm that the posted data reaches the API server. &lt;b&gt;Please read the section titled "Payload Checksums" above.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;media_checksum&lt;/span&gt;&lt;/span&gt;&lt;span style="font-size: x-small;"&gt; &lt;/span&gt;&lt;span style="font-size: xx-small;"&gt;&lt;span style="font-size: x-small;"&gt;–Set this variable to compare an MD5 checksum of image data being supplied with the post update.&amp;nbsp; &lt;b&gt;Please read the subsection titled "Media Checksums" under the "Posting Media" section above.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;br /&gt;As it was written that it uses REST, doing it in python is very easy.. You just have to use urllib to do a &lt;b&gt;POST&lt;/b&gt; to the URL&amp;nbsp; &lt;b&gt;http://api.ping.fm/v1/user.post&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;The first group of parameters I have shown are the required parameters which cannot be ignored.. Looking at the DOC, there is also one more optional parameter &lt;b&gt;"debug" &lt;/b&gt;which is useful..&lt;br /&gt;&lt;br /&gt;Here is how I made the script..&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Get the APIKEY and USERKEY from the website &lt;/li&gt;&lt;li&gt;Prepare the data_to_post (Refer to the FULL DOC on what you can send..)&lt;/li&gt;&lt;li&gt;Encode it&lt;/li&gt;&lt;li&gt;Send the request&amp;nbsp; using urllib&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Usage for the script:-&lt;br /&gt;&lt;br /&gt;$./statusUpdater.py "This is a status update"&lt;br /&gt;&lt;br /&gt;to update status to all your acounts&lt;br /&gt;&lt;br /&gt;$./statusUpdater.py facebook "This is an update only to facebook"&lt;br /&gt;&lt;br /&gt;to update status of only facebook...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$./statusUpdater.py twitter "This updates twitter"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;__author__ = " Abhijeet Rastogi http://www.google.com/profiles/abhijeet.1989"&lt;br /&gt;&lt;br /&gt;from xml.etree import ElementTree&lt;br /&gt;import urllib,urllib2&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;APIURL = 'http://api.ping.fm/v1/'&lt;br /&gt;&lt;br /&gt;#EDIT THE NEXT 2 LINES ACCORDING TO YOUR ACCOUNT&lt;br /&gt;APIKEY = 'your key' #Get this from http://ping.fm/developers/&lt;br /&gt;USERKEY = "your key" #get this from http://ping.fm/key&lt;br /&gt;#######################################################&lt;br /&gt;&lt;br /&gt;#degug = 1 just dumps the XML...&lt;br /&gt;debug = 0&lt;br /&gt;&lt;br /&gt;def StatusUpdate(msg = None, service = None):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; global debug&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Status message to be updated: "+msg&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if service is not None: print "Service to update: "+service&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data_to_post = {'api_key':APIKEY,'user_app_key':USERKEY,'post_method':'default','body': msg,'debug': debug}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #If service is provided in the command line parameter, add that service in the data_to_post too...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if service is not None: data_to_post['service'] = service&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Encoding the data to send...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; data_to_post = urllib.urlencode(data_to_post)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; req = urllib2.Request(APIURL + 'user.post', data_to_post)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; response_page = urllib2.urlopen(req)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #We get the response in XML&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; responseXML = response_page.read()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #Parsinf the XML&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; result = ElementTree.XML(responseXML)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if result.attrib is not None:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if result.attrib['status'] == 'OK':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Your message has posted successfully!!!';&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Error: ' + result[2].text&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if debug: print responseXML&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #Exception is handled&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; except urllib2.URLError, e:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if hasattr(e, 'reason'):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Couldnt connect to server.'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Reason: ', e.reason&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif hasattr(e, 'code'):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print 'Error code: ', e.code&lt;br /&gt;&lt;br /&gt;if __name__ == '__main__':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (len(sys.argv) == 2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; StatusUpdate(sys.argv[1],None)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; StatusUpdate(sys.argv[2],sys.argv[1])&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-7050626360170193004?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/7050626360170193004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/04/script-to-update-your-status-of-various.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/7050626360170193004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/7050626360170193004'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/04/script-to-update-your-status-of-various.html' title='Script to update your STATUS of various social networking websites (facebook,twitter,google buzz) all at once'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-7680535934509855309</id><published>2010-04-15T16:49:00.007+05:30</published><updated>2011-10-08T15:12:31.345+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='web server'/><category scheme='http://www.blogger.com/atom/ns#' term='fork'/><category scheme='http://www.blogger.com/atom/ns#' term='assignment'/><title type='text'>A Very Simple HTTP Server writen in C</title><content type='html'>This is a part of the semester assignment. I felt like sharing it because I couldnt find any simple code like this on internet..&lt;br /&gt;&lt;br /&gt;I have just edited the code to meet my requirements, originally it was made by my friend.. This code simply creates a web server with root in the current working directory and default port as 10000..&lt;br /&gt;Can handle a maximum of 1000 clients.. fork() is used to handle each clients. Not a very efficient way if the number of clients increase but its a basic example to how you how to implement a simple HTTP Server.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_JjJOh0rb2yI/S8b4RYM2R7I/AAAAAAAABK8/oy8KqWKKALs/s1600/Screenshot-1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_JjJOh0rb2yI/S8b4RYM2R7I/AAAAAAAABK8/oy8KqWKKALs/s320/Screenshot-1.png" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;/*&lt;br /&gt;AUTHOR: Abhijeet Rastogi (http://www.google.com/profiles/abhijeet.1989)&lt;br /&gt;&lt;br /&gt;This is a very simple HTTP server. Default port is 10000 and ROOT for the server is your current working directory..&lt;br /&gt;&lt;br /&gt;You can provide command line arguments like:- $./a.aout -p [port] -r [path]&lt;br /&gt;&lt;br /&gt;for ex. &lt;br /&gt;$./a.out -p 50000 -r /home/&lt;br /&gt;to start a server at port 50000 with root directory as "/home"&lt;br /&gt;&lt;br /&gt;$./a.out -r /home/shadyabhi&lt;br /&gt;starts the server at port 10000 with ROOT as /home/shadyabhi&lt;br /&gt;&lt;br /&gt;*/&lt;br /&gt;&lt;br /&gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include&amp;lt;string.h&amp;gt;&lt;br /&gt;#include&amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include&amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include&amp;lt;sys/types.h&amp;gt;&lt;br /&gt;#include&amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;#include&amp;lt;sys/socket.h&amp;gt;&lt;br /&gt;#include&amp;lt;arpa/inet.h&amp;gt;&lt;br /&gt;#include&amp;lt;netdb.h&amp;gt;&lt;br /&gt;#include&amp;lt;signal.h&amp;gt;&lt;br /&gt;#include&amp;lt;fcntl.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define CONNMAX 1000&lt;br /&gt;#define BYTES 1024&lt;br /&gt;&lt;br /&gt;char *ROOT;&lt;br /&gt;int listenfd, clients[CONNMAX];&lt;br /&gt;void error(char *);&lt;br /&gt;void startServer(char *);&lt;br /&gt;void respond(int);&lt;br /&gt;&lt;br /&gt;int main(int argc, char* argv[])&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct sockaddr_in clientaddr;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; socklen_t addrlen;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char c;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Default Values PATH = ~/ and PORT=10000&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char PORT[6];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ROOT = getenv("PWD");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; strcpy(PORT,"10000");&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int slot=0;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Parsing the command line arguments&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while ((c = getopt (argc, argv, "p:r:")) != -1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; switch (c)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case 'r':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ROOT = malloc(strlen(optarg));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; strcpy(ROOT,optarg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case 'p':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; strcpy(PORT,optarg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; case '?':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr,"Wrong arguments given!!!\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; default:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Server started at port no. %s%s%s with root directory as %s%s%s\n","\033[92m",PORT,"\033[0m","\033[92m",ROOT,"\033[0m");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // Setting all elements to -1: signifies there is no client connected&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int i;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (i=0; i&amp;lt;CONNMAX; i++)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; clients[i]=-1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; startServer(PORT);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // ACCEPT connections&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; while (1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; addrlen = sizeof(clientaddr);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; clients[slot] = accept (listenfd, (struct sockaddr *) &amp;amp;clientaddr, &amp;amp;addrlen);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (clients[slot]&amp;lt;0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; error ("accept() error");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if ( fork()==0 )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; respond(slot);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; while (clients[slot]!=-1) slot = (slot+1)%CONNMAX;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//start server&lt;br /&gt;void startServer(char *port)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; struct addrinfo hints, *res, *p;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // getaddrinfo for host&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset (&amp;amp;hints, 0, sizeof(hints));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hints.ai_family = AF_INET;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hints.ai_socktype = SOCK_STREAM;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; hints.ai_flags = AI_PASSIVE;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (getaddrinfo( NULL, port, &amp;amp;hints, &amp;amp;res) != 0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; perror ("getaddrinfo() error");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // socket and bind&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for (p = res; p!=NULL; p=p-&amp;gt;ai_next)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; listenfd = socket (p-&amp;gt;ai_family, p-&amp;gt;ai_socktype, 0);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (listenfd == -1) continue;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if (bind(listenfd, p-&amp;gt;ai_addr, p-&amp;gt;ai_addrlen) == 0) break;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (p==NULL)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; perror ("socket() or bind()");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; freeaddrinfo(res);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; // listen for incoming connections&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( listen (listenfd, 1000000) != 0 )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; perror("listen() error");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; exit(1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;//client connection&lt;br /&gt;void respond(int n)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; char mesg[99999], *reqline[3], data_to_send[BYTES], path[99999];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int rcvd, fd, bytes_read;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; memset( (void*)mesg, (int)'\0', 99999 );&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; rcvd=recv(clients[n], mesg, 99999, 0);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (rcvd&amp;lt;0)&amp;nbsp;&amp;nbsp;&amp;nbsp; // receive error&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr,("recv() error\n"));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else if (rcvd==0)&amp;nbsp;&amp;nbsp;&amp;nbsp; // receive socket closed&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; fprintf(stderr,"Client disconnected upexpectedly.\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&amp;nbsp;&amp;nbsp;&amp;nbsp; // message received&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf("%s", mesg);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; reqline[0] = strtok (mesg, " \t\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if ( strncmp(reqline[0], "GET\0", 4)==0 )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; reqline[1] = strtok (NULL, " \t");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; reqline[2] = strtok (NULL, " \t\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if ( strncmp( reqline[2], "HTTP/1.0", 8)!=0 &amp;amp;&amp;amp; strncmp( reqline[2], "HTTP/1.1", 8)!=0 )&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; write(clients[n], "HTTP/1.0 400 Bad Request\n", 25);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if ( strncmp(reqline[1], "/\0", 2)==0 )&lt;br /&gt;&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; reqline[1] = "/index.html";&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //Because if no file is specified, index.html will be opened by default (like it happens in APACHE...&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; strcpy(path, ROOT);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; strcpy(&amp;amp;path[strlen(ROOT)], reqline[1]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; printf("file: %s\n", path);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if ( (fd=open(path, O_RDONLY))!=-1 )&amp;nbsp;&amp;nbsp;&amp;nbsp; //FILE FOUND&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&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; send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0);&lt;br /&gt;&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; while ( (bytes_read=read(fd, data_to_send, BYTES))&amp;gt;0 )&lt;br /&gt;&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; write (clients[n], data_to_send, bytes_read);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else&amp;nbsp;&amp;nbsp;&amp;nbsp; write(clients[n], "HTTP/1.0 404 Not Found\n", 23); //FILE NOT FOUND&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; //Closing SOCKET&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; shutdown (clients[n], SHUT_RDWR); &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; //All further send and recieve operations are DISABLED...&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; close(clients[n]);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; clients[n]=-1;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-7680535934509855309?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/7680535934509855309/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/04/very-simple-http-server-writen-in-c.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/7680535934509855309'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/7680535934509855309'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/04/very-simple-http-server-writen-in-c.html' title='A Very Simple HTTP Server writen in C'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JjJOh0rb2yI/S8b4RYM2R7I/AAAAAAAABK8/oy8KqWKKALs/s72-c/Screenshot-1.png' height='72' width='72'/><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-3412674773021995723</id><published>2010-04-12T02:36:00.001+05:30</published><updated>2011-10-08T15:12:57.009+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='goo.gl'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Google URL shortener API</title><content type='html'>On the official site, its written that you can use goo.gl with google products only. So, the site actually doesnt provide any API for getting shortened URLs.&lt;br /&gt;&lt;br /&gt;Here is a very very simple python code that you can use to get shortened URLs. May be I shouldnt blog this bcos its extremely simple but still you dont find while searching on google, so I thought of sharing it.. It may be of help to someone.. :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;&amp;nbsp;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;import urllib&lt;br /&gt;&lt;br /&gt;SHORTNER_URL = "http://ggl-shortener.appspot.com/"&lt;br /&gt;if sys.argv[1].count('http://') is 0:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;URL_TO_SHORTEN = urllib.urlencode({'url':"http://"+sys.argv[1]})&lt;br /&gt;else: &amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;URL_TO_SHORTEN = urllib.urlencode({'url':sys.argv[1]})&lt;br /&gt;&lt;br /&gt;url = SHORTNER_URL+"?"+URL_TO_SHORTEN&lt;br /&gt;print "Sending URL: "+url&lt;br /&gt;&lt;br /&gt;f = urllib.urlopen(url)&lt;br /&gt;&lt;br /&gt;print "Shortened URL: "+f.read()[14:-2]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Usage:-&lt;br /&gt;&lt;blockquote&gt;shadyabhi@shadyabhi-desktop:~$ ./url_shortner.py linux-junky.blogspot.com&lt;br /&gt;Sending URL: http://ggl-shortener.appspot.com/?url=http%3A%2F%2Flinux-junky.blogspot.com&lt;br /&gt;Shortened URL: http://goo.gl/Sn3x&lt;br /&gt;shadyabhi@shadyabhi-desktop:~$ &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-3412674773021995723?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/3412674773021995723/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/04/google-url-shortner-api.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3412674773021995723'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3412674773021995723'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/04/google-url-shortner-api.html' title='Google URL shortener API'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-590701543737300539</id><published>2010-04-06T18:42:00.001+05:30</published><updated>2010-04-06T18:43:36.939+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='iPod'/><category scheme='http://www.blogger.com/atom/ns#' term='iPod Manager'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>The iPod Manager(Floola) on linux that actually works</title><content type='html'>Songbird used to work almost perfectly till version 1.2 but now it has stopped working (since 1.4.2) and they have also stopped maintaining the addon.. :X&lt;br /&gt;&lt;br /&gt;i tried using gtkpod but donno for what reason, it didnt work for me.&lt;br /&gt;&lt;br /&gt;The only software that worked is Floola. The better part is that it also copied the artwork and also lyrics which songbird didn't do. Though it sometimes fails to do so (the issue is with artwork and lyrics, &lt;b&gt;the song is copied just fine&lt;/b&gt;)!! But, I am satisfied that atleast I can transfer songs to my iPod without booting windows through Virtual Box.&lt;br /&gt;&lt;br /&gt;When I start the software, the iPod is detected but I get an error saying that "You dont have write access to the iPod". For that reason, I had to run it as root.&lt;br /&gt;&lt;br /&gt;I tried using it on Ubuntu 9.10 64-bit with iPod nano second generation and it works just fine. &lt;br /&gt;&lt;br /&gt;You can download the &lt;a href="http://download.schoonzie.com/Floola-linux.tar.gz"&gt;software from here&lt;/a&gt;..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-590701543737300539?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/590701543737300539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/04/ipod-manager-on-linux-that-actually.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/590701543737300539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/590701543737300539'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/04/ipod-manager-on-linux-that-actually.html' title='The iPod Manager(Floola) on linux that actually works'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-3596821909126293989</id><published>2010-03-19T19:36:00.003+05:30</published><updated>2010-03-19T21:45:47.277+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='sms notification'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='webmail'/><title type='text'>Automatic SMS updates for new mails on an IMAP account.</title><content type='html'>I recently made a script that sends instant notifications to my mobile whenever I receive a new mail on any IMAP account.&lt;br /&gt;&lt;br /&gt;I am sharing this script because it can help you learn how to retrieve new mails from an IMAP server and also send sms notifications.&lt;br /&gt;&lt;br /&gt;The script is configured with webmail account of our institute and the sms is sent to my mobile. You can open the *.py file in any text editor and change the variable values to edit it according to your needs.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;You can download the &lt;a href="http://docs.google.com/leaf?id=0Bz5PTCmbPL4aMDFkYjQzYzktZDczMS00NmIxLTg2OTgtNjYyNDJjNmU4ZmYz&amp;amp;hl=en"&gt;source code here&lt;/a&gt;.&amp;nbsp;&lt;/blockquote&gt;Just make the two scrips executable &amp;amp; send run webmail.py..&lt;br /&gt;If you want to have an idea as to how I made the sms script, take a look at &lt;a href="http://linux-junky.blogspot.com/2010/03/python-script-for-sending-free-sms-in.html"&gt;my previous post.&amp;nbsp; &lt;/a&gt;&lt;br /&gt;If you have any issues, leave comments..&lt;br /&gt;Also, if the sms is not sent, checkout the method &lt;a href="http://linux-junky.blogspot.com/2010/03/python-script-for-sending-free-sms-to.html"&gt;I wrote in this post&lt;/a&gt;..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-3596821909126293989?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/3596821909126293989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/automatic-sms-updates-for-new-mails-on.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3596821909126293989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3596821909126293989'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/automatic-sms-updates-for-new-mails-on.html' title='Automatic SMS updates for new mails on an IMAP account.'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-4472373730798877375</id><published>2010-03-19T01:40:00.015+05:30</published><updated>2011-10-08T15:13:30.498+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='free sms'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Python script for sending free SMS to any mobile using way2sms.com</title><content type='html'>&lt;blockquote&gt;&lt;b&gt;NOTE: This script is not working now. Till that is fixed, refer to this link http://linux-junky.blogspot.com/2010/03/python-script-for-sending-free-sms-in.html for a perfectly working sms sending script. &lt;/b&gt;&lt;/blockquote&gt;&lt;br /&gt;You can use this site to automate sms sending on occurrence of a desired event..&lt;br /&gt;This script is similar to my earliest script, but this time it uses a different site way2sms.com..&lt;br /&gt;&lt;br /&gt;Its better than the previous scrpt because:-&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Command line parameters support is now available (ex. ./way2sms.py -h)&lt;/li&gt;&lt;li&gt;way2sms is faster than mycantos&lt;/li&gt;&lt;li&gt;The sms sent has the sender number as your number &amp;amp; not something like &lt;b&gt;"TA-Mycantos"&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;This time I also had to include the feature of urlencode to encode my message bcos this was the way the did on its end while doing POST form..&lt;br /&gt;&lt;br /&gt;Also, if the script doesnt work for you, install the addon &lt;b&gt;"View HTTP Headers" in firefox&lt;/b&gt; and login to way2sms and goto send sms page.. Enter the mobile number to send and message text. &lt;b&gt;Before pressing send&lt;/b&gt;, goto tools-&amp;gt; View HTTP Headers, to show the sidebar &amp;amp; check that the number in the script matches to that shown by http header.&amp;nbsp; For me it was &lt;b&gt;750000&lt;/b&gt;, for my friend it was &lt;b&gt;950000&lt;/b&gt;. So, this varies sometimes and this is done by the way2sms to avoid making of scripts like these.. In the script, this value is set to &lt;b&gt;950000&lt;/b&gt;..&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;/div&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://4.bp.blogspot.com/_JjJOh0rb2yI/S6OYxX55S5I/AAAAAAAABK0/Lkc2BpxzllM/s1600-h/sendsms.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://4.bp.blogspot.com/_JjJOh0rb2yI/S6OYxX55S5I/AAAAAAAABK0/Lkc2BpxzllM/s320/sendsms.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If you want to have an idea as to how can script like this be made, take a look at &lt;a href="http://linux-junky.blogspot.com/2010/03/python-script-for-sending-free-sms-in.html"&gt;my previous post.&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I have checked this script on LINUX with python 2.6 and it works fine.. If you have any problem, feel free to leave comments...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;__author__ = """&lt;br /&gt;NAME: Abhijeet Rastogi (shadyabhi)&lt;br /&gt;Profile: http://www.google.com/profiles/abhijeet.1989&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;import cookielib&lt;br /&gt;import urllib2&lt;br /&gt;from getpass import getpass&lt;br /&gt;import sys&lt;br /&gt;from urllib import urlencode&lt;br /&gt;from getopt import getopt&lt;br /&gt;&lt;br /&gt;ask_username = True&lt;br /&gt;ask_password = True&lt;br /&gt;ask_message = True&lt;br /&gt;ask_number = True&lt;br /&gt;&lt;br /&gt;def Usage():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print '\t-h, --help:&amp;nbsp; View help'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print '\t-u, --username: Username'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print '\t-p, --password: Password'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print '\t-n, --number: numbber to send the sms'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print '\t-m, --message: Message to send'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit(1)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;opts, args = getopt(sys.argv[1:], 'u:p:m:n:h',["username=","password=","message=","number=","help"])&lt;br /&gt;&lt;br /&gt;for o,v in opts:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if o in ("-h", "--help"):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Usage()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif o in ("-u", "--username"):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; username = v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ask_username = False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif o in ("-p", "--password"):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; passwd = v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ask_password = False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif o in ("-m", "--message"):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; message = v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ask_message = False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif o in ("-n", "--number"):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; number = v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; ask_number = False&lt;br /&gt;&lt;br /&gt;#Credentials taken here&lt;br /&gt;if ask_username: username = raw_input("Enter USERNAME: ")&lt;br /&gt;if ask_password: passwd = getpass()&lt;br /&gt;if ask_message: message = raw_input("Enter Message: ")&lt;br /&gt;if ask_number: number = raw_input("Enter Mobile number: ")&lt;br /&gt;&lt;br /&gt;#Logging into the SMS Site&lt;br /&gt;url = 'http://wwwg.way2sms.com//auth.cl'&lt;br /&gt;data = 'username='+username+'&amp;amp;password='+passwd+'&amp;amp;Submit=Sign+in'&lt;br /&gt;&lt;br /&gt;#Remember, Cookies are to be handled&lt;br /&gt;cj = cookielib.CookieJar()&lt;br /&gt;opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))&lt;br /&gt;&lt;br /&gt;# To fool way2sms as if a Web browser is visiting the site&lt;br /&gt;opener.addheaders = [('User-Agent','Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0')]&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; usock = opener.open(url, data)&lt;br /&gt;except IOError:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Check your internet connection"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit(1)&lt;br /&gt;&lt;br /&gt;#urlencode performed.. Because it was done by the site as i checked through HTTP headers&lt;br /&gt;&lt;br /&gt;message = urlencode({'message':message})&lt;br /&gt;message = message[message.find("=")+1:]&lt;br /&gt;&lt;br /&gt;#SMS sending&lt;br /&gt;send_sms_url = 'http://wwwg.way2sms.com//FirstServletsms?custid='&lt;br /&gt;#Check this line with HTTP Headers, if script is not working&lt;br /&gt;send_sms_data = 'custid=undefined&amp;amp;HiddenAction=instantsms&amp;amp;Action=custfrom950000&amp;amp;login=&amp;amp;pass=&amp;amp;MobNo='+number+'&amp;amp;textArea='+message&lt;br /&gt;opener.addheaders = [('Referer','http://wwwg.way2sms.com//jsp/InstantSMS.jsp?val=0')]&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sms_sent_page = opener.open(send_sms_url,send_sms_data)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; inp = open("log.html","w")&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; inp.write(sms_sent_page.read())&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; inp.close()&lt;br /&gt;&lt;br /&gt;except IOError:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Check your internet connection( while sending sms)"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit(1)&lt;br /&gt;print "SMS sent!!!"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-4472373730798877375?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/4472373730798877375/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/python-script-for-sending-free-sms-to.html#comment-form' title='37 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4472373730798877375'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4472373730798877375'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/python-script-for-sending-free-sms-to.html' title='Python script for sending free SMS to any mobile using way2sms.com'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_JjJOh0rb2yI/S6OYxX55S5I/AAAAAAAABK0/Lkc2BpxzllM/s72-c/sendsms.jpg' height='72' width='72'/><thr:total>37</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-897517357900562141</id><published>2010-03-18T16:49:00.004+05:30</published><updated>2011-10-08T15:13:47.671+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='mycantos'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='free sms'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Python Script for sending free sms in INDIA using mycantos (www.mycantos.com)</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;i had this thing in mind since long.. I had searched a lot on google but couldnt find one..&amp;nbsp; &lt;b&gt;So, I decided of making my own.. :)&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;At the&lt;b&gt; &lt;/b&gt;end of the page, you will have an idea of:-&lt;br /&gt;&lt;ul&gt;&lt;li&gt;How to fetch pages in python&lt;/li&gt;&lt;li&gt;Handling cookies while fetching pages&lt;/li&gt;&lt;li&gt;Do GET &amp;amp; POST FORMS using python &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;I decided to use &lt;b&gt;python&lt;/b&gt; for making the script because I just love python.&lt;br /&gt;&lt;br /&gt;For making the script, I used &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3829"&gt;Live HTTP Headers&lt;/a&gt; to get the info about the GET &amp;amp; POSTs being performed while running the site..&lt;br /&gt;&lt;br /&gt;When I logged into the page of mycantos, i got the following in mycantos....&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;http://www.mycantos.com/ &lt;br /&gt;&lt;br /&gt;POST / HTTP/1.1 &lt;br /&gt;Host: www.mycantos.com &lt;br /&gt;User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0 &lt;br /&gt;Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 &lt;br /&gt;Accept-Language: en-us,en;q=0.5 &lt;br /&gt;Accept-Encoding: gzip,deflate &lt;br /&gt;Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7 &lt;br /&gt;Keep-Alive: 300 &lt;br /&gt;Connection: keep-alive &lt;br /&gt;Referer: http://www.mycantos.com/ &lt;br /&gt;Cookie: __utma=18572837.1612947254.1268907002.1268907002.1268909453.2; __utmc=18572837; __utmz=18572837.1268907002.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); username=shadyabhi; __utmb=18572837.4.10.1268909453; PHPSESSID=uevm8nnr6vcf8tui70nc419ac4 &lt;br /&gt;Content-Type: application/x-www-form-urlencoded &lt;br /&gt;Content-Length: 49 &lt;br /&gt;username=shadyabhi&amp;amp;password=mypassissecret&amp;amp;checklogin=1 &lt;br /&gt;HTTP/1.0 302 Found &lt;br /&gt;Server: nginx/0.6.34 &lt;br /&gt;Date: Thu, 18 Mar 2010 10:52:06 GMT &lt;br /&gt;Content-Type: text/html; charset=UTF-8 &lt;br /&gt;Location: http://www.mycantos.com/myAccount.php &lt;br /&gt;Connection: close &lt;br /&gt;X-Powered-By: PHP/5.2.9 &lt;br /&gt;Expires: Thu, 19 Nov 1981 08:52:00 GMT &lt;br /&gt;Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 &lt;br /&gt;Pragma: no-cache &lt;br /&gt;Set-Cookie: PHPSESSID=n9apaivcsd09rht5459hvb6r23; path=/; domain=.mycantos.com &lt;br /&gt;Set-Cookie: username=shadyabhi; path=/; domain=.mycantos.com &lt;br /&gt;Vary: Accept-Encoding &lt;br /&gt;Content-Encoding: gzip &lt;/blockquote&gt;So, now I know that its doing a POST to &lt;b&gt;"http://www.mycantos.com/" &lt;/b&gt;with content = &lt;b&gt;username=shadyabhi&amp;amp;password=mypassissecret&amp;amp;checklogin=1&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;So, i opened &lt;/b&gt;the python interpreter &amp;amp; wrote the following lines...&lt;br /&gt;&lt;blockquote&gt;import urllib&lt;br /&gt;url =  'http://www.mycantos.com/'&lt;br /&gt;data = 'username=shadyabhi&amp;amp;password=mypassissecret&amp;amp;checklogin=1'&lt;br /&gt;f = urllib.urlopen(url,data)&lt;/blockquote&gt;&lt;blockquote&gt;the_page = f.read() &lt;/blockquote&gt;After reading the value of the_page, I got to know the page was still not logged in. &lt;b&gt;So, I was sure that the site will not let me log in until the cookies are enabled.&amp;nbsp;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;So, I &lt;b&gt;used the cookies&lt;/b&gt; in the code for logging into the account.&lt;br /&gt;&lt;br /&gt;Next, &lt;b&gt;I faced the problem when I was sending SMS on the sendSMS.php page.&lt;/b&gt;.&lt;br /&gt;When I was doing POST on that page, I was repeatedly getting error page saying "&lt;b&gt;Missing data, Try again!!&lt;/b&gt;". After analyzing the data from "View HTTP Headers" addon, I came to know that it was required for the referrer URL to be &lt;b&gt;"http://www.mycantos.com/sendSMS.php" and a valid User-Agent.&lt;/b&gt; Otherwise, the site just wont let me send sms..&lt;br /&gt;&lt;br /&gt;The script works fine on linux with python 2.6..&lt;br /&gt;&lt;br /&gt;So, here is the script :-&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;__author__ = """&lt;br /&gt;NAME: Abhijeet Rastogi (shadyabhi)&lt;br /&gt;Profile: http://www.google.com/profiles/abhijeet.1989&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;import cookielib&lt;br /&gt;import urllib2&lt;br /&gt;from getpass import getpass&lt;br /&gt;import sys&lt;br /&gt;&lt;br /&gt;url = 'http://www.mycantos.com/'&lt;br /&gt;&lt;br /&gt;#Credentials taken here&lt;br /&gt;username = raw_input("Enter USERNAME: ")&lt;br /&gt;passwd = getpass()&lt;br /&gt;&lt;br /&gt;data = 'username='+username+'&amp;amp;password='+passwd+'&amp;amp;checklogin=1'&lt;br /&gt;cj = cookielib.CookieJar()&lt;br /&gt;opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))&lt;br /&gt;try:&lt;br /&gt;    usock = opener.open(url, data)&lt;br /&gt;except IOError:&lt;br /&gt;    print "Error fetching page www.mycantos.com\nExiting now.."&lt;br /&gt;    sys.exit()&lt;br /&gt;&lt;br /&gt;#Headers added to avoid the Missing data, try again!! error&lt;br /&gt;opener.addheaders = [('Referer','http://www.mycantos.com/sendSMS.php'),('User-Agent','Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20091020 Ubuntu/9.10 (karmic) Firefox/3.5.3 GTB7.0')]&lt;br /&gt;&lt;br /&gt;message = raw_input("Enter your message: ")&lt;br /&gt;number = raw_input("Enter mobile number: ")&lt;br /&gt;data_to_send = 'checkSMS=1&amp;amp;SMSnumber='+number+'&amp;amp;SMSmessage='+message&lt;br /&gt;url_send = "http://www.mycantos.com/sendSMStoanyone.php"&lt;br /&gt;&lt;br /&gt;#SMS send POST&lt;br /&gt;try:&lt;br /&gt;    send = opener.open(url_send,data_to_send)&lt;br /&gt;except IOError:&lt;br /&gt;    print "Error sending SMS\nExiting now.."&lt;br /&gt;    sys.exit()&lt;br /&gt;&lt;br /&gt;print "SMS SENT!!!"&lt;/pre&gt;&lt;br /&gt;Test run:-&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: xx-small;"&gt;shadyabhi@shadyabhi-desktop:~/mycantos$ ./mycantos.py&lt;br /&gt;Enter USERNAME: shadyabhi&lt;br /&gt;Password:&lt;br /&gt;Logged into the page.....&lt;br /&gt;Now, Into the SendSMS page...&lt;br /&gt;Enter your message: Hi. The sms is going to be sent&lt;br /&gt;Enter mobile number: 9510216275&lt;br /&gt;SMS SENT!!!&lt;br /&gt;shadyabhi@shadyabhi-desktop:~/mycantos$&lt;/span&gt;&lt;/blockquote&gt;Feel free to distribute the script... :)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-897517357900562141?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/897517357900562141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/python-script-for-sending-free-sms-in.html#comment-form' title='23 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/897517357900562141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/897517357900562141'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/python-script-for-sending-free-sms-in.html' title='Python Script for sending free sms in INDIA using mycantos (www.mycantos.com)'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>23</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-1300684160195158512</id><published>2010-03-13T00:53:00.000+05:30</published><updated>2010-03-13T00:53:45.724+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='mouse PS2'/><category scheme='http://www.blogger.com/atom/ns#' term='wakeup'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Disable wakeup through Mouse (PS2) on LINUX</title><content type='html'>I recently started suspending my PC. Dont know for what reason, but i never used this feature of ubuntu. But, the problem I faced was that the PC woke up whenever my MOUSE moved.&lt;br /&gt;&lt;br /&gt;On the messy table of my PC, its really difficult for me to avoid mouse movement while I do other things on the table. Like windows, LINUX doesnt have a GUI to change the settings of when to wake up the computer...&lt;br /&gt;&lt;br /&gt;To check, what waked up my PC:-&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;shadyabhi@shadyabhi-desktop:~$ cat /proc/acpi/wakeup&lt;br /&gt;Device&amp;nbsp; S-state&amp;nbsp;&amp;nbsp; Status&amp;nbsp;&amp;nbsp; Sysfs node&lt;br /&gt;SLPB&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp; enabled&lt;br /&gt;P32&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1e.0&lt;br /&gt;UAR1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pnp:00:09&lt;br /&gt;ILAN&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:19.0&lt;br /&gt;PEGP&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&lt;br /&gt;PEX0&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1c.0&lt;br /&gt;PEX1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1c.1&lt;br /&gt;PEX2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1c.2&lt;br /&gt;PEX3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1c.3&lt;br /&gt;PEX4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1c.4&lt;br /&gt;PEX5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&lt;br /&gt;UHC1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1d.0&lt;br /&gt;UHC2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1d.1&lt;br /&gt;UHC3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1d.2&lt;br /&gt;UHC4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&lt;br /&gt;EHCI&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1d.7&lt;br /&gt;EHC2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1a.7&lt;br /&gt;UH42&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1a.0&lt;br /&gt;UHC5&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1a.1&lt;br /&gt;UHC6&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1a.2&lt;br /&gt;AZAL&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; S3&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; disabled&amp;nbsp; pci:0000:00:1b.0&lt;br /&gt;shadyabhi@shadyabhi-desktop:~$&lt;/blockquote&gt;All the names looked really cryptic, and I still dont have idea about most of them. I only that I can still compare these devices with the output of &lt;b&gt;lspci&lt;/b&gt; to check what PCI device it is..&lt;br /&gt;&lt;br /&gt;From the output, I came to know that only one option was enabled, so i tried disabling it..&lt;br /&gt;&lt;blockquote&gt;$echo SLPB &amp;gt;/proc/acpi/wakeup&lt;/blockquote&gt;And now, my PC doesnt wake up by mouse activity..&lt;br /&gt;&lt;br /&gt;But, this was a temporary situation. As I had to do it everytime I booted the kernel (although I do it only once a fortnight &lt;b&gt;:D&lt;/b&gt;), so this command should be executed every time I start the PC.&lt;br /&gt;&lt;br /&gt;So, I made a file "mouse_disable.sh" in the &lt;b&gt;/etc/init.d&lt;/b&gt; directory with the following contents.&lt;br /&gt;&lt;blockquote&gt;#!/bin/sh&lt;br /&gt;echo SLPB &amp;gt;/proc/acpi/wakeup&lt;/blockquote&gt;Then use update-rc.d to make required symbolic links automatically in other directories...&lt;br /&gt;&lt;blockquote&gt;$update-rc.d /etc/init.d/mouse_disable.sh defaults&lt;/blockquote&gt;This finally solved my problem.. :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-1300684160195158512?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/1300684160195158512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/disable-wakeup-through-mouse-ps2-on.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1300684160195158512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1300684160195158512'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/disable-wakeup-through-mouse-ps2-on.html' title='Disable wakeup through Mouse (PS2) on LINUX'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-2195318265966351980</id><published>2010-03-09T13:56:00.001+05:30</published><updated>2011-10-08T15:15:29.658+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='daemon'/><category scheme='http://www.blogger.com/atom/ns#' term='unix programming'/><title type='text'>Writing a daemon in C (or daemonize a process) for absolute newbie</title><content type='html'>A daemon is a computer program that runs in the background. In a Unix environment, the parent process of a daemon is often (but not always) the init process (PID=1).&lt;br /&gt;&lt;br /&gt;Basically you have to do 6 steps:-&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Fork off the parent process&lt;/li&gt;&lt;li&gt;Change file mode mask (umask)&lt;/li&gt;&lt;li&gt;Open any logs for writing   &lt;/li&gt;&lt;li&gt;Create a unique Session ID (SID)&lt;/li&gt;&lt;li&gt;Change the current working directory to a safe place&lt;/li&gt;&lt;li&gt;Close standard file descriptors&lt;/li&gt;&lt;li&gt;Enter actual daemon code&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;Few terms may be new to you:-&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;b&gt;FORK&lt;/b&gt; - This is basically used to create a child process. After the fork() call is made, we differentiate the parent and child processes by the return value of fork().&lt;/li&gt;&lt;li&gt;&lt;b&gt;UMASK&lt;/b&gt; - Its used to set file permissions. umask(0) means you have full read, write, execute access..&lt;/li&gt;&lt;/ul&gt;&amp;nbsp;While writing the daemon, make sure you open the log files and be very verbose in that because as we dont have direct interaction, it can be sometimes very hard do find the bug.&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#include &amp;lt;sys/types.h&amp;gt;&lt;br /&gt;#include &amp;lt;sys/stat.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;#include &amp;lt;fcntl.h&amp;gt;&lt;br /&gt;#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;#include &amp;lt;syslog.h&amp;gt;&lt;br /&gt;#include &amp;lt;string.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(void) {&lt;br /&gt;        &lt;br /&gt;        /* Our process ID and Session ID */&lt;br /&gt;        pid_t pid, sid;&lt;br /&gt;        &lt;br /&gt;        /* Fork off the parent process */&lt;br /&gt;        pid = fork();&lt;br /&gt;        if (pid &amp;lt; 0) {&lt;br /&gt;                exit(EXIT_FAILURE);&lt;br /&gt;        }&lt;br /&gt;        /* If we got a good PID, then&lt;br /&gt;           we can exit the parent process. */&lt;br /&gt;        if (pid &amp;gt; 0) { // Child can continue to run even after the parent has finished executing&lt;br /&gt;                exit(EXIT_SUCCESS);&lt;br /&gt;        }&lt;br /&gt;&lt;br /&gt;        /* Change the file mode mask */&lt;br /&gt;        umask(0);&lt;br /&gt;                &lt;br /&gt;        /* Open any logs here */        &lt;br /&gt;                &lt;br /&gt;        /* Create a new SID for the child process */&lt;br /&gt;        sid = setsid();&lt;br /&gt;        if (sid &amp;lt; 0) {&lt;br /&gt;                /* Log the failure */&lt;br /&gt;                exit(EXIT_FAILURE);&lt;br /&gt;        }&lt;br /&gt;               &lt;br /&gt;        /* Change the current working directory */&lt;br /&gt;        if ((chdir("/")) &amp;lt; 0) {&lt;br /&gt;                /* Log the failure */&lt;br /&gt;                exit(EXIT_FAILURE);&lt;br /&gt;        }&lt;br /&gt;        &lt;br /&gt;        /* Close out the standard file descriptors */&lt;br /&gt;//Because daemons generally dont interact directly with user so there is no need of keeping these open&lt;br /&gt;        close(STDIN_FILENO);&lt;br /&gt;        close(STDOUT_FILENO);&lt;br /&gt;        close(STDERR_FILENO);&lt;br /&gt;        &lt;br /&gt;        /* Daemon-specific initialization goes here */&lt;br /&gt;        &lt;br /&gt;        /* An infinite loop */&lt;br /&gt;        while (1) {&lt;br /&gt;           /* Do some task here ... */&lt;br /&gt;           &lt;br /&gt;           sleep(30); /* wait 30 seconds */&lt;br /&gt;        }&lt;br /&gt;   exit(EXIT_SUCCESS);&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-2195318265966351980?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/2195318265966351980/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/writing-daemon-in-c-or-daemonize.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/2195318265966351980'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/2195318265966351980'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/writing-daemon-in-c-or-daemonize.html' title='Writing a daemon in C (or daemonize a process) for absolute newbie'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8265400177967117780</id><published>2010-03-08T00:11:00.000+05:30</published><updated>2011-10-08T15:15:47.993+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='last.fm'/><category scheme='http://www.blogger.com/atom/ns#' term='wallpaper'/><title type='text'>Last.fm Wallpaper generator script "wallpaperfm" in Python</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; I just came across a nice script (named wallpaperfm by the author) that makes a very nice wallpaper by watching your listening habits from your last.fm profile.. I didnt make the script, all credit goes to &lt;a href="http://www.last.fm/user/Koant"&gt;KOANT&lt;/a&gt;. Well you can of coarse play with the script to make it to your needs....:)&lt;br /&gt;&lt;br /&gt;Here is the screenshot of my wallpaper..&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://3.bp.blogspot.com/_JjJOh0rb2yI/S5PxT1YW6XI/AAAAAAAABKg/fe_q_RnvzoE/s1600-h/shadyabhi3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://3.bp.blogspot.com/_JjJOh0rb2yI/S5PxT1YW6XI/AAAAAAAABKg/fe_q_RnvzoE/s320/shadyabhi3.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;To get the above wallpaper, I ran the following command..&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;./wallpaperfm.py -m collage --CanvasSize 1440x900 --AlbumNumber 100 --GradientSize 10 --AlbumOpacity 60 -u shadyabhi -i 1440x900&lt;/blockquote&gt;Play well with the options to get what you exactly want...&lt;br /&gt;Source-code to the script...&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python&lt;br /&gt;# Wallpaperfm.py is a python script that generates desktop wallpapers from your last.fm music profile.&lt;br /&gt;# by Koant, http://www.last.fm/user/Koant&lt;br /&gt;# ./wallpaper.py will display the instructions&lt;br /&gt;#&lt;br /&gt;# Requirements:&lt;br /&gt;# . Python Imaging Library (probably already installed, available through synaptic for Ubuntu users)&lt;br /&gt;# . a last.fm account and an active internet connection&lt;br /&gt;#&lt;br /&gt;# v. 13 July 2009&lt;br /&gt;&lt;br /&gt;__author__ = 'Koant (http://www.last.fm/user/Koant)'&lt;br /&gt;__version__ = '$13 July 2009$'&lt;br /&gt;__date__ = '$Date: 2009/07/13&amp;nbsp; $'&lt;br /&gt;__copyright__ = 'Copyright (c) 2008 Koant'&lt;br /&gt;__license__ = 'GPL'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;from urllib import urlopen&lt;br /&gt;from xml.dom import minidom&lt;br /&gt;import os&lt;br /&gt;import os.path&lt;br /&gt;import sys&lt;br /&gt;from getopt import getopt&lt;br /&gt;import random&lt;br /&gt;import Image&lt;br /&gt;import ImageDraw&lt;br /&gt;import ImageFilter&lt;br /&gt;&lt;br /&gt;def usage():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Quick examples"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "--------------"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "./wallpaperfm.py -m tile -u your_lastfm_username&amp;nbsp;&amp;nbsp;&amp;nbsp; will generate an image with all your favorite albums tiled up in a random order."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "./wallpaperfm.py -m glass -u your_lastfm_username&amp;nbsp;&amp;nbsp;&amp;nbsp; will generate an image with a small random collection of albums, with a glassy effect."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "./wallpaperfm.py -m collage -u your_lastfm_username&amp;nbsp;&amp;nbsp;&amp;nbsp; will generate a random collage of your favorite albums."&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "\nGlobal switches:"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-u, --Username: your last.fm username."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-f, --Filename: the filename where the image will be saved. Username by default."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-t, --Past: [overall] how far back should the profile go. One of 3month,6month,12month or overall."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-O, --FinalOpacity: [80] darkness of the final image. from 0 to 100"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-i, --ImageSize: [1280x1024] size of the final image. Format: numberxnumber"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-c, --CanvasSize: size of the canvas. = image size by default."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-e, --Cache: [wpcache] path to the cache."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-x, --ExcludedList: ['http://cdn.last.fm/depth/catalogue/noimage/cover_med.gif'] excluded urls, comma separated." &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-l, --Local: use a local copy of the charts. Ideal for using it offline or being kind to the last.fm servers."&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "\nSpecific switches for the 'tile' mode (-m tile):"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-a, --AlbumSize: [130] size of the albums, in pixel."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-s, --Interspace: [5]&amp;nbsp; space between in tile, in pixel."&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "\nSpecific switches for the 'glass' mode (-m glass):"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-n, --AlbumNumber: [7] number of albums to show."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-d, --EndPoint: [75] controls when the shadow ends, in percentage of the album size."&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-r, --Offset: [40] starting value of opacity for the shadow."&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "\nSpecific switches for the 'collage' mode (-m collage):"&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-a, --AlbumSize: [250] size of the albums, in pixel."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-o, --AlbumOpacity: [90] maximum opacity of each album, from 0 to 100."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-n, --AlbumNumber: [50] number of albums to show."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-g, --GradientSize: [15] portion of the album in the gradient, from 0 to 100"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "-p, --Passes: [4] number of iterations of the algorithms."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit()&lt;br /&gt;&lt;br /&gt;def getSize(s):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ Turns '300x400' to (300,400) """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return tuple([int(item) for item in s.rsplit('x')])&lt;br /&gt;&lt;br /&gt;def getParameters():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ Get Parameters from the command line or display usage in case of problem """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Common Default Parameters&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Filename=''&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mode='tile'&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile=dict()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Username']='Koant'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Past']='overall'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['cache']='wpcache'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['ExcludedList']=['http://cdn.last.fm/depth/catalogue/noimage/cover_med.gif','http://cdn.last.fm/flatness/catalogue/noimage/2/default_album_medium.png']&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Limit']=50&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Local']='no'&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Common=dict();&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Common['ImageSize']=(1280,1024)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Common['CanvasSize']=''&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Common['FinalOpacity']=80&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ## Specific Default Parameters&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Collage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Collage=dict();&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Collage['Passes']=4&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Collage['AlbumOpacity']=90&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Collage['GradientSize']=15&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Collage['AlbumSize']=250&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Tile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tile=dict()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tile['AlbumSize']=130&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Tile['Interspace']=5&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Glass&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Glass=dict()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Glass['AlbumNumber']=7&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Glass['Offset']=40&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Glass['EndPoint']=75&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; optlist, args=getopt(sys.argv[1:], 'hu:t:n:c:f:a:o:g:O:i:m:p:s:e:d:r:x:l',["help", "Mode=", "Username=", "Past=", "Filename=","CanvasSize=", "ImageSize=", "FinalOpacity=", "AlbumSize=","AlbumOpacity=","GradientSize=", "Passes=", "AlbumNumber=", "Interspace=","Cache=","Offset=","EndPoint=","ExcludedList=","Local"])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; except Exception, err:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "#"*20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print str(err)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "#"*20 &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; usage()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(optlist)==0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; usage()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for option, value in optlist:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if option in ('-h','--help'):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; usage()&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-m','--Mode'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # m: mode, one of Tile,Glass or Collage&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mode=value.lower()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in('-e','--Cache'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # e: cache&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['cache']=value&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in('-l','--Local'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # l: use a local copy of the charts&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Local']='yes'&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-u','--Username'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # u: username (Common)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Username']=value&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-t','--Past'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # t: how far back (Common), either 3month,6month or 12month&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Past']=value&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-x','--ExcludedList'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # x: excluded url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['ExcludedList'].extend(value.rsplit(','))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-f', '--Filename'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # f: image filename (Common)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Filename=value&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-c','--CanvasSize'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # c: canvas size (Common)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Common['CanvasSize']=getSize(value)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-i','--ImageSize'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # i: image size (Common)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Common['ImageSize']=getSize(value)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-O', '--FinalOpacity'): &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # O: opacity of final image (Common)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Common['FinalOpacity']=int(value)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-a','--AlbumSize'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # a: album size (Collage,Tile)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Collage['AlbumSize']=int(value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Tile['AlbumSize']=int(value)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-o','--AlbumOpacity'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # o: album opacity (Collage)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Collage['AlbumOpacity']=int(value)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-g','--GradientSize'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # g: gradient size (Collage)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Collage['GradientSize']=int(value)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-p','--Passes'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # p: number of passes (Collage)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Collage['Passes']=int(value)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-n','--AlbumNumber'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # n: number of albums (Glass, Collage)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Glass['AlbumNumber']=int(value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Collage['AlbumNumber']=int(value)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-s','--Interspace'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # s: interspace (Tile)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Tile['Interspace']=int(value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-d','--EndPoint'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # d: EndPoint (Glass)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Glass['EndPoint']=int(value)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; elif option in ('-r','--Offset'):&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; # r: Offset (Glass)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Glass['Offset']=int(value)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "I'm not using ", option &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Filename=='': # by default, Filename=Username&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Filename=Profile['Username']&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Common['CanvasSize']=='':&amp;nbsp;&amp;nbsp;&amp;nbsp; # by default, CanvasSize=ImageName&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Common['CanvasSize']=Common['ImageSize']&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Add the common parameters&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for k,v in Common.iteritems():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Collage[k]=v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Tile[k]=v&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Glass[k]=v&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return {'Filename':Filename, 'Mode':mode, 'Profile':Profile, 'Tile':Tile, 'Glass':Glass, 'Collage':Collage}&lt;br /&gt;&lt;br /&gt;##############################&lt;br /&gt;## Parse and download the files&lt;br /&gt;##############################&lt;br /&gt;def makeFilename(url):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ Turns the url into a filename by replacing possibly annoying characters by _ """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url=url[7:] # remove 'http://'&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for c in ['/', ':', '?', '#', '&amp;amp;','%']:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; url=url.replace(c,'_')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return url&lt;br /&gt;&lt;br /&gt;def download(url,filename):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ download the binary file at url """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; instream=urlopen(url)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; outfile=open(filename,'wb')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for chunk in instream:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; outfile.write(chunk)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; instream.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; outfile.close()&lt;br /&gt;&lt;br /&gt;def IsImageFile(imfile):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ Make sure the file is an image, and not a 404. """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; flag=True&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; i=Image.open(imfile)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; except Exception,err:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; flag=False&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return flag&lt;br /&gt;&lt;br /&gt;def getAlbumCovers(Username='Koant',Past='overall',cache='wp_cache',ExcludedList=['http://cdn.last.fm/depth/catalogue/noimage/cover_med.gif','http://cdn.last.fm/flatness/catalogue/noimage/2/default_album_medium.png'],Limit=50,Local='no'):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ download album covers if necessary """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ## Preparing the file list.&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Past in ('3month','6month','12month'):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tpe='&amp;amp;type='+Past&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tpe=''&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; url='http://ws.audioscrobbler.com/1.0/user/'+Username+'/topalbums.xml?limit='+str(Limit)+tpe&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # make cache if doesn't exist&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if not os.path.exists(cache):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "cache directory ("+cache+") doesn't exist. I'm creating it."&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; os.mkdir(cache)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Make a local copy of the charts&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if Local=='no':&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "Downloading from ",url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; download(url,cache+os.sep+'charts_'+Username+'.xml')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; except Exception,err:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "#"*20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "I couldn't download the profile or make a local copy of it."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "#"*20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "Reading from local copy:&amp;nbsp; ",cache+os.sep+'charts_'+Username+'.xml'&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Parse image filenames&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Parsing..."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; data=open(cache+os.sep+'charts_'+Username+'.xml','rb')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; xmldoc=minidom.parse(data)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; data.close()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; except Exception,err:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print '#'*20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "Error while parsing your profile. Your username might be misspelt or your charts empty."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print '#'*20&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filelist=[imfile.firstChild.data for imfile in xmldoc.getElementsByTagName('large')]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Exclude covers from the ExcludedList&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filelist=[item for item in filelist if not item in ExcludedList]&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # Stop if charts are empty&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if len(filelist)==0:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print '#'*20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "Your charts are empty. I can't proceed."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print '#'*20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # download covers only if not available in the cache&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for imfile in filelist[:]:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; url=imfile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; imfile=makeFilename(imfile)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if not os.path.exists(cache+os.sep+imfile):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "&amp;nbsp;&amp;nbsp;&amp;nbsp; Downloading ",url&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; download(url,cache+os.sep+imfile)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filelist=[cache+os.sep+makeFilename(imfile) for imfile in filelist] &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filelist=[imfile for imfile in filelist if IsImageFile(imfile)] # Checks the file is indeed an image&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return filelist&lt;br /&gt;&lt;br /&gt;##############################&lt;br /&gt;## Tile&lt;br /&gt;##############################&lt;br /&gt;def Tile(Profile,ImageSize=(1280,1024),CanvasSize=(1280,1024),AlbumSize=130,FinalOpacity=30,Interspace=5):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ produce a tiling of albums covers """&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagex,imagey=ImageSize&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; canvasx,canvasy=CanvasSize&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetx=(imagex-canvasx)/2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offsety=(imagey-canvasy)/2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; #number of albums on rows and columns&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; nx=(canvasx-Interspace)/(AlbumSize+Interspace) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; ny=(canvasy-Interspace)/(AlbumSize+Interspace)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # number of images to download&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Limit']=ny*nx+len(Profile['ExcludedList'])+5 # some extra in case of 404 , even though there shouldn't be any really.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # download images&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filelist=getAlbumCovers(**Profile)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background=Image.new('RGB',(imagex,imagey),0) # background&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filelist2=list()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; posy=-AlbumSize+(canvasy-ny*(AlbumSize+Interspace)-Interspace)/2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for j in range(0,ny):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; posx,posy=(-AlbumSize+(canvasx-nx*(AlbumSize+Interspace)-Interspace)/2,posy+Interspace+AlbumSize) # location of album in the canvas&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(0,nx):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; posx=posx+Interspace+AlbumSize&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; if len(filelist2)==0: # better than random.choice() (minimises risk of doubles and goes through the whole list) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; filelist2=list(filelist)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; random.shuffle(filelist2)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; imfile=filelist2.pop()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; try:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; im=Image.open(imfile).convert('RGB')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; except Exception,err:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "#"*20&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print err&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "I couln't read that file: "+imfile&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "You might want to exclude its corresponding URL with -x because it probably doesn't point to an image."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "#"*20&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; im=im.resize((AlbumSize,AlbumSize),2)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; background.paste(im,(posx+offsetx,posy+offsety))&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # darken the result&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background=background.point(lambda i: FinalOpacity*i/100)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return background&lt;br /&gt;&lt;br /&gt;##############################&lt;br /&gt;## Glassy wallpaper&lt;br /&gt;##############################&lt;br /&gt;def makeGlassMask(ImageSize,Offset=50,EndPoint=75):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ Make mask for the glassy wallpaper """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mask=Image.new('L',ImageSize,0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; di=ImageDraw.Draw(mask)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizex,sizey=ImageSize&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; stop=min((EndPoint*sizey)/100,sizey)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; E=EndPoint*sizey/100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; O=255*Offset/100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(0,stop):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; color=(255*Offset/100*-100*i)/(EndPoint*sizey)+255*Offset/100 #linear gradient&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #color=((i-E)*(i-E)*O)/(E*E) # quadratic gradient&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #color=(O*(E*E-i*i))/(E*E)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; di.line((0,i,sizex,i),color)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return mask&lt;br /&gt;&lt;br /&gt;def Glass(Profile, ImageSize=(1280,1024),CanvasSize=(1280,1024),AlbumNumber=7,FinalOpacity=100,Offset=50,EndPoint=75):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ Make a glassy wallpaper from album covers """ &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if AlbumNumber&amp;gt;Profile['Limit']:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Limit']=AlbumNumber+len(Profile['ExcludedList'])+5&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filelist=getAlbumCovers(**Profile)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagex,imagey=ImageSize&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; canvasx,canvasy=CanvasSize&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offsetx=(imagex-canvasx)/2&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; offsety=(imagey-canvasy)/2&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background=Image.new('RGB',(imagex,imagey),0) # background&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; albumsize=canvasx/AlbumNumber&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mask=makeGlassMask((albumsize,albumsize),Offset,EndPoint)&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; posx=(canvasx-AlbumNumber*albumsize)/2-albumsize&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(0,AlbumNumber):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; imfile=filelist.pop()&amp;nbsp;&amp;nbsp;&amp;nbsp; # assumes there are enough albums in the filelist&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tmpfile=Image.open(imfile).convert('RGB')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tmpfile=tmpfile.resize((albumsize,albumsize),2) # make it square, prettier&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; posx,posy=(posx+albumsize,canvasy/2-albumsize)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; background.paste(tmpfile,(posx+offsetx,posy+offsety)) # paste the album cover&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tmpfile=tmpfile.transpose(1)&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; #turn it upside down&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; background.paste(tmpfile,(posx+offsetx,canvasy/2+offsety),mask)&amp;nbsp;&amp;nbsp;&amp;nbsp; # apply mask and paste&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # darken the result&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background=background.point(lambda i: FinalOpacity*i/100)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return background&lt;br /&gt;&lt;br /&gt;############################ &lt;br /&gt;## Collage&lt;br /&gt;############################&lt;br /&gt;def erfc(x):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ approximate erfc with a few splines """&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if x&amp;lt;-2:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 2;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif (-2&amp;lt;=x) and (x&amp;lt;-1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; c=[ 0.9040,&amp;nbsp;&amp;nbsp; -1.5927,&amp;nbsp;&amp;nbsp; -0.7846,&amp;nbsp;&amp;nbsp; -0.1305];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif (-1&amp;lt;=x) and (x&amp;lt;0):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; c=[1.0000, -1.1284,&amp;nbsp;&amp;nbsp; -0.1438,&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.1419];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif (0&amp;lt;=x) and (x&amp;lt;1):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; c=[1.0000,&amp;nbsp;&amp;nbsp; -1.1284 ,&amp;nbsp;&amp;nbsp; 0.1438,&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.1419];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif (1&amp;lt;=x) and (x&amp;lt;2):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; c=[1.0960,&amp;nbsp;&amp;nbsp; -1.5927,&amp;nbsp;&amp;nbsp;&amp;nbsp; 0.7846 ,&amp;nbsp; -0.1305];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return c[0]+c[1]*x+c[2]*x*x+c[3]*x*x*x;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;def makeCollageMask(size,transparency,gradientsize):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mask=Image.new('L',size,0)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; sizex,sizey=size&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; l=(gradientsize*sizex)/100&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; c=(255*transparency)/100.0&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; c=c/4.0 # 4=normalizing constant from convolution&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; s2=1/(l*1.4142)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for i in range(sizex):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for j in range(sizey):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; v=c*(erfc(s2*(l-i))-erfc(s2*(sizex-l-i)))*(erfc(s2*(l-j))-erfc(s2*(sizex-l-j)))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; mask.putpixel((i,j),int(v))&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return mask&lt;br /&gt;&lt;br /&gt;def Collage(Profile,ImageSize=(1280,1024),CanvasSize=(1280,1024),AlbumNumber=50,AlbumSize=300,GradientSize=20,AlbumOpacity=70,Passes=4,FinalOpacity=70):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; """ make a collage of album covers """&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Profile['Limit']=min(200,max(AlbumNumber,Profile['Limit'])) &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; filelist=getAlbumCovers(**Profile)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; imagex,imagey=ImageSize&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; canvasx,canvasy=CanvasSize&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background=Image.new('RGB',(imagex,imagey),0) # background&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; mask=makeCollageMask((AlbumSize,AlbumSize),AlbumOpacity,GradientSize)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Computing the collage..."&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; for p in range(0,Passes):&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "Pass ",p+1," of ",Passes&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for imfile in filelist:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tmpfile=Image.open(imfile).convert('RGB')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; tmpfile=tmpfile.resize((AlbumSize,AlbumSize),1)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; posx=random.randint(0,canvasx-AlbumSize)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; posy=random.randint(0,canvasy-AlbumSize)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; background.paste(tmpfile,(posx+(imagex-canvasx)/2,posy+(imagey-canvasy)/2),mask)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; # darken the result&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; background=background.point(lambda i: FinalOpacity*i/100)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return background&lt;br /&gt;&lt;br /&gt;########################&lt;br /&gt;## main&lt;br /&gt;########################&lt;br /&gt;def main():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "&amp;nbsp;&amp;nbsp;&amp;nbsp; Wallpaperfm.py is a python script that generates desktop wallpapers from your last.fm musical profile."&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "&amp;nbsp;&amp;nbsp;&amp;nbsp; by Koant, http://www.last.fm/user/Koant"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print ""&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; param=getParameters()&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Mode: "+param['Mode']&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "&amp;nbsp;&amp;nbsp;&amp;nbsp; Image will be saved as "+param['Filename']+".jpg"&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if param['Mode']=='tile':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for k,v in param['Tile'].iteritems():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "&amp;nbsp;&amp;nbsp;&amp;nbsp; "+k+": "+str(v)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image=Tile(param['Profile'],**param['Tile'])&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif param['Mode']=='glass':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for k,v in param['Glass'].iteritems():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "&amp;nbsp;&amp;nbsp;&amp;nbsp; "+k+": "+str(v)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image=Glass(param['Profile'],**param['Glass'])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; elif param['Mode']=='collage':&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; for k,v in param['Collage'].iteritems():&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print "&amp;nbsp;&amp;nbsp;&amp;nbsp; "+k+": "+str(v)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; image=Collage(param['Profile'],**param['Collage'])&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; else:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; print " I don't know this mode: ", param['Mode']&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; sys.exit()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; image.save(param['Filename']+'.jpg')&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; print "Image saved as "+param['Filename']+'.jpg'&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;if __name__=="__main__":&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; main()&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8265400177967117780?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8265400177967117780/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/lastfm-wallpaper-generator-script.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8265400177967117780'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8265400177967117780'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/lastfm-wallpaper-generator-script.html' title='Last.fm Wallpaper generator script &quot;wallpaperfm&quot; in Python'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_JjJOh0rb2yI/S5PxT1YW6XI/AAAAAAAABKg/fe_q_RnvzoE/s72-c/shadyabhi3.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-3395960998169827959</id><published>2010-03-06T16:41:00.009+05:30</published><updated>2011-10-08T15:16:09.458+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='cyberoam'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>Cyberoam login script in python (updated, now with notifications)</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; At our institute, we are forced to login into cyberoam and then only we can surf the web. The logging process is either through &lt;b&gt;WEB INTERFACE or using their client provided by them&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I didnt like any of the provided methods and also "the session logs out after every 1 hr" which is very irritating. So, few months ago, I wrote a script that simulates web login by using urllib in python.&lt;br /&gt;&lt;br /&gt;This script basically asks u for the username and password first time you run the script and then logs in automatically after the specified interval...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;#Author: Abhijeet Rastogi (http://www.google.com/profiles/abhijeet.1989)&lt;br /&gt;&lt;br /&gt;cyberroamIP = "10.100.56.55" #The IP of the Cyberoam site.&lt;br /&gt;cyberroamPort = "8090" #Set to "" if not using.&lt;br /&gt;never_quit = True #Once started cyberthon will never, even when the cyberoam server cannot be connected.&lt;br /&gt;reconnectAfter = 3500&lt;br /&gt;use_notification = True&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;import getpass&lt;br /&gt;from time import strftime&lt;br /&gt;import cookielib&lt;br /&gt;import urllib2&lt;br /&gt;import re&lt;br /&gt;import urllib, sgmllib,time,commands,os&lt;br /&gt;import thread&lt;br /&gt;import threading&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt; import pynotify&lt;br /&gt; pynotify.init("Cyberoam Login Script")&lt;br /&gt;except:&lt;br /&gt; print "You dont have pynotify installed, Notifications will not be shown :-( "&lt;br /&gt; use_notification = False&lt;br /&gt;&lt;br /&gt;username = raw_input("Enter your ID: ")&lt;br /&gt;username = username&lt;br /&gt;passwd = getpass.getpass()&lt;br /&gt;&lt;br /&gt;cyberroamAddress = cyberroamIP&lt;br /&gt;if cyberroamPort != "":&lt;br /&gt; cyberroamAddress = cyberroamAddress+":"+cyberroamPort&lt;br /&gt;&lt;br /&gt;#Parsing and logging in too.&lt;br /&gt;import sgmllib&lt;br /&gt;&lt;br /&gt;download_quota_remaining = 0&lt;br /&gt;&lt;br /&gt;def netUsage():&lt;br /&gt; url = "http://"+cyberroamAddress+"/corporate/servlet/MyAccountManager"&lt;br /&gt; data = "mode=1&amp;amp;login_username=&amp;amp;secretkey=&amp;amp;js_autodetect_results=SMPREF_JS_OFF&amp;amp;just_logged_in=1&amp;amp;username="+username+"&amp;amp;password="+passwd+"&amp;amp;select=My+Account&amp;amp;soft_25.x=0&amp;amp;soft_25.y=0"&lt;br /&gt; cj = cookielib.CookieJar()&lt;br /&gt; opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cj))&lt;br /&gt; opener.addheaders = [('Referer','http://10.100.56.55:8090/myaccount.html')]&lt;br /&gt; usock = opener.open(url, data)&lt;br /&gt; the_page = usock.read()&lt;br /&gt; transfer_log = []&lt;br /&gt; for i in range(1,10):&lt;br /&gt;     start = the_page.find('&lt;span class="\'textfont\'"&gt;')&lt;br /&gt;     the_page = the_page[start+53:]&lt;br /&gt;     end = the_page.find('     transfer_log.append(the_page[0:end])&lt;br /&gt; return transfer_log&lt;br /&gt;&lt;br /&gt;def periodicNotification(threadname, show_again_after):&lt;br /&gt; while True:&lt;br /&gt;  if use_notification == True:&lt;br /&gt;   show_quota = pynotify.Notification("Cyberoam Script", "Remaining Download Quota: %s\nRemaining Upload Quota: %s" % (netUsage()[-1], netUsage()[-4]))&lt;br /&gt;   show_quota.set_timeout(1)&lt;br /&gt;   show_quota.show()&lt;br /&gt;   print "Hello"&lt;br /&gt;   time.sleep(show_again_after)&lt;br /&gt;&lt;br /&gt;class MyCyberroamParser(sgmllib.SGMLParser):&lt;br /&gt; "A simple parser class."&lt;br /&gt;&lt;br /&gt; def parse(self, s):&lt;br /&gt;  "Parse the given string 's'."&lt;br /&gt;  self.feed(s)&lt;br /&gt;  self.close()&lt;br /&gt;&lt;br /&gt; def __init__(self, verbose=0):&lt;br /&gt;  "Initialise an object, passing 'verbose' to the superclass."&lt;br /&gt;     sgmllib.SGMLParser.__init__(self, verbose)&lt;br /&gt;  self.required_entities = ['message','loginstatus','liverequesttime']&lt;br /&gt;  self.frames_attr = []&lt;br /&gt;  self.in_required_entity = False&lt;br /&gt;  self.current_entity = ""&lt;br /&gt;  self.entity_values = {}&lt;br /&gt;&lt;br /&gt; def do_frame(self, attributes):&lt;br /&gt;  for name, value in attributes:&lt;br /&gt;   if name == "src":&lt;br /&gt;    self.frames_attr.append(value)&lt;br /&gt;&lt;br /&gt; def unknown_entityref(self,ref):&lt;br /&gt;  self.current_entity = ref&lt;br /&gt;  if ref in self.required_entities:&lt;br /&gt;   self.in_required_entity=True&lt;br /&gt;&lt;br /&gt; def handle_data(self, data):&lt;br /&gt;  "Try to get the value of entity &amp;amp;message. Used in 2nd pass of parsing."&lt;br /&gt;&lt;br /&gt;  if self.in_required_entity:&lt;br /&gt;   self.entity_values[self.current_entity] = data[1:] #To remove the preceeding =&lt;br /&gt;   self.in_required_entity = False&lt;br /&gt;&lt;br /&gt; def get_src(self,index=-1):&lt;br /&gt;  "Return the list of src targets."&lt;br /&gt;  if index == -1:&lt;br /&gt;   return self.frames_attr&lt;br /&gt;  else:&lt;br /&gt;   return self.frames_attr[index]&lt;br /&gt;&lt;br /&gt;lastmsg = ""&lt;br /&gt;msgChanged = True&lt;br /&gt;sec2sleepOnError = 6&lt;br /&gt;changeUser = True&lt;br /&gt;&lt;br /&gt;try:&lt;br /&gt; while True: &lt;br /&gt;  try:&lt;br /&gt;   # Logging in and fetching the Cyberroam login page.&lt;br /&gt;   """&lt;br /&gt;   if changeUser == True:&lt;br /&gt;    line = cred_file.readline()&lt;br /&gt;    cred = line.split(" ")&lt;br /&gt;    cred[1] = cred[1][:-1]&lt;br /&gt;    username = str(cred[0])+"@da-iict.org"&lt;br /&gt;    passwd = str(cred[1])&lt;br /&gt;    #passwd = getpass.getpass()"""&lt;br /&gt;   print "Username in use: "+username &lt;br /&gt;   f = urllib.urlopen("http://"+cyberroamAddress+"/corporate/servlet/CyberoamHTTPClient","mode=191&amp;amp;isAccessDenied=null&amp;amp;url=null&amp;amp;message=&amp;amp;username="+username+"&amp;amp;password="+passwd+"&amp;amp;saveinfo=saveinfo&amp;amp;login=Login")&lt;br /&gt;  except IOError, (errno, strerror):&lt;br /&gt;   if not silent:&lt;br /&gt;    print "Connection to Cyberoam server timed out. Error(%s): %s" % (errno, strerror)&lt;br /&gt;    print "Retrying in %s seconds" % sec2sleepOnError&lt;br /&gt;    time.sleep(sec2sleepOnError)&lt;br /&gt;    continue&lt;br /&gt;  s = f.read()&lt;br /&gt;  # Try and process the page.&lt;br /&gt;  # The class should have been defined first, remember.&lt;br /&gt;  myparser = MyCyberroamParser()&lt;br /&gt;  myparser.parse(s)&lt;br /&gt;  &lt;br /&gt;  # Get the the src targets. It contains the status message. And then parse it again for entity &amp;amp;message.&lt;br /&gt;  qindex = myparser.get_src(1).index('?')&lt;br /&gt;  srcstr = myparser.get_src(1)[:qindex+1]+'&amp;amp;'+myparser.get_src(1)[qindex+1:]&lt;br /&gt; &lt;br /&gt;  myparser.parse(srcstr)&lt;br /&gt; &lt;br /&gt;  message = myparser.entity_values['message']&lt;br /&gt;  message = message.replace('+',' ')&lt;br /&gt;  &lt;br /&gt;  if message=="You have successfully logged in":&lt;br /&gt;   try:&lt;br /&gt;    thread.start_new_thread(periodicNotification,("Notification of Quota",900))&lt;br /&gt;    changeUser = False&lt;br /&gt;    download_quota_remaining = netUsage()[-1]&lt;br /&gt;    transfer_log = netUsage()&lt;br /&gt;    print "Total TRANSFER till now: "+str(transfer_log[2])&lt;br /&gt;    print "Remaining Download QUOTA: "+str(transfer_log[-1])&lt;br /&gt;    print "You have successfully logged in"&lt;br /&gt;    if use_notification == True:&lt;br /&gt;     successful_login = pynotify.Notification("Cyberoam", "Login attempt successful \n Remaining Download QUOTA: %s" % download_quota_remaining)&lt;br /&gt;     successful_login.show()&lt;br /&gt;    time.sleep(reconnectAfter)&lt;br /&gt;   except KeyboardInterrupt:&lt;br /&gt;    time.sleep(0.5)&lt;br /&gt;    username=raw_input("Enter your ID: ")&lt;br /&gt;    username = username+"@da-iict.org"&lt;br /&gt;    passwd= getpass.getpass()&lt;br /&gt;  &lt;br /&gt;  if message == "The system could not log you on. Make sure your password is correct":&lt;br /&gt;   print "Wrong password.. Enter again"&lt;br /&gt;   passwd = getpass.getpass()&lt;br /&gt;   changeUser = False&lt;br /&gt;  &lt;br /&gt;  if message == "DataTransfer limit has been exceeded":&lt;br /&gt;   if use_notification == True:&lt;br /&gt;    data_limit_exceeded = pynotify.Notification("Cyberoam", "DATA-TRANSFER limit for the day exceeded")&lt;br /&gt;    data_limit_exceeded.show()&lt;br /&gt;   print "Download Quota Exceeded"&lt;br /&gt;   username=raw_input("Enter another ID: ")&lt;br /&gt;   username = username+"@da-iict.org"&lt;br /&gt;   passwd= getpass.getpass()&lt;br /&gt;except KeyboardInterrupt:&lt;br /&gt; pass&lt;br /&gt;&lt;/span&gt;&lt;/pre&gt;&lt;span class="\'textfont\'"&gt;&lt;span class="\'textfont\'"&gt; &lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-3395960998169827959?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/3395960998169827959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/cyberoam-login-script-in-python.html#comment-form' title='13 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3395960998169827959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/3395960998169827959'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/cyberoam-login-script-in-python.html' title='Cyberoam login script in python (updated, now with notifications)'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>13</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-1759968013784417197</id><published>2010-03-05T18:28:00.001+05:30</published><updated>2011-10-08T15:16:27.913+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='email'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='gmail'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Sending Mails through GMAIL ID using python</title><content type='html'>Everytime I go to my labs, all programs I make, I do a backup by sending my programs to an email id. The process of loggin in through web interface is tedious. So, I thought of implementing in python. This script supports &lt;b&gt;attachments&lt;/b&gt; also.&lt;br /&gt;&lt;br /&gt;The python script below uses &lt;b&gt;smtplib&lt;/b&gt; to contact the GMAIL SMTP server. The script is very easy and self explanatory.&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python&lt;br /&gt;#For Connecting to GAMIL SMTP server...&lt;br /&gt;import smtplib&lt;br /&gt;#For composing the email message&lt;br /&gt;from email.MIMEMultipart import MIMEMultipart&lt;br /&gt;from email.MIMEBase import MIMEBase&lt;br /&gt;from email.MIMEText import MIMEText&lt;br /&gt;from email import Encoders&lt;br /&gt;&lt;br /&gt;from getpass import getpass #For getting password from the user&lt;br /&gt;import os&lt;br /&gt;&lt;br /&gt;gmail_user = "abhijeet.1989@gmail.com"&lt;br /&gt;&lt;br /&gt;def mail(to, subject, text, attach):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"""Sends email"""&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;msg = MIMEMultipart()&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;msg['From'] = gmail_user&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;msg['To'] = to&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;msg['Subject'] = subject&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;msg.attach(MIMEText(text))&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;part = MIMEBase('application', 'octet-stream')&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;part.set_payload(open(attach, 'rb').read())&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;Encoders.encode_base64(part)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;part.add_header('Content-Disposition',&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;'attachment; filename="%s"' % os.path.basename(attach))&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;msg.attach(part)&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mailServer = smtplib.SMTP("smtp.gmail.com", 587)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mailServer.ehlo()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mailServer.starttls()&amp;nbsp;&amp;nbsp; &amp;nbsp;#All SMTP commands that follow will be encrypted&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mailServer.ehlo()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mailServer.login(gmail_user, gmail_pwd)&amp;nbsp;&amp;nbsp; &amp;nbsp;#Login performed&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mailServer.sendmail(gmail_user, to, msg.as_string())&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mailServer.close()&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;# RECEPIENTS ADDRESS, SUBJECT, BODY, PASSWORD taken here....&lt;br /&gt;entermore="y"&lt;br /&gt;recepients = []&lt;br /&gt;gmail_pwd = getpass()&lt;br /&gt;&lt;br /&gt;while entermore == "y":&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;recepient_email = raw_input("Email address: ")&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;recepients.append(recepient_email)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;entermore = raw_input("Do you want to enter more recepients(y/n): ")&lt;br /&gt;&lt;br /&gt;#print recepients&lt;br /&gt;subject = raw_input("Subject: ")&lt;br /&gt;body = raw_input("Body: ")&lt;br /&gt;attachment_path = raw_input("Enter attachment path: ")&lt;br /&gt;&lt;br /&gt;for email in recepients:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;mail(email,subject,body,attachment_path)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "Your email to "+str(email)+" has been sent successfully"&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Testrun:-&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;shadyabhi@shadyabhi-desktop:~/python$ ./mail_send.py&lt;br /&gt;Password:&lt;br /&gt;Email address: shadyabhi@gmail.com&lt;br /&gt;Do you want to enter more recepients(y/n): n&lt;br /&gt;Subject: Hi!! This is sent to you through python&lt;br /&gt;Body: BYE!!&lt;br /&gt;Enter attachment path: last.py&lt;br /&gt;Your email to shadyabhi@gmail.com has been sent successfully&lt;br /&gt;shadyabhi@shadyabhi-desktop:~/python$&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-1759968013784417197?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/1759968013784417197/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/sending-mails-through-gmail-id-using.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1759968013784417197'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/1759968013784417197'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/sending-mails-through-gmail-id-using.html' title='Sending Mails through GMAIL ID using python'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-2292274407747419444</id><published>2010-03-05T16:14:00.002+05:30</published><updated>2011-11-02T19:50:11.733+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='gtk'/><category scheme='http://www.blogger.com/atom/ns#' term='libnotify'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Sending libnotify Notification through C</title><content type='html'>&lt;div dir="ltr" style="text-align: left;" trbidi="on"&gt;Libnotify is the nice way to notify users of the important events occurred. &lt;br /&gt;Following is the code to send libnotify notifications through C..&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#include &amp;lt;libnotify/notify.h&amp;gt;&lt;br /&gt;#include &amp;lt;glib.h&amp;gt;&lt;br /&gt;#include &amp;lt;unistd.h&amp;gt;&lt;br /&gt;int main(int argc, char** argv)&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if(argc == 3)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; NotifyNotification *n;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notify_init("Test");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; n = notify_notification_new (argv[1],argv[2], NULL, NULL);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; notify_notification_set_timeout(n, 3000); //3 seconds&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (!notify_notification_show (n, NULL)) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_error("Failed to send notification.\n");&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 1;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_object_unref(G_OBJECT(n));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }else{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; g_print("Too few arguments (%d), 2 needed.\n", argc-1);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;NOTE: As Eugene MechanisM pointed out, recent version has changed the API. See his comment for details.&lt;br /&gt;&lt;br /&gt;  &lt;br /&gt;While compiling the program, you need to link libraries... So, to compile and run.... &lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;shadyabhi@shadyabhi-desktop:~/c$ vim libnotify.c&lt;br /&gt;shadyabhi@shadyabhi-desktop:~/c$ gcc -Wall -o test libnotify.c `pkg-config --libs --cflags glib-2.0 gtk+-2.0` -lnotify&lt;br /&gt;shadyabhi@shadyabhi-desktop:~/c$ ./test "Heading" "Body of the notification"&lt;br /&gt;shadyabhi@shadyabhi-desktop:~/c$ &lt;/blockquote&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://2.bp.blogspot.com/_JjJOh0rb2yI/S5Diiom17NI/AAAAAAAABKU/7znjnIaBmOI/s1600-h/Screenshot-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://2.bp.blogspot.com/_JjJOh0rb2yI/S5Diiom17NI/AAAAAAAABKU/7znjnIaBmOI/s320/Screenshot-1.jpg" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-2292274407747419444?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/2292274407747419444/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/sending-libnotify-notification-through.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/2292274407747419444'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/2292274407747419444'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/sending-libnotify-notification-through.html' title='Sending libnotify Notification through C'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_JjJOh0rb2yI/S5Diiom17NI/AAAAAAAABKU/7znjnIaBmOI/s72-c/Screenshot-1.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-7464849179914779967</id><published>2010-03-05T12:40:00.002+05:30</published><updated>2010-03-05T12:41:34.085+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='pys60'/><title type='text'>Setting up PyS60 Bluetooth Console</title><content type='html'>If you are into PyS60 development, this is a must...&lt;br /&gt;Instructions:-&lt;br /&gt;&lt;br /&gt;&amp;nbsp;- Make sure that your bluetooth device is plugged in.&lt;br /&gt;&amp;nbsp;- Reset all bluetooth devices:-&lt;br /&gt;&lt;blockquote&gt;$hciconfig reset&lt;/blockquote&gt;&amp;nbsp;- Optionally, you can also check if the device exists:-&lt;br /&gt;&lt;blockquote&gt;$hcitool dev&lt;/blockquote&gt;&amp;nbsp;- Register a serial port:-&lt;br /&gt;&lt;blockquote&gt;$sdptool add --channel=2 SP&lt;/blockquote&gt;&amp;nbsp;- Now, listening to the channel:-&lt;br /&gt;&lt;blockquote&gt;$rfcomm listen rfcomm2 2&lt;/blockquote&gt;Now, switch on the bluetooth on the device and open the PyS60 Interpreter on the mobile and do Options-&amp;gt;Bluetooth Console.. You will get the output like-&lt;br /&gt;&lt;blockquote&gt;shadyabhi@shadyabhi-desktop:~$ rfcomm listen rfcomm2 2 &lt;br /&gt;Waiting for connection on channel 2&lt;br /&gt;Connection from 00:21:FC:FA:B8:3A to /dev/rfcomm2&lt;br /&gt;Press CTRL-C for hangup&lt;/blockquote&gt;That means you are not connected. As told in the official documentation, when i did-&lt;br /&gt;&lt;blockquote&gt;$ cu -l /dev/rfcomm2&lt;br /&gt;cu: /dev/rfcomm2: Line in use &lt;/blockquote&gt;&amp;nbsp;I was getting the following error.. So, by a bit of googling i succeded by using another program &lt;b&gt;screen&lt;/b&gt; by typing:-&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$screen /dev/rfcomm2&lt;/blockquote&gt;Now, you will be connected &amp;amp; a new blank screen will come up.&lt;br /&gt;&lt;br /&gt;Suppose, you want to make a call to your buddy whose phone number is 9510216275.. Simply type in your terminal...&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;import telephone&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; telephone.dial(u'9510216275')&lt;br /&gt;&amp;gt;&amp;gt;&amp;gt; &lt;/blockquote&gt;This way, you can dial your buddy phone number in mobile by typing from your computer terminal....&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-7464849179914779967?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/7464849179914779967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/setting-up-pys60-bluetooth-console.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/7464849179914779967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/7464849179914779967'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/setting-up-pys60-bluetooth-console.html' title='Setting up PyS60 Bluetooth Console'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-245087683070910367</id><published>2010-03-05T00:38:00.002+05:30</published><updated>2011-10-08T15:17:34.461+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='shell scripting'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='bash'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>here-document Code Block</title><content type='html'>A &lt;b&gt;&lt;i class="FIRSTTERM"&gt;here document&lt;/i&gt;&lt;/b&gt; is a special-purpose  code block. It uses a form of&amp;nbsp;I/O redirection to feed a command list to  an interactive program or a command.&lt;br /&gt;&lt;br /&gt;Hard to digest!! Lets take an easy example. Suppose, you have a simple program which asks user to input 2 numbers and displays its sum as output:-&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#include&amp;lt;stdio.h&amp;gt;&lt;br /&gt;int main()&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; int a,b;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; scanf("%d",&amp;amp;a);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; scanf("%d",&amp;amp;b);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; printf("Sum of numbers is: %d\n",a+b);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;Suppose, you want to run this program with some pre-defined input everytime. You cannot actually automate it bcos the input is asked from the user which is meant to be entered by the keyboard.. There is the otherway round by giving input through &lt;b&gt;here-document&lt;/b&gt;...&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/bin/sh&lt;br /&gt;num1=1&lt;br /&gt;num2=10&lt;br /&gt;./a.out &amp;lt;&amp;lt; EOF&lt;br /&gt;$num1&lt;br /&gt;$num2&lt;br /&gt;EOF&lt;br /&gt;&lt;/pre&gt;Testrun:-&lt;br /&gt;&lt;blockquote&gt;shadyabhi@shadyabhi-desktop:~/c$ ./input.sh&lt;br /&gt;Sum of numbers is: 11&lt;/blockquote&gt;You can also do something like:-&lt;br /&gt;&lt;blockquote&gt;shadyabhi@shadyabhi-desktop:~/c$ ./a.out &amp;lt;&lt;eof&gt;&amp;lt;EOF&lt;br /&gt;&amp;gt; 1&lt;br /&gt;&amp;gt; 2&lt;br /&gt;&amp;gt; EOF&lt;br /&gt;Sum of numbers is: 3&lt;br /&gt;shadyabhi@shadyabhi-desktop:~/c$&lt;/eof&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;a href="http://tldp.org/LDP/abs/html/here-docs.html"&gt;Read more about here-document here.&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-245087683070910367?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/245087683070910367/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/here-document-code-block.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/245087683070910367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/245087683070910367'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/here-document-code-block.html' title='here-document Code Block'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-2733256937831555610</id><published>2010-03-04T16:02:00.005+05:30</published><updated>2011-10-08T15:17:51.916+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='artwork'/><category scheme='http://www.blogger.com/atom/ns#' term='songbird'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='dbus'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Playing with Dbus &amp; Songbird.... (Artwork Downloader for Songbird or any other Player supporting Dbus Interface)</title><content type='html'>Songbird comes from same family Firefox and Thunderbird. So, it would never disappoint. For everything you want, there is a addon. But, it still lacks one thing. It doesnt download the Album-Artwork automatically. When I first started using this, to add the artwork I used to search on GOOGLE IMAGES and then add them automatically.&lt;br /&gt;&lt;br /&gt;But, then i thought its waste of time searching for each and every Album manually.&lt;br /&gt;&lt;br /&gt;It just came to my mind that why not use DBus interface of songbird to get the current playing song TITLE and find its Album using an online service &amp;amp; then ultimately get its album-art.&lt;br /&gt;&lt;br /&gt;My favourite being last.fm, I rushed to google homepage and searched for "last.fm API python" and got the result "pylast". So, i was going to use "pylast" for all my programming.&lt;br /&gt;&lt;br /&gt;Basically i wrote a python script that contacts the Songbird for the current playing song title and artist, finds its Album through the last.fm provvided API, then downloads the corresponding ARTWORK available at last.fm... In addition, it also displays information like Album Release date.&lt;br /&gt;&lt;br /&gt;I just love python. It could do all this in just 30 lines code....&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;import pylast&lt;br /&gt;import getpass&lt;br /&gt;import dbus&lt;br /&gt;import eyeD3&lt;br /&gt;import subprocess&lt;br /&gt;import string&lt;br /&gt;bus = dbus.SessionBus()&lt;br /&gt;player_obj = bus.get_object('org.mpris.songbird', '/Player')&lt;br /&gt;status = player_obj.GetStatus()&lt;br /&gt;&lt;br /&gt;if status[0] == 0:&lt;br /&gt; print "Songbird is playing...."&lt;br /&gt;&lt;br /&gt;current_playing_track = player_obj.GetMetadata()&lt;br /&gt;&lt;br /&gt;print 'Title: '+current_playing_track['title']+'\nArtist: '+current_playing_track['artist']&lt;br /&gt;&lt;br /&gt;API_KEY="0381676636c5a36935b49595b352ad98"&lt;br /&gt;API_SECRET="6c5bd32fd666b03f21fb3446ef559a9a"&lt;br /&gt;username = "shadyabhi"&lt;br /&gt;#password = getpass.getpass()&lt;br /&gt;password_hash = '1552c1c2bee2fc2f472e02269417ac33'&lt;br /&gt;network = pylast.get_lastfm_network(api_key = API_KEY, api_secret = API_SECRET, username = username, password_hash = password_hash)&lt;br /&gt;&lt;br /&gt;#Getting Album Info&lt;br /&gt;track = network.get_track(current_playing_track['artist'],current_playing_track['title'])&lt;br /&gt;album = track.get_album()&lt;br /&gt;if album is not None:&lt;br /&gt; print "Album: "+album.get_name()&lt;br /&gt; print "Release Date: "+album.get_release_date()&lt;br /&gt; album_uri = album.get_cover_image(size=3)&lt;br /&gt;&lt;br /&gt;if album is None:&lt;br /&gt; album_uri = track.get_artist().get_cover_image()&lt;br /&gt; print "ALBUM Art could not be found on last.fm :(. Now, downloading Artist Image"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;print album_uri&lt;br /&gt;#Downloading the Album Art from last.fm&lt;br /&gt;cmd = "wget "+album_uri+" -O artwork."+album_uri[-3:]&lt;br /&gt;ret = subprocess.call(cmd.split())&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"""&lt;br /&gt;#Editing the MetaData&lt;br /&gt;tag = eyeD3.Tag()&lt;br /&gt;print tag.link(string.replace(string.replace(str(current_playing_track['location'])[7:],"%20"," "),"%27","'"))&lt;br /&gt;tag.setVersion([2,3,0])&lt;br /&gt;print tag.addImage(0x08,'artwork.jpg')&lt;br /&gt;print tag.update()&lt;br /&gt;"""&lt;/pre&gt;&lt;br /&gt;Future plans that I am gonna make Songbird addon, that also embeds the artwork into the mp3 file.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-2733256937831555610?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/2733256937831555610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/03/playing-with-dbus-songbird.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/2733256937831555610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/2733256937831555610'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/03/playing-with-dbus-songbird.html' title='Playing with Dbus &amp; Songbird.... (Artwork Downloader for Songbird or any other Player supporting Dbus Interface)'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-4328489286649883790</id><published>2010-02-21T02:43:00.005+05:30</published><updated>2010-03-04T16:50:43.748+05:30</updated><title type='text'>Auto-mounting partitions &amp; samba shares at start-up</title><content type='html'>For windows users, this may be quite frustrating for mounting partitions every time they start their OS.&lt;br /&gt;&lt;br /&gt;For auto-mounting, you need to edit /etc/fstab file. If you add a partition in /etc/fstab file, that partition will be auto-mounted.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# &amp;lt;file system&amp;gt; &amp;lt;mount point&amp;gt; &amp;lt;type&amp;gt; &amp;lt;options&amp;gt; &amp;lt;dump&amp;gt; &amp;lt;pass&amp;gt; &lt;/blockquote&gt;This line which is already present in the /etc/fstab file tell the format.&lt;br /&gt;&amp;lt;file system&amp;gt;&amp;nbsp; --&amp;gt; the partition to mount for ex. /dev/sda4 or //192.168.1.1/share&lt;br /&gt;&amp;lt;mount point&amp;gt;&amp;nbsp; --&amp;gt; An empty folder where you want to mount the partition&lt;br /&gt;&amp;lt;type&amp;gt; --&amp;gt; file system type for ex. ntfs-3g, smbfs etc..&lt;br /&gt;&amp;lt;options&amp;gt;&amp;nbsp; --&amp;gt; additions options. You can simply put it "default".&lt;br /&gt;&amp;lt;dump&amp;gt; --&amp;gt; an appropriate number which decides whether to backup the partition&lt;br /&gt;&amp;lt;pass&amp;gt;--&amp;gt; 0 in most cases&lt;br /&gt;&lt;br /&gt;So, for mounting an ntfs partition, we will write something like this:-&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;/dev/sda5 /media/Abhijeet ntfs-3g defaults,locale=en_IN 0 0 &lt;/blockquote&gt;For mounting a samba(windows) share, add:-&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;//10.100.56.21/Lecture /home/shadyabhi/Lecture smbfs username=user,password=pass 0 0 &lt;/blockquote&gt;Here is a sample of the  &lt;a href="http://docs.google.com/leaf?id=0Bz5PTCmbPL4aMzI4Y2Q1MjYtMTI3YS00M2VkLWE2NjItMTk5NDMwYjliZWYy&amp;amp;hl=en"&gt;/etc/fstab file i use&lt;/a&gt;...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-4328489286649883790?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/4328489286649883790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/02/auto-mounting-partitions-samba-shares_21.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4328489286649883790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4328489286649883790'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/02/auto-mounting-partitions-samba-shares_21.html' title='Auto-mounting partitions &amp; samba shares at start-up'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-4000173799897382097</id><published>2010-02-20T05:07:00.000+05:30</published><updated>2010-02-20T05:07:51.065+05:30</updated><title type='text'>Better menu For Gnome</title><content type='html'>Personally I prefer gnome over KDE but there are few things in which Gnome really lack, like it doesnt have a system menu which has a search feature.&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://files.myopera.com/ubuntunerd1/files/blog6/gnomenu2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" height="256" src="http://files.myopera.com/ubuntunerd1/files/blog6/gnomenu2.png" width="320" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;Well, here is the work around. you can install Gnomenu 2.3 which is quite stable..&lt;br /&gt;Installing from the source can be a bit tricky, so here is the &lt;a href="http://goo.gl/z5ak"&gt;debian file to the software. &lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-4000173799897382097?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/4000173799897382097/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/02/better-menu-for-gnome.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4000173799897382097'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4000173799897382097'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/02/better-menu-for-gnome.html' title='Better menu For Gnome'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8833565853015790937</id><published>2010-02-17T14:12:00.001+05:30</published><updated>2010-03-04T16:47:32.576+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>int (*(*foo)(void ))[3] means....</title><content type='html'>Just discovered a nice site to convert these declarations to english language which makes them easy to understand..&lt;br /&gt;&lt;br /&gt;Have a look at this site... (&lt;a href="http://cdecl.ridiculousfish.com/?q=int+%28*%28*foo%29%28void+%29%29%5B3%5D"&gt;CLICK HERE&lt;/a&gt;) &lt;br /&gt;&lt;br /&gt;If you are using ubuntu, you can also install the package "cdecl"..&lt;br /&gt;&lt;br /&gt;To install:-&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$sudo apt-get install cdecl&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8833565853015790937?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8833565853015790937/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/02/int-foovoid-3-means.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8833565853015790937'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8833565853015790937'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/02/int-foovoid-3-means.html' title='int (*(*foo)(void ))[3] means....'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8184457165402985177</id><published>2010-02-14T13:48:00.003+05:30</published><updated>2010-03-04T16:48:36.706+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='nokia mount obex'/><title type='text'>Transfer files to N-series phones on LINUX</title><content type='html'>There is no official support provided by NOKIA for linux, so we dont have any Nokia PC Suite for it..&lt;br /&gt;To transfer files on LINUX, u need to install 2 packages...&lt;br /&gt;I assume u r using ubuntu...&lt;br /&gt;&lt;blockquote&gt;$sudo apt-get install obexfs obexftp&lt;/blockquote&gt;Actually obex protocol is used to communicate with phones.. So, what i am going to do is that i will mount the phone using obex file system support provided by installed package...&lt;br /&gt;&lt;br /&gt;So, make a folder, lets say .. /mnt/nokia&lt;br /&gt;Lets say i am using USB cable...&lt;br /&gt;&lt;blockquote&gt;$sudo&amp;nbsp;obexfs -u 1 /mnt/nokia&lt;br /&gt;$sudo nautilus&lt;/blockquote&gt;&lt;br /&gt;This will open the file browser windows and now u can transfer the files graphically... &lt;br /&gt;&lt;br /&gt;To unmount the phone, type in terminal...&lt;br /&gt;&lt;blockquote&gt;$sudo umount /mnt/nokia....&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8184457165402985177?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8184457165402985177/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/02/transfer-files-into-n-series-phones-on.html#comment-form' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8184457165402985177'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8184457165402985177'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/02/transfer-files-into-n-series-phones-on.html' title='Transfer files to N-series phones on LINUX'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-5019464057073749597</id><published>2010-01-09T14:16:00.001+05:30</published><updated>2010-01-09T14:17:33.552+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='background'/><category scheme='http://www.blogger.com/atom/ns#' term='terminal'/><category scheme='http://www.blogger.com/atom/ns#' term='script'/><title type='text'>Running processes in background</title><content type='html'>While normal usage on linux, you may come across situations where you wish, what if we could run the process in background.&lt;br /&gt;&lt;br /&gt;Like I use a script to login to use the internet. That script runs in the terminal, so what a normal user would do is open the terminal until he wants the script to keep running, which sometimes bugs a lot.&lt;br /&gt;&lt;br /&gt;The better way is running s script in backgroud..&lt;br /&gt;For ex, if the script name is myscript.py&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;$./myscript.py &amp;amp;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;This will run the script in background. To see all programs running in background, type&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;$bg&lt;/span&gt; &lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;To bring it to the foreground, type&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;$fg&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;So, problem solved...&lt;br /&gt;&lt;br /&gt;But what if you forgot to append '&amp;amp;' and script has already started running. Now, if you wish to send the script to background, you will have to do two things. First, suspend the script to background and then make it run..&lt;br /&gt;Below is the example for a script 'Cyberoam.py' with all the commands..&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;shadyabhi@shadyabhi-desktop:~$ ./Cyberoam.py &lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;Enter your ID: 200801076&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;Password: &lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;Login ATTEMPT at: 09-01-2010 -&amp;gt; 14:14:17&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;Next attempt after: 3500seconds&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;Message from CYBEROAM: You have successfully logged in&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;^Z&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;[1]+&amp;nbsp; Stopped&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; ./Cyberoam.py&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;shadyabhi@shadyabhi-desktop:~$ bg&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;[1]+ ./Cyberoam.py &amp;amp;&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;shadyabhi@shadyabhi-desktop:~$ fg&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;span style="color: #999999; font-size: x-small;"&gt;./Cyberoam.py&lt;/span&gt;&lt;br style="color: #999999;" /&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-5019464057073749597?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/5019464057073749597/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/01/running-processes-in-background.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/5019464057073749597'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/5019464057073749597'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/01/running-processes-in-background.html' title='Running processes in background'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-4994408421855206098</id><published>2010-01-05T16:35:00.001+05:30</published><updated>2010-03-08T00:28:09.359+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='vim'/><category scheme='http://www.blogger.com/atom/ns#' term='python'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Get Auto-Complete feature in VIM for python</title><content type='html'>Ever felt like using an IDE for python scripting but didnt want to leave your favourite VIM EDITOR.. Here is the solution to get auto-completion in VIM. &lt;br /&gt;&lt;br /&gt;Goto this &lt;a href="http://www.vim.org/scripts/script.php?script_id=850"&gt;link&lt;/a&gt; and download this plugin..&lt;br /&gt;&lt;br /&gt;See if this location exists: ~/.vim/after/ftplugin&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;If not, create that folder..&lt;br /&gt;&lt;br /&gt;Now, open ~/.vimrc file and add the following lines....&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;filetype plugin on&lt;br /&gt;let g:pydiction_location = '~/.vim/after/ftplugin/pydiction-1.2/complete-dict'&lt;br /&gt;let g:pydiction_menu_height = 20&lt;/blockquote&gt;&lt;br /&gt;Next time you edit a *.py file using vim, auto-completion feature will be enabled. &lt;br /&gt;Feel free to explore more plugins too.. There are many more interesting plugins/&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-4994408421855206098?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/4994408421855206098/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2010/01/get-auto-complete-feature-in-vim-for.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4994408421855206098'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4994408421855206098'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2010/01/get-auto-complete-feature-in-vim-for.html' title='Get Auto-Complete feature in VIM for python'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8217658231453272884</id><published>2009-12-31T09:37:00.005+05:30</published><updated>2010-03-06T12:06:31.651+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='operator overloading'/><category scheme='http://www.blogger.com/atom/ns#' term='C'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C++'/><title type='text'>Few words on Function Overloading</title><content type='html'>&lt;div xmlns="http://www.w3.org/1999/xhtml"&gt;&lt;pre class="c" name="code"&gt;#include&amp;lt;iostream&amp;gt;&lt;br /&gt; struct A { int foo(){std::cout&amp;lt;&amp;lt;"No Arg";} };&lt;br /&gt; struct B { int foo(int a){std::cout&amp;lt;&amp;lt;a;} };&lt;br /&gt;&lt;br /&gt; struct C : A, B&lt;br /&gt; {&lt;br /&gt; //To Solve the error, uncomment NEXT LINE&lt;br /&gt; //using A::foo; using B::foo;&lt;br /&gt; };&lt;br /&gt;&lt;br /&gt; int main()&lt;br /&gt; {&lt;br /&gt; C c;&lt;br /&gt; c.foo(3); //Throws an error&lt;br /&gt; return 0;&lt;br /&gt; }&lt;/pre&gt;&lt;br /&gt;For, folks who think its simple Function Overloading, ITS NOT!!&lt;br /&gt;Also, there is no syntax error ofcoarse.... :D&lt;br /&gt;&lt;br /&gt;But, it feels that it should not throw an error.&lt;br /&gt;&lt;br /&gt;Why is there an error?&lt;br /&gt;Because in looking up the name, it finds functions in two different base class scopes. In this situation, &lt;b&gt;the lookup is ambiguous&lt;/b&gt; - they don't overload each other.&lt;br /&gt;&lt;br /&gt;To Solve!!&lt;br /&gt;A fix would be to use a using declaration for each member name. &lt;b&gt;Lookup will find names in the scope of C++&lt;/b&gt; and don't lookup further.&lt;br /&gt;Now, the call would find two functions, do overload resolution, and find that the one taking int will fit.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="zemanta-pixie"&gt;&lt;img alt="" class="zemanta-pixie-img" src="http://img.zemanta.com/pixy.gif?x-id=cef8e1e8-a4d2-85a9-ac39-0b5055fa658a" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div class="scribefire-powered"&gt;Powered by &lt;a href="http://www.scribefire.com/"&gt;ScribeFire&lt;/a&gt;.&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8217658231453272884?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8217658231453272884/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2009/12/few-words-on-function-overloading.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8217658231453272884'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8217658231453272884'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2009/12/few-words-on-function-overloading.html' title='Few words on Function Overloading'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-621008800896842615</id><published>2009-12-30T13:39:00.004+05:30</published><updated>2009-12-30T13:44:26.350+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='synchronize'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='rsync'/><title type='text'>Synchronize 2 folders</title><content type='html'>Ever felt like of there was a way to synchronize two folders automatically.&lt;br /&gt;Something like if you have a "Lecture Folder" shared on LAN but you also want a backup on your local HDD.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;One thing a lame user will do is "copy and paste" which is pain in the ass.. There should be a automatic method..&lt;br /&gt;&lt;/blockquote&gt;There is a software "rsync" which solves this problem. For ex.&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="background-color: #cccccc;"&gt;$rsync -r --times --progress --verbose --update [source] [destination]&lt;br /&gt;&lt;/blockquote&gt;This way whenever you run this command, it will only copy the files which are new.&lt;br /&gt;&lt;br /&gt;You can also make a shell script for it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-621008800896842615?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/621008800896842615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2009/12/synchronize-2-folders.html#comment-form' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/621008800896842615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/621008800896842615'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2009/12/synchronize-2-folders.html' title='Synchronize 2 folders'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-8255801021934616576</id><published>2009-12-30T12:52:00.006+05:30</published><updated>2011-10-08T15:19:06.568+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='package manager'/><category scheme='http://www.blogger.com/atom/ns#' term='download'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Package Downloader for Debian Based systems</title><content type='html'>&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; If you are in a bandwidth deprived country like INDIA, you might be facing the problem of slow package downloads in Synaptic Manager Manager as it does not support segmented downloads.&lt;br /&gt;&lt;br /&gt;This really freaked me out until I wrote a simple python script that downloads the package using&amp;nbsp;&lt;b&gt;AXEL DOWNLOAD MANAGER&lt;/b&gt; (the best download manager i think) in the newly created director "DownloadedPackages" in the current directory.&lt;br /&gt;&lt;br /&gt;The script also copies the list of links of packages to be downloaded in CLIPBOARD so that you can use it if you want to use any other download manager. &lt;br /&gt;&lt;br /&gt;&lt;b&gt;USAGE:- &lt;/b&gt;&lt;br /&gt;&lt;blockquote&gt;$./ubuntuPackageDownloader.py [package names]&lt;/blockquote&gt;&amp;nbsp;After the packages get downloaded simply goto the DownloadedPackages Directory and&amp;nbsp; type in terminal:-&lt;br /&gt;&lt;blockquote&gt;$sudo dpkg -iR ./&lt;/blockquote&gt;That will install all the packages automatically....&lt;br /&gt;&lt;br /&gt;Simple, easy and fast.... :-)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre class="prettyprint" name="code"&gt;&amp;nbsp;&amp;nbsp;#!/usr/bin/python&lt;br /&gt;&lt;br /&gt;__author__ = """Abhijeet Rastogi a.k.a shadyabhi &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;email: abhijeet.1989@gmail.com&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp; """&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;"""Downloads the required Packages using a download manager &amp;amp; then also install it.&lt;br /&gt;&amp;nbsp;&amp;nbsp; Also, copies the URIs into the clipboard in-case you wish to use a different download manager&lt;br /&gt;USAGE:- To install the packages "qdevelop" &amp;amp; "vim", pass it as a command line argument...&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Type in terminal: &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;$./packageInstall.py qdevelop vim&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;You will be asked for the password if you are not running the script as root.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;The script will create a new directory named "DownloadedPackages" and download all the packages in that directory.&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;Any suggestions will be highly appreciated.... Feel free to mail me.&lt;br /&gt;"""&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import sys&lt;br /&gt;import pygtk&lt;br /&gt;import gtk&lt;br /&gt;import subprocess&lt;br /&gt;import os&lt;br /&gt;from commands import getstatus&lt;br /&gt;from commands import getstatusoutput&lt;br /&gt;from commands import getoutput&lt;br /&gt;&lt;br /&gt;packagesToInstall = ""&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;#Contains the names of packages seperated by spaces&lt;br /&gt;&lt;br /&gt;for li in sys.argv:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if li == sys.argv[0]: pass&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;#Because I dont want the name of the script itself in the packages list.&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else: packagesToInstall = packagesToInstall+li+" "&amp;nbsp;&amp;nbsp; &amp;nbsp;#Forms a space seperated string of packages to be installed&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;def getURIs(packagesToInstall):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;"""Returns the List of URIs to files to download"""&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;packageManagerOutput = getoutput('sudo apt-get install '+packagesToInstall+'--print-uris --yes')&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if packageManagerOutput.find("will be installed")&amp;gt;-1 or packageManagerOutput.find("will be upgraded")&amp;gt;-1:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;links = []&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;downTraffic=packageManagerOutput[packageManagerOutput.find("Need to get ")+12:packageManagerOutput.find("of archives")]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "Size of packages to be downloaded: "+downTraffic&lt;br /&gt;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;while packageManagerOutput.find("'")&amp;gt;0:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;#Until no "'" is left in the string&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;packageManagerOutput = packageManagerOutput[packageManagerOutput.find("'")+1:]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;links.append(packageManagerOutput[0:packageManagerOutput.find("'")])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;packageManagerOutput = packageManagerOutput[packageManagerOutput.find("'")+1:]&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return links&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;else: &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "No new package will be installed"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;return None&lt;br /&gt;&lt;br /&gt;URIs = getURIs(packagesToInstall)[1:];&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;#List of URIs returned&lt;br /&gt;arg =&amp;nbsp; None #Space seperated list of URIs&lt;br /&gt;&lt;br /&gt;if URIs is not None:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;#Checked if any files are needed to be downlaoded&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;arg = ""&amp;nbsp;&amp;nbsp;&amp;nbsp; #Space seperated list of URIs&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for uri in URIs:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;arg +=uri+" "&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;clipboard = gtk.clipboard_get()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;clipboard.set_text(arg)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;clipboard.store()&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;#print "The space-seperated list has been copied to the clipboard\n or otherwise here's the list: \n"+arg&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;packageNames = []&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;#NExt 3 lines to make the package name list&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for uri in arg.split(" "):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;packageNames.append(uri.split("/")[-1])&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if uri!="":&amp;nbsp; print "The following packages will be downloaded: \n"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;for name in packageNames: print name&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;#Creating the DownloadPackages Directory&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;if packageNames!=[]:&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cmd = 'ls ./DownloadedPackages'&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = getstatusoutput(cmd);&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ret[0]==0: &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;os.chdir('./DownloadedPackages')&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;else: &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;os.mkdir('DownloadedPackages')&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;os.chdir("./DownloadedPackages")&lt;br /&gt;&lt;br /&gt;#Starting the Download Manager AXEL&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if uri!="": print "Starting the Download Manager AXEL"&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;flag=0&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;for uri in URIs:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (os.path.isfile(uri[uri.rfind("/")+1:]) &amp;amp; (not os.path.isfile(uri[uri.rfind("/")+1:]+".st"))) is True:&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "Pass as file already downlaoded from "+uri&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;pass&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if (os.path.isfile(uri[uri.rfind("/")+1:]+".st") or (not os.path.isfile(uri[uri.rfind("/")+1:]))):&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;cmd = "axel -a "+uri&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;ret = subprocess.call(cmd.split())&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "Return Value of AXEL: "+str(ret)&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if ret!=0: flag=1&lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;if flag==0:&amp;nbsp;&amp;nbsp; &amp;nbsp;print "Packages downloaded successfully"&lt;br /&gt;else: &lt;br /&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp;print "No packages are required to be downloaded"&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-8255801021934616576?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/8255801021934616576/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2009/12/package-downloader-for-debian-based.html#comment-form' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8255801021934616576'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/8255801021934616576'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2009/12/package-downloader-for-debian-based.html' title='Package Downloader for Debian Based systems'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-2436374446525849720</id><published>2009-12-30T11:59:00.004+05:30</published><updated>2009-12-30T12:03:03.910+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='modem'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Installing modems On LINUX</title><content type='html'>&lt;span style="font-size: small;"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Installing modems can be a bit tricky on LINUX as windows users are more used to GUI stuff.&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;I even met some people who said that modem cant be installed because there are no drivers for LINUX... :D&lt;br /&gt;&lt;br /&gt;First You need to install "&lt;b&gt;wvdial&lt;/b&gt;" package.&lt;br /&gt;&lt;br /&gt;The package manager will select the dependencies automatically but if thats not the case, following are the required packages:-&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;libuniconf&lt;/li&gt;&lt;li&gt;ibwvstreams&lt;/li&gt;&lt;li&gt;libxplc&lt;/li&gt;&lt;li&gt;wvdial&lt;/li&gt;&lt;/ol&gt;Now, in this example I will install a LG-350T modem(distrubuted by TATA INDICOM in INDIA) on ubuntu 9.10.&lt;br /&gt;&lt;br /&gt;Prerequisites are that you should have the manual for the modem which should be provided by the compant..&lt;br /&gt;&lt;br /&gt;Here goes the procedure:- &lt;br /&gt;&lt;br /&gt;1. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$sudo wvdialconf /etc/wvdial.conf&lt;/span&gt;&lt;br /&gt;This command autodetects the settings of your modem which can be wrong. :-(&lt;br /&gt;&lt;br /&gt;2. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$sudo vim /etc/wvdial.conf&lt;/span&gt;&lt;br /&gt;Now, we will edit the configuration file of the modem..&lt;br /&gt;&lt;br /&gt;3. Change the contents of wvdial.conf file to:&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size: x-small;"&gt;[Dialer Defaults]&lt;br /&gt;Modem = /dev/ttyACM0&lt;br /&gt;Modem Type = USB Modem&lt;br /&gt;Baud = 115200&lt;br /&gt;Phone = #777&lt;br /&gt;Username = internet&lt;br /&gt;Password = internet&lt;br /&gt;Dial Command = ATDT&lt;br /&gt;Init1 = ATZ&lt;br /&gt;Init2 = AT+CRM=1&lt;br /&gt;FlowControl= Hardware (CRTSCTS)&lt;br /&gt;Stupid Mode = 1&lt;br /&gt;Carrier Check = no&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;4. &lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;$sudo wvdial&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace;"&gt;The internet&amp;nbsp; &lt;/span&gt;&lt;span style="font-family: inherit;"&gt;should be connected &amp;amp; remember not to close the terminal otherwise internet will disconnect.&amp;nbsp;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: inherit;"&gt;To disconnect kill the process by pressing "&lt;b&gt;Ctrl+C&lt;/b&gt;"&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;You can also &lt;a href="http://www.youtube.com/watch?v=USBnJQ8mg1c"&gt;see the video on youtube&lt;/a&gt; which I uploaded..&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-2436374446525849720?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/2436374446525849720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2009/12/installing-modems-on-linux.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/2436374446525849720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/2436374446525849720'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2009/12/installing-modems-on-linux.html' title='Installing modems On LINUX'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-4408103968441774614</id><published>2009-12-29T23:05:00.000+05:30</published><updated>2009-12-29T23:05:05.798+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='perl'/><category scheme='http://www.blogger.com/atom/ns#' term='symbian'/><title type='text'>Extract contents of a .SIS File (Symbian OS in mobile phones)</title><content type='html'>We sometimes need to see the contents of a sis file in order to know more about a particular software.&lt;br /&gt;&lt;br /&gt;Here is a simple perl script to extract the contents of a sis file. Yes, no use of any software!!&lt;br /&gt;&lt;br /&gt;Suppose the sis file has name "theFile.sis".&lt;br /&gt;&lt;br /&gt;Type in terminal:-&lt;b&gt; $perl unsis.pl theFile.sis ./&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;to extract in the current folder.&lt;br /&gt;&lt;br /&gt;NOTE:- Make sure that the two &lt;a href="http://www.mediafire.com/?viq0zqqznzz"&gt;files&lt;/a&gt; (&lt;b&gt;SisFile.pm &amp;amp; unsis.pl&lt;/b&gt;)&amp;nbsp; are in the same folder.&lt;br /&gt;&lt;br /&gt;Download the two files from &lt;a href="http://www.mediafire.com/?viq0zqqznzz"&gt;here&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-4408103968441774614?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/4408103968441774614/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2009/12/extract-contents-of-sis-file-symbian-os.html#comment-form' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4408103968441774614'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/4408103968441774614'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2009/12/extract-contents-of-sis-file-symbian-os.html' title='Extract contents of a .SIS File (Symbian OS in mobile phones)'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2964319896839059376.post-683036943006868143</id><published>2009-12-29T21:52:00.000+05:30</published><updated>2009-12-29T21:52:19.560+05:30</updated><category scheme='http://www.blogger.com/atom/ns#' term='songbird'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Make iPod work on Songbird 1.2.0 under ubuntu 9.10</title><content type='html'>The iPod used to work with the official addon till ubuntu 9.04 but the&lt;span style="font-style: italic; font-weight: bold;"&gt; iPod fails to be detected on ubuntu 9.10.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;I was also frustrated since the evening. But, I got a simple solution.&lt;br /&gt;&lt;br /&gt;Steps:-&lt;br /&gt;&lt;br /&gt;1) Make sure that your &lt;span style="font-weight: bold;"&gt;iPod is disconnected&lt;/span&gt; and Songbird is &lt;span style="font-weight: bold;"&gt;not open&lt;/span&gt;.&lt;br /&gt;2) Open terminal and type "&lt;span style="font-weight: bold;"&gt;killall -9 nautilus&lt;/span&gt;" (without quotes).&lt;br /&gt;3) Connect the iPod and wait for few seconds (10 or 15 seconds).&lt;br /&gt;4) Press "&lt;b&gt;Alt+F2&lt;/b&gt;" and type "&lt;b&gt;nautilus&lt;/b&gt;" (without quotes) and press enter.&lt;br /&gt;5) Open Songbird.&lt;br /&gt;&lt;br /&gt;This should work....!&lt;br /&gt;&lt;br /&gt;&lt;div class="separator" style="clear: both; text-align: center;"&gt;&lt;a href="http://1.bp.blogspot.com/_JjJOh0rb2yI/SzorZUsfQAI/AAAAAAAABIU/3u2WAIHM8o0/s1600-h/Screenshot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"&gt;&lt;img border="0" src="http://1.bp.blogspot.com/_JjJOh0rb2yI/SzorZUsfQAI/AAAAAAAABIU/3u2WAIHM8o0/s400/Screenshot.png" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2964319896839059376-683036943006868143?l=linux-junky.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linux-junky.blogspot.com/feeds/683036943006868143/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://linux-junky.blogspot.com/2009/12/make-ipod-work-on-songbird-120-under_29.html#comment-form' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/683036943006868143'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2964319896839059376/posts/default/683036943006868143'/><link rel='alternate' type='text/html' href='http://linux-junky.blogspot.com/2009/12/make-ipod-work-on-songbird-120-under_29.html' title='Make iPod work on Songbird 1.2.0 under ubuntu 9.10'/><author><name>Abhijeet Rastogi</name><uri>https://profiles.google.com/107316377741966576356</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-LAoD2rdPie4/AAAAAAAAAAI/AAAAAAAABSk/QJ6lOyfmkQo/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_JjJOh0rb2yI/SzorZUsfQAI/AAAAAAAABIU/3u2WAIHM8o0/s72-c/Screenshot.png' height='72' width='72'/><thr:total>5</thr:total></entry></feed>
