Thursday, March 06, 2008

Grails Date Trick

If you have a Date field in one of your domain classes, for instance:
class Person{
String Name
Date Birthday
}
and you're struggling to figure out a way to get stuff into it without explicitly creating a date and converting strings or integers into it, Grails provides a handy (yet not documented?) set of properties for you. In our example, I could set birthday_year, birthday_month, birthday_day, birthday_hour, etc.. I found this by digging in the scaffolded views and figuring out how they render the tag. Now, maybe you don't have to dig.

Sunday, March 02, 2008

Font choices, anyone?

I've run into this a couple times, and I find it quite handy, so I'm sharing it for all. It's a list of common windows fonts, their mac equivalents, and the fall back font-family specifier. Plus, everything is in it's own font, so you can see what you're choosing.

Just another css developer's link. I'm on a roll here.

Saturday, March 01, 2008

Color Scheme Generator by WellStyled

Perhaps one of the best color scheme tools I've run across. Simple clean interface, great set of options. I like the rest of WellStyled's website as well, an interesting way to deal with multiple languages.

Lorem Ipsum Dolor Sit Amet

I took latin in high school and college (after a failed attempt to take Chinese.. love drawing the characters, hate trying to translate spoken Chinese), so the latin text popular to layout designers and typesetters always appealed to me. Here's a useful site that will generate as much of the text as you need, in paragraphs, lists, bytes, etc. I've used it a couple times before, just thought I'd share it with everyone. (Hint, View Source to copy/paste the useful stuff). Ah, good old Lorem Ipsum. As an aside, someone took thequickbrownfoxjumpsoveralazydog.com. Is it strange that that phrase reminds me of my childhood?

Friday, February 29, 2008

Gotcha: Grails Auto Recompile Doesn't Do GSP

Grails does the auto recompile thing, much like Turbogears etc., but it doesn't seem to work for gsp pages, in particular, main.gsp. Which can trip you up, if you're trying to make a couple simple changes to your first Grails app.

Wednesday, February 27, 2008

Gotcha: Grails Capitalization

So, apparently Grails doesn't like Controllers starting with multiple capitol letters (i.e. TLAcronym). If you create a domain class with all lowercase, it will capitalize it for you, but if you try to create TLAcronym, it happily plays along. Then if you generate-all or do scaffolding for that domain class, you won't be able to access your controller. I've raised an issue for this here: GRAILS-2541.

Thursday, February 14, 2008

Acegi on Grails Tutorial

So, neither the information on the Plugin Page for the Acegi Security Plugin, nor the info in the acegi tutorial actually work completely. Here's a real tutorial for doing this. (Step 6 is where the existing documentation fails)

Step 1. Install Grails

Step 2. Download the Acegi Security Plugin. (I downloaded version 0.2 it as a zip file, to %GRAILS_HOME%/plugins/)

Step 3. Create a new Grails Project, and cd into the new project folder:

grails create-app SecurityTutorial
cd SecurityTutorial

Step 4. Add the Acegi Security Plugin. Note that you can install plugins by name using some lookup service, but the Acegi plugin won't be found.

grails install-plugin %GRAILS_HOME%/plugins/grails-acegi-0.2.zip

Step 5. Installing the Acegi Plugin will add some new scripts to your project:

  • create-auth-domains [PersonDomainName] [AuthorityDomainName: this creates the domain model needed by the plugin, Person, Authority, and RequestMap classes, login and logout controllers, as well as the login view. You can give optional names as arguments to replace Person and Authority.
  • generate-manager: creates the scaffolding controllers to add new Person, Authority, and RequestMap object in your database
  • generate-registration: create a register and captcha controller, as well as matching views, and an emailer service.

Run each of these commands.

grails create-auth-domains
grails generate-mapper
grails generate-registration

Step 6. Setup BootStrap.groovy to contain some sample data, as follows:

// ProjectFolder/grails-app/conf/Bootstrap.groovyclass BootStrap {

def init = { servletContext ->

// get a AcegiSecurity AuthenticateService
def authenticateService = new AuthenticateService()
// use it to create an encoded password
def md5pass = authenticateService.passwordEncoder("pass")

// Create two sample users
// NB: you must specify all the Person attributes, otherwise
// Grails will fail quietly to add these to the database
def user_root = new Person(username:"root",
userRealName:"Root User",
passwd:md5pass,
enabled:true,
email:"root@example.com",
email_show:true,
description:"Desc").save()
def user_admin = new Person(username:"admin",
userRealName:"Admin User",
passwd:md5pass,
enabled:true,
email:"admin@example.com",
email_show:false,
description:"Desc").save()

// Add some sample Roles, add the users to those roles
def role_superuser = new Authority(description:"Superuser",
authority:"ROLE_SUPERUSER")
role_superuser.addToPeople(user_root)
role_superuser.save()

// See AcegiConfig.groovy, at the bottom, there's a defaultrole
// setting, you must make one to allow registration to work.
def role_user = new Authority(description:"User Role",
authority:"ROLE_USER")
role_user.addToPeople(user_admin)
role_user.addToPeople(user_root)
role_user.save()

// Create some Request Maps
new Requestmap(url:"/captcha/**",
configAttribute:"ROLE_SUPERUSER").save()
new Requestmap(url:"/register/**",
configAttribute:"ROLE_USER").save()

}
def destroy = {
}
}

