A wrapper for osd_cat
Few months ago, we discussed about a mail notification method for fetchmail/procmail and mutt combo. As you can see in that post, the script we wrote to handle notification was dependent on ratpoison. Well it makes life bit tough for my non-ratpoison X sessions. I thought it would be a good idea to make the script window manager independent. Enter osd.sh
The script uses osd_cat. It comes in the XOSD package for most of the unices. It is similar to the cat command for the console. It can read a file, string or the stdin and output the text onto X display. It has a bunch of config options which let you choose font, location etc. for the text. I’d recommend a RTM (man osd_cat).
Here is the code:
#!/bin/bash
# Displays a string on the screen
# Last Modified: Mon 22 Jun 2009 02:59:55 AM IST
# let osd know, we have a X running. there will be problems if this script is
# called from different user. disable acl in X in that case(use xhost +).
export DISPLAY=":0.0"
color="red"
font="-*-dina-medium-r-normal-*-16-*-*-*-*-*-*-*"
age="6"
align="center"
delay="4"
indent="0"
lines="5"
offset="0"
shadow="1"
pos="middle"
# read from stdin if no args are present
if [ $# -ne 1 ]
then
text=$(line)
else
text=$1
fi
echo $text | osd_cat --color=$color --delay=$delay --age=$age --font=$font --offset=$offset --shadow=\
$shadow --lines=$lines --align=$align --pos=$pos
This script can be used for any notification purpose. For using this with procmail, replace use the following construct in procmailrc:
:0 h
| grep "From:" | /home/arun/bin/osd.sh
This will display alerts as “From: Foo Bar ” when a new mail is received.
Enjoy!
Global command in VIM
Well you guessed it right, the “global” command (or :g in command mode) will let you select lines that match a particular pattern globally in the file and lets you operate on the selected text. The :v operates similar to grep -v which selects all texts which do not match the pattern.
Syntax: :g/pattern/command where pattern is any regular expression, command is any vim command
Here’s the scenario which taught me the global command:
I have a file with ~29K lines. All lines must begin with “\\”. However somelines are broken into two, in which case the lines which do not start with “\\” need to be appended to the previous
line
Sample text:
\\foo\bar
\\food
bar
\\x\y
\z
Should be converted to:
\\foo\bar
\\foodbar
\\x\y\z
And we solved it this way:
:v/^\\\\/exe "normal i\<C-H>\<ESC>"
All we did was to execute a backspace(C-H) for all occurences of pattern in normal mode
Let’s end the post with a theorem:
Statement:VI is perfect
Proof: VI in roman numerals is 6. The natural numbers less than 6 which
divide 6 are 1, 2, and 3. 1 + 2 + 3 = 6. So 6 is a perfect number. Therefore, vi
is perfect.
– Arthur Tateishi
And a corollary
VIM in roman numerals might be: (1000 – (5 + 1)) = 994, which happens to be
equal to 2*496+2. 496 is divisible by 1, 2, 4, 8, 16, 31, 62, 124, and 248 and
1+2+4+8+16+31+62+124+248 = 496. So, 496 is a perfect number. Therefore, vim is
twice as perfect as vi, plus a couple extra bits of goodies.
That is, vim is better than perfect.
– Nathan T. Oelger
Have an awesome 2009!
New mail notification with Procmail
Problem: I have my local mail setup with mutt, fetchmail and procmail. And I would need a way to run an arbitrary script when new mail arrives and _not_ loose the mail from my inbox.
Solution: Procmail supports a nice feature called nesting. With nested blocks a procmail recipe can be assigned more than action.
e.g: Here’s a recipe to filter all my email from gmail:
:0:
* ^To:.*gmail\.com
{
:0 c
$MAILDIR
:0 h
| grep “From:” | ~/src/_scripts/ratpoison/newmail.sh
}
And the newmail.sh script
#!/bin/bash
read from
ratpoison -c "echo Mail $from"
Discussion: Here’s the breakup
*^To:*gmail.comCatch all mails which have their To: field containing gmail.com- Nesting: specify the actions inside { .. }
:0 c -Copy the mail into $MAILDIR:0 h– Pipe the header into grep. And pipe the output (”From:*”) into newmail script- In newmail.sh script, read the piped content into variable $from and display that in ratpoison message bar
If your window manager has a notification tray, you may be interested in this. New to procmail, go here.
/me is having bit overdose of cookbooks these days
[Update] Download youtube videos in linux
I had posted long back about a bash wrapper over youtube-dl to fetch youtube videos using your own download manager. The youtube-dl script had changed long since then. And good news is now we don’t need to change the script in any way to get the download url. So here we go!
Grab the latest youtube-dl from here
Minor update to the linux youtube-dl script:
#!/bin/bash
if [ $# -ne 2 ]
then
echo “Usage : $0 ”
echo “e.g : $0 http://www.youtube.com/watch?v=D1R-jKKp3NA steve_jobs”
else
outputfile=”.avi”
todnload=$(youtube-dl -g $1) # youtube-dl is in path, right?
echo “Got the file..”$todnload
axel -n 100 $todnload -o $2″.flv” # wget -c $todnload -O $2″.flv” .if you don’t use axel
echo “Download Completed…”
ffmpeg -i $2″.flv” $2$outputfile # get the avi file
fi
Enjoy 
Thanks Jay for pointing this out!
How to choose a web host
Lemme shout it aloud: I am a big fan of free webhosts
Until recently, one of my friends made me realize(brainwashed!) that probably I had had my part of the freebies
And its been long since I last did something php-ish, so the thought of getting hands dirty with web programming made me take this bad decision of getting a host.
And dude, choosing the right host _is_ much tougher than expected. It ate up some 10s of my sleep-hours and a few man-weekends
Finally, yesterday I gave up(damn it! set IDontCare=true) on my FindBestHost greedy approach and purchased a hosting package.
A few suggestions for those looking out for webhosts:
- Apply filters
Define your purpose. Why you need a web host? What kind of websites you plan to host? Any special requirements? How much resources(space/bandwidth) do you think you’ll spend?
As an example, here are my answers: I need a webhost to host a blog(pleaseeeee not one more!). Mostly the website will be personal and will host my dev work, some projects. Since I am a self-proclaimed web hobbyist, I would need flexibility in terms of scripts (RoR?). At max, I will put in 5-10 domains in the web space. Considering a GB per site, will take up 5GB and assuming a moderate crowd will use my web resources, lets allow 40GB per domain per month, that would make bandwidth around 200GB per month. - The search begins!
Use your favorite search engine. Ask around. SetGTalkStatus/Twitter/Spam/Scrap/Write-on-wall your contacts. If they can refer, your hard job is done. Don’t waste time on more search. Jump to the next step.
In case you’re shy to ask people, you can look in some good webhosting forums (e.g: WebHostingTalk). They’re good. Lots of webhost guys roam around there. I got around 14k results for a simple search query “recommend host”
I think first 3-4 pages should suffice. This is a good starting place as well.
- Test the host!
At this time, we should have a shortlist of 4-5 hosts. Now for each host try this:- Go to Webhosting.info. Search for the webhost. Have a good look at the number of domains coming into the host and going out each week. You can country wise breakup of top hosts. For me the most important criteria was domain in/out analysis and total domains hosted.
- Do a “You suck” test. Query your favorite seach engine for negative reviews of the host. E.g: Go to your favorite search engine. Query for “[webhost] sucks”. Safely ignore the [Web Host Name]reviews.com(e.g: [TheBigCheapAndBestWebHost]Reviews.com) websites. A good choice would be query in Blog Search.
- Consider having a chat with the sales/support people at the webhosting live chat. Sometimes the time they make you wait will immediately give you a feel of their customer service
- Beware of these!
- The “foobar” offers. Before you sell out cash on *any* offer that gives you substantial discounts, make sure you’re aware of their normal(non-foobar) pricing. Unless you plan to change host every billing cycle, you will be charged against the normal pricing. E.g: A webhost offers 4.95USD as foobar price and normal pricing is 7.95USD.
And I never understood the rationale behind the *.95USD pricing rule. - Overselling. I was really astounded at the number of companies offering unlimited resources. So I went around bugging their sales/support guys on this. They say you can’t store personal files(Does it translate to “all your files must be web accessible”?). I doubt if they have shared hosting customers who distributes legal 1gig files! I wish I could copy/paste the chats I had with these guys
Clearly these people are overselling. They’ll put in your site in some server with probably a few hundred more poor domains. IMO unlimited bandwith can make sense for people who publish streaming content. But does the resource usage policy of these shared hosts allow you to stream enough?
I would suggest to take a limited resource plan. I agree we all love greedy algos, but lets truly have an estimate of the resource usage before getting lured away on such offers.
- The “foobar” offers. Before you sell out cash on *any* offer that gives you substantial discounts, make sure you’re aware of their normal(non-foobar) pricing. Unless you plan to change host every billing cycle, you will be charged against the normal pricing. E.g: A webhost offers 4.95USD as foobar price and normal pricing is 7.95USD.
Hope this might save a few minutes while deciding for a webhost. Good luck!
Sistine: A sify broadband client
Sify provides a connection client(they call it BBClient) for linux. If you use bbclient on *nix, these would have hit you:
- Sifyconnect is a pre-compiled (linked to old openssl libs) binary. I had to literally do some ‘n’ softlinks to get it start.
- As soon as I login, I am greeted with Sify homepage. That to with firefox running from root
- They overwrite my custom resolv.conf with the sify nameservers.
- The UI is a gtk interface which hangs on. I think it needs a systray to hide. Unfortunately my wm doesn’t provide a systray (though I can use stalonetray, but using that for a single app..)
After living through these for nearly three months, yesterday the level of irritation overtook my laziness. I had to disconnect few times and everytime the client would fork a firefox. The search for alternate client began. I stumbled across a nice hack by Liet-Kynes. The hack literally dissects the sify connection mechanism
Stepped through the script and modified a few bits to get the script working in my machine. And now its release time!
Download: Sistine-20081002.tar.bz2
Usage: Login: sistine.py in | Logout: sistine.py out || Please read the README bundled in the archive.
ChangeLog:
- Simple command line args. (in: login and out:logout)
- Added Logout support to the script
- Minor modification to connection string
- A small bug: If your password contains special characters then the script might not connect. I will look into this for next update. Please patch it if you’re a python guy.
Disclaimer: Your box might burst/fly/crawl on running the script. Don’t blame me for that. The script works normally for me btw.
License: Public domain. Bend it as you like.
I’ve tested the script in linux. It should work in windows as well if you’ve python installed.
The original code by Liet-Kyne is sistine-20070828.tar.gz. Kudos to Liet-Kyne, buddy you’re a true hacker
Update: If you’re in python 2.6, get the scripts from my github.











3 should-use vim plugins
with 5 comments
The first two are very useful, if you kill bugs for a living (read debugging freak).
‘NERDs use real editors (VIM
This is your friend for browsing those 1000x lines of legacy code. All it does is: creates a split window and shows the macros, functions, variables etc.. You can C-w (ctrl+w) to the split window and start jumping through the code. Ofcourse, I agree with the die hard ctags fans. CTags is the ultimate thingy! I prefer not using my best weapon(ctags -R *.cs) against a single progam.cs which has damn 3000 lines of code (its reality! spare me, I din’t write that program
! put this in .vimrc/_vimrc! press \tt to toggle taglist on/off in normal mode
nmap <Leader>tt :TlistToggle<cr>
This will add “time” dimension to your source code. First time you create the file, add these:
Created: TIMESTAMPLast Modified: TIMESTAMP
Rest assured for the life of that file. Every time you save the file, Last Modified will get updated. For those lazy guys, this is a tool to measure your level of procrastination.
What would be your “three” should-use vim plugins?
Written by arun
September 10, 2008 at 6:35 am
Posted in Programming
Tagged with code, comment, productivity, tags, vim