Where Are The Wise Men?

Mike's Ramblings

Weave The Best FireFox Plugin You Aren't Using

| Comments

I'm not sure how I stumbled onto it -- I think I was reading something at Ars Technica and saw a link for[this article][]about [Mozilla Weave][]. I never heard of it before -- it sounded interesting. After a month of heavy use, let me just say that it's not just interesting -- it's downright, wicked cool.

Home. Many times I wish I stumble onto a site I want to read at home. Usually I just save it to [Diigo][]. But sometimes I forget. The biggest annoyance is passwords. Yes, I save a ton of website passwords in FireFox. But it stinks when I save it on the home machine but want to get into my account at work, and I can't remember what password I used there.

Weave solves all these problems. And ones that I didn't know I even had.

So now when am I work, I don't worry about saving an address to Diigo just so I can read it at home. Instead, I do nothing special. When I go home, I start FireFox, I wait about 15 seconds and I see that it starts to sync. After that, I have all my history from my last session. Yes, you read that. All my history from my work browsing session. Oh, and if I setup a web account during the day at work and save the passwords, that is synced too. Preferences? Check, but in a smart way. Like my proxy server config from the office is not moved to home. That's a good thing. Bookmarks? Check. Yes, I still use bookmarks and I probably use them more now because they are synced between my machines.

A neat feature is tabs. Yes, tabs are saved across browsing sessions on different machines. So if I want to quickly see what I was looking at last night at home, I can go to History-> Tabs from other computers while at work.

Many of you may be thinking. "How is this different than the nasty FoxyMarks/XMarks crap?" Well, not only does Mozilla not publish or track it but t[hey also encrypt all data with a passphrase of your choosing.][]So, yeah, they thought of that too. If you are truly paranoid you can [setup your own Weave server.][]

So I think it's worth a go, especially if you are still using FireFox instead of Chrome (which I still am on the fence about, but that's another discussion.)

Getting It's All Text to Play With Cygwin

| Comments

