 five minutes, oh my god, because earlier I didn't realize when I made my first presentation that we were going to have 30 minutes, so I made like a long presentation and then I cut it down to size and they said I could do the whole thing, so I'm going to have to go fast. So, the presentation begins with NodeJS, this is part one, okay, so what is NodeJS? NodeJS is a server-side JavaScript server library for building servers using evented IO, which I'll explain in one second, okay, so here's an example web server written in Node, I'm not sure if you can read it, especially all the way to the back, but basically you require the HTTP module or what have you, you call create server on that, you give it an anonymous function in JavaScript which takes a requested response as arguments, then you say a response right ahead, 200 content type text plain, which is the absolute bare minimum for an okay response with some content coming back from a web server, and then you do response end with hello world and then all you have to do after that is add on that you want this function and this server to listen on port 8124, hold on, so Shane Becker, who I'm not sure is, but he told me that it's cooler when you're doing this if you can actually make it look as if, see lasers come out of my fingers, but anyway, so you give it the port to listen to and listen on and the IP address, okay, so that's the basics, is it already time? No, no, I'm just kidding. This is a picture of a bad day of employment at a coffee shop, now you might wonder why on earth I'm showing you this graphic, this is to explain the invented IO thing that I mentioned earlier, okay, so there's this asynchronous evented thing that Node.js does which is quite bizarre when you first get into it, right, and the coffee shop is actually the best metaphor I heard for explaining it, right, typically when you're programming with well okay, just you go into a coffee shop, you order whatever it is you want to drink, you say like I'd like to have a latte, right, they say okay we're gonna make your latte and then you wait for a second and they're like latte and you're like that's me and you get your latte, right, that's a synchronous organization, right, if they were using a threaded model in coffee shops it would go like this, you go up there and you're like I'd like a latte they're like okay they take your money they make the latte and then they give it to you and then they ask what the next person in line wants, right, which would be really annoying and cost them a lot of customers because everyone would go to the places that uses evented and asynchronous organization so if you talk to people about Node they'll be like my god the asynchronous model is so strange and you'll be like no it's easy it's like a coffee shop okay so Node runs on the V8 interpreter from Google it is blazingly fast if I understand the lineage correctly the strong top guys whose son hired to make the Java VMs got hired away by Google to create V8 that's if I recall correct so once very short it's fast comes from Google although this is actually cluefulgoogle.gilesb.com this is a little bit of self-promotion I have been known to indulge in self-promotion from time to time over here it says imagine how cool it would be if Google was useful for down script documentation and this website is like a Google that is useful for down script documentation this is a blank so to install this you go here major local configure make make install it's like anything else on legs or you know OSX any set of units pluses to Node.js the big thing that is making it popular is it is fast as hell it is just ridiculously fast here they have some benchmarks for it serving 10,000 requests per second here's a blog post by a guy who actually had Python going faster until he started optimizing and got it you know pretty fast another thing that I think is actually even bigger when is it's mega convenient and one of the reasons it's convenient here's a Jasmine Node well I don't know where Evan is but the okay the Jasmine library for JavaScript VDD or specs comes from Pivotal Pivotal Labs this is a fork which is altered slightly to run with Node I don't know what they use I think maybe Rhino like out of the box but what makes it so convenient is this right here the I represents number of people who are following it and the fork represents number of people who are forking it so you can see that one out of every three people who follow this project have forked it this is the same on Node where it's not quite it's not the same number but it's still quite high 4500 followers 485 forks so one out of every ten people who follow the project forks this is how you know that an open source project is doing well when you have high ratios like that now minus is to Node I haven't actually had any real problems with Node community wise but I heard gripes that their social skills are you know this is the guy wait okay the guy on a bear with a machine gun and if you notice this is actually a second machine gun he is there to represent not necessarily the user-friendliest attitude in the world you might not want to file support tickets with this guy although if you look very closely he has a guitar so you know maybe he has a sweet side that we don't know about it it's very fast changing is another node if you write something in Node three weeks later you might have to change some you know API like util becomes utilist little things like that then there's this which when I made the presentation I thought was something serious but I'm further reflection is not and I'll tell you why at the very end of this presentation assuming I get to it there is a solution for this this is a guy saying he's on the Node.js list and he's like I love this asynchronous model but I just can't code like this and I'll read it to I love the event loop and I understand the execution model and I don't want to change it I don't feel like JavaScript is desperately missing macros but I need someone to talk me down because I'm coming to the conclusion that certain parts certain sorts of programs are unrightable without language extensions so again I thought this was a serious thing when I first encountered it but if you think about what he just said he's like guys I'm not a heretic but I really need someone to talk me through this because I've come to the conclusion that this tool is only suited to particular types of problems okay so there's some drama queen nonsense so I apologize for even showing you the slide but he does raise one thing here which is kind of interesting which is in a typical synchronous JavaScript thing you would have something like this dot that dot the other thing and you can this whole thing here is just chaining right it was a very common technique what he's doing here this is what you sometimes have to do with uh node hold on basically everything in order to support the asynchronousness and the uh the event model and so on and so forth it's all done with callbacks so when you do that the callback pattern is typically first error and then whatever data right so the lasers they just weren't working um if error throw error if error throw error he's saying in order to do chaining which is so easy in synchronous JavaScript in asynchronous JavaScript you got to throw in these if error throw error things with every callback and he said that was driving him nuts there's a solution a little bit later in here but people have asked themselves there's such a ridiculous error handling model were the people who created Node.js coding drunk this has been controversial to some people I don't really care what I really like about Node.js is being able to use JavaScript on the command line in a fast way that does not involve Java this is one of the first things I did with it is a blog comment similarity detector free code for discus which discus heartbreak when we scorned here it is this is what it's for these are a whole bunch of track backs from blog comments on this guy's blog so he posted this blog post what it says is a lp challenge fight semantically related terms over a large vocabulary one million plus words and then the link and you can't see from this distance but these are all a bunch of different bit me links and you know t.co links pointing to the same place and a few of these retweets the word find and find semantically blah blah blah is capitalized it has a capital F and in others it has a lower case F so on this blog post these are all taken from the blog post about finding the semantically related terms and what actually happened on this thing discus reported every link back to the blog post as being a discussion of it on twitter so the discussion consisted entirely of retweets with only one exception which was I posted a link to this blog post and I said at discus please filter highly similar tweets and if you went to this blog post it would be listed as part of the discussion on the blog post so that is a really easy way to fill any discus using blog with spam right all you do is you say free Viagra link that you want them to go to for the Viagra and then link to the blog post and suddenly you have spam spam spam spam completely filled you could literally pwn every single discus using blog in this manner in you know a matter of hours it's trivial so I wrote this thing it said blog comments similarity detector and I wrote it in Node.js and I use something called underscore.js we don't have time to explain but I do have time to show you the page Giles bokeh discus blog comments similarity detector on github I kind of have to rush here okay so what this does is it finds highly similar tweets it just uses the JSON filters them etc oh wow okay can you read the red parts of this yeah yeah okay this i'm going to have to go through even quicker this was some legacy code what I did at the top it calls a particular method with all these you know repeated settings right so what I what I did is I shrank it down to this and I did that by first creating little spreadsheets of what are the invariant fields in every call right which was uh basically just an hack like bash script and then I wrote a little thing here which is a tiny templating engine it's impossible to see this so you're just going to have to believe me and then this here what it does okay core not registered group was the name of the function right um I've liked out a lot of the uh the details this is like client code I can show you those parts but this redefines the function as being a function that takes in command line arguments or function arguments and only spits out those arguments which are variant right so what it would do is it would have different concepts of which different objects basically uh that had their own built-in defaults right and then having to find this function this way it then evals requiring the file that has the original uh you know bigger block your legacy code so this was a legacy code compressor and what you can see well you can't see it okay but this was a little spreadsheet that I made where it's a checklist of all the changes you know generate the code check it for the commas being correct and I took 418 lines of yeah okay I removed 418 lines of code automatically right it took me some time to write the thing in JavaScript that did it and then it just ran through it and that's stuff that you can't do with client side JavaScript unless you have something that you can run it in and you could conceivably have done that in a browser but it would be painful oh um I also have a system called tally uh which I created in 2008 uh this is like the revision it uses no jas actually to find highly similar functions although it also also uses ruby which I hack at larv and it also uses simulant jas which I'll tell you about in a few moments uh and it also does extremely simple wrapper functions and oh this is more self promotion so I'll get through it really quick this is a spec uh the passes where it's in ruby and also JavaScript where it can take some JavaScript and write a wrapper function around it automatically um and it can use this other stuff now this is for my own nefarious capitalist purposes so I won't go too much on it the other reason I won't go too much on it is it is largely vaporware but it has some cool parts that do work uh and if you want to find out more about it there is overnightrefactor.gilesb.com which is nothing but a mailing list capture a thing now but may hopefully evolve into something more interesting. Anywho another thing this is very useful for is unit testing right um it is very nice to be able to take those parts of your JavaScript which do not depend on the browser and unit test them separately so you can just just check them out on the command line without having to care about loading them up in the browser um it makes sense to test stuff against the DOM when it interacts with the DOM but if you've got any kind of code that just deals with models uh you know controllers a lot of that stuff it's faster on the command line and a lot more fun uh this is jasmine which you would use for that um so here's an example of actually doing that this is key to uh how you use require with no JS this is its whole packaging system right here all you do is you add objects to an existing exports object uh and exports might as well be called namespaces because what it does is it provides like a fully object oriented namespace yeah you know with the caveat that when I say fully object oriented I mean fully object oriented in the JavaScript sense because the unusual paradigm of object orientation but this here creates a mathinator with a function called add which returns a plus b right and this is unfortunately strings are in red in this but this is a spec for the mathinator and you can see it has a before each where it says the number is equal to zero then it says expect number equals mathinator add number one to equal one so you add zero to one you expect that to equal one and this is like passes which you know is good and here's a bunch of other specs passing another thing that no JS is uh good for and a little closer to what it was intended for is mini apps uh first thing I built with it is a minimal github dashboard again if you want to see code for this it's on github and you can find more information about it on my blog here's what it looks like on the iPad basically it takes all your repos that are not forks of another person's repo and shows so up here minimal github.com I'm sorry minimal github.gilesb.com github username in my case Josh okay obviously there are plenty of other github news usernames but up there the way it does this this is the whole thing it's uh 22 lines of code so and actually one of those lines is unnecessary this line here sorry I just noticed that uh sys equals require sys that pulls something from the common library for no JS that I'm not actually using I was using it for debug so again you start by requiring the HTTP namespace and you do a create server right and then there's rest you use that to require wrestler which is a rest library and then jade is a templating library and this whole thing is uh you know that's very brief now going back to this whole evented thing what you do first is you set it up to uh do this gets right it does get the github API gets all the repos in JSON format for the github username then it adds a listener for when it's complete and it renders the file using jade and adds another error uh I'm sorry another listener for the error event which I did not bother to write in the handling form I just didn't care this is another mini app it's called minimal bit.ly so again you can find more information about it on my blog along with the code on github this is what the bit.ly homepage looked like at the time now what I typically use bit.ly for is compressing stuff so I can put it in twitter on the twitter web interface so in order to do that you have to deal with all this distracting bullshit right and then there's this other bullshit over here and if you look next to it you'll notice some more bullshit uh that's more bullshit and then a bullshit fish and just to point out how bullshit this bullshit fish is they didn't even finish drawing it to who it was bullshit it's like it's not gonna look like a fish it doesn't need to be there we'll just you know it's almost drawing it's getting out that after you get through all that shit this here is actually useful so you put in your link and you click shorten and you think aha I'm done all I have to do now is when the link comes back I hate that link where it says you're a link and I don't think like you know I copy paste no big deal wrong once you get your link if you try and put your cursor in there you get some more agents bullshit so I was like I just can't handle this this is minimal bit.ly okay you put in your link there you click go you're done okay uh you might be familiar with this typical out product this is a very popular uh you know uh web kind illustrating the need for simplicity okay this is a book which you know don't make me think I don't know if they read that but they should have uh in my obviously you know somewhat aggressive opinion and this is what the bit.ly home page looked like about a week and a half after I released the minimal bit.ly which is pretty cool actually I have to say because when I tweeted to discuss hey I wrote some free code for you that prevents you from making every single one of your users vulnerable to incredible amounts of spam they didn't do anything they're just like uh we should not acknowledge this peon there so I really think that uh bit.ly deserves a little bit of applause for restoring simplicity so please please any who you can find the code right here dial up okay minimal bit.ly it's on github uh again I just uh hold on where's the laser there we go so uh you require HTTP you require sys even though you don't need to require your tails even though you don't need to those two steps you can actually skip require node static that's a little static server and then restler and jade which are again the rest in template libraries so this one's a little longer I can't go into like line by line detail and you can't see it anyway but again this took you know 20 minutes to write it was really really easy it kind of takes you back to like the old days of like pearl shell scripts and stuff like that through CGI like 1996 um which is not necessarily a great day to go back to but the simplicity of it is you know quite a lot of fun uh okay so one more thing jade the templating engine I've mentioned this a couple times it's basically hammer but for node js and it has you know where you would normally use like a ruby hash you use a jobs for cash stuff like that so long story short node js is pretty awesome this is a diagram of awesomeness you'll notice that uh chubaca is playing drums and so on and so forth so next I had to take you a little bit of an excursion I promise it'll be worth it or at least I promise it'll be less than half an hour in length uh this is an excursion into poetry so I saw this on a blog somewhere it was pretty much the only thing I liked on that blog but it said code is like poetry some is beautiful the rest of it isn't very good all right and here is uh William Shakespeare um widely known poet some of his poetry shall I compare you to a summer's day that are more lovely and more temperate la la la you get the idea here is biggie smalls there's another poet um here's one of his uh poems or a fragment thereof my forte causes Caucasians to say he sounds demented how long we'd sent it I have to tell you it sounds better when he says it you probably knew that but I'm just saying now these guys obviously very different um obviously people have all kinds of conversations about like what does it mean the change in language blah blah blah I don't care um what I do want to tell you about which I think is kind of interesting is that there's this whole range of scholarship around uh the English poetic tradition and there's this phenomenon of iambic pentameter which allows you to understand uh Shakespeare so the concept of an I am is almost exactly what it sounds like it's not a monopeia which means the word that represents itself through sound right uh an iambic rhythm follows like I am I am I am which is to say that that that that that that right it it alternates a weak beat with a strong beat so in this example shall I compare the two a summer's day and so on that changes a little bit here um this is my attempt to portray the emphasis alternation in uh this you know my forte causes Caucasian to say you know it doesn't really quite cut it in terms of portraying the uh emphasis alternation pattern uh there's also this very well established very formulaic and regular pattern of a sign which is the rhyme scheme is very regular you go a b a b so shall I compare the two summers day that one will love her love me and love me and all that that's about that one will love me and temper a rough wings to shape the dialing buds of humane and summer's leaf howl too short at date right so it's a b a b whereas here again you have you know tay ran ran to the case and say call and call and then demented weed scented so what I decided to do was set it in a mono space font because it actually makes it easier to see what's going on here right suddenly it's really clear to see they can have this this rhyme scheme here this rhyme scheme here and this rhyme scheme this like triplet scheme down here okay this will become relevant to code in a weirdest way now obviously the next thing to talk about is a cure okay now if you're wondering about that link is between hip hop and the cure you might be thinking oh he wants to talk about Kanye West doing a video based on the cure but no actually what I want to talk to you about is another like mid late 90s album from the east coast uh rap scene that's done by the artifacts which also included an acura reference and I'm real happy for Kanye and I've been let him finish but that's the best hip hop acura reference of all time of all time I just had to uh it also contains this lyric prime time teams rewind and can't find mine they all left behind because my mind's like god so the idea here is he's saying that his rhyme scheme is so unformulatic that people even the best in the field cannot keep up with it and it's easy to see what he's doing here if you use the mono space approach right so you've got okay if you have red green colored deficiency which is a very common form of mild color blindness you might not be able to see this but these here are white green and these are bright yellow and what's going on is the I'm I'm I'm are all in green whereas the I'm I'm I'm are all in yellow and then you got this down here where he mixes up a bit and it's neither I'm nor I'm it's eyed and then you got this up here which I put in purple again this is a color wheel so down here is bright green and up there is purple and the reason I put these two in opposite colors is because this is the opposite of a rhyme scheme normally what you do when you're rhyming things is you vary consonants and you hold vowels constant but what do you did here wait well I guess he did it there too what do you did here is he here see that's why I don't like the lasers all right what he did here is he held consonants constant and yeah consonants constant and varied vowels so it's not a rhyme scheme it's the opposite of rhyming it's an inverse it's an unusual inversion I have a friend who is like a English professor and you probably know some obscure term for that in poetics but that is not a little ration okay it might be constant but I don't think you have English professors in here point is it's kind of unusual but if you notice using green like that is overkill because it has this opposite relationship with time it doesn't actually have an opposite relationship with prime it doesn't really have any relationship with prime so there's a little bit of a flaw there and it's also this is python um what I'm showing you right now is not python right you can see that these things are different over here is python over here is a rap album different things right you really okay all right so we don't actually need to rely solely on indentation we can throw in some punctuation and so what I did here is the prime time section is yellow the time team section is blue and this section which is in both gets yellow plus blue which is green okay but we can take the color out and we can even take out the indentation and now we use punctuation to convey this unusual structure who in here knows what this looks like okay that's that's interesting so some of you are like huh he did have a point and the rest of you have no idea here is some sibling list code done in a hythotic manner which is to say that all the structural information is encoded with indentation alone this is not what the limit list actually looks like this well this is simply less from three this is what similar this actually looks like right but syntax coloring comes back in and there's all these parentheses now if we want the parentheses allow us to communicate structure in the same way that the parentheses and mustache brackets did just moments ago in that rack so we can collapse it like this now when people first encounter this the parentheses often freak them out but it's really easy to get past that lickety-sklit as long as you realize that their only purpose is to convey structure so there we go the structure approaches or you know ideally is a tree and specifically the abstract syntax tree so a little bit about what the abstract syntax tree is here is some ruby this is actually an old spec from the original version of tally doing repetition detection death food well it doesn't really matter what you see is some very very simple ruby right so in order if you run ruby parser or what was called at the time i think um parse tree you get this this is very list like if you just imagine these square brackets we're all parentheses this is what it would look like to code ruby in this you say i'm defining a function it's called foo it has a block scope it has no arms and it contains a string something unique so basically in order to process ruby and make sense of it you need to turn it into this list like structure that's the abstract syntax tree what you can do when hacking with list is basically work with the abstract syntax tree directly whereas most form of programming means you are using a text-based user interface to the abstract syntax tree called a program language this is tally because that code was from tally see i'm using the ipad right now and it doesn't have presenter notes so i have to kind of guess what my slides are in there for which is why i wasn't able to explain the camel earlier you know usually i rely on those notes quite heavily but yeah anyway it comes from the first version of tally which could do repetition detection and very mild similarity detection and when i say very mild i mean extremely mild it basically it was like on the verge of making a cpu catch fire anyway that was in ruby which i like to hack at larb this is the larb shout out okay so this is a little mnemonic device to help you realize that the larb url is rb.la right see how it works it's like that also there's a movie where you can also hear about these things about offensive events so this is an example of the fanaticism that this inspires someone earlier mentioned the y-combinator i think maybe brian this is the y-combinator in actual lambda calculus format which is identical to this format with the exception of the symbols being different like you can actually write a lambda on your arm if you're sufficiently motivated whereas typing one prior to the advent of unicode was quite difficult this is this is impossible looking surprised so yes the abstract syntax treaty is nifty it's awesome because i'm basically doing powerpoint karaoke with my own presentation similar dance here we have it it's really cool this is the website it's similar jazz info and one of the neat things about it is that on the left side it shows you sibling code and on the right side it shows you how that is compiled into javascript and if you change the code on the left it'll show up on the right and you can page through this thing and see a very complete uh syntax introduction to lisp as implemented in sibling and it's a pretty good list those of you know your lists if you like the scheme you type of list so the syntax this is the extremely brief version of the syntax so here's how you would do 1.2 sorry 1 plus 2 in like nearly every language there is here's how you do it in a lisp you do plus one two that looks a bit weird but if you do this one plus two plus three you again do plus one two three and basically the more numbers you add the more cumbersome the traditional syntax becomes and the more elegant the lisp syntax becomes and the reason for that is list is heavily optimized for lists in fact it stands for uh it's an acronym or whatever for list processing everything is either a list or an atom so for example here we have a list list here we have atoms okay so basically the the parentheses the whole thing is a list and everything in it is an atom now i like to think of that in a much more simplified version nouns and verbs okay here we have nouns here we have a verb and i know that there's more sophisticated terminology and more precise terminology that listeners use to differentiate between the different types of verbs and the different types of nouns but honestly this is pretty much everything you need to know to understand lisp it's either a noun or a verb and the verbs come first this is um okay so on the subject of not sticking to the old terminology this is a sort of revisionist approach to language name right uh PHP personal homepage is replaced with laser looking awesome scripting everything rules pearl is replaced with knife i like that knowledge non stop in fucking expressions right list is replaced with bicep mm-hmm uh python is pretty cool as it is okay and demon lord is just an idea if you need a name for new language that's that's an idea to think about uh this i think this is a toothpaste for dinner i'm not sure okay now if you are a classicist um or a purist and you want to find out from the source this is one of the best books on skiing ever it's been in print from like 1952 onwards which is impressive because i don't think they actually discovered lisp until 1959 but anyway i could just have my numbers messed up so civil and jazz is really great and let me just page ahead um okay i don't remember what the slide is for so civil and jazz is really great okay so this is actually the same code that i showed you in one of the very first slides to create a hello world server using no j s because this compiles to know j s um first you def bar http require http then you do a create server on that http but you chain the results of that with this listen down here which listens on port 8124 on this ip address and you can see you again set up an anonymous function which takes a request and responses arguments writes the head and content time text claim and writes hello world so it's pretty straightforward and it's right there so normally when you're doing keynote on a mac you get to see what slide is coming next anyway so here's something i created um i was uh this is called missing ruby conf that giles b.com uh and i created this because i wasn't at ruby conf and everybody was tweeting about ruby cops they're like ruby cap ruby cap ruby cap and i was like uh well let's make some easy little app and i wanted to learn uh civil and lisp right there's something more interesting than hello world so this just listens on like search dot twitter and filters for this particular word and here it is this is the whole app again it's on github um and you know please take a look check it out it's surprisingly easy to follow um again it's a little too you know i mean i can't get into it now right um because i think i got more slides i've got i've got 174 minus 145 slides to go um i'm sure some of you can figure that out actually to me uh basically it does the same thing as uh any of these note js things i showed you um but it does it in this very elegant way now i did a talk on note js and civil and lisp at la ruby a few months ago and someone uh actually a few people brought up the very valid question of why are you telling us this what does this have is there any good reason to use this aside from the fact that you enjoy lisp and i thought that was the silliest question i ever heard but out because no lisp use lisp um i was in fact yes yeah i was in fact thoroughly brainwashed by the same guy oh okay i gotta go faster um so here's something kind of cool which uh i just i got a few minutes left um this is lisp actually in the source code okay uh and this is i'm doing a script source equals javascript sibling info dot list right so this is a tag that says pulling this lisp five so you can do this client side too if you want and here's how we did it this is not actually me this is the sibling js site this is actually uh sibling compiled to javascript this is inject and map and all these various things compiled to javascript and that is trivial you can just take it from this site it's not a big deal um okay this is the book that brainwashed me the most in favor of this this is by paul graham same influential person who sent uh michael on his fascinating wild goose chase uh he does that for a lot of people this book dwells quite a bit on the awesomeness of macros and this is actually an answer for when this can be useful okay so you remember this guy who was like oh my god i can't deal with the fact that a programming language is only useful for particular types of problem spaces right that guy he raises this problem if air throw air if air throw air if air throw air right this is a prime candidate for macros so macros are basically i am going to need a particular pattern of code written so i write a macro which processes my code excuse me for that explosion noise processes my code to create other code so i can write a shorter version of the code even though i know that the end result will be longer code so an example of a macro is the chain macro this is what we use to chain the listen onto hctp create server and if you go on github you can read it and it's it's like 10 lines or maybe that's eight i don't know this is shorter right so two nights ago i think something like that i decided to see if i could create an air chain macro and i spent 30 minutes on it and it worked so first thing i did just to make sure that the chain thing was working and i was using it correctly is i did chain this chain that this is the stuff from his example right look how awesome it is to be able to chain stuff right so that's in my list file i run a sibling experiment on the command line the part that i had as a comment is printed out as a javascript comment and the part that i said chain it chains so this is an air chain macro and basically and it's gonna be it's you do a depth macro up here saying that you're making a macro basically this part here is the money shot function air data if air throw air right this is basically saying and unfortunately it's a bit redundant because i put it down here too this is basically saying every time you process one of these calls interpolate this little if air throw air thing right and here i am running it a sibling experiment at least it does all the comments and then the indentation is terrible the variable name is not very good but what you have here is main menu main window menu file function air data if air throw air data open menu function air data if air throw air and you can see by looking up at the top this is what he was complaining about not being able to do so i did that in 30 minutes it was the first macro i'd ever written in my life people tend to make a big deal out of list being incredibly obscure and magical it's not it's responsible levels of programmer power if you plan on doing your job like a responsible person you know who does their job then you should be working with power tools anyway this guy does not actually agree with that check this out i don't feel like javascript is desperately missing macro okay the consensus seems to be that threads are evil i agree source transformation is evil i agree and blah blah blah so what i just did in his book is evil right am i evil apparently i am yeah i don't think anyone here is surprised by that but i've had it to be a shocking revelation uh my illusions were dashed um so there's this notion of evil and magical and oh yeah here's an evil magical flying camel right it's incredibly terrifying it's a monster of magical proportions from beyond the the zone of doom as long as you ignore this crane but if you just look at the crane it's not magic it's just real simple people tend to only act to macros it says oh fuck the acid is kicking in jesus christ the walls are melting this is how people tend to react when they show that macros they're like saying hey your language would be cool with macros they're like the macros no this is pretty straightforward actually yeah all you want all that involves is having the ability to work with the tree directly when you might want to so i am giles bokeh um giles go boy on twitter finanguly venture thing which is still very much experiments now this overnight refactored at gilesb.com um thank you