Girish Venkatachalam is a UNIX hacker with more than a decade of
networking and crypto programming experience.
His hobbies include yoga,cycling, cooking and he runs his own
business. Details here:
UNIX geeks belong to the command line world. They want to do everything from google searches to flickr photo uploads from the almighty UNIX command line. Since most websites nowadays have a REST API or similar this is very much possible and even desirable in several cases.
Google has released pygoogle for google searches from the command line and many options exist for accessing flickr photographs. Nearly every online service including rememberthemilk todo lists, delicious bookmarks and of course mail services like gmail include a way to access and modify your online storage from the command line.
In this article we are going to look at a tiny project to access the English dictionary from the command line. There is a C client invoked using the dict(1) command on UNIX boxes. The dictionary protocol is a very simple text based protocol described in RFC2229.
I wrote this Python script just for fun. I feel that both the dictionary protocol and Python are useful tools to learn protocols and programming respectively. Especially if you are a beginner.
#!/usr/bin/env python import socket,sys,re if len(sys.argv)==1: sys.exit("Usage: " + sys.argv + " [dictionary server]") pat = re.compile("250 ok") pat2 = re.compile("\.|2\d\d"); pat3 = re.compile("1\d\d") errpat = re.compile("552 no match"); errpat2 = re.compile("551"); #create an INET, STREAMing socket s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) #now connect to the dictionary server on port 2628 # By default it connects to www.dict.org unless overridden by the # command line if len(sys.argv) == 3: s.connect((sys.argv, 2628)) else: s.connect(("www.dict.org", 2628)) s.send("define * " + '"' + sys.argv.strip() + '"' + "\r\n\r\n") buf = '' while 1: tmpbuf = s.recv(1024) if not tmpbuf: break buf += tmpbuf if errpat.search(tmpbuf): sys.stdout.write("No definitions found for " + '"' + sys.argv.strip() + '"') s.send("match * lev " + '"' + sys.argv.strip() + '"' + "\r\n\r\n") res = s.recv(80) if errpat.search(res) or errpat2.search(res): print s.send("quit\r\n") s.close() sys.exit() else: sys.stdout.write(", perhaps you mean:") suggestions = s.recv(2048) source = '' for line in suggestions.splitlines(): if source != '': prev = source else: prev = '' if pat.match(line) or pat2.match(line): break source = line.split(' ') if prev == source: sys.stdout.write(' ' + source.strip('"')) else: sys.stdout.write('\n' + source + ':' + ' ' + source.strip('"')) print s.send("quit\r\n"); s.close() sys.exit() if pat.search(tmpbuf): break for line in buf.splitlines(): if pat2.match(line): continue if pat3.match(line): if line.find('" ') != -1: a = line.split('" ') print b = str(a).split(' '); c = ' '.join(b[1:]) d = c.split('"') print "From " + d + ' ' + '[' + b + ']' + ":\n" else: a = line.split(' ') a = "found" print ' '.join(a[1:]) continue sys.stdout.write(' ' + line + "\n") s.send("quit\r\n"); s.close()
Copy paste the above python code as dict.py and give execute permissions.
$ chmod +x dict.py
Now all you have to do to lookup a word is type this on the UNIX command line:
$ dict.py programming
This will lookup a dictionary server from the Internet and print the meanings along with thesaurus lookups to the console. You might wish to use a pager program like less(1) or redirect the output to a file.
Learning is easy when things are kept simple. Once we master the basics we can over time graduate to master advanced concepts. Happy programming.
Got something to add? Send me email.
More Articles by Girish Venkatachalam © 2013-06-21 Girish Venkatachalam