hoodwink.d enhanced
RSS
2.0
XHTML
1.0

RedHanded

Camping's Youthfulness Wins Annual Award #

by why in cult

Today, the International Kayak Consortium celebrates Camping (a Microframework)’s 1st birthday. They have honored the paragraph of code by awarding it the Annual First Place in Birthdaying Special Day Award and So Brave.

Click to zoom.

The commissioner of kayaking LeBrock Mitchell gave an acceptance speech on behalf of Camping at this morning’s banquet. His sentiments were brief, but stirring:

I have written two speeches for today, a long one and a short one. However, the pages for both got wet inside my kayak. Yes, I tried blow-drying them. But as I held that that cylinder of hot air, I realize that I couldn’t say anything as brief as Camping itself.

And he held up a printout of Camping from trunk and he wept exactly 4k of tears. We, in fact, measured with a graduated cylinder.

Here is Camping today.

%w[active_support markaby tempfile uri].map{|l|require l}
module Camping;Apps=[];C=self;S=IO.read(__FILE__).sub(/S=I.+$/,'')
P="Cam\ping Problem!";module Helpers;def R(c,*g);p,h=/\(.+?\)/,g.grep(Hash)
(g-=h).inject(c.urls.find{|x|x.scan(p).size==g.size}.dup){|s,a|s.sub p,C.
escape((a[a.class.primary_key]rescue a))}+(h.any?? "?"+h[0].map{|x|x.map{|z|C.
escape z}*"="}*"&": "")end;def URL c='/',*a;c=R(c,*a)if c.respond_to?:urls
c=self/c;c="//"+@env.HTTP_HOST+c if c[/^\//];URI(c)end;def/p;p[/^\//]?@root+p :
p end;def errors_for o;ul.errors{o.errors.each_full{|x|li x}}if o.errors.any?end
end;module Base;include Helpers;attr_accessor:input,:cookies,:env,:headers,:body,
:status,:root;def method_missing*a,&b;a.shift if a[0]==:render;m=Mab.new {},self
s=m.capture{send(*a,&b)};s=m.capture{send(:layout){s}} if /^_/!~a[0].to_s and m.
respond_to?:layout;s end;def r s,b,h={};@status=s;@headers.merge!h;@body=b end
def redirect*a;r 302,'','Location'=>URL(*a)end;Z="\r\n";def to_a;[@status,@body,
@headers]end;def initialize r,e,m;e=H[e.to_hash];@status,@method,@env,@headers,
@root=200,m.downcase,e,{'Content-Type'=>"text/html"},e.SCRIPT_NAME.sub(/\/$/,'')
@k=C.kp e.HTTP_COOKIE;q=C.qsp e.QUERY_STRING;@in=r;if%r|\Amultipart/form-.*boun\
dary=\"?([^\";,]+)|n.match e.CONTENT_TYPE;b=/(?:\r?\n|\A)#{Regexp::quote("--#$1" 
)}(?:--)?\r$/;until@in.eof?;fh=H[];for l in@in;case l;when Z;break
when/^Content-D.+?: form-data;/;fh.u H[*$'.scan(/(?:\s(\w+)="([^"]+)")/).flatten]
when/^Content-Type: (.+?)(\r$|\Z)/m;fh[:type]=$1;end;end;fn=fh[:name];o=if
fh[:filename];o=fh[:tempfile]=Tempfile.new(:C);o.binmode;else;fh=""end;while l=@in.
read(16384);if l=~b;o<<$`.chomp;@in.seek(-$'.size,IO::SEEK_CUR);break;end;o<<l
end;C.qsp(fn,'&;',fh,q) if fn;fh[:tempfile].rewind if fh.is_a?H;end;elsif@method==
"post";q.u C.qsp(@in.read)end;@cookies,@input=@k.dup,q.dup end;def service*a
@body=send(@method,*a)if respond_to?@method;@headers["Set-Cookie"]=@cookies.map{
|k,v|"#{k}=#{C.escape(v)}; path=#{self/'/'}"if v!=@k[k]}-[nil];self end;def to_s
a=[];@headers.map{|k,v|[*v].map{|x|a<<"#{k}: #{x}"}};"Status: #{@status}#{Z+a*Z+
Z*2+@body}"end;end;X=module Controllers;@r=[];class<<self;def r;@r;end;def R*u
r=@r;Class.new{meta_def(:urls){u};meta_def(:inherited){|x|r<<x}}end;def M;def M
end;constants.map{|c|k=const_get(c);k.send:include,C,Base,Models;r[0,0]=k if
!r.include?k;k.meta_def(:urls){["/#{c.downcase}"]}if !k.respond_to?:urls}end;def
D p;r.map{|k|k.urls.map{|x|return k,$~[1..-1]if p=~/^#{x}\/?$/}};[NotFound,[p]]end
end;class NotFound<R();def get p;r(404,Mab.new{h1 P;h2 p+" not found"})end end
class ServerError<R();def get k,m,e;r(500,Mab.new{h1 P;h2"#{k}.#{m}";h3"#{e.class
} #{e.message}:";ul{e.backtrace.each{|bt|li(bt)}}}.to_s)end end;self;end;class<<
self;def goes m;eval S.gsub(/Camping/,m.to_s).gsub("A\pps=[]","Cam\ping::Apps<<\
self"),TOPLEVEL_BINDING;end;def escape s;s.to_s.gsub(/[^ \w.-]+/n){'%'+($&.
unpack('H2'*$&.size)*'%').upcase}.tr(' ','+')end;def un s;s.tr('+',' ').gsub(
/%([\da-f]{2})/in){[$1].pack('H*')}end;def qsp q,d='&;',y=nil,z=H[];m=proc{|_,o,n|o.u(
n,&m)rescue([*o]<<n)};q.to_s.split(/[#{d}] */n).inject((b,z=z,H[])[0]){|h,p|k,v=un(p).
split('=',2);h.u k.split(/[\]\[]+/).reverse.inject(y||v){|x,i|H[i,x]},&m}end;def
kp s;c=qsp(s,';,')end;def run r=$stdin,e=ENV;X.M;k,a=X.D un("/#{e[
'PATH_INFO']}".gsub(/\/+/,'/'));k.new(r,e,(m=e['REQUEST_METHOD']||"GET")).Y.
service *a;rescue Object=>x;X::ServerError.new(r,e,'get').service(k,m,x)end
def method_missing m,c,*a;X.M;k=X.const_get(c).new(StringIO.new,H['HTTP_HOST',
'','SCRIPT_NAME','','HTTP_COOKIE',''],m.to_s);H.new(a.pop).each{|e,f|k.send(
"#{e}=",f)}if Hash===a[-1];k.service *a;end;end;module Views;include X,Helpers
end;module Models;autoload:Base,'camping/db';def Y;self;end;end;class Mab<
Markaby::Builder;include Views;def tag!*g,&b;h=g[-1];[:href,:action,:src].map{
|a|(h[a]=self/h[a])rescue 0};super end end;H=HashWithIndifferentAccess;class H
def method_missing m,*a;m.to_s=~/=$/?self[$`]=a[0]:a==[]?self[m]:raise(
NoMethodError,"#{m}")end;alias_method:u,:regular_update;end end

More recently:

Update: If all of you can get out your copy of the Camping core team’s group picture, Indian Chief Skittles McQueeny has just sent me the following legend:

  1. Ranger Jake (holding a lizard)
  2. Tiffany Rabbitsapple
  3. (a non-notable prince)
  4. why the lucky stiff
  5. Spud Webb (the same)
  6. Indian Chief Skittles McQueeny
  7. Mrs. Rummly
  8. Jonas Pfenniger
  9. Oarsman C. S. “Celery Shirt” Acornson
  10. Camera Nap
  11. Helps the Janitor (holding a soccer ball under his poncho)

Update from Air Force Staff Sargeant Guds Mandragon:

We try to keep a lid on it, but some pilot folklore has infiltrated our ranks. The tale goes that if you eject from your plane on Camping’s birthday that you will be visited in the night by a red fairy who will grant you a free batch of caramel apples, answering to any quantity you provide. In some permutations of the rumor, she grants an infinite quantity. Four aircraft have been ditched, two have struck earth, one crushing a cereal factory. I am told Grape Nuts. Please dispell this rumor forthrighly.

Hmm, interesing stuff. Thanks, Guds!

Update:

Update: The latest Camping trunk lets you add a query string to your routes by adding a Hash argument.

 >> a "version 2", :href => R(Show, page.title, :version => 2)
 => "<a href='/wiki/title?version=2'>version 2</a>" 