We also have to edit the RegisterController.groovy to fix a bug.

// ProjectFolder/grails-app/controllers/RegisterController.groovy                    // Line # 159-161
person.save(flush:true)
def parMap =['j_username':person.username,'j_password':params.passwd]
// change this line:
// redirect(controller:'login',action:'../j_acegi_security_check',params:parMap)
// to this:
redirect(controller:'login',action:"auth")

Step 7. Run the application

grails run-app

Step 8. Play around. Notice that you when you try to go to the register controller, it asks for a login, then, since you're already logged in, the register controller just shows you your info with a redirect(action "show"). Go delete the RequestMap for the register url, make sure you logout, then try again. See how the captcha is broken? Go remove the captcha RequestMap, and try again.

Thankyou Markmail

So, I've been trying to dig through codehaus's mail archives for the Groovy Lists. Oh wow, what a terrible interface, and miserable search. A lucky Google search later, and I stumble on Markmail's Groovy Site. Not only do I find the mail thread I was hoping for which solved my problem, but a fantastic interface to some of the larger tech mailing lists that has a fantastic interface and great search. The date restraints and graphs are nice, but even nicer: Awesome, awesome thread display, really nice interface for checking out attachments, perma-links, and powerful search features. Good job guys, I saved enough time to write this :)

Tuesday, January 15, 2008

It's not easy being dorky

So, I was hanging out with some of my friends the other night, and we watched the 2nd ep of the new Terminator show, which they had DVR'd. I didn't see the first one, because I don't really watch TV, but it was a pretty good episode. It was odd seeing Summer Glau playing a robot, but not surprising somehow. Anyways, as John leaves the store in the mall, the address of the store is '1337', so I say "haha, leet" (obviously, what else would you say?). No-one in a room full of guys, including the one I'm dating, had any idea what the heck I was talking about, even when I tried to explain. I'm not even sure how to take that.

o.O

Wednesday, January 09, 2008

Rock Band is Awesome

So, I've been playing Rock Band like a mad fiend since late last year. I never got into the Guitar Hero thing, but I truly love drumming. Singing is also fun. My crowning achievements so far: 621 note streak on Medium with The Strokes song, and singing hard Say It Ain't So while playing the drums on hard for the first time without redlining.

Anyways, the fun stuff for you: I made a list of the music videos for the standard Rock Band songlist. (At least all of the ones I could find) Here's the html and rss feed from my del.icio.us account, and here's the list (not in any particular order):
  1. You Tube - Van Halen- Won't Get Fooled Again (Live 1993)

  2. You Tube - The Killers - When You Were Young

  3. You Tube - welcome home - coheed and cambria

  4. You Tube - Pixies - Wave Of Mutilation

  5. You Tube - Bon Jovi - Wanted Dead Or Alive

  6. You Tube - Stone Temple Pilots Vaseline, Vasoline

  7. You Tube - Aerosmith - Train Kept a Rollin'

  8. You Tube - bowie, tokyo 1978: suffragette city

  9. You Tube - The Clash - Should I stay or should I go

  10. You Tube - Weezer - Say It Ain't So

  11. You Tube - Beastie Boys- Sabotage

  12. You Tube - Iron Maiden: Run to the Hills

  13. You Tube - The Strokes - Reptilia

  14. You Tube - Black Sabbath - Paranoid

  15. You Tube - R.E.M. - Orange Crush

  16. You Tube - The Police - Next To You (Hamburg 1980)

  17. You Tube - Mountain - Mississippi Queen - 1970

  18. You Tube - The Hives - Main Offender

  19. You Tube - Foo Fighters - Learn To Fly

  20. You Tube - Nirvana - In Bloom

  21. You Tube - Garbage - I Think I'm Paranoid

  22. You Tube - Deep Purple - Highway Star

  23. You Tube - OK Go - Here It Goes Again

  24. You Tube - Nine Inch Nails - The Hand That Feeds

  25. You Tube - The Outlaws - Green Grass & High Tides - Part One

  26. You Tube - Queens Of The Stone Age - Go With The Flow

  27. You Tube - The Rolling Stones Gimme Shelter

  28. YouTube - Boston - Long Time (11/13/06 at Boston Syphony Hall)

  29. YouTube - Molly Hatchet - "Flirtin' With Disaster"

  30. YouTube - Faith No More: Epic

  31. YouTube - Metallica- Enter Sandman

  32. YouTube - Don't Fear the Reaper - Blue Oyster Cult

  33. YouTube - Kiss - Detroit Rock City

  34. YouTube - FALL OUT BOY: Dead On Arrival

  35. YouTube - Red Hot Chili Peppers - Dani California

  36. YouTube - Radiohead - Creep

  37. YouTube - Smashing Pumpkins - Cherub Rock

  38. YouTube - Hole - Celebrity Skin: Video

  39. YouTube - Ramones - Blitzkrieg Bop

  40. YouTube - Soundgarden - Black Hole Sun

  41. YouTube - The Sweet - Ballroom Blitz

  42. YouTube - Jet - Are you gonna be my girl ?

  43. YouTube - Yeah Yeah Yeahs - Maps