I love the FireFox plugin [It's All Text][]-- it lets me edit wiki pages, webmail, etc. in my beloved editor of Emacs and automatically refreshes the text field in FF with my new text. But I recently moved from using NTEmacs to Cygwin's version, and things simply stopped working. And it made sense -- Cygwin is just a layer on top of Windows, but it uses Unix-like paths, while It's All Text would, naturally, use Windows-style paths.

I put up with this for a few months, mostly because I didn't want to spend the cycles on figuring this out. I did spend a few, and they were all pretty much worthless. I'm not sure why -- the idea wasn't hard, but it seemed to be.

A while back I decided to put some dedicated cycles to this. I found [this comment][]from the It's All Text developer on his blog -- it didn't work , but it was a start. I took his work and built my own version. I was trying to do it with a one-script solution but seeing his some experimenting,

The following batch script should be left alone. It sets up the Cygwin environment, and then uses Cygwin's "run" command to start a bash shell, when then runs our shell script. The "%~f1" is actually the most important component here. It is a batch file command that says to give the full path of the first argument. Of course, that assumes that the first argument is a file but considering we are using this with It's All Text, we are safe with that assumption.


@echo off
SET RUN=%CYGWIN_ROOT%\bin\run -p /usr/X11R6/bin
SET XAPPLRESDIR=/usr/X11R6/lib/X11/app-defaults
SET XCMSDB=/usr/X11R6/lib/X11/Xcms.txt
SET XKEYSYMDB=/usr/X11R6/lib/X11/XKeysymDB
SET XNLSPATH=/usr/X11R6/lib/X11/locale

rem the %~f1 is the full path name of the argument given to the script.
%CYGWIN_ROOT%/bin/run.exe c:/cygwin/bin/bash.exe /cygdrive/h/bin/text.sh %~f1

The following is our shell script, which we referenced as "text.sh" above. It's much simpler -- it converts the Windows path it was given to a Unix path and then calls our editor ("emacsclient" in my case, which will load up the file in the current Emacs instance). You maybe thinking that I could have just was well as done this in the batch file above -- and, you are right, I could have ran the editor but I had to also convert the file's path first. That is really why we need two scripts -- using a shell script is the only way I could find that would let me use the cygpath command in a reliable way. Note that I used "$\*" at the path name -- that will give all the arguments, which I need because there are spaces in the full path name ("$~f1" above).



/usr/bin/emacsclient "`cygpath "$*"`"


So not easy, but it's possible. Of course, I made it a lot easier now for everyone else!

Fun at The Joslyn

| Comments

Gina was busy on Saturday morning and Leah requested that we do something "fun". It was cold outside, and we have a six-month old foster son, so the zoo was out. Leah also suggested (OK, begged) for the Children's Museum, which would have been fine but it cost money and, frankly, I'm cheap. But I knew that our local art museum was free on Saturday mornings (10am-noon) but I thought, "What do they have for a six-year old at an art museum?" So I did some research.

The answer is that the[Joslyn Art Museum][] has a lot of kids stuff. [Quite a bit in fact.][] Actually, [they have a whole website worth of stuff.][] And we had a ball.

We kinda walked around the special exhibits and[saw some interesting things.][] But Leah wanted to make her own. Leah sat at the Can Do Art display, where they have paper, crayons, colored pencils, etc. Even a few games! If you know Leah very well, you know that she loves that kind of stuff. A grandfather was there with two grandkids and he started making paper airplanes. That meant we made some too.

After that, we went to the Cafe and had a little snack. Then Leah asked for something that I casually mentioned to her. I read it off the website but really didn't know what it was. So we went and got an [Art Pack][] and got going.

We did the "Go West!" pack. The best way to describe it is a scavenger hunt or a geocache in the museum. They gave us a backpack and it had a journal with directions, and a compass. The journal told us where to start and then gave us directions of "Walk 6 paces North then turn East . . ." until we eventually got to a painting. We read about the painting, and then reached in the backpack and got an activity out there to do (make a journal, play a bingo game, etc.) And we had a blast with it! And, while we didn't see a lot of different art on this activity, we actually learned a lot about the pieces that we saw -- and isn't that the point.

Leah is excited to do it again and I am as well. We need to take Gina next time. And how did our foster son do? I had to feed him during our stop at the Can do Art display, and then he slept until waaay after we left.

Uncle Bob on Dependency Injection

| Comments

This post is really just a rehash of my internal email response to my co-workers on [this article on Dependency Injection][] by Robert "Uncle Bob" Martin. I like Uncle Bob -- a lot. Just reading a couple chapters from his book Clean Code changed the way I think about programming. It had an immediate effect on how I think about code and making a stance on leaving it a little better than I found it. This also means that I know how Uncle Bob thinks, to a certain extent. And I know that Uncle Bob has strong opinions. And now I know he has strong opinions about dependency injection -- or, rather, dependency injection frameworks.

I think what he's saying in a round-about way is that the dependency injection framework should not be a deep dependency in our code. I agree with it in theory, but it's not necessarily great in practice.

Sort of like the log4j example inClean Code, Uncle Bob thinks it is good to hide the fact that we are using a library into the inner bowels of the project. In the log4j example, Uncle Bob makes his own wrapper around the log4j calls and uses his wrapper instead of calling log4j in his code. His idea is that, if they decide to change logging mechanisms, they just have to change one class. I think "why not just use [commons-logging][], since that is what is was designed for?"

Anyway, I think a Dependency Injection framework is much harder to abstract because your main method has to know about it just to get the abstract this stuff out, so it dirties up my code. I don't like it!!" I'm not sure like it either but it's a cost thing. If you decide to do dependency injection, then you have a hard dependency on that library. Sort of a contradiction in terms, certainly, but then you only have one hard dependency and the framework should take care of the rest.

Of course, Uncle Bob doesn't seem to talk about cost -- for him, it's black and white. For me, I figure you have to know what you are getting into before you start down this road. This is a good example of "What if I decide to use a Dependency Injection Framework? What are the costs?". His post is a good example of what those costs are. In that light, it can been read like [Ted Neward's infamous The Vietnam of Computer Science.][] It's OK to choose a framework for dependency injection, just know what you are getting into before you start and be ready to suffer some pain down the road.

Zsh Completion Magic

| Comments

I'm a happy user of [zsh][]for a few years now and, while I don't know all the subtleties of it, I find it a indispensable tool. People I know and respect keep asking me "Why not bash?" One of the big reasons is [zsh's completion system.][]

Bash has a add-on version of this, called [bash-completion][], and I used that before moving over to zsh full-time. Bash-completion feels, well, added on and slow and not always working. Zsh's completion, however, keeps surprising me on how much it does do. As they say, a picture is worth a thousand words.

[caption id="attachment_722" align="aligncenter" width="300" caption="I typed "./manage.py TAB" and Zsh gave me all the arguments of a standard Django manage script."][![ZSH doing Django Completion][]][][/caption]

The above screenshot came with no configuration -- I didn't have to tell zsh about Django because, well, [someone already did][]. And I'm glad for it.

It's not just for Django, either. See what happened when I did "./configure " in PHP's source tree:

[caption id="attachment_724" align="aligncenter" width="300" caption="The top part is what I got when I did "./configure TAB". The part below my prompt is what I got when I did "./configure --with-TAB""][![Zsh when configuring soruce][]][][/caption]

So note that zsh helps me figure out the right options. What I want to know the exact options for MySQL?

[caption id="attachment_725" align="aligncenter" width="300" caption="Results of ./configure --with-mTAB"][![Results of ./configure --with-mTAB][]][][/caption]

Again, none of this stuff had to be configured -- I just told zsh I wanted completion and it gave it to me. I didn't have to tell it that this was a configure script -- it knew that! Just like it knew about the Django script.

This is just a taste. I hope you bite into zsh for more goodness.

"ZSH doing Django Completion"
"Zsh when configuring soruce"
"Results of ./configure --with-mTAB"