 So my name is Evan Light and I'm going to give you a iOS eye for you. Well Ruby web guys sort of Rails guys Which is what I called it Basically, I want to show some of you guys or show you why iOS is not as intimidating the developed for as you might imagine and even though it's kind of Evil to the goodness that is Ruby because it's a walled garden whereas Ruby almost everything's MIT licensed It's still actually a kind of fun place to play Just to give you a little bit of background before before I really get into it I started out as a C program. We had way too much Java found Ruby got very happy and started doing Ruby for a living and Realized I needed a slightly different hobby then the iPad came out and I got really excited I didn't care about the iPhone so much, but I always just seemed kind of hard for a while And then I had a few people point me in the right direction Found a whole bunch of good resources and was able to make sense of it And I'm here to try to share some of that with you and show you guys why it's not to just Gary But it is actually a fun place to be so for starters Let's talk about the language a little bit that you use developed for I with iOS. This is objective C which is a Small talk or is C with small talk extensions essentially so to some extent that that gives it a little bit of A Ruby flavor this might look a little bit funny. Yes, you've got if the top you have a Functionate declaration a method declaration Which you have to do and see it's something you don't have to deal with in Ruby and at the bottom We have an invocation of that method So just talking about the method declaration in the top first You might notice that it looks a little bit funny that I have these these names on the left with a colon And then I have a type declaration in the variable name The names on the left all of those put together essentially give you the method name So one of the most beautiful things about objective C that you can do that you actually have to fake in Ruby is That you can write really literate code. You can write code that reads like English So when I invoke this method, which is what I'm doing in the bottom I'm sending it to myself You still have self in objective C like you have in Ruby and it's you perform asynchronous get to URL with headers on success do something on fail do something and Just to go into a little bit more detail because you're gonna see some of this off and on throughout the presentation The you have to have an at sign in front of your quotes or else bad things happen like your app crashes This is how you tell objective C. I'm declaring a sting a string statically in my code So that's one of the weird things you just have to get used to just like when you first flash back to when you started learning Ruby You had to to learn that at signs that member variables double at signs make class variables and you might not think it now But back then I probably look pretty weird to you. I know it turned me off at first So I'm just gonna introduce you to a few of the language peccadillos. You just need to accept and then get past So that's one of them. You got the at with the quotes On success on fail. Those are actually passing function pointers they call them selectors in Objective C where it's very much like in JavaScript. We're handing a callback off Functions aren't exactly first-class objects. The selector says give me a handle to this so that way I can pass something else So anyway, that's objective C I think it's a pretty beautiful language at least that's in a very nutshell and You can rate some really nice code in it. So moving right along though I'm sure most of you are familiar with the the rails golden path This is just a screenshot of the canonical blog application where you create blog post You can read up blog post. You can update blog posts and delete them. So here's the iPhone golden path an iPhone golden the iPhone golden path or really iOS golden path is a table-based application and when I say table-based This here is really a single table At the top here and here are just section section header names And then each one of these is just a cell and a cell Can you can compose a template for a cell much like you have templates in Rails or any other framework using for the most part for web development and you've got name and you've got text and Okay, so we've got a little icon here some information the iPad golden path Again, the table is present as well, but they have this thing called the split view controller Which you'll see a lot of if you own an iPad you buy iPad apps where you have a table on the left side You can scroll it up and down and whatnot and then clicking somewhere in the table might modify the table or it might modify this Detail view over here on the right and that detail view can be and pretty much whatever you want in that case it's another table with also a section headers just formatted a little bit differently and That's pretty much the golden path in addition to that you have some database backing, which I'll talk more about Now I'm gonna talk a little bit about generators. That's a Tony Starks arc reactor from Iron Man if anyone remembers Is a newbie to iOS I had to lean pretty heavily initially on the generator code and I Think it's a fairly reasonable thing to do a lot of people in real is poo poo scaffolding But for the for new people it's important and I was a new iOS developer a little over a month ago So I really really needed to scaffolding And sure scaffolding or training wheels, but they're awfully helpful training wheels So yeah, don't don't knock him and you're when you're new at first those those training wheels are a big deal Once you get more experience, okay, maybe you don't need them, but you know work with them starting out so Rails and iOS As platforms go are both MVC In just in different ways Rails is very model-based now the reason you see a big censored logo up there is because when I said rails is obsessed with models I was gonna have imagine if you will a picture of a very hot scantily clad woman on one side And for the ladies in the audience a fairly equally hot but scantily clad me on the other side I was I did check this with Mike and he didn't think it was such a great idea So you're gonna see this off and on throughout the presentation whenever we talk about models, okay, so Moving right along Apple on the other hand is somewhat obsessed with the controller instead of with the models They really seem to want you to do almost everything for your application in the controller So to someone who's done a bit of rails like me. I find that very annoying. I was taught skinny controller fat model Don't imagine that picture too late, okay But in any event That's just something you have to fight with a little bit the scaffold and let's talk about that So with rails three generated code you go run Generated scaffold for blog you get about a hundred lines of code total and almost none of that's in the model granted But you don't need that much and the scaffolding in the controller Well, you guys already know most of this now for iPad if I want to have a database backed application I get about 500 lines of objective C code Okay, so that's a lot of code and then in addition to that I get to what are called the XIB files We'll talk about that in a little bit. Those are XML interface builder files And we you don't want to know how big they are. They're huge You're never going to edit those if you do actually use them I'm gonna tell you you probably shouldn't and we'll talk more about that later, too So let's talk about iOS some more like rails iOS is event-driven just in a different fashion with rails you could say that rails is event-driven for when a When a user or some kind of service comes along and says I want access to a particular resource With iOS you have a lot of you have user events But then you have all kinds of system level events to deal with also So the first and most important one at least to me is load view that says when the app is loading up When I'm about to display a view do whatever is in here now the default scout the default generated code to scaffolding If you will does not use that talk a little bit more about that in a bit, but then these are just other Events if you will that occur or can occur There are a lot of different hooks in iOS and I'll tell you where to look to find those later So that way you can get yourself started These are just a few some that I use in in one of the controllers for the application I put in the app store lately, but I just wanted to give you guys a little bit something to look at so I Can say I can register to know when the view is a didn't the view just appeared I can talk about when the view will I can ask to know when the view is about to appear. That's another one I can have I can tell iOS look. I'm interested in knowing when the screen is going to rotate That's kind of important And then of course I can go down more at the system level and say I want to know when there's a memory problem I want to know when the app it when the view is unloading. I want to know when the controller is Being de-allocated so that way the controller can clean up after itself, too And again forward referencing we'll talk about it So back to models again now that we talked about controllers just a little bit SQLite is baked right into iOS, which is kind of handy. You can write SQL if you really really want to I would advise against it instead use this might look kind of ugly use something called core data That's really not quite as bad as it looks this is as you might imagine a data model and it's really pretty easy to generate this inside of iOS and When you do that it basically is going to set up your database for you it's going to generate some code for you and Then it's going to do a whole bunch of really handy things for you at runtime So that way you can have code that while this is lengthy about to walk you through it will essentially Perform somewhat like active record in C. Now it is an old see-hand to me. This was the coolest things in slice bread I got so excited when I first realized I could do this you don't have to write a liquid SQL This is essentially an ORM in C So just walk through kind of briefly you're setting up a this is setting up a request to get Okay, a little background on this I wrote an application which provides a pivotal track a pivotal tracker front end For the iPad so I have all kinds of data in in my database among other things. I have stories in the ice box So I want a query for stories in the ice box in ascending order and all this is just to do that So yeah, it's a bit of code, but you set up request and Then that you tell the request. Well, this is the kind of entity. I'm going to request on This little thing here is odd this managed object context It's sort of a combination of your database connection and also a factory for creating objects that are going to get stored in your database And that that's one of those things that gets set up for you when you generate your scaffolding So you don't have to worry about it too much You just have to remember that you're going to need it in various places So you're going to want to give yourself access to it I won't claim to be an expert on core data and yet I was able to get an awful awful lot done with it So moving right along so we've said we've got the request We said what we want to query for and this is the sort order that we want to query it for it So we have a sort descriptor we say I want to query by a sort order field Which I have in the database in ascending order and then you have to stick it into an array and then put it on the request Then the predicate is a lot like your conditions and an active record finder this is what I want to query on and I put this particular sample in here because this is doing a joint and It's that easy. I'm saying I want to make sure I want to get stories where the where the project for the story has an ID and tracker of Whatever so that way I'm only getting icebox stories for my project enough for other projects then I actually execute the query I get This is where we get into the more C stuff where I'm passing a double pointer or I'm pat Yeah, I'm passing a double pointer so that way I can get an error back from the manage object context That's where we get a little bit a little bit hot and heavy on the C side if anyone not C side That comes next Where we get a little hot and heavy on the C side and and I can talk to you guys about that after the presentation for Anyone has a question because there are a few seasons but not too many in here and then we just clean up after ourselves. I Will talk about memory management later. It's not that bad So anyway, we're gonna talk about views to have this nice lovely view here So this is interface builder which is evil Don't you don't want to use it interface builder is it goes hand-in-hand with Xcode It is a tool is a essentially rapid application development tool for making a front-end and it sounds like such a great idea in principle It is a piece of garbage And if you use interface builder with Xcode as I'll show you later, you're gonna have so many windows on spring It's gonna be really hard to get anything done. That's problem number one problem number two You see this panel right here. These are all the properties for This little cell right here, and that's not for all the little widgets inside of it it's just for this cell template all these stupid little properties right there and you can manage all that from inside your code trying to manage that from a Development tool just feels unwieldy never mind I have an easier time finding this information in the documentation again I'll show you a little bit of the documentation then I can ever in this tool so I Strongly advise if you if you are interested in iOS Write the UI code by hand. Don't use interface builder. It seems like a good idea at first Very quickly just becomes an enormous pain in the butt. It's not worth it Now on the other hand here. This is a good place to do Control oops, I thought it was control alt Control option command 8 to invert and That's not working. Maybe I need to bust out of keynote for a second. Yeah Okay, so All of that code here Which by the way, I'll admit this is Evan's principle Evan's one of Evan's principles of writing software is right ugly first This is ugly. I Haven't refactored this yet, but It gets the job done Sorry was there a question? Oh Okay, and all of that code Just generates this UI right here. It's actually generating a template and shoving data into it if you will yes I could refactor it But we'll talk more about why I haven't done that yet in a bit But all that code generates this but this code is really if you can you can tell by looking at the structure It's one of the reasons they zoomed it way out You can see that there's repetition just by looking at the structure and if there's repetition that can be factored That could be factored in a smaller bits of code. It could definitely be made better But you can do some pretty nifty things without using interface builders. You just don't so let's talk about some things in iOS and iOS development that scare people this is usually number one if Yeah, if you've been doing a lot of Ruby if you've done a lot of dynamic languages You don't have to deal with memory allocation. So people freak out when they think oh my god I have to free things on the heap and allocate things on the heap Not really you saw in the code sample I showed you early or so in the code samples. I showed you earlier and Let me actually go back. Here we go For the request I call Alec Alec just says go allocate the memory for and then I call in it and it is In it is like the other half these together are kind of like new in a Ruby So Alec allocates a memory in a knit says okay go set up the object go You know nil out things set things to zero what not or you can write your own custom initializer Which is really very very easy to do So I've allocated some memory. So if I've allocated some memory, what do you think I have to do later? Gotta clean up So got my request here. I release it here. That's not actually even freeing up the memory You've got these things called reference counts on objects. I'm just so when I release I'm decrementing a reference count when that reference count gets to zero then iOS is oh, I can free this now So to those of you have done Java that might sound a little bit familiar. It's not garbage collected not in iOS But it's a similar principle so That's you don't really need to be that afraid of memory allocation also You just you just need to be aware of when you're responsible for Releasing when you're not if the if iOS gives you an object back It's not your problem. iOS takes care of it. If you alloc something then you own it That's it. That's really not very scary I don't think and you guys probably don't want to hear the camera like that again So let me skip ahead or skip back ahead go back to the future. No, no, no, there we go Okay, so that's memory management static typing. Oh question Memory leaks Okay, glad you asked This is actually one of the places where Xcode is not evil X codes kind of tricky to use admittedly But it does have some analysis tools built in So when you you can say build and analyze and then when you do it has these nice little blue highlights Every place it thinks you might be leaking memory now. It's not a canonical list I found that it can miss some pretty obvious things I mean, I could have an alloc in them in a method and at the end of the method I'm not releasing and it just doesn't see it. There are other places where it finds some kind of clever ones So it's worth using even if it even if it doesn't give you all of the answers But it's definitely worth using The other one of the other nice things at least just in terms of iOS is if you really screw up memory You're just gonna screw up your own app. You're not gonna screw up the device Your app will eventually run out of memory and just crash and restart and then well you you're starting from a clean slate again So that's pretty much the worst case So it's not something necessarily to freak out about unless you're gonna have a really leaky app and you're selling it And people are gonna yell at you for your app crashing, but you know, that's about as bad as it gets So static typing this is you know one of the classic reasons I suppose Ruby is really hate Java one of many reasons I could Do a whole presentation on that so I'll just stop there but Static typing in in Objective-C is somewhat optional There's a type called ID. You could pass almost everything around as an ID and it's essentially An object and you can call whatever you want on it So it's a scent it's duct typed and you won't get compile time warnings on it at the same time Static typing the reason to exist in the first place is to help catch you making stupid mistakes So as a newbie in Objective-C it can be handy. It's been a little helpful for me Occasionally when I get warnings, I look at the warning. Is this really something I care about? No, usually it's not usually I've just I created a subclass and I was lazy and I passed it as a reference to the parent class and it says You're trying to call a method on something you can't see. I know it's there shut up. Leave me alone and Then as I mentioned earlier interface builder plus Xcode equals lots and lots and lots and lots and lots of windows Xcode for which comes out kind of soon. I'm not trying to advertise for Apple here But the Xcode for which is in preview right now is just one window with interface builder built in if you really Feel like you have to use it So that way you don't end up murdered by windows because you can just have Xcode loves to open up more and more windows resource code than interface builder adds even more and you just have a hard time figuring out Where it is you should be at any given time Another stupid little problem is if you're acting you have a master window for the for Xcode Which is right here on the right if you close that window Xcode closes entirely so if you have a bunch of source windows open and You accidentally close the master window and Xcode well Xcode just closes and that sucks Because when you get a bunch of windows just funny at least I just want to annihilate them to get back to one Sometimes I close Xcode doing it Testing I think that's like kind of speaks for itself one of the hardest parts being a Diet in the wool TDD adherent is that testing an iOS unit testing even and integration testing especially in iOS suck There I it is getting a little bit better I found that there's a framework out there called gh unit. I have a slide which actually cites it a little bit later I think oh That really is kind of dark isn't it? Sorry, but I guess inverting it's probably not gonna help very much. No, not really. It's like an a dad Like an x-ray of Okay, so we'll find that's another scene from the Holy Grail where that there's that the guy picking up the dead people bring out You're dead and then yes, I'm not dead. Yeah, I'm getting I'm getting better, but in any event in any event Testing is getting better and I an iOS iOS 4 actually has something a little bit like cucumber But you need to write your own adapter between the cucumber like language and your app And that itself is a kind of hairy amount of objective see I'm hoping that this will improve But right now it's pretty awful the unit testing unit testing is getting a little bit better But the complete a lot of the complexity in objective C is in the view and so you really want integration tests And they're just not quite baked yet. So testing an iOS really means you write your code You build your app you launch the simulator you go push buttons in the simulator and you're trying to attenuate the Lighting it you you launch the simulator you punch buttons in the simulator and things work or they don't and then rinse it repeat Kind of sucks so but there's some other things you can do about that So everyone needs a little bit of help getting started as as I said this talk is really a bit about a little bit about Introducing you to iOS, but also about giving you some of the tips I learned along the way so first Get if you're interested get my clerks About becoming productive in Xcode videos even though they will become obsolete kind of soon when Xcode Xcode 4 comes out hugely useful saved me a lot of effort once I actually knew how to use the editor because Xcode is where the IDE Xcode is a very complicated IDE and Just getting some of the most basic features down like being able to navigate files without having to point and click inside of windows is huge Then the documentation as I said is really pretty good You want to get to know UI view UI view is your friend He is the most important part in the user interface if unless you're writing some really hairy little stuff or writing games or something like that If you're writing any kind of a typical data form driven application You want to get to know UI view the documentation is pretty darn verbose. You can see by the scroll bar over here You read through that you're going to be in pretty good shape Then there's Stack Overflow I found after doing a lot of googling whenever I encountered some weird problems that almost every problem weird problem I encountered someone else I already encountered before And usually that answer was on Stack Overflow. It's not even really worth going to Google unless you went to Google site colon stackoverflow.com Put in your question. You'll find an answer Again saved me lots of time Now here are some libraries that you're probably going to want to consider using if you're going to write for iOS Touch XML and touch JSON are probably exactly what you're expecting to be They're libraries for parsing and generating XML and JSON on iOS So if you want to talk to any web services That's going to be half of the equation. The other half is going to be as I htdp request Which is a very nice library for sending it out Http request And it does async and sync for this async is actually I sort of showed you an example the very beginning you provide callbacks. It's beautiful It's probably easier to use in that http when you get right down to it And then sorry, that's actually one reference to ruby in the whole presentation other than my uh my last slide And the facebook 320 is a whole bunch of widgets that facebook has open source that they used in their iphone app And I have not used them, but I perused them and they're pretty kick ass So if you are serious about writing an iphone app You should probably if you find that the standard widgets In the ios library aren't quite enough for you in the uikid library. I mean sorry uikid is What they call the whole platform really for developing for ios If the uikid widgets aren't good enough for you check out facebook 320 save yourself some effort You don't have to reinvent the wheel necessarily And just a little bit of advice for some big gotchas Or little gotchas or little things I think might help Always remember to leave your your strings with an at If you don't your your apple crash in the simulator You'll look at the console and you'll have no idea what happened And you'll sit there and you'll kick yourself 10 minutes 20 minutes later when you realize I forgot an app in the string because it won't tell you it the apple just died Do read about uiview. I already said earlier. I'll say it again. Do read about uiview. It'll save you a lot of trouble Do not use interface builder last one. I hadn't mentioned yet ns log Which is not any different really than doing an active record base logger. Whatever or console.debug and javascript It is really your friend compile times in ios are really pretty short Playing around in the simulator is nice But being able to see the states of your models by just dumping them out to the console is beautiful So that that way you don't actually have to fudge around with the debugger in ios You don't really want to use xcodes debugger for for ios. It's kind of awful Use ns log. It's easy. That's where you're going to run into the problem with strings again Because if ns log you're going to be passing in strings Remember the at sign And okay, so finally me i'm evan light My company i'm a freelancer. I don't know if you guys can even read that. Can you read that? Okay, um, I have my am i twitter github xbox live gamer tag because well i'm a computer gamer too I'm contracting to a company in san francisco called cotweet. They are looking for hires So I figured I'd help them out and just mention here if anyone's looking for ruby work They prefer people in san francisco, but they're open to telecommuters too. So if you're interested come see me Any questions Okay, I'll just start Nick I forgot to mention it. Thank you Okay, so um, it's nick, right? Yeah, okay. What nick was asking about was um The night before last apple right right before me to give my presentation telling you all about objective c and ios Apple says Well, now we're going to change our minds and say you don't just have to use objective c You really can use whatever you want on ios The condition being that you can you're not allowed to download code at runtime Which clearly that i'm guessing that that particular stipulation doesn't apply to javascript but Other than that And y'all javascript and html because web apps do a lot of that But other than that that would mean that if you can get ruby running for example in ios Reliably Then as long as all the ruby code for your app is in your app and that ruby code can interact With ios via ui kit or some other mechanism Then You could write almost all of your app in ruby just along as you use just enough objective c to bootstrap ruby interpreter So someone go and do that It might be incredibly slow at first, but it'd be nice to have the option Or more than likely someone will come along and put java on there too, and then oracle will sue them So there's that the other one The other related announcement was that they also put out the app store review guidelines And i haven't looked at those yet because i only have one app up there and they already approved it Other questions There was a hint here, no The same question You're creating a bear c string And it's trying to assign it to what's going to be i believe in a string pointer and it says That you're you're trying to take a character in a ray and put it in a string and it says i don't know what that is You know that that that that's not going to be compatible um Under the hood and some of this is supposition, but for my background and c a lot of Well first off i didn't say objectives for those of you who know c Objective c is a super set of c. So ordinary c is perfectly valid in objective c um objective c is Came out of next which was a rounded which started in the late 80s So it's got a long and storied history the api Uh ui kit is based on coco, which is based on next step again long and storied history. It's fairly mature It's been around for more than 20 years um having been a java developer For entirely too long before Getting into ruby i can tell you coco is once you get past a little bit of the weird names Everything starts with n s for next step once you get past some of the weird things like that It's infinitely better than the j2 sdk. It's so much easier to use um And about the at sign and other things like it I'm pretty sure most of those are really preprocessor instructions That there's a lot of macro there that a lot of objective c is really using macros um I I guess I I kind of glossed over it, but you probably saw so i'm going to jump back very briefly to my second slide Second slide there we go The square square brackets here You don't use the dot notation in objective c to descend a message You use the square bracket notation that says this is the receiver of the message and this is the message that's being sent And yes, it can get a little squirrely because you start nesting your square brackets get over it You guys are using ruby you probably like lisp lisp is insane with parentheses again get over it It's really not that bad It's one of those language syntax things again like the at sign and ruby And the double at sign and whatnot that you will learn to see past after you do it just a little bit of it Yes Entirely That makes a lot of sense from what I see because I won't claim to be an expert, but that makes a lot of sense Everyone hear that the original objective c was basically implemented entirely in the c preprocessor And well, what I'm wondering is is that would you use this incarnation of it How much of this stuff is kind of built into their compiler and how much of it just into I think a fair amount to the compiler because the editor is able to warn you about a lot of stupid things that that you do as you do them um, I unless I'm very um An unattentive which is possible because like most programmers. I must have some degree of add Um, I don't believe xcode warns me about the forgetting my at sign in front of a string because well also because It's perfectly legal in c to do that and again super set of c But it should be smart enough to realize you're probably using it in a string You probably mean to have an at sign near dummy, but it doesn't tell me that I guess what I'm wondering is there is there a separate preprocessor? Um, I can't I can't say that um, I can't say that I can't say oh, there are there are headers. Yes Um, so there is that much there's at least that much preprocessing going on There's got to be there's at least as much preprocessing going on as there is in c Again because it is a super set again because oh I can I can say with certainty Because I use some very basic c macros in my code just for constants Because you don't really have the notion of a constant in c I think unless they change that in the language spec in the late 80s because I've been away for a bit Well, not that long Paul you had a question I It's mac That's that's one the other way another way that apple makes their money luigi Yes, yes I contemplated Before whether it would be possible to do it and then I wrote it and then I Rethought it later. Obviously. I did a lot of learning as I went um, some portion of it certainly The you know, I'll I'll go back to that slide There we go, so The The labels for example are very predictable So those could have been in an interface builder xml interface builder file and then I could have populated the data Well, and actually each of each of these widgets except for the spark line Are just ui labels is what they're called. So I could have put in placeholder labels That I would then populate later The spark line though is entirely programmatically generated. That's a library I didn't mention it because that's just kind of a little thing. It's called ck spark line I tweaked it slightly. Yeah, I can be so proud of myself I tweaked it slightly to make a little red dot at the end Just to highlight the end of the spark line put a little more attention there But um, yeah, I could have done some of it in interface builder instead of writing the code But with Writing the code the reason to do that is because well a reason to do it It is because I'm a control freak. So I can I can admit my problems And so at least I know exactly how things are going to be positioned because and I guess it bears mentioning if you are Writing if you are writing your own view from scratch you have to position absolutely everything yourself So a lot of the code here you can barely make these little bits out here the yellow bits here are numbers Um, which are oh my god hard coded in there right now, which is evil But um a lot of that is positioning and then the reason I wanted to register to know when the view rotates Is because when there's a view rotation I have to reposition widgets based on the view orientation So fair question Yes, fernando github Actually, there's a there really is a fair amount of objective c stuff on github Um, I found ck sparkline was on github. I found it using google facebook 320 also on github There are a fair number of projects out there. I guess I didn't have it in a slide I'd only just played with it Last yesterday morning. It's called gh unit And it's not a bad framework for doing unit testing on objective c I need to play with it some more But it's not too hard to set up and it runs right in the simulator So it again not integration testing, but it's a start um And I guess that brings me to one other last point again if with what I mentioned The uh thin controllers fat models you have to you actually do it does take effort to push the code down on the model Apple really does try to to hurt you into putting more logic into the controller So when you're using core data, which was that active record like mechanism I told you about that code gets generated into the controller That's why the controllers are 500 lines of scaffolding You have to copy paste that code out and put it where you want it if you is in the model specifically If that's what you really want. Otherwise, you're going to end up with multi-thousand line controllers that are entirely unwielding I I put them in the models as much happier. I had a lot more files, but many smaller files um another question Nick again Oh, sorry I think objective c Is worth learning for a few reasons But there's a little bit of historical bias there for me. I think c is a beautiful language It was the first language I ever learned But of all the languages I know ruby is my favorite c is my next favorite still If I need to write something that's going to go really really really fast. I rate it and c It's a system level language objective c is a weird combination of of because of Coco because of ui kit It's a weird combination of an application level language or a system of a language with a good application library That that can read literally Um with a system level language, but if you know c Then you can learn almost any other language except maybe lisp And so I think objective c is great to learn for that. Also, I think objective c is great to learn because as I said Having named arguments really encourages you to write Literate beautiful code and it it might when you if you when you come back to ruby if you go back and forth a bit You might find yourself writing a lot of methods that accept hashes and doing the same thing But personally, I think that's a pretty awesome thing to do That's how I like to write code beyond that Objective c is native on ios So you want fast you're writing objective c if you're just if you're You're okay with loading up web pages running in a browser essentially not in the browser But in what they call I think a ui web view Then yeah, you know you could use phone gap for example. That's another there's phone gap There's roads if you want to write ruby that runs on android and ios. There are all kinds of other Essentially cross develop cross platform development Environments some of them generate objective c But I think I think you'd be it's good to dabble in a little. This is a hobby for me. I did this for fun Um, I still play with objective c and I'm still working on my application because people are telling me it doesn't have enough features Um, and I'm probably going to open source it. I hadn't decided on that firmly before It does not have a test suite at all yet. So that's one of the things that's been holding me back But um, I'm going to start writing some unit tests for it and I'll probably open source it And if anyone else wants to help make a really cool pivotal tracker client an ipad I'd be glad to take some contributions any other questions. I understand. I'm running low on time Okay, thank you