01
Mini-Namco #3: (Almost) Finished
Filed Under (Open source, Other stuffs) by 2of1 on 01-09-2011
And the (almost) finished machine running Namco Museum’s Ms. Pacman…

(Sorry for the grainy 3.2MP mobile-phone pic)
01
And the (almost) finished machine running Namco Museum’s Ms. Pacman…

(Sorry for the grainy 3.2MP mobile-phone pic)
31
Ok, so I constructed the unit over the past two evenings.
I stupidly didn’t take photos during the construction and seriously messed up the paint job.
Read the rest of this entry »
02
After being inactive for a long while on my fullsize Mame cabinet project (put on hold indefinitely until I get some perspex/stop being lazy), I was inspired by Victor Coleiro’s “Worlds Smallest Space Invaders” project to do something similar myself.
Read the rest of this entry »
11
Here’s some code for a simple C hashtable.
Read the rest of this entry »
10
Recently my WM of choice has been xmonad.
Configuring the desktop to my specification has been fun yet sometimes quite tedious as i messed around with the Haskell config (my knowledge of haskell == NULL), dzen2, conky, etc.
Here’s a screenshot from my main xinerama screen:

If anyone wants some inspiration for their setup, here are the relevant config files / scripts:
xmonad.hs
import XMonad import XMonad.Hooks.DynamicLog import XMonad.Hooks.ManageDocks import XMonad.Hooks.XPropManage import XMonad.Hooks.FadeInactive import XMonad.Util.Run(spawnPipe) import XMonad.Util.EZConfig(additionalKeys) import XMonad.Prompt import XMonad.Prompt.RunOrRaise import System.IO import qualified XMonad.StackSet as W import XMonad.StackSet(stack) import XMonad.Actions.TagWindows main = do workspaceBarPipe <- spawnPipe myStatusBar spawn myConkyBar xmonad $ defaultConfig { manageHook = manageDocks <+> manageHook defaultConfig <+> myManageHook , layoutHook = avoidStruts $ layoutHook defaultConfig , terminal = "urxvt" , workspaces = myWorkspaces , startupHook = myStartupHook , logHook = myLogHook workspaceBarPipe >> fadeInactiveLogHook 0xdddddddd , modMask = mod4Mask } `additionalKeys` [ ((mod4Mask .|. shiftMask, xK_z), spawn "xscreensaver-command -lock") , ((controlMask, xK_Print), spawn "sleep 0.2; scrot -s") , ((0, xK_Print), spawn "scrot") , ((mod4Mask, xK_x), runOrRaisePrompt defaultXPConfig) , ((mod4Mask, xK_m), focusUpTaggedGlobal "mail") , ((mod4Mask, xK_i), focusUpTaggedGlobal "irc") , ((mod4Mask, xK_c), focusUpTaggedGlobal "chat" >> spawn "cat /dev/null > /tmp/centerim.msgs") , ((mod4Mask, xK_b), focusUpTaggedGlobal "web") , ((mod4Mask, xK_d), focusUpTaggedGlobal "dev") ] ws_term = "1:term" ws_web = "2:web" ws_dev = "3:dev" ws_comms = "4:comms" ws_rce = "5:rce" ws_vms = "6:vms" ws_stats = "7:stats" myStatusBar :: String myStatusBar = "dzen2 -fn '-*-terminus-bold-r-normal-*-10-*-*-*-*-*-*-*' -bg '#000000' -fg '#444444' -h 22 -sa c -x 0 -y 0 -e '' -ta l -xs 1" myConkyBar :: String myConkyBar = "sleep 1 && conky -c ~/.conkyrc | dzen2 -fn '-*-terminus-bold-r-normal-*-10-*-*-*-*-*-*-*' -bg black -fg green -h 22 -sa c -x 1000 -y 0 -e '' -ta r -xs 1" myLogHook :: Handle -> X () myLogHook h = dynamicLogWithPP $ defaultPP { ppCurrent = dzenColor "black" "green" . pad , ppVisible = dzenColor "black" "lightgreen" . pad , ppHidden = dzenColor "#cccccc" "" . pad , ppHiddenNoWindows = dzenColor "#444444" "" . pad , ppUrgent = dzenColor "" "red" , ppWsSep = " " , ppSep = " | " , ppTitle = (" " ++) . dzenColor "green" "" . dzenEscape , ppOutput = hPutStrLn h } myWorkspaces = [ ws_term,ws_web,ws_dev,ws_comms,ws_rce,ws_vms,ws_stats ] myManageHook = ( composeAll [ appName =? "mutt" --> doShift ws_comms , appName =? "irssi" --> doShift ws_comms , appName =? "centerim" --> doShift ws_comms , className =? "Chromium" --> doShift ws_web , className =? "Eclipse" --> doShift ws_dev , className =? "Vmware" --> doShift ws_vms , className =? "Idaq" --> doShift ws_rce , appName =? "htop" --> doShift ws_stats , appName =? "feh" --> doShift ws_stats , appName =? "dev1" --> doShift ws_dev , appName =? "dev2" --> doShift ws_dev ] ) <+> xPropManageHook xPropMatches myStartupHook = do spawn "urxvt -title mutt -name mutt -e mutt" spawn "urxvt -title irssi -name irssi -e irssi" spawn "urxvt -title centerim -name centerim -e centerim" spawn "urxvt -title htop -name htop -e htop" spawn "urxvt -title feh -name feh -e feh ~/pictures/" spawn "chromium" spawn "urxvt" spawn "urxvt -title dev1 -name dev1" spawn "urxvt -title dev2 -name dev2" >> sendMessage NextWorkspace spawn "eclipse" spawn "vmware" spawn "schroot -p /home/dk/tools/ida/idaq" xPropMatches :: [XPropMatch] xPropMatches = [ ([(wM_CLASS, any ("mutt"==))], pmX(addTag "mail")) , ([(wM_CLASS, any ("irssi"==))], pmX(addTag "irc")) , ([(wM_CLASS, any ("centerim"==))], pmX(addTag "chat")) , ([(wM_CLASS, any ("chromium"==))], pmX(addTag "web")) , ([(wM_CLASS, any ("Eclipse"==))], pmX(addTag "dev")) ]
.centerim/external
%action nnotification event msg proto all status all options nowait %exec #!/bin/bash nick=$(head -n 1 $CONTACT_INFODIR/info) echo $nick $EVENT_TYPE >> /tmp/centerim.msgs
centerim-notify.sh
#!/bin/bash TEMPFILE=/tmp/centerim.msgs if [ -e "$TEMPFILE" ] then MSGS=`wc -l ${TEMPFILE} | awk '{ print $1 }'` else MSGS=0 fi if [ "$MSGS" -lt 1 ] then echo -n $'^fg(green)' echo -n $'^bg(black)' echo -n $'^i(/home/dk/.xmonad/dzen2/icons/sm4tik/xbm8x8/pacman.xbm) ^fg(#cccccc)'${MSGS}' ^bg(black)' else echo -n $'^fg(black)' echo -n $'^bg(red)' echo -n $' ^i(/home/dk/.xmonad/dzen2/icons/sm4tik/xbm8x8/pacman.xbm) '${MSGS}' ^bg(black) ' fi
check-gmail.pl
(I pulled this off the net from somewhere and hacked it for my needs)
#!/usr/bin/perl use Switch; use Text::Wrap; my $what=$ARGV[0]; $user="user"; #username for gmail account $pass="pass"; #password for gmail account $file="/tmp/gmail.html"; #temporary file to store gmail #wrap format for subject $Text::Wrap::columns=45; #Number of columns to wrap subject at $initial_tab=""; #Tab for first line of subject $subsequent_tab="\t"; #tab for wrapped lines $quote="\""; #put quotes around subject #limit the number of emails to be displayed $emails=5; #if -1 display all emails &passwd; #give password the proper url character encoding switch($what){ #determine what the user wants case "n" { &gmail; if($new==0){print "^fg(green) ^i(/home/dk/.xmonad/dzen2/icons/sm4tik/xbm8x8/mail.xbm) ^fg(#cccccc)0";} else{print "^fg(black)^bg(red) ^i(/home/dk/.xmonad/dzen2/icons/sm4tik/xbm8x8/mail.xbm) $new ^bg(black)";} } #print number of new emails case "s" { #print $from and $subj for new email &gmail; if ($new>0){ my $size=@from; if ($emails!=-1 && $size>$emails){$size=$emails;} #limit number of emails displayed for(my $i=0; $i<$size; ++$i){ print "From: $from[$i]\n"; #print from line $text=$quote.$subj[$i].$quote."\n"; print wrap($initial_tab, $subsequent_tab, $text); #print subject with word wrap } $size=@from; if ($emails!=-1 && $size >$emails){print "$emails out of $size new emails displayed\n";} } } case "e" { #print number of new emails, $from, and $subj &gmail; if($new==0){print "You have no new emails.\n";} else{ print "You have $new new email(s).\n"; my $size=@from; if ($emails!=-1 && $size>$emails){$size=$emails;} #limit number of emails displayed for(my $i=0; $i<$size; ++$i){ print "From: $from[$i]\n"; #print from line $text=$quote.$subj[$i].$quote; print wrap($initial_tab, $subsequent_tab, $text); #print subject with word wrap } $size=@from; if ($emails!=-1 && $size >$emails){print "$emails out of $size new emails displayed\n";} } } else { print "Usage Error: gmail.pl <option>\n"; print "\tn displays number of new emails\n"; print "\ts displays from line and subject line for each new email.\n"; print "\te displays the number of new emails and from line plus \n"; print "\t\tsubject line for each new email.\n"; } #didn't give proper option } sub gmail{ if(!(-e $file)){ #create file if it does not exists `touch $file`; } #get new emails `wget -O - https://mail.google.com/a/2of1/feed/atom --user=$user --password=$pass --no-check-certificate> $file`; open(IN, $file); #open $file my $i=0; #initialize count $new=0; #initialize new emails to 0 my $flag=0; while(<IN>){ #cycle through $file if(/<entry>/){$flag=1;} elsif(/<fullcount>(\d+)<\/fullcount>/){$new=$1;} #grab number of new emails elsif($flag==1){ if(/<title>.+<\/title>/){push(@subj, &msg);} #grab new email titles elsif(/<name>(.+)<\/name>/){push(@from, $1); $flag=0;} #grab new email from lines } } close(IN); #close $file } sub passwd{ #change to url escape codes in password #URL ESCAPE CODES $_=$pass; s/\%/\%25/g; s/\#/\%23/g; s/\$/\%24/g; s/\&/\%26/g; s/\//\%2F/g; s/\:/\%3A/g; s/\;/\%3B/g; s/\</\%3C/g; s/\=/\%3D/g; s/\>/\%3E/g; s/\?/\%3F/g; s/\@/\%40/g; s/\[/\%5B/g; s/\\/\%5C/g; s/\]/\%5D/g; s/\^/\%5E/g; s/\`/\%60/g; s/\{/\%7B/g; s/\|/\%7C/g; s/\}/\%7D/g; s/\~/\%7E/g; $pass=$_; } sub msg{ #THE HTML CODED CHARACTER SET [ISO-8859-1] chomp; s/<title>(.+)<\/title>/$1/; #get just the subject #now replace any special characters s/\&\#33\;/!/g; #Exclamation mark s/\&\#34\;/"/g; s/\"\;/"/g; #Quotation mark s/\&\#35\;/#/g; #Number sign s/\&\#36\;/\$/g; #Dollar sign s/\&\#37\;/%/g; #Percent sign s/\&\#38\;/&/g; s/\&\;/&/g; #Ampersand s/\&\#39\;/'/g; #Apostrophe s/\&\#40\;/(/g; #Left parenthesis s/\&\#41\;/)/g; #Right parenthesis s/\&\#42\;/*/g; #Asterisk s/\&\#43\;/+/g; #Plus sign s/\&\#44\;/,/g; #Comma s/\&\#45\;/-/g; #Hyphen s/\&\#46\;/./g; #Period (fullstop) s/\&\#47\;/\//g; #Solidus (slash) s/\&\#58\;/:/g; #Colon s/\&\#59\;/\;/g; #Semi-colon s/\&\#60\;/</g; s/\<\;/</g; #Less than s/\&\#61\;/=/g; #Equals sign s/\&\#62\;/>/g; s/\>\;/>/g; #Greater than s/\&\#63\;/\?/g; #Question mark s/\&\#64\;/\@/g; #Commercial at s/\&\#91\;/\[/g; #Left square bracket s/\&\#92\;/\\/g; #Reverse solidus (backslash) s/\&\#93\;/\]/g; #Right square bracket s/\&\#94\;/\^/g; #Caret s/\&\#95\;/_/g; #Horizontal bar (underscore) s/\&\#96\;/\`/g; #Acute accent s/\&\#123\;/\{/g; #Left curly brace s/\&\#124\;/|/g; #Vertical bar s/\&\#125\;/\}/g; #Right curly brace s/\&\#126\;/~/g; #Tilde s/\&\#161\;/¡/g; #Inverted exclamation s/\&\#162\;/¢/g; #Cent sign s/\&\#163\;/£/g; #Pound sterling s/\&\#164\;/¤/g; #General currency sign s/\&\#165\;/¥/g; #Yen sign s/\&\#166\;/¦/g; #Broken vertical bar s/\&\#167\;/§/g; #Section sign s/\&\#168\;/¨/g; #Umlaut (dieresis) s/\&\#169\;/©/g; s/\©\;/©/g; #Copyright s/\&\#170\;/ª/g; #Feminine ordinal s/\&\#171\;/«/g; #Left angle quote, guillemotleft s/\&\#172\;/¬/g; #Not sign s/\&\#174\;/®/g; #Registered trademark s/\&\#175\;/¯/g; #Macron accent s/\&\#176\;/°/g; #Degree sign s/\&\#177\;/±/g; #Plus or minus s/\&\#178\;/²/g; #Superscript two s/\&\#179\;/³/g; #Superscript three s/\&\#180\;/´/g; #Acute accent s/\&\#181\;/µ/g; #Micro sign s/\&\#182\;/¶/g; #Paragraph sign s/\&\#183\;/·/g; #Middle dot s/\&\#184\;/¸/g; #Cedilla s/\&\#185\;/¹/g; #Superscript one s/\&\#186\;/º/g; #Masculine ordinal s/\&\#187\;/»/g; #Right angle quote, guillemotright s/\&\#188\;/¼/g; s/\¼\;/¼/g; # Fraction one-fourth s/\&\#189\;/½/g; s/\½\;/½/g; # Fraction one-half s/\&\#190\;/¾/g; s/\¾\;/¾/g; # Fraction three-fourths s/\&\#191\;/¿/g; #Inverted question mark s/\&\#192\;/À/g; #Capital A, grave accent s/\&\#193\;/Á/g; #Capital A, acute accent s/\&\#194\;/Â/g; #Capital A, circumflex accent s/\&\#195\;/Ã/g; #Capital A, tilde s/\&\#196\;/Ä/g; #Capital A, dieresis or umlaut mark s/\&\#197\;/Å/g; #Capital A, ring s/\&\#198\;/Æ/g; #Capital AE dipthong (ligature) s/\&\#199\;/Ç/g; #Capital C, cedilla s/\&\#200\;/È/g; #Capital E, grave accent s/\&\#201\;/É/g; #Capital E, acute accent s/\&\#202\;/Ê/g; #Capital E, circumflex accent s/\&\#203\;/Ë/g; #Capital E, dieresis or umlaut mark s/\&\#204\;/Ì/g; #Capital I, grave accent s/\&\#205\;/Í/g; #Capital I, acute accent s/\&\#206\;/Î/g; #Capital I, circumflex accent s/\&\#207\;/Ï/g; #Capital I, dieresis or umlaut mark s/\&\#208\;/Ð/g; #Capital Eth, Icelandic s/\&\#209\;/Ñ/g; #Capital N, tilde s/\&\#210\;/Ò/g; #Capital O, grave accent s/\&\#211\;/Ó/g; #Capital O, acute accent s/\&\#212\;/Ô/g; #Capital O, circumflex accent s/\&\#213\;/Õ/g; #Capital O, tilde s/\&\#214\;/Ö/g; #Capital O, dieresis or umlaut mark s/\&\#215\;/×/g; #Multiply sign s/\&\#216\;/Ø/g; #Capital O, slash s/\&\#217\;/Ù/g; #Capital U, grave accent s/\&\#218\;/Ú/g; #Capital U, acute accent s/\&\#219\;/Û/g; #Capital U, circumflex accent s/\&\#220\;/Ü/g; #Capital U, dieresis or umlaut mark s/\&\#221\;/Ý/g; #Capital Y, acute accent s/\&\#222\;/Þ/g; #Capital THORN, Icelandic s/\&\#223\;/ß/g; #Small sharp s, German (sz ligature) s/\&\#224\;/à/g; #Small a, grave accent s/\&\#225\;/á/g; #Small a, acute accent s/\&\#226\;/â/g; #Small a, circumflex accent s/\&\#227\;/ã/g; #Small a, tilde s/\&\#228\;/ä/g; #Small a, dieresis or umlaut mark s/\&\#229\;/å/g; #Small a, ring s/\&\#230\;/æ/g; #Small ae dipthong (ligature) s/\&\#231\;/ç/g; #Small c, cedilla s/\&\#232\;/è/g; #Small e, grave accent s/\&\#233\;/é/g; #Small e, acute accent s/\&\#234\;/ê/g; #Small e, circumflex accent s/\&\#235\;/ë/g; #Small e, dieresis or umlaut mark s/\&\#236\;/ì/g; #Small i, grave accent s/\&\#237\;/í/g; #Small i, acute accent s/\&\#238\;/î/g; #Small i, circumflex accent s/\&\#239\;/ï/g; #Small i, dieresis or umlaut mark s/\&\#240\;/ð/g; #Small eth, Icelandic s/\&\#241\;/ñ/g; #Small n, tilde s/\&\#242\;/ò/g; #Small o, grave accent s/\&\#243\;/ó/g; #Small o, acute accent s/\&\#244\;/ô/g; #Small o, circumflex accent s/\&\#245\;/õ/g; #Small o, tilde s/\&\#246\;/ö/g; #Small o, dieresis or umlaut mark s/\&\#247\;/÷/g; #Division sign s/\&\#248\;/ø/g; #Small o, slash s/\&\#249\;/ù/g; #Small u, grave accent s/\&\#250\;/ú/g; #Small u, acute accent s/\&\#251\;/û/g; #Small u, circumflex accent s/\&\#252\;/ü/g; #Small u, dieresis or umlaut mark s/\&\#253\;/ý/g; #Small y, acute accent s/\&\#254\;/þ/g; #Small thorn, Icelandic s/\&\#255\;/ÿ/g; #Small y, dieresis or umlaut mark s/^\s+//; return $_; }
.conkyrc
background yes
out_to_console yes
update_interval 1.0
no_buffers yes
text_buffer_size 512
TEXT
^fg(\#444444)| ^fg(green)^i(/home/dk/.xmonad/dzen2/icons/sm4tik/xbm8x8/cpu.xbm) ^fg(\#cccccc)${cpu cpu0}% ^fg(\#444444)| ^fg(green)^i(/home/dk/.xmonad/dzen2/icons/sm4tik/xbm8x8/mem.xbm) ^fg(\#cccccc)$mem ^fg(\#444444)| ^fg(green)^i(/home/dk/.xmonad/dzen2/icons/sm4tik/xbm8x8/net_down_03.xbm)^fg(\#cccccc)${downspeed eth0} ^fg(green)^i(/home/dk/.xmonad/dzen2/icons/sm4tik/xbm8x8/net_up_03.xbm)^fg(\#cccccc)${upspeed eth0} ^fg(\#444444)| ^fg(\white)${execi 3 /home/dk/.xmonad/dzen2/scripts/centerim-notify} ^fg(\#444444)| ^fg(\white)${execi 30 /home/dk/.xmonad/dzen2/scripts/check-gmail-davkaplan.pl n 2>>/dev/null} ^fg(\#444444)^fn(-*-*-normal-*-*-*-9-*-*-*-*-*-*-*)[dk]^fn(-*-*-bold-*-*-*-10-*-*-*-*-*-*-*) | ^fg(\white)${execi 30 /home/dk/.xmonad/dzen2/scripts/check-gmail-2of1.pl n 2>>/dev/null} ^fg(\#444444)^fn(-*-*-normal-*-*-*-9-*-*-*-*-*-*-*)[2of1]^fn(-*-*-bold-*-*-*-10-*-*-*-*-*-*-*) | ^fg(green)${time %d-%m-%y %l:%M%p}07
Installing IDA Pro on a 64-bit flavour of Linux is a bit of a business – mostly because there is no 64-bit version of IDA (yet).
Read the rest of this entry »
04
Two Thursday evenings ago saw the first ever DC9723 hackathon.
The evening was a great success and I certainly enjoyed it; both the social aspects and the ‘hacking’ (not to mention the free Pizza, Elbit laptop bag and fantastically fun RSA challenge which I partially did a few days later)! Kol HaKavod to Iftach Ian Amit and Itzik Kotler for making this – and DC9723 in general – happen!
I worked in a group together with a bunch of other guys dealing with creating a PoC mobile botnet for the Android platform (yes I know one already exists – but that was based on a slightly different concept). As the evening was only 5 hours long (hoping for a 24 hr hackathon next year!!), we didn’t get much coding done – except for the client-side guys; they did great!
We’re hoping to continue working on the project in our spare time to see what we can come up with, so *watch this space*.
For those who didn’t attend and want (read: must) to see what the fuss is all about, check out here and here (nice paper scan version).
Some pics from the event are available here.
04
Here are the slides and code examples of the talk that I gave at the 7th DC9723 meet a few weeks ago.
To all those that came; thanks – I hope you found it interesting!
24
Just too cool: http://bellard.org/jslinux/
29
If you’re having problems with Hebrew text coming up all garbled with Wine under Ubuntu, here’s the solution:
Read the rest of this entry »