Slides and code posted

My talk at VanX last night was a success. Not many people showed (too close to Xmas), but the ones who did seemed to enjoy my presentation on Cocoa, Python, and Renaissance. Gerald was a great host, SchemaSoft provided a good (and convenient!) venue, Paul came to show support, and BlastRadius (my employer) sponsored the snacks. After we went to Mira in Yaletown for beers and tech talk, had the whole place to ourselves, and a musician playing Flamenco guitar, then I walked across the bridge to home. A great end to a great evening.

I’ve posted my slides at livingcode.org/slides/renaissance.html using Eric Meyer’s neat S5 tool to put the whole slideshow into one HTML file.

I’ve also built a new .dmg containing all the source code and built, runnable examples (seven of them now), although they’re not all fully functional yet. More example gsmarkup to view, improved setup scripts, and they all have icons now. The file is examples 2004-12-17 on SourceForge.

I’ve been working hard to put this all together, which hasn’t left much time for posting, but I will have a lot more to say real soon now.

Small Nerd Example Chapter 2

Aaron Hillegass’ book, “Cocoa Programmig for Mac OS X” is a great way to learn Cocoa, Objective-C and Interface Builder, and I highly recommend you buy it to understand OS X programming (of course, you’ll be buying the new, improved Second Edition, and I’m working off the first edition here, so things may not completely match up). In order to demonstrate how compact, yet readable, Renaissance + Python can be, I’m going to convert the example programs from this book. Aaron’s company is called Big Nerd Ranch, and I was trying to find something to show which postings were examples from the book, so readers can follow along, but without implying in any way that Aaron has approved of these conversions in any way, so I’m going to call them the Small Nerd Examples (The small nerd being me).

Note that while you are developing, it is inconvenient to have to build the project every time you touch a file, so you can use python setup.py py2app –alias to build it once, then you can edit your files normally and the changes will be reflected when you run your application. Just remember to re-run this when you add a new file, and to re-run it without the alias flag when you’re building any version to be distributed.

Like the previous example, Hello World, this one contains four files. The setup.py file will look radically similar to the Hello World version. The program itself is simple: A window with two buttons, one which seeds the random number generator with the current time, and another which generates and displays a random number between 1 and 100 in a text field.

MainMenu.gsmarkup

<?xml version="1.0"?>
<!DOCTYPE gsmarkup>
<gsmarkup>
    <objects>
        <menu type="main">
            <menu title="ch02" type="apple">
                <menuItem title="About ch02" action="orderFrontStandardAboutPanel:"/>
                <menuSeparator/>
                <menu title="Services" type="services"/>
                <menuSeparator/>
                <menuItem title="Hide ch02" action="hide:" key="h"/>
                <menuItem title="Hide Others" action="hideOtherApplications:"/>
                <menuItem title="Show All" action="unhideAllApplications:"/>
                <menuSeparator/>
                <menuItem title="Quit ch02" action="terminate:" key="q"/>
            </menu>
            <menu title="Window" type="windows">
                <menuItem title="Minimize Window"
                    action="performMiniaturize:" key="m"/>
                <menuSeparator/>
                <menuItem title="Bring All to Front"
                    action="arrangeInFront:"/>
            </menu>
            </menu>
                <menu title="Help" type="help">
                <menuItem title="ch02 Help" keys="?"/>
        </menu>
    </objects>
</gsmarkup>

MainWindow.gsmarkup

<?xml version="1.0"?>
<!DOCTYPE gsmarkup>
<gsmarkup>
    <objects>
        <window delegate="#NSOwner" resizable="no">
            <vbox>
                <button target="#NSOwner" action="seed"
                    title="Seed random number generator with time"/>
                <button target="#NSOwner" action="generate"
                    title="Generate random number"/>
                <textField editable="no" id="text" align="center"/>
            </vbox>
        </window>
    </objects>
    <connectors>
        <outlet source="#NSOwner" target="text" key="outputNum"/>
    </connectors>
</gsmarkup>

ch02.py

'''
Hillegass Example, Ch. 02
'''
from Foundation import *
from AppKit import *
from Renaissance import *
import random
class AppDelegate(NSObject):
    outputNum = None

    def windowWillClose_(self, notification):
        NSApp().terminate_(self)

    def quit_(self, notification):
        NSApp().terminate_(self)

    def close_(self, notification):
        NSApp().terminate_(self)

    def applicationDidFinishLaunching_(self, notification):
        NSBundle.loadGSMarkupNamed_owner_('MainWindow', self)

    def seed(self):
        random.seed()

    def generate(self):
        self.outputNum.setStringValue_(str(random.randint(1,100)))

def main():
    app = NSApplication.sharedApplication()
    delegate = AppDelegate.alloc().init()
    app.setDelegate_(delegate)
    NSBundle.loadGSMarkupNamed_owner_('MainMenu', delegate)
    NSApp().run()
if __name__ == '__main__': main()

setup.py

'''
Run with:
% python setup.py py2app
or
% python setup.py py2app --alias # while developing
'''
from distutils.core import setup
import py2app
setup(
    data_files = ['MainMenu.gsmarkup', 'MainWindow.gsmarkup'],
    app = ['ch02.py'],
)

OK, this time out we’ve got about 52 lines of XML markup and 44 lines of Python. Of course, the program doesn’t really do much more than Hello World, but we’re getting somewhere. If anyone has questions about the code, or want more explanatory text around the Renaissance markup, please let me know in the comments or by email.

« Previous Page « Previous Page Next entries »

google

google

asus