Friday, December 07, 2007

Documentation stuck in the 90's

I'd just like to put this out there: It's high time that in-application documentation systems adopt tabs. They're obviously using web browser technology, and since we're so familiar with that model, and using tabs, it's highly irritating that they don't follow suit.

Tuesday, November 20, 2007

Fuel! Cell! Consumer! Model! ....!!!!


I'm almost embarrassingly excited about this.

Last night, I saw this IMHO awful commercial with the most amazing ending ever - a fuel cell car that will be commerically available!



Wikipedia had this to say about the Honda FCX Clarity:

In 15 November 2007 at the Greater Los Angeles Auto Show, Honda unveiled the FCX Clarity, the first production model, and announced that the car would be available for lease beginning in the summer 2008. Initial availability will be limited to the Southern California market, with availability expanding as hydrogen fueling stations become available...

...The new FCX utilizes several interesting new features. The new V Flow fuel cell stack can operate at temperatures as low as −30 °C. This is achieved by allowing the gas to flow vertically in the fuel cell stack. The tanks can store up to 5 kg (171 litres) of hydrogen at a pressure of 350 atmospheres, thanks to the new hydrogen absorption materials used. This allows a longer range of up to 350 miles (570 km)...

...To support the hydrogen fuel-cell technology, Honda also introduced the Home Energy Station (HES). This home solution can convert natural gas to electricity, heat and hydrogen to refuel fuel-cell vehicles. This allows consumers to refuel vehicles with hydrogen at home, important until hydrogen stations become widespread. Alternatively, the hydrogen can be used in the HES's built-in hydrogen fuel cell, providing up to 5 kW of normal or backup electricity and/or hot water for the home.

Apparently there are 20 already-leased 2002 prototypes, some of which are here in New York. What especially excites me is that they've come up with with a home refueling solution! With a range up to 350 miles that sounds like it might be a practical enough solution to make up for the lack of hydrogen fuel infrastructure.

I wish mass production might get started sooner than 2018..

Thursday, November 15, 2007

Best Gaming News All Year

I'm super duper stoked about the news that they're going to be making Lego Batman games. I love Legos, I love Batman, and I love the Legos Starwars Games. (My awesome sister bought me the complete saga for the Wii as a birthday gift this year) Life doesn't get any more exciting than this. :)

Wednesday, September 26, 2007

Toscawidgets Forms: Passing Compound Widgets

For lack of documentation's sake, and because it wasn't initially obvious to me after poking around in the code (in fact, I got led astray, thinking there was some dot notation I would have to use), this is how you pass values into Compound Widgets in Toscawidgets:

Say you have some Widget like this:
form = Form('FormName',
children=[
FieldSet('FieldSetName',
children=[
TextField('TextFieldName')])
])

and displayed in your template like this:

${ form.display(**form_args)}


then you can pass values into it from your controller like so:
def controller(self):
return dict(form=form,
form_args={'value':{
'FieldSetName':{ 'TextFieldName':
'Desired TextField Value'}}})

I guess it's pretty obvious in retrospect, in fact, the compound Form outputs something much like this (minus the outside dictionary), and those values can be passed right back into the Compound Form again. Perhaps, had I been actually using a Model, or gotten more sleep, this all would have been more natural - but hopefully this helps someone else.

Hint: If you're overriding templates, be sure that you're still passing the right values in to fetch the children arguments, i.e.:


${section.display(value_for(section), **args_for(section))}

Monday, September 24, 2007

Aardvark: Must have Firefox Extension

