Leonardo DaVinci Quotes on Humility

A small patch of snow finding itself clinging to the top of a rock which was lying on the topmost height of a very high mountain and being left to its own imaginings, it began to reflect in this way, saying to itself: “Now, shall not I be thought vain and proud for having placed myself—such a small patch of snow—in so lofty a spot, and for allowing that so large a quantity of snow as I have seen here around me, should take a place lower than mine? Certainly my small dimensions by no means merit this elevation. How easily may I, in proof of my insignificance, experience the same fate as that which the sun brought about yesterday to my companions, who were all, in a few hours, destroyed by the sun. And this happened from their having placed themselves higher than became them. I will flee from the wrath of the sun, and humble myself and find a place befitting my small importance.” Thus, flinging itself down, it began to descend, hurrying from its high home on to the other snow; but the more it sought a low place the more its bulk increased, so that when at last its course was ended on a hill, it found itself no less in size than the hill which supported it; and it was the last of the snow which was destroyed that summer by the sun. This is said for those who, humbling themselves, become exalted.

Fables on plants (1275-1279)

My Ninjitsu teacher, Dan Morris said, “The difference between confidence and arrogance is humility”. I try to follow that path.

Fun with Triangular Numbers + Triangular Corporate Logos

I’ve always been fond of triangular numbers [1] and found the pattern they create beautiful.

                         .
                       .   .
                     .   .   .
                   .   .   .   .
                 .   .   .   .   .
               .   .   .   .   .   .
             .   .   .   .   .   .   .
           .   .   .   .   .   .   .   .
         .   .   .   .   .   .   .   .   .
       .   .   .   .   .   .   .   .   .   .
     .   .   .   .   .   .   .   .   .   .   .

Embedded within are many a corporate logo:

Mitsubishi, Chase, Star of David, &c.

Mitsubishi Triangle Logo

Chase Logo

I wanted to find out the relationships between the dots and the possible lines drawn between them. For example.
If you have T_n, how many dots exist as a recurrence relation? How many lines can one draw between the dots for T_n?

           o
          / \  (T_2 -> n_2 = 3)
         o - o

number of dots:
d_i = d_{i-1} + i
number of lines:
n_i = n_{i-1} + 3 * (i – 1)

I wrote some of it up in CLISP to check it out:

;; calculates numer of edges in triangular graph
(defun nlines (i)
(let ((prev (- i 1)))
(if (eq i 0)
0
(+ (* 3 prev) (nlines prev)))))

;; returns number of nodes in graph
(defun ndots (i)
(if (eq i 0)
0
(+ (ndots (- i 1)) i)))

Now what if we looked at the triangular numbers with respect to a triangular array like Pascal’s Triangle? [2]
That is, how many operations need to take place in order to calculate the entire triangle?
; calcs number of operations for triangular arrays based on n
; nops = 6, i = 3
; .
; / \
; . . (nops 3) == 6
; / \ / \
; . . .
;
(defun nops (i)
(if (eq i 0)
0
(let ((prev (- i 1)))
(+ (nops prev) (* 2 prev)))))

I brute-forced the limit by just putting large numbers in and found out that the ratio between the number of dots and lines approaches 1/3 as i approaches infinity and the number of dots to the number of operations (in a triangular array) approaches 1/2 as i approaches infinity.

\lim_{i\to\infty} \frac{ndots_I}{nlines_i} = \frac{1}{3}
\lim_{i\to\infty} \frac{ndots_I}{nops_i} = \frac{1}{2}

Sources:
http://en.wikipedia.org/wiki/Triangular_number
http://en.wikipedia.org/wiki/Pascal’s_triangle

An elegant pythonic solution to – TypeError: is not JSON serializable

So if you ever have to deal with python and JSON at the same time, I’m sure you’ve run into this problem at least once.  With Baybo, the typical example of this is failure for json.dumps to successfully coerce Decimal objects into strings (go figure).  Anyways, the solution to the error above is simply:

dictionary = {"key": "val", "foo": Decimal("8.88")}

dict(map(lambda x: isinstance(x[1], Decimal) and (str(x[0]), str(x[1])) or (str(x[0]), x[1]), dictionary.items()))

Let’s break that down a bit

dictionary.items() => [("key", "val"), ("foo", Decimal("8.88"))]

lambda x: lambda x: isinstance(x[1], Decimal) and (str(x[0]), str(x[1])) or (str(x[0]), x[1]) => ("foo", "8.88")

map turns it all into [("key", "val"), ("foo", "8.88")] if it is in fact a Decimal object, otherwise leaves it alone

which we wrap up with a dict() => {"key": "val", "foo": "8.88"} and dump to json

'{"key": "val", "foo": "8.88"}'

voila! problem solved!

edit (2011-01-04): after looking over this again, I would like to comment that one *might* want to keep integers of type int, list of type list, etc. simply mapping everything to a string is a crufty hack at best. I’ve revised the code to adjust for this. isinstance(x[1], Decimal) and (str(x[0]), str(x[1])) or ... the ever useful and-or logic short-circuting which you may be familiar with if you’ve programmed in C or JavaScript.

edit (2015-12-07): Switched from type(foo) == “TypeString” to isinstance(foo, TypeString).

Working with utf8 (like Chinese) with sqlAlchemy + Elixir

Today I’ve been playing around with sqlAlchemy and Elixir.

I was having problems with how some strings (Chinese Characters) were being encoded and stored. The issue was with the

metadata.bind statement (create_engine() without Elixir)

before it was:

metadata.bind = 'mysql://username:password@localhost/database'

You need to select utf8 encoding manually.

metadata.bind = 'mysql://username:password@localhost/database?charset=utf8'

or, plain SQLAlchemy:

db = create_engine('mysql://...', encoding='utf8')