HP Total GoatseCare
February 28th, 2008
So I was reading an article this afternoon & noticed the HP advertisement that appeared right next to it:
And I kept thinking, that’s so familiar…
dynamic resolution + prototype
February 27th, 2008
You may have heard of the Dynamic CSS resolution switcher from Particletree, it's a neat bit of js that allows you to specify different css files depending on the browser resolution.
We love this script, but we had problems running it with Safari, and we are using prototype, so we wanted to make use of its goodness for the browser independent stuff.
So, if you're already using prototype, the following script achieves the same effect as the original particletree script. It also uses the dom:ready event, which fires after the dom is loaded, but before the screen is drawn, so you shouldn't see any 'twitch'.
Example
In the following example, we have three stylesheets that correspond to browser widths as follows:
thin up to 1020 wide 1021...1400 widest above 1400
For non js users we want to default to 'wide' (the middle one). In order for this to work properly, we disable all of the non-default stylesheet links.
In your html
In your html you need to link to the three stylesheets, give them each a title attribute, and disable the ones you don't want non-js users to see.
<link title="wide" href="/stylesheets/wide.css" rel="stylesheet" type="text/css" /> <link title="thin" disabled="true" href="/stylesheets/thin.css" rel="stylesheet" type="text/css" /> <link title="widest" disabled="true" href="/stylesheets/widest.css" rel="stylesheet" type="text/css" />
And link to the script, we'll call it dynamic_css.js
<script src="/javascripts/dynamic_css.js" type="text/javascript"></script>
The script
This is the script, it uses the title attribute of the stylesheets to disable or enable them. It is run when the dom is ready, and when the browser width changes.
// DYNAMIC RESOLUTION SWITCHER
// Originally from ParticleTree
// Simplified with Prototype by Ian White of Argument from Design 2008
// include prototype.js (>=1.6) before this file
// you need to edit this function as per your situation
function applyDynamicLayout() {
var width = document.viewport.getWidth();
if (width <= 1020 ) { applyStylesheet("thin") }
if (width > 1020 && width <= 1400) { applyStylesheet("wide") }
if (width > 1400) { applyStylesheet("widest") }
}
// you shouldn't need to edit past here
function applyStylesheet(title) {
var i, stylesheet;
for(i=0; (stylesheet = document.getElementsByTagName("link")[i]); i++) {
// is it a stylesheet with a title attribute?
if(stylesheet.getAttribute("rel").indexOf("style") != -1 && stylesheet.getAttribute("title")) {
stylesheet.disabled = true;
if (stylesheet.getAttribute("title") == title) {
stylesheet.disabled = false;
}
}
}
}
//Run applyDynamicLayout function when window is ready and when it resizes.
Event.observe(document, 'dom:ready', applyDynamicLayout);
Event.observe(window, 'resize', applyDynamicLayout);
That's it!
That's it, it works for us in Safari, Opera, FF and IE 6 or greater.
Also, you can have as many stylesheet links as you like with the same title. For example, let's say you have some IE6 specific kludges for the 'thin' layout. You would do this:
<!--[if lt IE 7]> <link title="thin" disabled="true" href="/stylesheets/thinie6.css" rel="stylesheet" type="text/css" /> <![endif]-->
resources_controller new trunk
February 26th, 2008
There's going to be some new features coming in resources_controller. Stay tuned...
Meanwhile, rc has got a new repository location (the old one will still work for a while, but will remain at the current version):
trunk: http://svn.ardes.com/resources_controller/trunk/resources_controller
tag 0.5: http://svn.ardes.com/resources_controller/tags/0.5/resources_controller
For those interested in providing patches, you should checkout http://svn.ardes.com/resources_controller/trunk and run rake pre_commit in that directory to check your changes. Then send a diff along, or post it on the google group.
Ruby muckin
February 12th, 2008
So I was writing a Rakefile and found myself doing stuff like this:
cmd = "svn co #{src} #{dest}"
puts cmd
system cmd
Everytime I wrote lines like this, a little corner of my heart died.
I dreamt of something like this:
"svn co #{src} #{dest}".to :puts, :system
But it's hard to do this properly, because you need to get hold of the receiver (in the above case main, or some Rake task) or binding, so that the methods can be sent where they ought. With crippled Kernel#caller, the the demise of Binding.of_caller (Ruby-debug solved the problem but there's significant overhead) it was looking like I should just wait for the next ruby release.
But I frowned like Hiro and came up with this:
pass("svn co #{src} #{dest}").to :puts, :system
Briefly, Object gets #pass which creates a PassProxy (basic object). It keeps hold of the receiver, but acts like the object (in this case the string). When you send #to(:method) to this PassProxy, it calls the original receiver with the object.
This is just sugar, but its nice sugar in some cases. Compare:
# plain ruby
msg = "oooh!"
MyObj.foo msg
MyObj.far msg
MyObj.faz msg
msg
# => 'oooh!'
# returning (ActiveSupport)
returning "oooh!" do |s|
MyObj.foo s
MyObj.far s
MyObj.faz s
end
# => 'oooh!'
# (pass) (this code)
MyObj.pass("oooh!").to :foo, :far, :faz
# => 'oooh!'
But eat too much sugar and your teeth will fall out: I realised that this probably has limited usefulness (how often do you need to send the same object to a bunch of different methods?). But at least I learned some things in that last couple of hours of coding.
Go get the code from pastie if you're interested.
Thanks for reading