From kirby.urner at gmail.com Mon Apr 4 14:21:43 2016 From: kirby.urner at gmail.com (kirby urner) Date: Mon, 4 Apr 2016 11:21:43 -0700 Subject: [Edu-sig] from back to front end (SQL to HTML) Message-ID: Below is a script I recently published to another list, mostly of math teachers, designed to start with SQL table creation and end with something HTML, as this models record-keeping and visualization at the industrial scale. I'm using Python in the middle, but sure, the controller could be a different language performing the same task. I use collections.namedtuple, one of my favorites, and exercise the DB API to a minimum, leaving plenty of room for others to expand. Kirby === # -*- coding: utf-8 -*- """ Created on Sun Apr 3 14:09:02 2016 @author: Kirby Urner (c) MIT License >From SQL to HTML with geometry in the middle. Developed for a five day crash course in STEM-relevant mathematics which includes learning a computer language, in this case Python. The script store row data about a few polyhedra in a table, using SQL to create the table and insert the rows. Then two of the columns are selected to build an HTML page containing a volumes table. Expressions involving phi, the golden ratio, are evaluated to give floating point values for volumes in some cases. Other volumes are simply integers. The volumes are expressed in less familiar 'tetravolume' units as developed in Buckminster Fuller's writings, and in subsequent follow-on investigations by students of Fuller's approach, such as David Koski. Interesting discussion and further topics for investigation derive from using this somewhat alien system of mensuration, wherein a regular tetrahedron of edges L has the volume L * L * L or L to the 3rd power. """ import sqlite3 as sql # SQL library included in Python from collections import namedtuple # used for row data from math import sqrt as rt2 # rename sqrt to rt2 phi = (1 + rt2(5))/2 # could use the Greek letter # information about polyhedrons, could be a file data = """\ TETRA | 4 | 4 | 6 | 1 CUBE | 8 | 6 | 12 | 3 OCTA | 6 | 8 | 12 | 4 RD | 12 | 14 | 24 | 6 CUBOCTA | 12 | 14 | 24 | 20 ICOSA | 12 | 20 | 30 | rt2(2) * 5 * phi**2 PD | 20 | 12 | 30 | (phi**2 + 1) * 3 * rt2(2) RT | 30 | 32 | 60 | 15 * rt2(2)""" # create the SQL table in memory for this script conn = sql.connect(":memory:") curs = conn.cursor() # here's the table curs.execute( """create table shapes ( name text, V integer, F integer, E integer, vol float)""") Rec = namedtuple('Rec', 'name V F E vol') # e.g. Rec. shapes = [ ] for shape in data.split("\n"): rec = shape.split("|") table_row = Rec(rec[0].strip(), # name int(rec[1]), # V int(rec[2]), # F int(rec[3]), # E float(eval(rec[4]))) # volume print(table_row) # for adding rows to the table to_do = """insert into shapes (name, V, F, E, vol) VALUES ('{}', {}, {}, {}, {})""".format( table_row.name, # substitutes into insert command table_row.V, table_row.F, table_row.E, table_row.vol) curs.execute(to_do) conn.commit() # this is the skeleton of a web page, into which row data is inserted output = """\ Volumes Table {}
""" # get the row data back out from the table... curs.execute("""select name, vol from shapes order by vol""") table_data = "" # starts empty for name, vol in curs.fetchall(): table_data += """{}{}\n""".format(name, vol) conn.close() # save the html file, view in browser fh = open("shapes.html", "w") output = output.format(table_data) print(output) print(output, file = fh) fh.close() -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Fri Apr 8 02:33:28 2016 From: kirby.urner at gmail.com (kirby urner) Date: Thu, 7 Apr 2016 23:33:28 -0700 Subject: [Edu-sig] python from the very beginning: "we" versus "it" Message-ID: I think what older folks like me need to remember is that people coming from cell phones and tablets may have a very sketchy concept of a "file system". I go back to DOS and Windows, where the File Manager was a centerpiece. If you've drilled down through folders on a laptop, then maybe you've see it in your mind's eye, but I can't take it for granted that students learning Python have much sense of the file tree. They come to code school with a just-purchased laptop in some cases, wondering what to do next. Using Python as a calculator i.e. interactively, is different from seeing python as something that "eats modules" at the command line. There's like a "we" (me and the snake) when whispering in a REPL, whereas it's more an "it" (on its own, or her own) when made to eat a module in the wild. >From playing computer games, students are probably familiar with "first person view" (FPV) versus third person or "god's eye", like in many simulations such as SimCity and Civilization. Python in the REPL is more FPV (me and Python -- or 2nd person) whereas in 3rd person "run mode" there's no "me" to create objects or share the namespace with, as when we're together, say in Spyder (an IDE). When I run the script in an IDE, I can make use of names defined in the I-Python REPL. Conversely, the one line script print(a + b) will run without issues, if I've defined the names, e.g. a = 10; b = 11, in the REPL. In 3rd person mode, we'd get a NameError. [ So how is all this different from the Clojure Reader we read about, I wonder. Is that different from a REPL in a namespace shared with running code files? ] In the REPL we're more "snake whisperers" whereas when you feed Python a module, that's more being a "wrangler" perhaps. You might run many pythons at once ("herding Pythons"). I know, I know, it's not named for the snake originally, but it's hard to fight that, so I go to the other extreme and get maximum mileage out of it e.g. using "__ribs__" as a moniker for special names -- snakes have lots of ribs plus we're talking about "reflex arcs" -- triggered methods, like __getitem__ -- akin to what a spinal chord does. A class with __ribs__ is built to react. Someone new to the whole picture is looking for handles, conceptual cues. How to best plant this tree of knowledge, right from the beginning? Maybe leverage existing knowledge of grammar, computer games, and reptile anatomy? Worth a try, depends on the audience. Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Tue Apr 12 18:29:54 2016 From: kirby.urner at gmail.com (kirby urner) Date: Tue, 12 Apr 2016 15:29:54 -0700 Subject: [Edu-sig] another look at sorting generic objects by attribute... Message-ID: # -*- coding: utf-8 -*- """ Created on Tue Apr 12 14:38:28 2016 @author: Kirby Urner, 4Dsolutions.net Tips and Tricks: Note use of **self.__dict__ in the __repr__, and print(*sorted(L)). Also, remember sep= and end= are overridable keyword args to print(). Related: data-only objects http://stackoverflow.com/questions/19988043/are-data-only-objects-ok-in-an-oop-design See also: Data Transfer Object, Passive Data Object, Bunch Class E.g.: http://pydanny.blogspot.com/2011/11/loving-bunch-class.html """ from collections import namedtuple # first, with an ordinary class (not quite a 'Bunch class', but could be) class Element: def __init__(self, dim0, dim1, dim2, dim3): self.axis0 = dim0 self.axis1 = dim1 self.axis2 = dim2 self.axis3 = dim3 def __repr__(self): return 'Element({axis0},{axis1},{axis2},{axis3})'.\ format(**self.__dict__) the_list = [Element('A', 'D', 0, 1), # goal: to sort on different axes Element('X', 'R', 2, 3), Element('R', 'B', 9, 8)] # sort on any attribute of Element print(sorted(the_list, key=lambda elem: elem.axis0)) # lambda extracts the key print(sorted(the_list, key=lambda elem: elem.axis1)) print(sorted(the_list, key=lambda elem: elem.axis2)) print(sorted(the_list, key=lambda elem: elem.axis3)) # one might use a named tuple to the same end Elem = namedtuple("Elem", "axis0 axis1 axis2, axis3") the_list = [Elem('A', 'D', 0, 1), Elem('X', 'R', 2, 3), Elem('R', 'B', 9, 8)] # almost identical syntax but line-wrapping added because namedtuple __repr__ # is more verbose... print("+++") print(*sorted(the_list, key=lambda elem: elem.axis0), sep="\n", end="\n--\n") print(*sorted(the_list, key=lambda elem: elem.axis1), sep="\n", end="\n--\n") print(*sorted(the_list, key=lambda elem: elem.axis2), sep="\n", end="\n--\n") print(*sorted(the_list, key=lambda elem: elem.axis3), sep="\n", end="\n--\n") expected_output = \ """ OUTPUT: [Element(A,D,0,1), Element(R,B,9,8), Element(X,R,2,3)] [Element(R,B,9,8), Element(A,D,0,1), Element(X,R,2,3)] [Element(A,D,0,1), Element(X,R,2,3), Element(R,B,9,8)] [Element(A,D,0,1), Element(X,R,2,3), Element(R,B,9,8)] +++ Elem(axis0='A', axis1='D', axis2=0, axis3=1) Elem(axis0='R', axis1='B', axis2=9, axis3=8) Elem(axis0='X', axis1='R', axis2=2, axis3=3) -- Elem(axis0='R', axis1='B', axis2=9, axis3=8) Elem(axis0='A', axis1='D', axis2=0, axis3=1) Elem(axis0='X', axis1='R', axis2=2, axis3=3) -- Elem(axis0='A', axis1='D', axis2=0, axis3=1) Elem(axis0='X', axis1='R', axis2=2, axis3=3) Elem(axis0='R', axis1='B', axis2=9, axis3=8) -- Elem(axis0='A', axis1='D', axis2=0, axis3=1) Elem(axis0='X', axis1='R', axis2=2, axis3=3) Elem(axis0='R', axis1='B', axis2=9, axis3=8) """ -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Fri Apr 15 13:40:02 2016 From: kirby.urner at gmail.com (kirby urner) Date: Fri, 15 Apr 2016 10:40:02 -0700 Subject: [Edu-sig] of Brython, JavaScript and closures Message-ID: Those of you tracking the Cuba working group will have seen that Brython is to be a topic [0]. That's "Python is the browser", which I'm eager to try (haven't yet). Brython is a segue to JavaScript, which I'm relearning from scratch ('The Good Parts' etc.). Over on mathfuture I'm continuing to discuss what I call the Lambda Calc track [1] where we introduce programming as a math-relevant way of thinking / activity / skill. A long-running theme here on edu-sig already. In comparing JavaScript and Python, I'm learning quite a bit. Example: JavaScript allows closures wherein a function in a function retains its memory of the variables (names) in the surrounding scope. The following example of a closure is from: Speaking JavaScript by Axel Rauschmayer Publisher: O'Reilly Media, Inc. Release Date: March 2014 ISBN: 9781449365035 in the intro section on Closures. function createIncrementor(start) {return function () { start++; return start; }} ... which gives the following behavior: > var inc = createIncrementor(5); > inc() 6 > inc() 7 > inc() 8 Lets try that same thing in Python. def createIncrementor(x): def increm(): x += 1 return x return increm At first it seems not to work (not just seems, it doesn't): >>> from closure import createIncrementor >>> inc = createIncrementor(5) >>> inc() Traceback (most recent call last): File "", line 1, in inc() File "/Users/kurner/Documents/classroom_labs/closure.py", line 4, in increm x += 1 UnboundLocalError: local variable 'x' referenced before assignment That's where the keyword nonlocal comes in. The increm function was originally looking in the global namespace for x whereas we need it to look "close to home" (at the originally surrounding scope): def createIncrementor(x): def increm(): nonlocal x x += 1 return x return increm >>> from closure import createIncrementor >>> inc = createIncrementor(5) >>> inc() 6 >>> inc() 7 >>> inc() 8 Voila, a closure. Closures turn out to be really important in JavaScript thanks to its weak modularization model i.e. namespaces are difficult to segregate minus such patterns. Closures get used to mitigate name collisions. Python is less dependent on that pattern, given it has other ways to confine names to local scopes. Kirby [0] http://tinyurl.com/hpgrebf (Brython sprint / Cuba) [1] http://tinyurl.com/jbpef72 (mathfuture posting) -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Fri Apr 15 15:21:56 2016 From: kirby.urner at gmail.com (kirby urner) Date: Fri, 15 Apr 2016 12:21:56 -0700 Subject: [Edu-sig] of Brython, JavaScript and closures In-Reply-To: References: Message-ID: On Fri, Apr 15, 2016 at 10:40 AM, kirby urner wrote: > > The increm function was originally looking in the global namespace for x... > That's not quite right either as this is simply wrong as a complete module: x = 0 def createIncrementor(x): def increm(): x = x + 1 return x return increm The "referenced before assignment" error will occur regardless of the presence of a global x. The choices to make increm work would be: x = 100 def createIncrementor(x): def increm(): global x x = x + 1 return x return increm (a module is a kind of closure / enclosure -- coming in ES6 right?) or: def createIncrementor(x): def increm(): nonlocal x x = x + 1 return x return increm for an even more enclosed closure. One may even remove x = from the module's global namespace and inject it retroactively: >>> from closure import createIncrementor >>> inc = createIncrementor(5) >>> inc() Traceback (most recent call last): File "", line 1, in inc() File "/Users/kurner/Documents/classroom_labs/closure.py", line 4, in increm x = x + 1 NameError: global name 'x' is not defined >>> x = 100 # this won't work either as '__main__' is not where it looks >>> inc() Traceback (most recent call last): File "", line 1, in inc() File "/Users/kurner/Documents/classroom_labs/closure.py", line 4, in increm x = x + 1 NameError: global name 'x' is not defined >>> closure.x = 100 # this would work if I added closure to the namespace Traceback (most recent call last): File "", line 1, in closure.x = 100 NameError: name 'closure' is not defined >>> import closure # which I do here >>> closure.x = 100 >>> inc() # and now the earlier imported function works with no problems 101 Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: From jurgis.pralgauskis at gmail.com Wed Apr 20 15:37:50 2016 From: jurgis.pralgauskis at gmail.com (Jurgis Pralgauskis) Date: Wed, 20 Apr 2016 22:37:50 +0300 Subject: [Edu-sig] anti-idiom checker? Message-ID: Hi, As I teach Py after C, guys like to index list items more than needed... Maybe you know some check'er which would automatically detect such and similar stuff (and propose the idioms :). https://en.wikibooks.org/wiki/Python_Programming/Idioms#Data_types Thanks :) ps.: I imagine I could make sth via AST analysis... -- Jurgis Pralgauskis tel: 8-616 77613; Don't worry, be happy and make things better ;) http://galvosukykla.lt -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Wed Apr 20 16:14:36 2016 From: kirby.urner at gmail.com (kirby urner) Date: Wed, 20 Apr 2016 13:14:36 -0700 Subject: [Edu-sig] anti-idiom checker? In-Reply-To: References: Message-ID: > > ps.: I imagine I could make sth via AST analysis... > -- > Or maybe some regex that looks for "for bar in range(len(foo)): ...foo[bar]" # (in the for's scope) 'cept I don't know regexes well enough to write that. :-D It could just say "slap with wet fish ("for block" starting line 10)" in a nagnanny.log file someplace, with the user option to care (a "Pythonic" toggle). Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Wed Apr 20 16:53:05 2016 From: kirby.urner at gmail.com (kirby urner) Date: Wed, 20 Apr 2016 13:53:05 -0700 Subject: [Edu-sig] more simmering debate... Message-ID: I want to suggest that the much-used metaphor (by me included): "class is a blueprint, with instances the buildings made from it" (houses usually) is a good start, but not nuanced enough to take us all the way to the end of our story. These days I've taken a two pronged approach: yes, OO is meant to model how we think normally, about things with properties and behaviors. "The language gets out of the way and lets you think in terms you're already familiar with, from work" and such PR, some truth in it... ... However (big pause), OO also is it's own knowledge domain with its own concepts and those are better faced directly and dealt with than dismissed as mere noise. The blueprint metaphor, in being so simple, is maybe too simple, and therefore dismissive, at least if left in place for too long. So yes, OO has its cost, the knowledge domain that is OO with all its twisted tails of multiple inheritance and the method resolution order. But learning that little overhead is more than worth the price of admission (the PR again). The whole idea of inheritance, and of static and class methods, undermines this simplistic beginning of "blueprint" and so could become corrosive vectors of entropy (leaking sense), if not contained within more fitting metaphors. I like to say the class is a "mother ship" and serves as a kind of "home base" or "platform". How about an "amusement park"? Each self brings its little __dict__ to the theme park, but all the "rides" (the "stuff happening") are anchored in the class's __dict__. The self parameter is like an empty seat in a ride, which the rider's self then fills. This so-called "blueprint" is where the methods are happening, which is so not what it's like in the case of houses. The many instances (the selves) are but little bags of state, little "var stashes" (uh oh, JavaScript creeping in... :-D). Anyway, ya catch my drift, right? If we over-stress the blueprint metaphor they'll not be as open minded about blueprints having their own "batteries included" and doing stuff on their own, no "selves" need apply in some cases (not all methods need a self). Literal blueprints don't light up and do stuff all on their own like that. Our classes often behave a lot more like objects with a life of their own. ... and that's true of course as they're each instances of the type "type", one more example of what that "bag o' tricks" we called 'a class' might look like. Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: From carl at nextdayvideo.com Wed Apr 20 17:42:48 2016 From: carl at nextdayvideo.com (Carl Karsten) Date: Wed, 20 Apr 2016 16:42:48 -0500 Subject: [Edu-sig] more simmering debate... In-Reply-To: References: Message-ID: > I like to say the class is a "mother ship" and serves as a kind of "home base" or "platform". How about an "amusement park"? ... I don't think any of that is any better. When explaining OOP, I have two points I try to drive home. 0. you can do anything in any language any way you please. OOP does not give you any new capabilities, it is just a way of keeping your code organized and readable. 1. I describe a parent class and some of the subclasses used in my video processing system parent: find a list of videos to work on, iterate over the list, self.work() on each one. work is defined in the subclasses: subclass 1 - encode subclass 2 - upload subclass 3 - email the URL to the presenter On Wed, Apr 20, 2016 at 3:53 PM, kirby urner wrote: > > I want to suggest that the much-used metaphor (by me included): > > "class is a blueprint, with instances the buildings made from it" > > (houses usually) is a good start, but not nuanced enough to take us all > the way to the end of our story. > > These days I've taken a two pronged approach: yes, OO is meant to model > how we think normally, about things with properties and behaviors. > > "The language gets out of the way and lets you think in terms you're > already familiar with, from work" and such PR, some truth in it... > > ... However (big pause), OO also is it's own knowledge domain with its own > concepts and those are better faced directly and dealt with than dismissed > as mere noise. > > The blueprint metaphor, in being so simple, is maybe too simple, and > therefore dismissive, at least if left in place for too long. > > So yes, OO has its cost, the knowledge domain that is OO with all its > twisted tails of multiple inheritance and the method resolution order. > > But learning that little overhead is more than worth the price of > admission (the PR again). > > The whole idea of inheritance, and of static and class methods, undermines > this simplistic beginning of "blueprint" and so could become corrosive > vectors of entropy (leaking sense), if not contained within more fitting > metaphors. > > I like to say the class is a "mother ship" and serves as a kind of "home > base" or "platform". How about an "amusement park"? > > Each self brings its little __dict__ to the theme park, but all the > "rides" (the "stuff happening") are anchored in the class's __dict__. The > self parameter is like an empty seat in a ride, which the rider's self then > fills. > > This so-called "blueprint" is where the methods are happening, which is so > not what it's like in the case of houses. > > The many instances (the selves) are but little bags of state, little "var > stashes" (uh oh, JavaScript creeping in... :-D). > > Anyway, ya catch my drift, right? > > If we over-stress the blueprint metaphor they'll not be as open minded > about blueprints having their own "batteries included" and doing stuff on > their own, no "selves" need apply in some cases (not all methods need a > self). > > Literal blueprints don't light up and do stuff all on their own like that. > > Our classes often behave a lot more like objects with a life of their own. > > ... and that's true of course as they're each instances of the type > "type", one more example of what that "bag o' tricks" we called 'a class' > might look like. > > Kirby > > > > _______________________________________________ > Edu-sig mailing list > Edu-sig at python.org > https://mail.python.org/mailman/listinfo/edu-sig > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Wed Apr 20 18:19:15 2016 From: kirby.urner at gmail.com (kirby urner) Date: Wed, 20 Apr 2016 15:19:15 -0700 Subject: [Edu-sig] more simmering debate... In-Reply-To: References: Message-ID: > > Our classes often behave a lot more like objects with a life of their own. > > For example I might do something like this. One could argue this is not describing an "is a" relationship i.e. how can each member of the landing party be a "ship". I'm saying we internalize our type inheritance and "is a" might not apply in quite the same way in this particular knowledge domain. Keep an open mind. # -*- coding: utf-8 -*- """ Created on Wed Apr 20 14:56:55 2016 @author: Kirby Urner 10 Cloverfield Lane, Nowhere, Nebraska """ import random class MotherShip: attack_mode = False # note to self, need to learn more Earthling names earthling_names = ['Alan', 'Helga', 'Ahmed', 'Jerome', 'Achio', 'Kelly'] @classmethod def toggle(M): if M.attack_mode: M.attack_mode = False; else: M.attack_mode = True @classmethod def spawn(M, n): # size of pod pod = [] for _ in range(n): pod.append(M()) # blessings return pod def __init__(self): # rarely used except by spawn self.name = random.choice(self.__class__.earthling_names) def __repr__(self): return self.name # we each feel empowered by the whole! # ship lands... landing_party = MotherShip.spawn(10) # spawn a swarm of little selves print("Landing Party:", landing_party) print("Hostile?: ", landing_party[3].attack_mode) # what hath triggered their ire? Everything was going so well... MotherShip.toggle() # each self has a shared collective hive mind print("Hostile?: ", landing_party[3].attack_mode) # uh oh... === Anaconda.console (blank rows added for readability): runfile('/Users/kurner/Documents/classroom_labs/martians_landed.py', wdir='/Users/kurner/Documents/classroom_labs') Landing Party: [Kelly, Kelly, Achio, Kelly, Jerome, Alan, Alan, Helga, Achio, Alan] Hostile?: False < some triggering event? > Hostile?: True > -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Wed Apr 20 18:50:02 2016 From: kirby.urner at gmail.com (kirby urner) Date: Wed, 20 Apr 2016 15:50:02 -0700 Subject: [Edu-sig] more simmering debate... In-Reply-To: References: Message-ID: On Wed, Apr 20, 2016 at 1:53 PM, kirby urner wrote: << SNIP >> > I like to say the class is a "mother ship" and serves as a kind of "home > base" or "platform". How about an "amusement park"? > > Another one to limber up on: # -*- coding: utf-8 -*- """ Created on Wed Apr 20 15:27:35 2016 @author: Kirby Urner Carnival Guy (aka "geek", luvs chicken) """ class Blech(Exception): pass class AmusementPark: # euphemism for carnival @classmethod def ferris_wheel(A, me): me.sick = False return me @classmethod def roller_coaster(A, me): # moral: don't eat before riding the roller coaster if len(me.stomach) > 0: me.sick = True # sick state persists me.stomach = [] # ... this should help though return me @classmethod def make_rider(A): return A() def __init__(self): # born to ride self.stomach = [] self.sick = False def __call__(self, food): # born to eat if self.sick: raise Blech("too sick to eat") self.stomach.append(food) def __repr__(self): if self.sick: return "I don't feel so good" else: return "I feel fine" A1 = AmusementPark alice = A1.make_rider() # a child of her profession A1.ferris_wheel(alice) print("Sick after ferris wheel:", alice) # time to eat! try: alice("cotton candy") alice("diet doctor pepper") alice("hot dog with onions") except: print("I'll eat later...") A1.roller_coaster(alice) print("Sick after roller coaster?", alice) # it always happens # time to eat! try: alice("popcorn") alice("gum drops") alice("another diet doctor pepper") except: print("I'll eat later...") Runtime: runfile('/Users/kurner/Documents/classroom_labs/having_fun.py', wdir='/Users/kurner/Documents/classroom_labs') Sick after ferris wheel: False Sick after roller coaster? True I'll eat later... -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Wed Apr 20 18:51:43 2016 From: kirby.urner at gmail.com (kirby urner) Date: Wed, 20 Apr 2016 15:51:43 -0700 Subject: [Edu-sig] more simmering debate... In-Reply-To: References: Message-ID: Sounds like we agree Carl. The "blueprint" metaphor is not that great. It keeps us from thinking more fluently about OO after awhile. A straitjacket. Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: From carl at nextdayvideo.com Wed Apr 20 18:58:48 2016 From: carl at nextdayvideo.com (Carl Karsten) Date: Wed, 20 Apr 2016 17:58:48 -0500 Subject: [Edu-sig] more simmering debate... In-Reply-To: References: Message-ID: I also don't show real code right away. I scribble on the white board. class MotherShip; ... yeah, that's correct, but to me it looks too wordy for what is a fairly simple concept. hmm... simple? ok, inheritance is the concept that I think is fairly simple if you don't dive into all the other neat stuff. Once they see the elegance of talks=self.get_list_of_talks_to_process() for talk in talks: self.work(talk) their eyes light up and I let them bask in the benefits of elegant programming. After that, I think they will be receptive to learn all that other neat stuff on their own. On Wed, Apr 20, 2016 at 5:19 PM, kirby urner wrote: > > >> Our classes often behave a lot more like objects with a life of their >> own. >> >> > For example I might do something like this. One could argue this is not > describing an "is a" relationship i.e. how can each member of the landing > party be a "ship". > > I'm saying we internalize our type inheritance and "is a" might not apply > in quite the same way in this particular knowledge domain. Keep an open > mind. > > # -*- coding: utf-8 -*- > """ > Created on Wed Apr 20 14:56:55 2016 > > @author: Kirby Urner > > 10 Cloverfield Lane, > Nowhere, Nebraska > > """ > import random > > class MotherShip: > > attack_mode = False > # note to self, need to learn more Earthling names > earthling_names = ['Alan', 'Helga', 'Ahmed', 'Jerome', 'Achio', > 'Kelly'] > > @classmethod > def toggle(M): > if M.attack_mode: > M.attack_mode = False; > else: > M.attack_mode = True > > @classmethod > def spawn(M, n): # size of pod > pod = [] > for _ in range(n): > pod.append(M()) # blessings > return pod > > def __init__(self): # rarely used except by spawn > self.name = random.choice(self.__class__.earthling_names) > > def __repr__(self): > return self.name # we each feel empowered by the whole! > > # ship lands... > > landing_party = MotherShip.spawn(10) # spawn a swarm of little selves > print("Landing Party:", landing_party) > > print("Hostile?: ", landing_party[3].attack_mode) > > # what hath triggered their ire? Everything was going so well... > > MotherShip.toggle() # each self has a shared collective hive mind > > print("Hostile?: ", landing_party[3].attack_mode) # uh oh... > > === Anaconda.console (blank rows added for readability): > > runfile('/Users/kurner/Documents/classroom_labs/martians_landed.py', > wdir='/Users/kurner/Documents/classroom_labs') > > Landing Party: [Kelly, Kelly, Achio, Kelly, Jerome, Alan, Alan, Helga, > Achio, Alan] > > Hostile?: False > > < some triggering event? > > > Hostile?: True > >> > > _______________________________________________ > Edu-sig mailing list > Edu-sig at python.org > https://mail.python.org/mailman/listinfo/edu-sig > > -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Wed Apr 20 19:51:58 2016 From: kirby.urner at gmail.com (kirby urner) Date: Wed, 20 Apr 2016 16:51:58 -0700 Subject: [Edu-sig] more simmering debate... In-Reply-To: References: Message-ID: On Wed, Apr 20, 2016 at 3:58 PM, Carl Karsten wrote: > I also don't show real code right away. I scribble on the white board. > > Yeah, I think we're just talking about different points along the journey. I'm fine with Blueprint and/or Cookie Cutter at first, as the predominant metaphor, and not too much code. But then in my code school boot camp model they might have 12 weeks x 40 hours to learn all this JavaScript -> Other Language -> Python -> JavaScript (they go round and round in a spiral in this curriculum). So down the road a ways, when it's important to understand more of the Python grammar, I might move away from Blueprint and Cookie Cutter to MotherShip and AmusementPark. [ The version below keeps statistics at the class level (turnstyles...). ] I like your relating programming to processing video. I'm working to forge that connection more explicitly myself. The idea of "frames" (as in time frames, frames of file, intervals of action) figures in. Kirby # -*- coding: utf-8 -*- """ Created on Wed Apr 20 16:44:44 2016 @author: Kirby Urner Carnival Guy (aka "geek", luvs chicken) version 0.2 (copyleft) MIT License """ import random class Blech(Exception): pass class AmusementPark: # euphemism for carnival ferris_riders = 0 coaster_riders = 0 riders_born = 0 @classmethod def report(A): return "Ferris rides: {}\nCoaster rides: {}\nRiders: {}".\ format(A.ferris_riders, A.coaster_riders, A.riders_born) @classmethod def ferris_wheel(A, me): A.ferris_riders += 1 me.sick = False return me @classmethod def roller_coaster(A, me): A.coaster_riders += 1 # moral: don't eat before riding the roller coaster if len(me.stomach) > 0: me.sick = True # sick state persists me.stomach = [] # ... this should help though return me @classmethod def make_rider(A): A.riders_born += 1 return A() def __init__(self): # born to ride self.stomach = [] self.sick = False def __call__(self, food): # born to eat if self.sick: raise Blech("too sick to eat") self.stomach.append(food) def __repr__(self): if self.sick: return "I don't feel so good" else: return "I feel fine" A1 = AmusementPark alice = A1.make_rider() # a child of her profession bob = A1.make_rider() carl = A1.make_rider() def time_frame(): while True: rider = random.choice([alice, bob, carl]) ride = random.choice([A1.ferris_wheel, A1.roller_coaster]) ride(rider) yield A1 frame = time_frame() for time_tick in range(10): next(frame) print(A1.report()) -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Wed Apr 20 19:56:12 2016 From: kirby.urner at gmail.com (kirby urner) Date: Wed, 20 Apr 2016 16:56:12 -0700 Subject: [Edu-sig] more simmering debate... In-Reply-To: References: Message-ID: I'm working to forge that connection more explicitly myself. The idea of > "frames" (as in time frames, frames of file, intervals of action) figures > in. > > Kirby > "frames of film" I meant to say (not "file"). The browser window frame = puppet theater is part of it. JavaScript pulls the string of its "DOM-puppets". Then there's a "back stage" where the client makes calls to the server via whatever protocols.... ...while the show on stage continues, lets hope smoothly (at whatever frame rate). Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: From iwan at reahl.org Thu Apr 21 02:00:19 2016 From: iwan at reahl.org (Iwan Vosloo) Date: Thu, 21 Apr 2016 08:00:19 +0200 Subject: [Edu-sig] more simmering debate... In-Reply-To: References: Message-ID: <57186C73.8080200@reahl.org> Hi Kirby, You may be interested in Dijkstra's take on teaching via metaphor: https://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1036.html I am not sure exactly how it applies to your case. It seems to me that OO tends to get taught in terms of the mechanisms present in OO languages and how that is implemented. Things like the notion of inheritance, polymorphism and the idea of putting behaviour and data together. When I learnt OO we were taught about concepts, how they're defined by intention/extension and how they can be reasoned about in terms of set theory. We were taught about how to produce OO analysis models. That shows you how to think about a problem. Language features and how they work are?out of necessity?a very limited shadow of such models. Language features are not even necessary for implementing an OO model - you can happily reap OO benefits writing C code. My feeling is teaching OO by language features is like giving people a physical tool without giving them the mental tool that gives direction on how to and why and where use it (or not). One nice book that does explain the fundamentals really well IMHO is "Object-Oriented Methods: A Foundation" by James Martin/James Odell. http://www.amazon.com/Object-Oriented-Methods-Foundation-UML-2nd/dp/0139055975 Regards - Iwan -- Reahl, the Python only web framework: http://www.reahl.org From mamckenna at sch.ci.lexington.ma.us Thu Apr 21 12:03:39 2016 From: mamckenna at sch.ci.lexington.ma.us (Marianne McKenna) Date: Thu, 21 Apr 2016 12:03:39 -0400 Subject: [Edu-sig] Edu-sig Digest, Vol 153, Issue 8 Message-ID: I am out of the office today April 21, 2016. If you need immediate help, please contact tech support. Thanks -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Thu Apr 21 14:23:58 2016 From: kirby.urner at gmail.com (kirby urner) Date: Thu, 21 Apr 2016 11:23:58 -0700 Subject: [Edu-sig] more simmering debate... In-Reply-To: <57186C73.8080200@reahl.org> References: <57186C73.8080200@reahl.org> Message-ID: On Wed, Apr 20, 2016 at 11:00 PM, Iwan Vosloo wrote: > Hi Kirby, > > You may be interested in Dijkstra's take on teaching via metaphor: > https://www.cs.utexas.edu/~EWD/transcriptions/EWD10xx/EWD1036.html > I am not sure exactly how it applies to your case. > > I'm going through this. Interesting. I've not plumbed his writing much. There're some hours of me on-line doing a workshop in Chicago where I cite the guy, as the father of structured programming (new idea at the time, the Age of Spaghetti Code). Steve Holden, co-presenter, interjects that Dijkstra's medicine could be hard to swallow given he had no bedside manner (paraphrase). [1] I just heard the joke about arrogance being measured in nano-dijkstras (some Youtube from the Javascript culture). Anyway, I'm glad for the link, so thank you. What about coding just to experiment, as an art project? He seems very fixated on his model program with its "functional specification" along with some "proof". But some styles of coding are much more like experimenting in a lab, just trying stuff, not knowing the result in advance. He seems to have a rather narrow definition of what it means to program? The languages were lower level back then, is maybe part of it. It seems to me that OO tends to get taught in terms of the mechanisms > present in OO languages and how that is implemented. Things like the notion > of inheritance, polymorphism and the idea of putting behaviour and data > together. > > I really want to anchor OO in human language (human-executable: Hx). It's in English that we have "things" (etymology is closer to "meetup" but that's another story). Things have properties and behaviors. Not news. Plus we also understand about inheritance, not only in agronomy and animal husbandry (including of humans by humans) but in terms of cultural heritage (memes not just genes). These metaphors are ingrained in how we think about everything and for all the "radical novelty" a computer may represent, sometimes the goal is not to be amazed and agog at the stunning genius of computer architecture, and to get on with cell biology, the real focus, the work at hand. [3] To that end, the fact that an OO language that lets us start right away with "class Cell:" (immediately and not after two years of computer science), is a big relief, a boon, a godsend. What I want is for students to daydream about their own lives in Python code. I go to start my car, there's an exception. How do I handle that exception? Is the battery dead (raise BatteryDead)? Or did the key break off? (raise KeyBreak). The latter is pretty rare but happened to me in the code school parking lot. The next day, I shared a little program about it. https://github.com/4dsolutions/Python5/blob/master/carkeys.py Thinking in Python includes thinking about ordinary everyday things in Python. It doesn't mean fantasizing about the guts of a Von Neumann architecture computer unless you really need that to be your knowledge domain i.e. that's your line of work. Lets think about Cells and Proteins in Python. What attributes do they have, what behaviors? And what inherits from what? https://github.com/4dsolutions/Python5/blob/master/genetics.py (just native Python types here, no use of class semantics) Lets talk about ancestral trees in the discipline at hand. Are there any? OO is a way of analyzing a knowledge domain D into an expressive language L that is also machine executable (Mx). Mx <----- L -----> Hx Fig. 1: a spectrum > When I learnt OO we were taught about concepts, how they're defined by > intention/extension and how they can be reasoned about in terms of set > theory. We were taught about how to produce OO analysis models. That shows > you how to think about a problem. > > Language features and how they work are?out of necessity?a very limited > shadow of such models. Language features are not even necessary for > implementing an OO model - you can happily reap OO benefits writing C code. > > Indeed, given Python is just a pile of C code (some Pythons that is). > My feeling is teaching OO by language features is like giving people a > physical tool without giving them the mental tool that gives direction on > how to and why and where use it (or not). > > I'm suggesting Human Language already has a lot of what we need in its toolbox. For all Dijkstra's criticizing how we dumb it down with misshapen metaphors, OO is intentionally and by design aimed it implementing everyday experiential concepts we learn in Hx languages -- way before we try our hand at using Ls closer to the Mx end of the spectrum (see Fig. 1). Concrete (computable) <----- L -----> Speculative (non-computable) Fig. 2: same spectrum > One nice book that does explain the fundamentals really well IMHO is > "Object-Oriented Methods: A Foundation" by James Martin/James Odell. > http://www.amazon.com/Object-Oriented-Methods-Foundation-UML-2nd/dp/0139055975 > > Regards > - Iwan > > I'll check this out as well. I have Safari On-Line, maybe it's there. Kirby [1] http://worldgame.blogspot.com/2009/03/urner-workshop.html -------------- next part -------------- An HTML attachment was scrubbed... URL: From sergio_r at mail.com Thu Apr 21 22:06:29 2016 From: sergio_r at mail.com (Sergio Rojas) Date: Fri, 22 Apr 2016 04:06:29 +0200 Subject: [Edu-sig] Libro: Aprendiendo a programar en Python con mi Computador Message-ID: Un libro que puede interesar a los usuarios de edu-sig es "Aprendiendo a programar en Python con mi Computador" de distribuci?n bajo licencia Atribuci?n-NoComercial-CompartirIgual 3.0 Venezuela (CC BY-NC-SA 3.0 VE) cuyos t?rminos y condiciones est?n disponible en: http://creativecommons.org/licenses/by-nc-sa/3.0/ve/ El mismo lo hemos hecho disponible en : https://github.com/rojassergio/Aprendiendo-a-programar-en-Python-con-mi-computad or Saludos, Sergio From kirby.urner at gmail.com Fri Apr 22 11:42:39 2016 From: kirby.urner at gmail.com (kirby urner) Date: Fri, 22 Apr 2016 08:42:39 -0700 Subject: [Edu-sig] Libro: Aprendiendo a programar en Python con mi Computador In-Reply-To: References: Message-ID: 2016-04-21 19:06 GMT-07:00 Sergio Rojas : > > El mismo lo hemos hecho disponible en : > > https://github.com/rojassergio/Aprendiendo-a-programar-en-Python-con-mi-computad > or > > Saludos, > > Sergio > Thanks Sergio! I'm seeing a solid intro to the scipy stack, with a heads first dive into sympy and linear algebra using the Anaconda distro in the opening pages, then a slower ramping up, helping students get to that point themselves. Kirby Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: From mamckenna at sch.ci.lexington.ma.us Fri Apr 22 11:43:58 2016 From: mamckenna at sch.ci.lexington.ma.us (Marianne McKenna) Date: Fri, 22 Apr 2016 11:43:58 -0400 Subject: [Edu-sig] Edu-sig Digest, Vol 153, Issue 9 Message-ID: I am out of the office today April 21, 2016. If you need immediate help, please contact tech support. Thanks -------------- next part -------------- An HTML attachment was scrubbed... URL: From sergio_r at mail.com Sun Apr 24 09:43:14 2016 From: sergio_r at mail.com (Sergio Rojas) Date: Sun, 24 Apr 2016 15:43:14 +0200 Subject: [Edu-sig] Libro: Aprendiendo a programar en Python con mi Computador In-Reply-To: References: , Message-ID: Sent:?Friday, April 22, 2016 at 11:12 AM Subject:?Re: [Edu-sig] Libro: Aprendiendo a programar en Python con mi Computador ? ?El mismo lo hemos hecho disponible en : https://github.com/rojassergio/Aprendiendo-a-programar-en-Python-con-mi-computador [vhttps://github.com/rojassergio/Aprendiendo-a-programar-en-Python-con-mi-computador ] Saludos, Sergio ? > Thanks Sergio! ? > I'm seeing a solid intro to the scipy stack, with a heads first dive into sympy and linear algebra > using the Anaconda distro in the opening pages, then a slower ramping up, helping students get to > that point themselves. ? > Kirby Thanks, Kirby, for perusing the book and making so a nice quick review, I would like to add that the web site was updated and now contains all the programs presened in the text. Thanks again for reading it, Sergio https://github.com/rojassergio/Aprendiendo-a-programar-en-Python-con-mi-computador From jurgis.pralgauskis at gmail.com Wed Apr 27 15:59:29 2016 From: jurgis.pralgauskis at gmail.com (Jurgis Pralgauskis) Date: Wed, 27 Apr 2016 22:59:29 +0300 Subject: [Edu-sig] anti-idiom checker? In-Reply-To: References: Message-ID: Hi, I found good collection + tool to match code patterns. Guys made a system to crowdsource the (anti)patterns for auto-checking! :) http://docs.quantifiedcode.com/python-anti-patterns/ The tool http://docs.quantifiedcode.com/patterns/language/index.html On Wed, Apr 20, 2016 at 11:14 PM, kirby urner wrote: > > >> ps.: I imagine I could make sth via AST analysis... >> -- >> > > Or maybe some regex that looks for > > "for bar in range(len(foo)): ...foo[bar]" # (in the for's scope) > > 'cept I don't know regexes well enough to write that. :-D > > It could just say > > "slap with wet fish ("for block" starting line 10)" > > in a nagnanny.log file someplace, with the user option to care (a > "Pythonic" toggle). > > Kirby > > > -- Jurgis Pralgauskis tel: 8-616 77613; Don't worry, be happy and make things better ;) http://galvosukykla.lt -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Wed Apr 27 16:55:49 2016 From: kirby.urner at gmail.com (kirby urner) Date: Wed, 27 Apr 2016 13:55:49 -0700 Subject: [Edu-sig] anti-idiom checker? In-Reply-To: References: Message-ID: Excellent resource! I've clued a number of folks in my network within minutes of seeing this (shout out to Steve Holden). Thanks! Treating security and maintainability holes together under the heading of "anti-patterns" makes so much sense. Risk based thinking <--> awareness of anti-patterns (how to find them, how to not fall into using them). Kirby On Wed, Apr 27, 2016 at 12:59 PM, Jurgis Pralgauskis < jurgis.pralgauskis at gmail.com> wrote: > Hi, > > I found good collection + tool to match code patterns. > > Guys made a system to crowdsource the (anti)patterns for auto-checking! :) > > http://docs.quantifiedcode.com/python-anti-patterns/ > > The tool > http://docs.quantifiedcode.com/patterns/language/index.html > > On Wed, Apr 20, 2016 at 11:14 PM, kirby urner > wrote: > >> >> >>> ps.: I imagine I could make sth via AST analysis... >>> -- >>> >> >> Or maybe some regex that looks for >> >> "for bar in range(len(foo)): ...foo[bar]" # (in the for's scope) >> >> 'cept I don't know regexes well enough to write that. :-D >> >> It could just say >> >> "slap with wet fish ("for block" starting line 10)" >> >> in a nagnanny.log file someplace, with the user option to care (a >> "Pythonic" toggle). >> >> Kirby >> >> >> > > > -- > Jurgis Pralgauskis > tel: 8-616 77613; > Don't worry, be happy and make things better ;) > http://galvosukykla.lt > -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Fri Apr 29 15:20:50 2016 From: kirby.urner at gmail.com (kirby urner) Date: Fri, 29 Apr 2016 12:20:50 -0700 Subject: [Edu-sig] BI about Code Schools Message-ID: As some of you know, I've been studying the emerging market for "code schools", not an entirely new phenomenon, but spiraling through a next iteration around now. Why am I interested? Because per my LinkedIn profile, I've been working in this arena for a long time, back to the 1980s when I was a trainer in Lotus 1-2-3, dBase and WordPerfect. "I go way back" as they say, in the Way Back Machine (see archive.org). Here's one of my recent BI-like findings, using my own neural net (the one between my ears): code schools are in need of on-the-shelf prototypes that students might hack on, both alone and together, and a logical application every code school needs is (drum role): an on-line gift shop (with optional brick 'n mortar add-on with point of sale devices). Why? Well lets take the case of many colleges and universities that teach computer science as an academic subject. If one drills down, with the question, "do they eat their own dog food?" the answer is often "no, they use Banner" or some other engine to manage registration, enrollment, HR stuff. They don't roll their own and why should they? Their business is teaching the theory, not designing college-management applications. Admin is free to not bother faculty and outsource instead; buy off the shelf stuff (COTS) if you can find it. [1] With a code school though, it's different, at least when it comes to those advertising "full stack engineer" as what they're hatching (eager eggheads lining up). Any code school worth its salt should be turning out the very folks who write those on-line gift shop applications, in Django, Rails or whatever. The Shopping Cart. Other paradigms. "How do we know they're learning those skills and actually writing such applications?" the hopeful employer wants to know. We can see their checked in code in Github that's how. Front End, Back End, whatever, they've hacked on a gift shop prototype, maybe not the one running at the moment, but that's neither here nor there (the Ux keeps changing out, as the code school rotates its look and feel). Some capstone project: a gift shop in Haskell, fully operational. Wow. Another capstone: a MEAN stack using TypeScript with Angular2, classic implementation. Again wow. "This school has the cheese! We want our people from there!" Plus every school needs a gift shop, of course, for alumni and enrollees, partners and siblings, who want to partake of the swag. This won't all happen overnight. Some code schools have gift shops already. I'm anticipating a trend here, so we can all look back and see if my crystal ball was cloudy or clear. Kirby [1] https://en.wikipedia.org/wiki/Commercial_off-the-shelf -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Fri Apr 29 17:22:55 2016 From: kirby.urner at gmail.com (kirby urner) Date: Fri, 29 Apr 2016 14:22:55 -0700 Subject: [Edu-sig] more about a classic code school spiral... Message-ID: On Fri, Apr 29, 2016 at 12:20 PM, kirby urner wrote: << SNIP >> > Here's one of my recent BI-like findings, using my own neural > net (the one between my ears): code schools are in need of > on-the-shelf prototypes that students might hack on, both alone > and together, and a logical application every code school needs > is (drum role): > (drum roll): <--- oops The curriculum I'm envisioning (for some schools to adopt) looks like this: X --> JavaScript (good parts) --> Front End (static HTML / CSS, then DOM animation) --> dive into alien LISPish language, in parallel with... --> dive into Python --> back to JavaScript (and so on, in a spiral) --> X By LISPish language I mean such as: Clojure, Pyret, Racket, Scala... feel free to add. Where does J fit in? Definitely J, like APL before it, shares the paradigm of a "pipeline of transformations" and that's what this segment will show off: concurrent / parallel throughput as we work through examples of machine learning. Pyret has image objects self representing right in the REPL, making the concepts come easily. Apply image filtering interactively. I like that theme of "Where's Waldo" https://youtu.be/U89BmApmnE8?t=1870 # <-- that's 31 minutes, 10 seconds I'm not saying Python can't do a deep learning learning pipeline, it can and does, but we're purposely going from JavaScript to LISPish because we want our spiral to branch off in all directions, future career-wise. If you end up doing Java or C#, you'll have your Python to build on. If you're pulled towards Clojure, your code school will have prepared you. Starting and ending with JavaScript is just another way of saying "to be continued" i.e. on the next iteration through JavaScript we might look at ES7 or one of the transpiler variants (TypeScript). Lots to learn! Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Sat Apr 30 19:48:41 2016 From: kirby.urner at gmail.com (kirby urner) Date: Sat, 30 Apr 2016 16:48:41 -0700 Subject: [Edu-sig] more simmering debate... In-Reply-To: References: <57186C73.8080200@reahl.org> Message-ID: On Thu, Apr 21, 2016 at 11:23 AM, kirby urner wrote: << SNIP >> > Thinking in Python includes thinking about ordinary everyday things in > Python. It doesn't mean fantasizing about the guts of a Von Neumann > architecture computer unless you really need that to be your knowledge > domain i.e. that's your line of work. > Since posting the above some weeks back, I've been informed that "Von Neumann architecture computer" is maybe not the best jargon to be spreading around. Source: https://vimeo.com/145672920 about 4:55 into it. I've watched quite a few of these Eric Smith vimeos. I've learned a lot. Given I'm flying the lambda calculus banner on Mathfuture, trail-blazing a new track, it behooves me to catch up on what that means in more detail, Y combinator and all that. ;-D Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: From kirby.urner at gmail.com Sat Apr 30 19:51:34 2016 From: kirby.urner at gmail.com (kirby urner) Date: Sat, 30 Apr 2016 16:51:34 -0700 Subject: [Edu-sig] BI about Code Schools In-Reply-To: References: Message-ID: On Fri, Apr 29, 2016 at 12:20 PM, kirby urner wrote: > > As some of you know, I've been studying the emerging market > for "code schools", not an entirely new phenomenon, but > spiraling through a next iteration around now. > > Why am I interested? > > Because per my LinkedIn profile, I've been working in this arena > for a long time, back to the 1980s when I was a trainer in > Lotus 1-2-3, dBase and WordPerfect. "I go way back" as they > say, in the Way Back Machine (see archive.org). > > Here's one of my recent BI-like findings, using my own neural > net (the one between my ears): code schools are in need of > on-the-shelf prototypes that students might hack on, both alone > and together, and a logical application every code school needs > is (drum role): an on-line gift shop (with optional brick 'n mortar > add-on with point of sale devices). > I continue with this theme in this morning's blog: http://controlroom.blogspot.com/2016/04/code-school-gift-shop.html Kirby -------------- next part -------------- An HTML attachment was scrubbed... URL: