Programming

On Being and Deliciousness

Thursday, July 21st, 2005

A really interesting article has been written at DrunkenBlog about Delicious Monster’s founder, Wil Shipley.

One of the rules of writing algorithms that I’ve recently been sort of toying with is that we (as programmers) spend too much time trying to find provably correct solutions, when what we need to do is write really fast heuristics that fail incredibly gracefully.

How right he is. But actually, it’s quite an interesting interview. I love engineers who work under OS X, and sometimes consider switching, but I’m convinced that Linux doesn’t have to be a “legacy” OS like it’s described here.

New Years Resolution

Friday, December 31st, 2004

To upgrade this website to Movable Type, among other things.

Last-minute hacking with my version of Metacity, and I finally got what I wanted. Basically, I was using xfwm4 for window management, and since it is NETWM compliant, I was supposed to notice no difference at all in GNOME. Except that’s not true, since xfwm4 doesn’t know about gnome-panel, and since a lot of useful hotkeys I want to use in gnome-panel are generally bound in metacity. Plus, the gnome theme manager doesn’t work without metacity. So, shame on GNOME developers, basically. You claim you are compliant, but you aren’t.

But then I did some reading and figured out metacity is actually a bit better than xfwm4 anyway, just that some of its features are hidden in gconf and other places. Also, someone has coded a neat app called devil’s pie which lets you manager your windows at a very fine-grained level, which I like… though it is a bit buggy right now, it shows promise.

So, the main thing I was annoyed by is vertical/horizontal maximize. xfwm4 has this working fine, and I’m quite used to it. Metacity doesn’t treat it as a “toggle,” so if you hit maximize vertical button twice, you just sit there with a maximized window… it doesn’t switch back and forth. I find this annoying since when I have vim windows open, sometimes to see more I just quickly maximize vertical rather than scrolling down, and then toggle it back afterwards.

Someone coded a patch to this. You can find it on bugzilla here at Bug #113601. Unfortunately, no one has written a “proper patch” that also works with session management and such, but I don’t really care, I wanted this patch to get back to work. So, in order to jive with my Ubuntu system, I created some debs with the patched version of metacity.

more vim

Sunday, December 19th, 2004

nonsense, but useful nonsense:

if you have tags working, cd into the directory with the tags and hit something like:

vim -t env_alloc

vim will automatically open to the file with that symbol. Nice.

Other nonsense:

:ab #d #define

vim abbreviations, make it so whenever you type #d it will be replaced by #define

you can actually execute a proper shell from vim, just use the :shell command.

finally, there is a “confirm” option for the substitute command, so:

%s/foo/bar/gc will globally replace foo with bar and confirm each replacement.

Transparency

Saturday, December 11th, 2004

I read this on a Gentoo forum today about Alsa’s DMIX plugin:

quote:

I mean, why can’t they make a _transparent_ software mixer? Why must every software be “updated” and “configured” to support the software mixing thing? Why on Earth couldn’t they make a plugin that needs no attention from the actual software, but just lets the software open and open the sound device? Why must mplayer, arts and others _know_ about the dmix plugin and _select_ it? That is not transparent.

The guy is right on. This is one of Linux’s main problems. Although we have as a hacker tenet to never reinvent the wheel, we also have a shitload of libraries and ways of doing things, and sometimes it leads to this awful situation: where you want to get software mixing of audio to work, but it will only work if you enable a mixing plugin in each application.

Library, woe is me; at least vim has lots of plugins

Monday, December 6th, 2004

At the library for yet another full day, reading operating systems papers. This time, however, I kept getting really bored (can you blame me?), and I kept thinking about so many other things. They take so long to read, so much attention… I have so little to give. I don’t even have my laptop here, and I only spent the last 30 minutes on a computer.

This is my “break,” searching for vim plugins:

ZoomWin for maximizing a buffer temporarily, MiniBufferExplorer for switching buffers (Matt would probably like that one), Project Explorer for “favorite files”, ShowMarks for finding marks you set in a file, SearchComplete’s tab completion for searching (s/bla/bla2/g), cppcomplete for code completion (Matt says it rocks, like intellisense for C/C++/Java)…

I think I’ll actually install most of those (provided they work as advertised).

I think for C# programming all one needs to do is modify JavaBrowser and cppcomplete the recognize all of C#’s syntax, and we’d be all set C#-wise. Hell, maybe I’ll even do it next month.

Programming

Saturday, December 4th, 2004

While programming today, I came up with some nice vim bindings. If you use vim, and want tags-powered “intellisense-like” stuff, use this. Also thrown in there are hotkeys for :Tlist (indispensible vim plugin) and saving quickly (I save often, so I like to have a single key in either normal or insert mode).


