top | item 1967536

Zed Shaw: Tir Web Framework Officially Up

132 points| ctkrohn | 15 years ago |sheddingbikes.com | reply

68 comments

order
[+] mikeryan|15 years ago|reply
So in 2010 Zed has written his own web server which runs his new framework he wrote for the new webapp he wrote.

What did you do this year?

[+] angelbob|15 years ago|reply
In 2010? I reworked my Comet-based realtime game-in-a-web-server library, RailsGame.

I fully rewrote, updated and released a webapp called WantMyJob.com.

I wrote a circuit simulator game called Shanna's Pizza to start teaching my two-year-old the basics of programming. I also started doing Snap Circuits with her so she'd have a physical basis to understand the circuit simulator game. Also, had a second kid.

I wrote a Rails 3 tutorial, including an app with logins and nested resources, called RefactorIt!

I finally put together a real programming portfolio, on the web and everything (angelbob.com/portfolio).

I read up on Bayesian Statistics and Data Analysis (thanks, O'Reilly!).

I blogged and blogged and blogged.

I reworked, resurrected and took screen shots of a scary amount of my old work, partly for the portfolio. This sort of blurs with converting my old Rails stuff to Rails 3, but I did some of both.

I continued to work on my day job, of course. And gave a JRuby presentation for Engine Yard based on what we do there.

Did you know you get more done if you write it down somewhere (like a blog and portfolio) and tell people about it? True story.

That's probably part of Zed's trick, too.

[+] jrockway|15 years ago|reply
I wrote a rant about how much I hate people that kick back and put their feet up on the table.

Oh, nope, that was Zed, too!

(But seriously, Mongrel 2 is an amazing work of software engineering. In addition to being a good web server, it's also a good example of how nice C is if you forget how they did it in the 70s and write it like it's 2010.)

[+] timtadh|15 years ago|reply
Wrote my own web server. Which runs my own web framework. Which runs my new webapp a friend and I wrote yesterday. Writing a simple web stack isn't hard. Writing a full featured, secure, and reliable stack is more difficult.

I mean we are mostly all people who make stuff here. I am slightly offended by your attitude that ZS is some how showing us up and we need to prove what we did this year.

[+] simonw|15 years ago|reply
Launched wildlifenearyou.com, built a new commenting system for guardian.co.uk (with a great team), ran a marathon, got married, went on a six month honeymoon through France, Spain, Morocco and Egypt, co-founded and launched lanyrd.com with my wife (from an apartment in Casablanca), learnt to scuba dive, and we're now on a self-drive safari in South Africa. 2010 has been /awesome/.
[+] mwhooker|15 years ago|reply
don't forget writing a book on python
[+] endtime|15 years ago|reply
Since we're all bragging, I finished my MSCS at Stanford with over a 4.0 GPA, wrote a game that was a finalist in the CS248 competition, had my first paper published, TAed CS210, launched my startup, learned Django and CoffeeScript and JavaScript, wrote a charting library in CS/Raphael, started learning how to be someone's boss, and moved across the country and forced myself to make friends. All in all I feel good about the year.
[+] _b8r0|15 years ago|reply
* Kicked out more bad guys out of compromised networks than usual.

* Grew my main business, had our first year where I've not had a single worry about running out of money (touch wood) in the middle of a serious recession.

* Started building academic and vendor relationships (never thought I'd do that) to develop new technologies and services.

* Did more vulnerability research this year than I have in the last two but haven't published anything public yet.

* Moved to Sales, Marketing, now back to Technical for the time being.

* Took on a business partner and mentor

* Bid for two research grants

* Built up pipeline, wrote more proposals than I have in a long time.

* Seriously damaged my knee in a freak dancing accident.

* Grew a Mo to support Prostate Cancer charities (and raised a few bob too)

* Started a proper non-security side project (http://www.minklinks.com/) - failed to get it into beta for HN November but it will be out before year end.

* Did a whole load of pentesting.

That's it so far, still more things to come before year end though. Hope I pull them off.

[+] didip|15 years ago|reply
Let's see,

* I quit my full time job, start doing contracting again.

* I co-founded http://cooln.es to test our theory about points relationships between social sites.

* I founded http://mybucket.co because all other bookmarking apps are too much work.

* manual classification of news is too much work, so I created Bayesian filter on top of Redis. It's open source: https://github.com/didip/bayes_on_redis

* I'm still helping out Python newcomers on Pylons, Tornado, and recently Flask mailing list.

* I fix bugs on a couple of gems.

* I start blogging again.

* I start learning http://keplerproject.github.com/orbit not too long ago after answering my own question "I wish there's a hybrid between ruby+python and faster than both."

I'd say it hasn't been a bad year.

[+] bluesnowmonkey|15 years ago|reply
Well, I made a new cloud computing platform using my new federated REST database and my new message queue and my new Subversion sharding layer and my new unit testing library, all in a language I didn't know when I started. Then I made a web site and management console for it that runs on it. And a network API and a command-line tool because you need those.
[+] pistoriusp|15 years ago|reply
It's a fair question, but I think that comparing yourself to others success is a great way to make yourself feel bad.
[+] mmastrac|15 years ago|reply
I love the natural style of page conversation on the example page. As a Java developer, I wish that this style were possible on the servlet platform:

  local login_page = Tir.view("login.html")
  local login_form = Tir.form { 'login_name', 'password'}

  local function login(web, req)
    local params = login_form:parse(req)

    repeat
        params = web:prompt(login_page {form=params, logged_in=false})
    until login_form:valid(params)
    
    return web:redirect('/')
  end

  Tir.start {route='/Login', main=login}
Also, +1 to this: "the framework creator shouldn't be shoving stateful/stateless dogma in your face".
[+] zedshaw|15 years ago|reply
The natural style is sweet for things like that. I did the Hype.la signup process with natural style and it meant I didn't have to touch the database the whole time. If they quit half-way through then no DB junk left over.

Where this kind of coroutine stuff sucks though is in anything that's "RESTy". In other parts of Hype.la I had simple Xhr callbacks that just grabbed lists of data, so the coroutines were just annoyingly in the way and half the time they were just a big loop with an if-statement for the URLs.

That's where the evented came in. In that way I just map actions to callbacks and done.

Then I ran into a few simple things that didn't work in evented and were still stateless, like the search interface, and so I use the stateless handler for that. Nice and snappy with no extra junk.

Another advantage of all this is that, if you have a part of your app that needs to be resistant to restarts, then you can craft it evented or stateless. In other parts, restarts aren't a big deal so you can do natural. And since everything is just a bunch of little processes, it scales out nice and doesn't have as much of the "gotta-copy-the-world-for-users" that Seaside upgrades do.

[+] viraptor|15 years ago|reply
This one really surprised me: "Finally, there's not much for deployment. I run my apps in GNU screen and that's about it." Seriously? Is he that lucky, serves that little traffic, or does he run with redundant power, network, server and 24/7 monitoring in an inaccessible bunker?

I haven't been able to run even my toy web apps without something like monit - due to both things under my control and outside of it.

[+] zedshaw|15 years ago|reply
Hype.la is the only real Tir app, with the Mongrel2 BBS demo being a "proto-Tir" app. There's hardly anyone on it yet since I didn't really "launch" it. Because of that, I just run it in screen and I'll worry about the deployment scenario later. Also, the Tir start command actually works kind of like a little monit/daemontools, so if a handler dies it gets restarted. It's pretty robust already.

And yeah I need some monit soon, but so far it's been running fine for the small scale.

[+] buro9|15 years ago|reply
On my hobby projects I run stuff in screen, I haven't had a problem and my server uptime is currently above 200 days. Is it being used? Something like 1,000 concurrent users for most of the day, so yes.

I regarded this as cowboy, but as it worked for me I haven't needed to re-visit it.

[+] meric|15 years ago|reply
Last time this was posted I was really interested in it. So interested in fact, I built a django-style template library to go with it because I really liked 'extends' and 'block'.

Github https://github.com/meric/tier/

Example https://github.com/meric/tier/blob/master/main.lua http://pastehtml.com/view/1c26ovp.html

Zed would think this is contradicting the point of Tir, though; it being a micro-framework. =\

[+] zedshaw|15 years ago|reply
Interesting, I'll take a look at this some more. My only question is, isn't plain old Lua already like django's templates. What specifically are you adding that embedded lua doesn't just give you?
[+] samd|15 years ago|reply

   -------------- NO TESTS ----------------
     You must work at a startup.
Brilliant.

Hype.la is also pretty slick. Maybe it will become the blogroll of open-source projects.

[+] zedshaw|15 years ago|reply
Ha, yeah I had to put that in. I find working in the valley is kind of like working with a bunch of guys before Knuth and Dijkstra established structured programming. It's like they say, "Yo, I don't do if-statements man. I use gotos only. That logic and structure crap just slows me down and busts up my creative chi."

As for hype.la, stay tuned. I gotta fix up the ad blocks and improve the UI a bunch, but I'm really aiming for it to be for FLOSS and other artists to do ads without feeling like sleeze. Definitely something I want.

[+] jcromartie|15 years ago|reply
Very cool. I was just looking for other Seaside-style web frameworks today. The "natural style" mode in Tir is just like the main way to build web apps in Seaside.

Aside from Lua and Smalltalk, what other languages could host this kind of framework? I know Ruby 1.9 has Wee, but that doesn't seem to be "ready for prime time."

[+] vito|15 years ago|reply
I've been toying with something similar in Atomo (running atop mongrel2): http://bitbucket.org/alex/web/src/2a90b9bd6322/example.atomo

In its early stages it was continuation-based, but now it's just regular ol' closures. You can still use continuations rather easily though; some of it is modeled on the PLT stack (send/suspend, etc.).

Earlier progress: https://gist.github.com/717381/433d743dc4a7d91705692ff1dc6ca...

Source code: http://bitbucket.org/alex/web/src

[+] jhpriestley|15 years ago|reply
Code written in the continuation monad (i.e., simple imperative style) can be translated to an Automaton arrow and fit into a Haskell on a Horse application. This approach has the advantage of type-safety and greater composability.
[+] zedshaw|15 years ago|reply
The main feature that is required is the ability to callcc and/or coroutine yield from any point in the stack. If you look at Wee, the user of the framework has to callcc all over the place to make it work. In Tir I have web:prompt(), which itself does the yielding without anyone having to care.

The significance of this is that Tir can provide one API for all three styles without special effort from the user.

[+] grandalf|15 years ago|reply
very cool! looking forward to trying it out.