Any discussion on Firefox Extension recommendations must include the obligatory "Firebug is the most amazing tool ever" note. (Because it's really fantastically useful, and it just keeps getting better)

Today, I'd like to mention Aardvark. It's super useful for isolating parts of the page for easy printing, and quite easy to use, once you learn the keystrokes. I use it all the time for printing out comics and lolcats for posting on my cubical walls.

Gotcha: Toscawidgets and Mochikit

So, after much annoyingness, I've finally realized why I was having so much trouble using the Mochikit extension to Toscawidgets. As the Toscawidgets docs state, you need to include this template if you're using Genshi, which basically adds these lines (plus matching matching body top and bottom lines):

<link for=\"css in tg_css\" replace=\"css.display()\">
<link for=\"js in tg_js_head\" replace=\"js.display()\">

Now, if you're silly, like me, and don't really pay attention, you just include it, without looking too hard at your master template, which includes these lines by default:

<link for=\"css in tg_css\" replace=\"ET(css.display())\">
<link for=\"js in tg_js_head\" replace=\"ET(js.display())\">

As soon as you put the widget in your controller:

from toscawidgets.widgets.mochikit import mochikit
class Root(controllers.RootController):
@expose("genshi:mumapp.templates.sections")
def info(self):
return dict( form = InformationForm,
js = mochikit )

You start to get funny Genshi errors, mine was "AttributeError: 'Stream' object has no attribute 'tag'" which prompted me to try various combinations of adding ET() and HTML() to my templates, when the problem was that Toscawidgets cleans that whole ET/Genshi issue up and breaks when you leave them in.

So, long story short, add the site template and remove the conflicting lines from your master template. (Though, if you are mixing Toscawidgets and Turbogears widgets, you'll have to do something like what's outlined here.)

Wednesday, September 12, 2007

Security Camera Shenanigans

One of the funniest things I've seen in a while: At the Port Authority in Tampa, they have a whole bunch of security cameras, in a really nice movie looking setup. Unlike the movies, though, a whole colony of ants has built a highway across one, so it looks like something out of Them!.. and on another camera, a huge fuzzy spider crawling about a pier. It was quite alarming at first, out of the corner of my eye, but ultimately quite amusing. I wish I could have taken a picture, but I doubt they would like me whipping out a camera in their security room.

Tuesday, September 11, 2007

Announcement: GenshiColumnTemplate

I've made a quickstart Genshi template for Turbogears that gives you a ready made 3 column layout, using the excellent 3 column layout from A List Apart's Holy Grail article. If you spent 5 minutes, you could do it yourself, but it's kinda nice to have something ready made. I pull out the layout css in a separate file, and relaid out the welcome page to use 3 columns. The master.html template uses Genshi's Xpath select function to pull content together into the columns.

To Install:
easy_install genshicolumntemplate

To Use:
In your templates that include master.html, make divs that have ids of 'left', 'center', 'right', 'footer', and 'header', or just add your static content to master.html. The only caveat is that there must be some sort of other element inside the positional div wrapping your text, it can't be just text, as xpath won't select it for replacement.

ToDo:
  • Documentation. It should be mercifully short, yet I still haven't done it
  • Fix up the welcome page a bit
  • Figure out some sort of decent unit test for templates
  • Wait for suggestions, criticisms, etc :)
Please let me know if you try it out.

Monday, September 10, 2007

Python Cheeseshop and Eggs

I've been playing with putting a package up on the Cheeseshop, Python's Package Index. There isn't a lot of documentation out there, but there really doesn't need to be, it's pretty easy. I cheated and modified someone else's egg for my own use, but the file setup isn't all that hard, and you can get paster to make a ready-eggable template for you.

Anyways, the quick commands to use, after creating an account and setting up your egg and metadata:

  • python setup.py register
    this creates an entry in the cheeseshop for your project and populates it with the metadata from your egg. If something is wrong, just fix it and rerun this command.
  • python setup.py sdist upload
    this creates a source distribution (the egg folder tarred and gunzipped) in dist/ and uploads it to the cheeseshop
  • python setup.py bdist_egg
    upload this creates a binary distribution (the egg folder all zipped up) in dist/ and uploads it to the cheeseshop


Super bonus hints:
python setup.py develop installs the egg using a link to your source code instead of putting it in the site-packages folder, so you can test things.
easy_install -m package_name
takes the package name out of the appropriate places, allowing you to uninstall a package by deleting it from the site-packages folder.

Sunday, September 02, 2007

Toscawidgets and Paster

So, I'm playing around with making a bunch of Toscawidgets (Toscawidgets widgets?) and found, by hunting around a bit, that you can get a pretty handy package template by using PasteScript. Try:
paster create -t toscawidgets
and answer the questions. For a list of what other templates paster create has, try:
paster create --list-templates
For some reason, figuring this out took me way longer than it really should have last night. (Thanks Daniel)

A super bonus bbedit command line hint: bbedit *.py --new-window