" intellisense - yea well close enough
noremap <F2> mz<C-w>1]
noremap <F3> <C-w>c`za
noremap <F4> <C-w>11_

" for insert mode, goes back to unmatched brace
" so it's good for function prototype lookups
inoremap <F2> <ESC>mz 999[(b<C-w>1]

" tlist hotkeys
noremap <F8> :Tlist<CR>
noremap <F9> :TlistUpdate<CR>

" save hotkey for normal and insert modes
noremap <F10> :w<CR>
inoremap <F10> <ESC>:w<CR>a

Algorithms and vim

Saturday, December 4th, 2004

I spent about 5 hours today doing algorithm homework/studying. I like that class a little more now, even though some of it is a pain. Divide and conquer and dynamic programming actually are powerful concepts, once you get a feel for them.

Then I came back to my dorm, ate some food, and played with vim for literally 2 hours. I guess that was a waste of time, but I learned so much about this editor. Now I feel I can be twice as productive when I code. Especially with all the stuff I implemented for prototype previewing in my vimrc, and with all the support for ctags vim always had but I never used. Wow, this is one powerful programmer’s editor.

Matt has been telling me that I should use emacs with vi emulation (viper), and then I’ll get access to all that great emacs stuff. Maybe. I have nothing against it, except that emacs seems like an operating system unto itself. Eh, it doesn’t matter I guess, I just need to know one of the two well. They are both portable, and run on all major platforms.

gob2: Building GObjects easily in C

Monday, November 8th, 2004

I’ve been playing with a preprocessor called gob2, which I only recently discovered. I found it because I actually had the same exact idea as the author. I was reading the Gnome 2 Developer’s Guide, and realized that although GObjects are nice and handy when they are already coded (as in all the widgets in GTK), they are actually a pain in the ass to write from scratch. Tons of boilerplate code, tons of macros you need to code to keep yourself sane.

So, I thought, what if some code produced all this boilerplate code for me? Someone already had the idea. It’s called GOB (or gob2), the GObject builder. Check it out.

What’s so nice about it is that it tries to have the feel of Java or C#. So, check out this definition of a new GtkWidget which counts the number of clicks it receives. If you run gob2 gtk-button.gob, it will produce gtk-button.{c,h} with all the proper GObject boilerplate code you’ve come to expect coding by hand.

Much nicer than doing that from scratch.

What’s strange is that more GTK+ developers aren’t using this. On the gob2 mailing list, the author claims it is used in gnome-vfs, but doesn’t it seem like it should be used by a lot of developers? (Granted, it’s not as nice as using gtkmm/C++ I guess, but there are still people declaring objects in C out there).

On stupidity and drunken behavior

Friday, October 29th, 2004

So, night before last I came home and hung out with some friends. We were a bit drunk, my roommate and Sak were fooling around and Sak slipped and fell on my bed. Problem was, my laptop was right underneath him, and so the LCD screen cracked. Bad, bad situation. Turns out repairing it would be more $$$ than the amount I paid for it in the first place, so I’m not really sure what to do on that front.

It’s a shame… I really was getting used to that laptop. I mean, I’ll probably just re-purchase the same one, but I dunno what’s gonna happen exactly.

In other news, I was playing with Glade 3 earlier today and decided that it really needs some work done on it. I would love to hack that project a bit if I had time. I mean, if someone can produce something like Gambas for Linux, then some sort of RAD tool for GTK is possible. I know the two aren’t really comparable (Glade uses libglade to dynamically load the GUI from XML files, Gambas is a “better VB”, i.e. a full environment), and that a lot of developers scoff at RAD tools for GTK, but I don’t think properly designed RAD tools are about “dumbing down UI design.” I think they are really about making UIs easier to design quickly, so that you can spend more time on the code that does stuff.

Also, I was checking out Mainsoft, with their product MainWin for J2EE. Interesting approach. They take Microsoft IL code and compile it to Java Bytecode. This means that for now, while Microsoft doesn’t support platforms other than Windows for .NET, you can actually convert take a .NET project and make it run in the JVM. I wonder if it works…

wifi detector bash script

Tuesday, October 26th, 2004

I didn’t really like any of the wifi-related tools out there for switching networks, so I scratched an itch and coded my own. Read more if you’re interested in obtaining an easy-to-configure bash script that requires iwconfig, ifstate tools, zenity and dhcpcd, and can easily allow you to set an array of prioritized wireless networks which are scanned and joined if found. After you establish your connection, dhcpcd is called to negotiate your IP address. It works quite nicely, and allows me to move from network to network and only have to click a button to enable my wifi access. Check it out (code inside)…