Saturday, April 12, 2008
Review of "King of Kong: A Fist Full of Quarters"
Over the last three days (it's been several months ago now) I've had the extreme pleasure of watching "King Kong: A Fist Full or Quarters". You
must see this movie.
It is, in my opinion, the quintessential American underdog story set to the music of Donkey Kong. On one side you have Billy Mitchell, a superstar in his own world. Arguably the best gamer of all time, but certainly the best classic gamer of all time. Billy is amazing--He's truly gifted. Unfortunately, like a lot of us in this world, his head is much bigger than it aught to be. (In Billy's case, his hair is longer than it aught to be too.)
On the other side you have Steve Wiebe, an apparent "screw up" (and I mean that in the nicest way possible). Of his own admission, he hasn't lived up to his true potential throughout his live. Highly athletic yet subject to "the chokes", gifted musically but prohibitively shy, highly intelligent yet awkward and sheepish.
"King of Kong: A Fist Full of Quarters" is their story.
I won't spoil the rest, but I will say this: be prepared for the subculture of classic gaming's superstars, groupies, officials, desperate wannabees, outsiders, insiders, family members, winners, and losers. It's a strange world, beyond description, even for a geek like me.
After you've watched the movie, go check out the current record at
Twin Galaxies.
Saturday, February 16, 2008
Rock it out with Heart
Though I consider myself mostly an 80's-synth-pop-new-wave-2-tone kind of person, I still have a great love for classic rock. I think it was Homer Simpson who once said "rock peaked in '74, everyone knows that!" Amen, Homer, Amen.
I've been trying to play this song for +10 years now, oh well, someday I'll get it. Enjoy...
I've been trying to play this song for +10 years now, oh well, someday I'll get it. Enjoy...
Saturday, October 27, 2007
PyGTK Treeview digest
I'm always forgetting how to use the TreeView widget to display columnar data. In PyGTK (well, GTK+ in general) a TreeView is used to display trees (TreeStores) and columnar data (ListStores) like in the screenshot below. In this mini HOWTO I'm restricting the post to ListStores, however, many of the concepts below apply to TreeStores.)
A ListStore keeps track of the values you want to display in your TreeView. You create one like this:
Where
Once your ListStore or "model" is created, you'll want to put things in it and take things out. To add a row you use append or prepend like so
The iterator
So what about accessing/changing things after the fact?
will get a single column from a single row at
gets multiple rows from
does.
Conversly,
sets a single column in
for multiple columns and values. To remove a single row do
, and
to remove them all.
The model (ListStore) is essentially a database. To actually see the contents of it in a widget you'll need a TreeView, TreeViewColumns, and CellRenderers.
does the job of creating a TreeView, optionally setting the model off of which it's based. Otherwise it can be set and retrieved with
TreeViewColumns hold the CellRenderers and are managed by the TreeView. You add a TreeViewColumn to a TreeView like this:
You make one thus
CellRenderers do the work of displaying a particular column in the store. CellRenderers get packed into the TreeViewColumns (which manage the column headers), therefore you can have multiple CellRenderers under one column heading. It is a common practice to put an image and text together under the same column heading. Different Cellrenderers exist for different types namely pixmaps, text, and toggle buttons. (And, of course, you can always make your own.) It is easy to create a Cellrenderer:
. You can then pack it into the the desired TreeViewColumn with
and
Here is the part I have the hardest time remembering... How do you associate data in the store with what gets displayed in the CellRenderers? The answer is column attributes. So, to associate the text of column 0 in the model with the text in a particular CellRenderer
or equivalently
. There are many other attributes besides 'text' that can be tied to your data model. Some include 'markup' (simple HTML), 'font', 'background' (color), 'foreground' (color).
Here is a minimalist example that ties it all together:
I've written it to be as simple as possible, (hence no classes, functions, etc.), so that the associations between the ListStore, TreeView, TreeViewColumns, and CellRenderers are obvious. The result is ugly (both the code and the screenshot!), but effective at achieving the desired result. Note that the hex and dec CellRenderers are both under the 'Strings' heading and how you can associate the model with more than just the text, in this case the background color of the cell.
For more details including sorting, additional attributes, and signals see chapter 14 of the PyGTK tutorial http://www.pygtk.org/pygtk2tutorial/sec-TreeModelInterface.html upon which this post is heavily based.
A ListStore keeps track of the values you want to display in your TreeView. You create one like this:
liststore = gtk.ListStore(type1, type2, type3, ...)Where
typen can be a Python type int, str, a PyGTK type gtk.Button..., or a gobject type like gobject.TYPE_CHAR or 'gchar'.Once your ListStore or "model" is created, you'll want to put things in it and take things out. To add a row you use append or prepend like so
iter=liststore.append([1,2,3,'a','b','c']) iter=liststore.prepend([1,2,3,'a','b','c'])The iterator
iter can be used by other calls like new_iter=liststore.insert_before(iter, [1,2,3,'a','b','c']) new_iter=liststore.insert_after(iter, row=[...]).So what about accessing/changing things after the fact?
value=liststore.get_value(iter, column)will get a single column from a single row at
iter.
values=liststore.get(iter,col1,col2,col3,...)gets multiple rows from
iter just as vala, valb=liststore.get(iter, 0, 2)does.
Conversly,
liststore.set(iter,col,val)sets a single column in
iter to value. As does liststore.set(iter,col,val,col,val,...,...)for multiple columns and values. To remove a single row do
liststore.remove(iter), and
liststore.clear()to remove them all.
The model (ListStore) is essentially a database. To actually see the contents of it in a widget you'll need a TreeView, TreeViewColumns, and CellRenderers.
view=gtk.TreeView(model=None)does the job of creating a TreeView, optionally setting the model off of which it's based. Otherwise it can be set and retrieved with
view.set_model(model) model=view.get_model().TreeViewColumns hold the CellRenderers and are managed by the TreeView. You add a TreeViewColumn to a TreeView like this:
view.append_column(column).You make one thus
col=gtk.TreeViewColumn('Heading').CellRenderers do the work of displaying a particular column in the store. CellRenderers get packed into the TreeViewColumns (which manage the column headers), therefore you can have multiple CellRenderers under one column heading. It is a common practice to put an image and text together under the same column heading. Different Cellrenderers exist for different types namely pixmaps, text, and toggle buttons. (And, of course, you can always make your own.) It is easy to create a Cellrenderer:
cell=gtk.CellRendererText() cell=gtk.CellRendererPixbuf() cell=gtk.CellRendererToggle(). You can then pack it into the the desired TreeViewColumn with
column.pack_start(cell,expand=True)and
column.pack_end(cell,expand=False).Here is the part I have the hardest time remembering... How do you associate data in the store with what gets displayed in the CellRenderers? The answer is column attributes. So, to associate the text of column 0 in the model with the text in a particular CellRenderer
cell you do col.add_attribute(cell, 'text', 0)or equivalently
col.set_attributes(cell, text=0, prop1=modelcol1, prop2=modelcol2, ...). There are many other attributes besides 'text' that can be tied to your data model. Some include 'markup' (simple HTML), 'font', 'background' (color), 'foreground' (color).
Here is a minimalist example that ties it all together:
import gtk
store = gtk.ListStore(int,str,str,str)
view = gtk.TreeView(model=store) # Associate the store with the view
column_int = gtk.TreeViewColumn('Integer') # These will be our column
column_str = gtk.TreeViewColumn('String') # headings in the TreeView widget
view.append_column(column_int) # Associate the columns with the TreeView
view.append_column(column_str) #
cell_int = gtk.CellRendererText()
cell_hex = gtk.CellRendererText()
cell_dec = gtk.CellRendererText()
column_int.pack_start(cell_int) # This column only has one CellRenderer
column_str.pack_start(cell_hex) # This column has two
column_str.pack_start(cell_dec) #
column_int.add_attribute(cell_int, 'text', 0) # Associate col 0 of model with text of cell_int
column_int.add_attribute(cell_int, 'background', 3) # Associate col 3 of model with the cell background
column_str.add_attribute(cell_hex, 'text', 1) # Associate col 1 of model with text of cell_hex
column_str.add_attribute(cell_dec, 'text', 2) # ditto for cell_dec
column_str.add_attribute(cell_hex, 'background', 3) # Associate col 3 of model with the cell background
column_str.add_attribute(cell_dec, 'background', 3) # Associate col 3 of model with the cell background
store.append([1,'0x01','1','red']) # Add items to the store
store.append([2,'0x02','2','green']) #
store.append([3,'0x03','3','blue']) #
store.append([4,'0x04','4','wheat']) #
store.append([5,'0x05','5','gray']) #
store.append([0,'','','']) #
window = gtk.Window()
window.add(view)
window.show_all()
window.connect('delete_event', gtk.main_quit)
gtk.main()
I've written it to be as simple as possible, (hence no classes, functions, etc.), so that the associations between the ListStore, TreeView, TreeViewColumns, and CellRenderers are obvious. The result is ugly (both the code and the screenshot!), but effective at achieving the desired result. Note that the hex and dec CellRenderers are both under the 'Strings' heading and how you can associate the model with more than just the text, in this case the background color of the cell.
For more details including sorting, additional attributes, and signals see chapter 14 of the PyGTK tutorial http://www.pygtk.org/pygtk2tutorial/sec-TreeModelInterface.html upon which this post is heavily based.
Wednesday, July 25, 2007
Predefined Macros in gcc
gcc (well cpp, the preprocessor) provides several predefined macros. Many of these are platform independent, for instance
__FILE__ and __LINE__. Others are platform dependent (or "system-specific" as the gcc manual puts it). So how do you know what your particular platform defines? Try this: cpp -dM /dev/null
I stumbled across this trick the other day on Apple's mailing lists archives.
Linux Kernel Threads Can Have Priorities and Can Dereference current
My memory failed me on some points of kernel threads today so hopefully this post will solidify my knowledge.
- Kernel threads can have a priority via the "nice" mechanism. It is set using
set_user_nice(tsk, nice_level), just as for userspace processes/threads. - As a consequence of the above point, kernel threads have a task structure and it may be referred to by the
currentpointer, again, the same as is the case with userspace processes/threads.
set_user_nice() should be called from within the task callback function supplied to kthread_create().
Friday, July 20, 2007
"Real HTML" in blogger
Ok, first things first... If you're a control freak like I am and want to actually use "real" HTML (tables, div, etc.) in your posts to blogger, the first thing you should do is disable the automatic conversion of line breaks to the <br /> tag.
Of course, then you'll have to explicitly add <br /> tags to format your posts, but at least then you won't waste an hour trying to figure out why your tables look atrocious. (Not that I did that or anything ;)
To do this, log in, hit the "Settings" tab, then the "Formatting" tab, then set "Convert Line Breaks" to "No".
In other words "Settings"->"Formatting"->"Convert Line Breaks" = "No".
Of course, then you'll have to explicitly add <br /> tags to format your posts, but at least then you won't waste an hour trying to figure out why your tables look atrocious. (Not that I did that or anything ;)
To do this, log in, hit the "Settings" tab, then the "Formatting" tab, then set "Convert Line Breaks" to "No".
In other words "Settings"->"Formatting"->"Convert Line Breaks" = "No".
Thursday, July 19, 2007
Emacs Notes
This is my general emacs knowledge base. Some of these keys/features I use everyday others I always forget about, hence the existence of these notes.
// When opening (visiting) a file (C-x C-f), disregards everything before //
M-\ Kills whitespace pointed to by point
M-^ Merge the current line with previous line (taking away whitespace)
C-x C-x swap mark and point
C-space set new mark
C-u C-space goto next mark in ring
C-M-space mark to end of paren
C-t transpose two chars
M-t transpose two words
C-M-t transpose two balanced expressions
C-M-f move forward one balanced expression
C-M-b move backward one balanced expression
C-M-k kill balanced expression forward
C-M-<del> kill balanced expression backward
C-x C-t transpose two lines
M-m move to first non-whitespace on line
C-c C-e in C-mode expands macros into new buffer
C-M-q toggle-read-only
C-x w h highlight a regexp
C-x w r unhighlight a regexp
M-x find-file-at-point Opens file at point
M-x apropos Find an emacs command based on regexp
M-x woman Advanced manual page browser
C-x > scroll right
C-x < scroll left
C-x C-+ Increase font size
C-X C-- Decrease font size
Narrowing
C-x n d Narrow to defun (one C-function)
C-x n n Narrow to region
C-x n w widen
Minibuffer
M-s Search minibuffer history forward
M-r Search minibuffer history backward
Kill Ring
C-h v kill-ring View contents of kill ring
C-u C-y Yank, but leave point at beginning of yanked text
TAGS (old tags)
M-. TAG Find a TAG
C-u M-. Find next TAG
C-M-. PATTERN Find a TAG using regexp PATTERN
C-x 4 . TAG Find a tag but put in another window
M-* Pop back to where you invoked a TAG search
M-x tags-search Search multiple files for regexp
M-, Continue tags search
M-x list-tags FILE Lists all tags in a file
M-x tags-apropos Lists all tags matching a regexp
GTAGS
M-. TAG find TAG
M-? TAG find all references to TAG
[f3] TAG create TAG completion list "global -c TAG"
M-x gtags-symbol-find find a symbol (similar to [f6])
M-x ps-spool-region-with-faces
M-x desktop-read
M-x desktop-save
"C-mode"
M-a backward statement
M-e forward statement
C-M-u up conditional (block)
C-M-d down conditional (block)
C-M-n next conditional (block)
C-M-p prev conditional (block)
C-c C-a Toggle Autonewline minor mode
C-c C-d Toggle Hungry Delete minor mode
C-c C-t Toggle both Autnewline and Hungry Delete minor modes
C-c C-\ Add \'s to a region for multi-lined macros
C-u C-c C-\ Remove \'s from multi-line macros
M-q In a C comment, wrap text appropriately.
M-j Add a line break in a comment.
C-x ` go to next compilation error
DIRED
(to enter)
C-x d Enter dired mode
C-x f [tab] [enter] Enter dired mode while visiting file
(once in)
i Show contents of directory at point
g Update buffer (reread directory from disk)
d Mark file at point for deletion ('D' not '*')
u Ummark file at point
x Delete (expunge) files marked for deletion
% d <regexp> Mark files for deletion matching regexp
% m <regexp> Mark files matching regexp
% g <regexp> Mark all files which contain regexp (like grep)
[del] Unmark move point up one line
[enter] Visit file at point
f Visit file at point (Same as [enter])
e Visit file at point (Same as [enter])
o Visit file at point in other window
C-o Visit file at point in other window, but stay in dired window
v View file at point (read only, q to quit)
^ Move up to parent directory (..)
m Mark a file (with '*' not 'D')
* s Mark all files in current dired window
* t Toggle marked files (unmark all marked, mark all unmarked)
* % Same as % m <regexp> above
* ! Unmark all marked
* / Mark all directories except . and ..
C <name> Copy current file, see manual for multiple files (marked files)
R <name> Rename current file, see manual for multiple files
M <mode> Change mode of file(s) (uses chmod modes)
G <newgroup> Like chgrp
O <newowner> Like chown
S <name> Make symbolic link
Z Compress marked files (or uncompress if compressed)
! <cmd> Run shell command <cmd> on all marked files. If <cmd> contains '*', '*' expands to all marked files
X <cmd> Same as ! <cmd>
% R <from> <to> Use regular expression to rename file ^.*$ to x-^.*$ adds "x-" to all marked files
% C <from> <to> Use regular expression to copy file ^.*$ to x-^.*$ makes new files with "x-"
% S <from> <to> Use regular expression to symlinks files ^.*$ to x-^.*$ adds "x-" to all symlinks
q Quit (kill dired buffer)
= diff files at point and mark (uses dired-diff as command)
M-= diff file at point with it latest backup (.*~)
C-x u (undo, unmark all marked, restore names of renamed files)
M-x find-dired Use the 'find' command to fill dired buffer
M-x find-name-dired Use the 'find' command employing -name to fill dired buffer
M-x find-grep-dired Use the 'find' command with grep to fill dired buffer
M-x locate Similar to 'locate' command
VC (clearcase.el)
C-x C-q Toggle read-only on non-version controlled element
Checkout or checkin (whatever makes sense) version controlled element
C-x v v Checkout or checkin (whatever makes sense) version controlled element
C-x v ~ <version> View a specific version of a file (dired mode kicks in on tab)
C-x v i Runs mkelem on current buffer (NOT TESTED!)
C-x v l Display history on current buffer
C-x v u Revert element (uncheckout current buffer)
C-x v e Edit config spec
C-c C-c Finishes a comment session (on checkin or checkout)
v v (In dired mode) Checkout or checkin all marked files (whatever makes sense for each file)
Emacs server/client
(server-start) Starts emacs server. Clients connect with emacsclient command.
C-x # Unblock emacsclient and kill emacsclient buffer
EDITOR (Environment variable, set this to emacsclient)
ALTERNATE_EDITOR (Environment variable, set to a different editor if emacs server not running)
International input mode
C-\ Enter\Get out of international input mode.
_a 1ª (feminine ordinal)
_o 1º (masculine oridinal)
~c ç (ce com cedilha)
~a ã,õ - nasals
^a â,ô,ê - circumflex (hat)
'a á,é,í,ó,ú, - accent (acento agudo)
`a à - grave accent (acento grave)
Environment Variables
M-x getenv
M-x setenv
GDB mode
C-x space Set breakpoint at point
M-s step
M-n next
M-i stepi
M-c continue
Filtering/Searching
M-x occur <RET> REGEXP <RET> Lists in a buffer all lines matching REGEXP
M-x how-many <RET> REGEXP <RET> Shows how many lines match REGEXP
M-x flush-lines <RET> REGEXP <RET> Filter out lines matching REGEXP
M-x keep-line <RET> REGEXP <RET> Filter out all lines not matching REGEXP
Rectangles
C-x r k Kill a rectangle
C-x r y Yank a rectangle
C-x r d Delete contents of a rectangle
C-x r o "open" a rectangle, inserts spaces the same size as the rectangle
C-x r t string Replace contents of a rectangle with string
C-x r c Clears a rectangle (replaces with spaces)
Subscribe to:
Posts (Atom)