Tuesday, June 17, 2008

Firefox 3 download day - Mozilla just got into politics

Well, Firefox 3 finally arrived and all is well in the world. I was just browsing the downloads map and was ready to call it a night when something caught my eye. Something was strange about that map... Ah, that's it, there seems to be one state missing on the map. For all of you that don't know which one is missing, let me give you a hint -- it's a small state just north of Albania, south of Serbia. You guessed it, it's Kosovo. Yes, Kosovo. The state that got its independence in February this year is not plotted as a separate country, but rather as a part of Serbia (of which it was a part until recently). Now, it may be considered overranting, but I wonder why isn't Kosovo listed as a separate country. After all, it is recognized by the US (country which Mozilla calls home), the UK, France, Italy, Germany... The list goes on. And it's not like the guys at Mozilla didn't have time to prepare, Kosovo got its independence in February which gave them some four months to add it to the countries list. So, why can't I see how many people from Kosovo downloaded Firefox 3? And more importantly, who decides if a country is relevant enough to be added to a company's list? It seems that nowadays a country has to be recognized not only by other countries, but also by companies if it wishes to make a meaningful existence...





Monday, April 7, 2008

Saving e-mails to disk (from a gmail account)

As I was trying to download all my spam messages to disk (I'm building a database of spam messages), I realised that this is no simple task. Well, one thing I could do is save the messages using Thunderbird or Outlook, but since I don't use either (I consider the Gmail web interface very nice and user-friendly) this one is out of the question. However, after a little browsing I discovered a wonderful Python package called libgmail. Long story short, here is the script I used to download all the messages from the spam folder:


#!/usr/bin/env python
'''
savemsg.py -- Download all messages from a specified folder
License: GPL 2.0
'''

import sys
from getpass import getpass
import libgmail

if __name__ == "__main__":
try:
name = sys.argv[1]
except IndexError:
name = raw_input("Gmail account name: ")

pw = getpass("Password: ")

ga = libgmail.GmailAccount(name, pw)

print "\nPlease wait, logging in..."

try:
ga.login()
except libgmail.GmailLoginFailure,e:
print "\nLogin failed. (%s)" % e.message
sys.exit(1)
else:
print "Login successful.\n"

FOLDER_list = {'U_INBOX_SEARCH' : 'inbox',
'U_STARRED_SEARCH' : 'starred',
'U_ALL_SEARCH' : 'all',
'U_DRAFTS_SEARCH' : 'drafts' ,
'U_SENT_SEARCH' : 'sent',
'U_SPAM_SEARCH' : 'spam',
}

FOLDER_list = raw_input('Choose a folder (inbox, starred, all, drafts, sent, spam): ')
folder = ga.getMessagesByFolder(FOLDER_list)

for thread in folder:
for msg in thread:
print "Downloading message %s " % msg.id
encIndexStart = msg.source.find('charset=')
if encIndexStart != -1:
encIndexEnd = (msg.source.find(' ', encIndexStart),\
msg.source.find('\n', encIndexStart),\
msg.source.find(';', encIndexStart),\
msg.source.find('"', encIndexStart+10))
encIndexEnd = [ind for ind in encIndexEnd if ind != -1]
encIndexEnd = min(encIndexEnd)
enc = msg.source[encIndexStart + 8:encIndexEnd]
enc = enc.replace('"', '').replace(';', '')
else:
enc = 'ascii'
print "Detected encoding %s\n" % enc
try:
f = open(msg.id + " " + msg.subject + ".txt", 'w')
except:
# message subject contains characters forbidden by the os in the
# file name, use just message id
f = open(msg.id + ".txt", 'w')
try:
f.write(msg.source.decode(enc).encode('utf-8'))
except:
f.write(msg.source)
f.close()
print "\n\nDone."


One could use the script to download messages from any gmail folder. The encoding of the message is automatically recognized and the message is saved in UTF-8 to facilitate later processing. Of course, you have to have libgmail installed to run the script. It is also very easy to adapt the script to use it for any other purpose (I actually wrote this script by changing one of the demo scripts that come with libgmail).








Tuesday, March 4, 2008

Reddit alien in LaTeX

What to do on a lazy sunday afternoon? Well, there are probably a thousand useful
things one could do, but I chose to do something completely useless. And here it is, the reddit alien drawn in LaTeX (using PsTricks) :)


\documentclass{memoir}

\usepackage{pstricks}
\usepackage{pst-all}

\begin{document}

\thispagestyle{empty}