said on

Happy Birthday Camping!

said on

The lizard that shall remain unnamed!

Congratulations Why!! I wish you’d stop being so humble and start promoting this gem a bit more.

said on

I think we should make you an honorary member of the Perl community. You’d fit right in with the rest of the mad scientists. ;-)

said on

I have the same birthday as Camping (a Microframework). I find that comforting.

said on

LninYo: Oh, I promote. Hooks right up!

Scott: Ever since you were young, a deerling walked in the adjacent hallways. Today that young buck stood upright. My fondest of happy birthdays to you.

said on

Happy Birthday Camping! We use camping everyday for the lighting of the lava lamps.

I agree need to get your marketing mojo going. Perhaps camping needs it’s own myspace page.

Now where’s that cake…

said on

May it live long.

Why: looking back, you sent me an email about Markaby on the 3rd (Jan ‘06) with this little gem…

It would be nice to have a parser as well, but I can’t imagine writing anything superior to HTree.

Heh heh :) Did you get my (more recent) email?

said on

I’m baking a cake. Yum!

said on

happy bday camping!!11elventyone

said on

Hoorah for Camping, it’s a heck of a lot easier on the brain than TrailerPark (Scalable Enterprise Edition), which weighs in at a mere 4 gigs :)

said on

I’m still waiting for my Camping 2006 uniform to arrive in the mail.

said on

Life before Camping is a haze of pollution and natureless waste. I’ve never had so much fun with a pocket knife and a bag full of trail mix in my life.

said on

woo! happy birthday to Camping! It rocks. hard.

said on

Happy Birthday to Camping, and good job _why!

said on

It’s amazing that one year ago I was thinking “WTF is this, why would anyone not want to use rails” and now I look rails the same way, and consider camping the better. What have you done _why, what have you done?

said on

hey, thanks for the camping intro link (the only thing i’ve felt like missing a bit was a reference to http://prototypejs.org ). But, hooo, great work all around. Keep going and happy birthday Camping.

said on

I must say, I’ve found MooFX way better than Prototype for Camping. Super light, about as powerful, more compact syntax. It also originates at the best domain name in existence, mad4milk.net.

said on

I less than three camping. Thanks for bringing Feedchamp to my attention, I’ve got some nifty-keen patches for it a brewin. And I would never have gotten beyond the “One day I should…” phase without 4k of outdoorsy-fresh delightfulness.

said on

Camping: The web framework for all in tents and purposes (:

happy birthday!

said on

Yet another Camping gem to know about is http://subtlety.errtheblog.com. Yes, now you can RSSin your SVN , http://swik.net/Rails/Err+the+Blog/RSSin%27+Your+SVN/uwio Cool, isn’t it?

said on

I know you will hate me but I had to do this

http://julik.textdriven.com/svn/tools/rails_plugins/camper/lib/camper.rb

Might as well be a birthday present for Camping (although sort of a bondagy-one at that).

said on DD Mon YYYY at HH:MM

* do fancy stuff in your comment.

PREVIEW PANE