%\psset{linecolor=red}
\psset{linewidth=1pt}
\begin{pspicture}(6,9)
%\psgrid[subgriddiv=1,griddots=10,gridlabels=10pt](0,0)(12,12)
\psframe(0,0)(6,9)
% head
\psellipse(3,6)(1.8,1)
% ears
\psarc{-}(1.5,6.5){0.4}{38}{230}
\psarc{-}(4.5,6.5){0.4}{-50}{142}
% eyes
\pscircle[fillstyle=solid,linestyle=none,fillcolor=orange](2.3,6.3){0.3}
\pscircle[fillstyle=solid,linestyle=none,fillcolor=orange](3.7,6.3){0.3}
% mouth
\psbezier(2.3,5.6)(2.5,5.3)(3.5,5.3)(3.7,5.6)
% the tentacle thingie
\psline(2.99,6.99)(3.6,8)
\psline(3.581,7.993)(4.1,7.8)
\pscircle(4.35,7.65){0.3}
% arms
\psarc{-}(2.8,4.3){1.1}{130}{231}
\psarc{-}(3.15,4.3){1.1}{-48}{50}
% body
\psbezier(2.1,5.15)(2.0,4.7)(1.8,3.3)(2.6,2.7)
\psbezier(3.85,5.15)(4.1,4.65)(4.1,3.3)(3.4,2.7)
% feet
\psline(1.65,2.7)(4.3,2.7)
\psarc{-}(2.1,2.685){0.45}{70}{180}
\psarc{-}(3.85,2.685){0.45}{0}{105}
\end{pspicture}

\end{document}

Note that I used the memoir document class, but you could also use article if you don't have memoir available (the results would be the same). The alien does not look exactly the same as the official reddit one, but who cares? And here is what you should get when you run this example through LaTeX:

And people say LaTeX suxx...





Monday, February 25, 2008

Deferred printing in LaTeX

Ever written a textbook? Ever written any document that has questions/problems and answers to those problems? Usually when you do this, you want to have questions printed in one place (or questions in each section of the document), and answers printed at the end of the document (so your readers, which are usually students, would try to actually solve the problem rather than just look at the solution which is right under the problem).
Now, I don't know how most of you usually do this, but up until now the only way I knew to do this is the "brute force" approach---I would simply write the questions and then, at the end of the document, I would write the answers. The obvious drawback of this approach is that you have to look up each individual question when writing the answers (just to see what it was) and this can quickly become very boring. Or, if you have the questions/answers on paper, they are usually written in pairs question/answer so you have to first type all the questions (ignoring the answers), and then go back to the begining of the paper and type all the answers (ignoring the questions). Anyway, I hope you get the picture why I hate doing this.
Wouldn't it be great if I could somehow have the question and its answer in the same place in the source of the document (notice that we are not talking about WYSIWYG text processors here), but then defer the printing of answers in the output document (that is, print the answers at the end of the document)? The solution to my problem comes in a form of the LaTeX box mechanism. Just take a look at this minimal example:


\documentclass{article}

\newbox\answerscollect
\newcounter{problem}
\setcounter{problem}{0}
\renewcommand{\theproblem}{\textit{Problem \arabic{problem}.}\,}

\def\answer#1{\par\setbox\answerscollect=\vbox{\unvbox\answerscollect\vspace{5mm}\theproblem\,#1\par}}
\def\printanswers{\unvbox\answerscollect\setbox\answerscollect=\vbox{}}
\def\initbox{\setbox\answerscollect=\vbox{Answers:\par}}

\newcommand{\problem}[1]{\addtocounter{problem}{1}\par\theproblem\textit{#1}}

\begin{document}

\initbox

\section{Intro}
Some text before...

\problem{What is the capital of the US?}
\answer{Washington, D.~C.}

\problem{What is 2+2?}
\answer{4}

\section{Foo}

Some other text goes here...

\section{Answers}

\printanswers

\end{document}

Now I know it looks a bit complicated, but it really isn't. What we are doing is creating a box and storing all the answers in it, and then, when the time is write, we simply print all the contents of that box using the \printanswers command. This way, we can simply have the problem and its solution (answer) in the same place in the source of the document, but have the answers appear in a totally different place in the output pdf (or postscript or whatever). Now, I'm not going to go into details of the LaTeX code itself here. Those who know LaTeX will pretty much understand the code, and those who don't should first learn the basics before trying to get this. Anyway, the code can be used out-of-the-box; if someone would like to change something but doesn't know how, you can contact me. Last, but not least, here is how the output pdf looks like:


UPDATE: As Evan noted, if you are going to use multiple files, don't use \include. Instead, use the \input command which does not create new .aux files.