<?xml version="1.0" encoding="utf-8" ?>

<rss version="2.0" 
   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
   xmlns:admin="http://webns.net/mvcb/"
   xmlns:dc="http://purl.org/dc/elements/1.1/"
   xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
   xmlns:wfw="http://wellformedweb.org/CommentAPI/"
   xmlns:content="http://purl.org/rss/1.0/modules/content/"
   >
<channel>
    <title>David Pollak's Blog - Ruby</title>
    <link>http://blog.lostlake.org/</link>
    <description>Information, experiences, rants...</description>
    <dc:language>en</dc:language>
    <generator>Serendipity 1.4 - http://www.s9y.org/</generator>
    <pubDate>Sun, 03 May 2009 17:20:28 GMT</pubDate>

    <image>
        <url>http://blog.lostlake.org/templates/default/img/s9y_banner_small.png</url>
        <title>RSS: David Pollak's Blog - Ruby - Information, experiences, rants...</title>
        <link>http://blog.lostlake.org/</link>
        <width>100</width>
        <height>21</height>
    </image>

<item>
    <title>In defense of DHH &amp; the Rails comminity</title>
    <link>http://blog.lostlake.org/index.php?/archives/93-In-defense-of-DHH-the-Rails-comminity.html</link>
            <category>Ruby</category>
    
    <comments>http://blog.lostlake.org/index.php?/archives/93-In-defense-of-DHH-the-Rails-comminity.html#comments</comments>
    <wfw:comment>http://blog.lostlake.org/wfwcomment.php?cid=93</wfw:comment>

    <slash:comments>15</slash:comments>
    <wfw:commentRss>http://blog.lostlake.org/rss.php?version=2.0&amp;type=comments&amp;cid=93</wfw:commentRss>
    

    <author>nospam@example.com (David Pollak)</author>
    <content:encoded>
    &lt;p&gt;No, my machine was not hacked.  Yes, I do believe that DHH and the Rails community has done far more to advance web development than the Apache
Software Foundation.  I radically disagree with &lt;a href=&#039;http://cubiclemuses.com/cm/articles/2009/04/28/a-community-of-rockstars/&#039;&gt;J Aaron Farr&#039;s&lt;/a&gt; 
post comparing the two.&lt;/p&gt; &lt;p&gt;First, I am a fan of DHH.  I think he&#039;s a wicked smart person and that Rails as a piece of software and as a catalyst for
web development is a milestone.  DHH built Rails and created the Rails community.  He&#039;s done a masterful job.
He&#039;s also become more of a statesman over the years.  With that being said, I&#039;m not a huge fan of the Rails community
or its culture.&lt;/p&gt;

&lt;p&gt;I&#039;m a user of a lot of Apache Software Foundation stuff.  It&#039;s solid.  It&#039;s maintained.  With the possible exception of Wicket,
none of it is groundbreaking.  In fact,
some of it is &lt;a href=&quot;http://tomcat.apache.org/&quot;&gt;poorly&lt;/a&gt;
&lt;a href=&#039;http://ant.apache.org/&#039;&gt;designed&lt;/a&gt; &lt;a href=&#039;http://struts.apache.org/&#039;&gt;crap&lt;/a&gt;.
I&#039;m an Apache &lt;a href=&#039;http://people.apache.org/~jim/committers.html&#039;&gt;commiter&lt;/a&gt; (perhaps not for long) 
on the &lt;a href=&#039;http://incubator.apache.org/esme/community/community.html&#039;&gt;ESME&lt;/a&gt; project.
I have seen very little of the meritocracy that Aaron blogs about.
&lt;/p&gt;

&lt;h2&gt;It&#039;s not easy &lt;strike&gt;being green&lt;/strike&gt; running a ground-breaking project&lt;/h2&gt;

&lt;p&gt;I&#039;ve run my share of &lt;a href=&#039;http://www.plsys.co.uk/mesa&#039;&gt;groundbreaking&lt;/a&gt;
&lt;a href=&quot;http://athena.com&quot;&gt;software&lt;/a&gt; &lt;a href=&quot;http://liftweb.net&quot;&gt;projects&lt;/a&gt; in my life.
It&#039;s really not an easy task.  Having vision, managing employees/committers, building community, and
satisfying users all takes a bit of attitude that pisses people off.  Let&#039;s look at what DHH did with Rails:
&lt;ul&gt;
&lt;li&gt;He blew away most of the other web frameworks by demonstrating that web development could be
concise and that web apps could be built to be visually pleasing and easy to use without a ton of
developer time.  That, IMHO, puts him in diety territory.&lt;/li&gt;
&lt;li&gt;He built an ecosystem around Rails that had enough critical mass to spawn a whole industry around
Rails development.&lt;/li&gt;
&lt;li&gt;And the 37 Signals apps don&#039;t suck.&lt;/li&gt;
&lt;/ul&gt;
But doing all that requires making choices.  DHH made a series of choices about style, community building, etc.
Some people think he&#039;s a jerk... but the same can be said about Steve Jobs, Bill Gates, Halsey Minor and other folks who
fundamentally changed the game (yeah, I&#039;m lumping DHH in league with those guys.)  In my opinion,
DHH is not a &lt;a href=&quot;http://en.wikipedia.org/wiki/Kim_Polese&quot;&gt;one&lt;/a&gt; &lt;a href=&quot;http://en.wikipedia.org/wiki/Craig_Newmark&quot;&gt;trick&lt;/a&gt; 
&lt;a href=&quot;http://en.wikipedia.org/wiki/Mark_Pesce&quot;&gt;pony&lt;/a&gt; (&lt;a href=&quot;http://www.amazon.com/Architects-Web-Built-Future-Business/dp/product-description/0471171875&quot;&gt;Folks who built the future&lt;/a&gt;).
He&#039;s got direction, attitude, energy, charisma, and the other stuff that it takes to change the game, and he&#039;d done just that.
&lt;/p&gt;

&lt;h2&gt;And in the other corner, weighing 98 pounds...&lt;/h2&gt;
&lt;p&gt;Now, let&#039;s look at the ASF.  It&#039;s a nice place to house a project.  There are lots of reports to write.  In fact, I believe more
time is spent on the ESME project writing monthly reports than writing code.  The ASF has done nothing to help
the ESME folks build community or inspire folks to join the project.  There&#039;s been little in the way
of technical guidance.  Sure there&#039;s brand and visibility in having an ASF project,
but there&#039;s no meritocracy.  There&#039;s nothing that I&#039;ve seen in the ASF that rewards anything other than being nice and writing
reports and having statistics get better.  Sure, if I&#039;m Yahoo! and I want to open source &lt;a href=&quot;http://hadoop.apache.org/&quot;&gt;Hadoop&lt;/a&gt; and pay my developers to
work on it, Apache is a nice neutral place to house it.  &lt;a href=&quot;http://couchdb.apache.org&quot;/&gt;CouchDB&lt;/a&gt; is high on the doesn&#039;t
suck scale, but I gotta say, &lt;a href=&quot;http://damienkatz.net/&quot;&gt;Damien Katz&lt;/a&gt; is the personality behind it (no, he&#039;s not
as acerbic as DHH) and without him, CouchDB would not be (violating the ASF guidelines, but I guess they needed a flashy project).&lt;/p&gt;

&lt;p&gt;Further, let&#039;s look at the ASF crap pile.  Well, there&#039;s the HTTP server... so bogged down in commityism that Nginx 
blows it away.  Struts... the ultimate piece of crap web framework.  ActiveMQ... junk compared to RabbitMQ.  Tomcat,
consistently behind Jetty (a personality driven show.)  There&#039;s no real merit that I can see across the board in Apache&#039;s offerings.
Put another way, if the ASF were a meritocracy, they&#039;d dump the crap that&#039;s in their top-level projects.&lt;/p&gt;

&lt;p&gt;Yes, I think that the Rails community could be a nicer place to be.  I&#039;ve tried to build the Lift community so that
it&#039;s a warmer and more welcoming place to be than the Rails community.  But I am sure glad Lift is not part of
the ASF.  I tip my hat to DHH and what he&#039;s built.&lt;/p&gt;

&lt;p&gt;Party and (likely) flame on.&lt;/p&gt; 
    </content:encoded>

    <pubDate>Wed, 29 Apr 2009 06:16:06 -0700</pubDate>
    <guid isPermaLink="false">http://blog.lostlake.org/index.php?/archives/93-guid.html</guid>
    
</item>
<item>
    <title>Advocacy vs. Attack</title>
    <link>http://blog.lostlake.org/index.php?/archives/49-Advocacy-vs.-Attack.html</link>
            <category>Ruby</category>
    
    <comments>http://blog.lostlake.org/index.php?/archives/49-Advocacy-vs.-Attack.html#comments</comments>
    <wfw:comment>http://blog.lostlake.org/wfwcomment.php?cid=49</wfw:comment>

    <slash:comments>4</slash:comments>
    <wfw:commentRss>http://blog.lostlake.org/rss.php?version=2.0&amp;type=comments&amp;cid=49</wfw:commentRss>
    

    <author>nospam@example.com (David Pollak)</author>
    <content:encoded>
    
&lt;p&gt;I read &lt;a href=&quot;http://www.bitwisemag.com/2/What-s-Wrong-With-Ruby&quot;&gt;What&#039;s wrong with Ruby&lt;/a&gt; yesterday, including many of the
&amp;quot;comments.&amp;quot;   Putting aside the substance of the article, the tone of the responses really bugged me.  There were plenty of &lt;i&gt;ad hominem&lt;/i&gt; attacks and very little discussion about the substance of the posting.&lt;/p&gt;&lt;p&gt;A while back, I got cranky about some Ruby guy suggesting that Java folk who use static typing as a tool must be stupid.  Someone asked me about my view of advocacy... well here goes...&lt;/p&gt; 
&lt;p&gt;FIrst, I believe that open, sometimes heated, debate about topics is the best way to improve a &amp;quot;thing.&amp;quot;&lt;/p&gt;&lt;p&gt;Second, I&#039;ve been around Internet flame-wars since 1990 (this was before Web 1.0, this was before the Web.)  I&#039;ve done my share of flaming and been flamed a whole bunch of times.&lt;/p&gt;&lt;p&gt;Here&#039;s my &amp;quot;formula&amp;quot; for debating (yes, you&#039;ll find a bunch of places where I haven&#039;t followed my formula, but each time I don&#039;t I regret it):&lt;/p&gt;&lt;ul&gt;&lt;li&gt;The goal is optimal outcome, not getting the other people to blindly agree with your original position.&lt;/li&gt;&lt;li&gt;It is very helpful to spend more time listening than speaking.&lt;/li&gt;&lt;li&gt;There is a difference between &amp;quot;facts&amp;quot; (the things that can be objectively measured or the things that nobody is debating), &amp;quot;hypotheses&amp;quot; (something that can be proven true or false by obtaining facts and applying logic), &amp;quot;personal experiences&amp;quot; and &amp;quot;personal opinions.&amp;quot;  For example, it is my personal opinion that has derived from my personal experiences that statically typed languages are better than dynamically typed languages.  For me, this is true, but it is clearly not a &amp;quot;fact&amp;quot; because people are debating it madly and it&#039;s not even a hypothesis because the debate has been raging for long enough and enough people have tried to define tests to measure which is &amp;quot;better&amp;quot; and, as far as I know, there&#039;s no hypothesis that has been tested that proves things one way or another.&lt;/li&gt;&lt;li&gt;Look for the implicit statements within the explicit statements.  For example, &amp;quot;Rails is better than any Java-based framework for building web sites.&amp;quot;  The &amp;quot;truth&amp;quot; of a statement like this depends on a number of &amp;quot;implicit&amp;quot; parts of the statement.  For example, &amp;quot;where security is not a top priority&amp;quot;, &amp;quot;where your team size is less than 8&amp;quot;, &amp;quot;where it&#039;s a green-field project&amp;quot;, and &amp;quot;where your data model is closely tied to the presentation layer.&amp;quot;  When I hear a statement, I try to figure out what the implicit parts of the statement are.  In a discussion, it&#039;s a powerful tool to say, &amp;quot;okay, I agree with your statement with the following conditions, but let&#039;s explore what happens outside these conditions.&amp;quot;  It helps focus the discussion.&lt;/li&gt;&lt;li&gt;With the above tools, you can talk about the implicit statements, figure out what the hypotheses are and figure out what facts you need to obtain to prove or disprove the hypothesis, and figure out the things that are just personal opinions.  For things that are personal opinions, you can share your experiences about why you&#039;ve formed those opinions.&lt;/li&gt;&lt;li&gt;Respect the classics.  Classics are things that have withstood the test of time.  That is not to say they are the best that will ever be.  That is not to say that they are the best of when they were created (e.g., Windows).  But it is to say that there&#039;s value in the momentum and investment that have made them classics.  Perhaps Shakespeare invented every plot device ever used in any piece of Western fiction, but we still write and view new plays.  We still study Shakespeare.  Shakespeare gave a platform to grow from (and he stood on a platform built by others.)&lt;/li&gt;&lt;li&gt;Finally, and perhaps most importantly, the &lt;i&gt;ad hominem&lt;/i&gt; attack may feel good, but it will change the debate away from the original to a debate about people.  Those debates rarely do any good.  In fact, learning from other peoples&#039; experiences can make you a richer person.  The researchers are the guys thinking about things in a way that computing &amp;quot;could be.&amp;quot;  But for guys like &lt;a href=&quot;http://en.wikipedia.org/wiki/Alan_Kay&quot;&gt;Alan Kay&lt;/a&gt; and  &lt;a href=&quot;http://en.wikipedia.org/wiki/John_McCarthy_%28computer_scientist%29&quot; title=&quot;John McCarthy (computer scientist)&quot;&gt;John McCarthy&lt;/a&gt;, we wouldn&#039;t have the foundations of computing that have led to C++, Java, Ruby, Python, etc.  We also need &amp;quot;practical guys&amp;quot; like &lt;a href=&quot;http://en.wikipedia.org/wiki/Larry_Wall&quot;&gt;Larry Wall&lt;/a&gt; and &lt;a href=&quot;http://www.loudthinking.com/&quot;&gt;DHH&lt;/a&gt; who make things accessible.  We need both.&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;So, advocate away.  Make things better. But please, respect what others have to say.  If they disagree with you and you cannot resolve the disagreements, may it&#039;s just a personal preference.&lt;/p&gt;&lt;p /&gt;&lt;p&gt;&lt;/p&gt;&lt;p /&gt;&lt;p /&gt;&lt;p /&gt; 
    </content:encoded>

    <pubDate>Fri, 13 Apr 2007 10:02:54 -0700</pubDate>
    <guid isPermaLink="false">http://blog.lostlake.org/index.php?/archives/49-guid.html</guid>
    
</item>
<item>
    <title>Some more Rails to lift code examples</title>
    <link>http://blog.lostlake.org/index.php?/archives/46-Some-more-Rails-to-lift-code-examples.html</link>
            <category>Ruby</category>
            <category>Scala</category>
    
    <comments>http://blog.lostlake.org/index.php?/archives/46-Some-more-Rails-to-lift-code-examples.html#comments</comments>
    <wfw:comment>http://blog.lostlake.org/wfwcomment.php?cid=46</wfw:comment>

    <slash:comments>11</slash:comments>
    <wfw:commentRss>http://blog.lostlake.org/rss.php?version=2.0&amp;type=comments&amp;cid=46</wfw:commentRss>
    

    <author>nospam@example.com (David Pollak)</author>
    <content:encoded>
    &lt;p&gt;I have been porting a Rails application to the &lt;i&gt;lift&lt;/i&gt; web framework.&lt;/p&gt;

&lt;p&gt;In this installment, I show an example of a Rails controller method and the converted &lt;i&gt;lift&lt;/i&gt; snippet method.  Thus I discuss the &lt;i&gt;lift&lt;/i&gt; and Scala idioms&lt;/p&gt;

&lt;p&gt;Also, for those folks who have claimed I&#039;m a &quot;Java guy&quot; and &quot;don&#039;t get Rails.&quot; I&#039;d like to differ with you.  I&#039;ve written 7 commercial Rails applications and have been doing Rails work since 2005.  While I&#039;m not the best Rails coder on the planet, I&#039;m pretty proficient with Rails and with Ruby.  For those folks who are branding &lt;i&gt;lift&lt;/i&gt; as a Rails clone, I differ with you as well.  I am borrowing the best of Rails, but I view TurboGears and Seaside as the true &quot;thought drivers&quot; for &lt;i&gt;lift&lt;/i&gt;.  I am using a Rails app that I&#039;m converting to &lt;i&gt;lift&lt;/i&gt; because the commercial app that I&#039;m involved in building &lt;b&gt;was&lt;/b&gt; written in Rails and we decided to move away from Rails because Rails could not scale to suit our needs (read my prior post where I outline why Rails cannot scale to meet our needs.)&lt;/p&gt; &lt;div&gt;&lt;div class=&quot;Normal_22&quot;&gt;&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; padding-top: 0pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;In my ongoing discussion of porting a Rails app to &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;, I figured I&#039;d show some Rails code and what it became in &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua-Italic&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;.&amp;#160; These two code snippets perform the same function: a &quot;new account invitation is emailed to a user.&amp;#160; The user clicks on a link contained in the email.&amp;#160; The user enters their first name, last name, enters a new password (twice).&amp;#160; This controller code (or snippet code in &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua-Italic&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;&amp;#160;as controllers are longer lived) performs the validation and updates the model.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;The LoC for Rails and &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua-Italic&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;&amp;#160;is nearly identical.&amp;#160; The &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua-Italic&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;&amp;#160;code pushes the password validation into the model (where it should and can be reused.)&amp;#160; The Rails code does not include the &quot;implicit&quot; lines of code for rendering the view, where the &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua-Italic&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;&amp;#160;code includes the view rendering code (see the &quot;bind&quot; function that binds XML in the view to form fields.)&amp;#160; A discussion of the code differences follows the code block:&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 11pt; line-height: 15pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160;&lt;/span&gt;&lt;span style=&quot;color: #3f7f5f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;# allow a new user to accept an invitation from an existing user via&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;# the email link sent in the invitation email.&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;def&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; accept_invitation&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;# the url from the email should have the token to find the user who was invited&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; request.get?&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #003f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;@token&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; = params[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:token&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;]&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; user = User.find_by_last_token(&lt;/span&gt;&lt;span style=&quot;color: #003f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;@token&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; flash[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:error&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;] = &lt;/span&gt;&lt;span style=&quot;color: #2900fe; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;Token not found&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;and&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; redirect_to &lt;/span&gt;&lt;span style=&quot;color: #2900fe; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&#039;/home/error&#039;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;and&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;return&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; user.nil? || user.token_expiry == &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; || user.token_expiry &amp;lt; Time.now&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; session[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:user_id&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;] = user.id&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;end&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; request.post?&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; pw1 = params[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:new_pw&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;].strip&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; pw2 = params[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:new_pw2&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;].strip&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; firstname = params[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:firstname&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;].strip&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; lastname = params[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:lastname&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;].strip&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; flash[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:error&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;] = &lt;/span&gt;&lt;span style=&quot;color: #2900fe; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;Passwords do not match&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;and&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;return&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; pw1 != pw2&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; flash[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:error&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;] = &lt;/span&gt;&lt;span style=&quot;color: #2900fe; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;Password too short&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;and&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;return&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; pw1.length &amp;lt; &lt;/span&gt;&lt;span style=&quot;color: #037fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;6&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; u = User.find(session[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:user_id&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;])&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; u.firstname = firstname&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; u.lastname = lastname&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; u.friendly_name = firstname+&lt;/span&gt;&lt;span style=&quot;color: #2900fe; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;+lastname&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; u.password= pw1&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; u.token_expiry = &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;nil&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; u.default_address.save&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; u.save&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #3f7f5f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;# Send a welcome email&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; email = NotificationsMailer.create_welcome_email(u)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; email.set_content_type(&lt;/span&gt;&lt;span style=&quot;color: #2900fe; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&#039;text/html&#039;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; NotificationsMailer.deliver(email)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; logger.debug(&lt;/span&gt;&lt;span style=&quot;color: #2900fe; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;Invitation accepted and welcome email delivered.&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; flash[&lt;/span&gt;&lt;span style=&quot;color: #fe3f40; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:notice&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;] = &lt;/span&gt;&lt;span style=&quot;color: #2900fe; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;Invitation accepted succesfully, we have sent a welcome email to you.&quot;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; redirect_to &lt;/span&gt;&lt;span style=&quot;color: #2900fe; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&#039;/user/download&#039;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;end&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;end&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160;&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;// the &quot;accept invitation&quot; snippet&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;def&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;accept&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;xhtml&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #a52a2a; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;Group&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;): &lt;/span&gt;&lt;span style=&quot;color: #a52a2a; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;NodeSeq&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; = {&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;// find the user associated with the foken&amp;#160;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;val&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; = (&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;for&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;val&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;token&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &amp;lt;- &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;param&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;token&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;);&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;val&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &amp;lt;- &lt;/span&gt;&lt;span style=&quot;color: #a52a2a; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;User&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;find&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;By&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #a52a2a; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;User&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;lastToken&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;token&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;));&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; !&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;logged_in_?&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;tokenExpiry&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;get&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;ne&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;null&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;tokenExpiry&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;getTime&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;millis&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;yield&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;) &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;getOrElse&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; {&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;error&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;Token not found&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;) ; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;redirectTo&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;/&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;) }&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;val&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;invokedAs&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #a52a2a; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;S&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;invokedAs&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;// this function tests acceptance of the invitation&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;def&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;innerAccept&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;xhtml&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #a52a2a; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;NodeSeq&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;): &lt;/span&gt;&lt;span style=&quot;color: #a52a2a; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;NodeSeq&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; = {&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;// check the password and if all is well, save the user&amp;#160;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;def&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;checkPassword&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;i&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;: &lt;/span&gt;&lt;span style=&quot;color: #a52a2a; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;List&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #a52a2a; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;String&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;]) = {&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;// set the password&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;password&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;::=&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;i&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;val&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;issues&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; = &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;validate&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;// if there are no issues, set the friendly name, destroy the token, log the user in and send them to the home page&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;if&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; (&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;issues&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;isEmpty&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;) {&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;friendlyName&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;firstname&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot; &quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;+&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;lastname&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;tokenExpiry&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;null&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;save&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;sendWelcomeEmail&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;logUserIn&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;notice&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;Invitation accepted succesfully, we have sent a welcome email to you.&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;redirectTo&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;/user/download&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;mapSnippet&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;invokedAs&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;innerAccept&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;// whoops... we have issues, display them to the user and continue loading this page&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;error&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;issues&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;true&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; }&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;// bind the parameters to the xhtml that was passed to us&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;bind&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;cs&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;xhtml&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&#039;email -&amp;gt; user.email.get, &#039;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;fn_input &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;text&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;firstname&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; _, &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;Val&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;firstname&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)),&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&#039;ln_input -&amp;gt; text(user.lastname := _, Val(user.lastname)),&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&#039;pw_input -&amp;gt; passwordL(checkPassword))&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; }&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160;&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;// call the innerAccept method with the XHTML that was passed to us&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;innerAccept&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;xhtml&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160; &amp;#160; }&lt;/span&gt;&lt;span style=&quot;font-size: 10pt; line-height: 12pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; color: #a33579; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 11pt; line-height: 15pt; opacity: 1.00;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;The first thing I will call attention to is the &quot;bind&quot; call.&amp;#160; &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua-Italic&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;&amp;#160;takes the approach that the &quot;view&quot; should contain only valid XHTML code.&amp;#160; It should not contain program code.&amp;#160; &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua-Italic&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;&amp;#160;loads the requested view in response to an HTTP request (rather than invoking a controller.)&amp;#160; The view contains a list of the controllers and snippets necessary to render the view.&amp;#160; These are designated by &amp;lt;lift:snippet&amp;gt; and &amp;lt;lift:controller&amp;gt; tags.&amp;#160; The tags may contain XML/XHTML elements that are passed to the snippet/controller as rendering instructions.&amp;#160; Snippets and Controllers take the XML and return a rendering of new XHTML.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;What is the difference between a &quot;snippet&quot; and a &quot;controller&quot;?&amp;#160; &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua-Italic&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;&amp;#160;implements controllers in the Smalltalk &quot;real&quot; MVC &quot;controller&quot; way.&amp;#160; Controllers are long-lived.&amp;#160; They exist as long as any page that references them lives.&amp;#160; Controllers can push changes to a page and if a browser is currently viewing the page, the change will be pushed out to the browser.&amp;#160; This allows &quot;chat&quot; controllers, clock controllers, shopping cart controllers (so the shopping cart is updated, even if an item was placed in the cart by another browser tab, or, conceivably, if two people are on different computers, they can share a shopping cart.)&amp;#160; Controllers are based on Scala Actors.&amp;#160; Each controller consumes about 200 bytes plus whatever state the controller keeps around (let&#039;s say 2K of state per Controller for a shopping cart.)&amp;#160; This means that 10,000 active controllers would consume about 20MB of RAM, or about 1/2 of the RAM used by a single Rails instance.&amp;#160; Put another way, keeping state in memory scales.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;&quot;&gt;Scala Actors do not have to be in the same address space in order to share messages.&amp;#160; The &quot;shared shopping cart&quot; controller could be hosted on one machine while the web servers servicing the sessions of the folks who are sharing the shopping carts could be on different machines.&amp;#160; There&#039;s no difference for the controller.&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;&quot;&gt;Snippets are a lot more like Rails controllers.&amp;#160; They are low-state (not quite state-free as we&#039;ll see in a minute) objects that are instantiated to service a single request and after that, they are discarded.&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;The view invokes the snippet in the following way:&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;lt;lift:snippet type=&quot;user_mgt:accept&quot; form=&quot;POST&quot;&amp;gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;&quot;&gt;Dear &amp;lt;cs:email /&amp;gt; choose a password to create an account and be able to use CircleShare.&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;&quot;&gt;&amp;lt;table&amp;gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;&quot;&gt;&amp;#160;&amp;#160; &amp;#160;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;First Name:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;cs:fn_input/&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;&quot;&gt;&amp;#160;&amp;#160; &amp;#160;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Last Name:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;cs:ln_input /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;&quot;&gt;&amp;#160;&amp;#160; &amp;#160;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Email Address:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;cs:email /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;&quot;&gt;&amp;#160;&amp;#160; &amp;#160;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Password:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;cs:pw_input /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;&quot;&gt;&amp;#160;&amp;#160; &amp;#160;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;Re-type Password:&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;cs:pw_input /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;&quot;&gt;&amp;#160;&amp;#160; &amp;#160;&amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;amp;nbsp;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;lt;input type=&quot;submit&quot; value=&quot;Accept Invitation&quot; /&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt;&quot;&gt;&amp;lt;/table&amp;gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;lt;/lift:snippet&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 11pt; line-height: 15pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt; instantiates a &quot;UserMgt&quot; object and calls the &quot;accept&quot; method. &amp;#160;The accept method locates and validates the user and then &quot;binds&quot; the appropriate values and actions to the XHTML:&lt;br /&gt;
&lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;bind&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&quot;cs&quot;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;xhtml&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;,&lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&#039;email -&amp;gt; user.email.get, &#039;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;fn_input &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;text&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;firstname&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;:=&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt; _, &lt;/span&gt;&lt;span style=&quot;color: #1e8fff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;Val&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;user&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #1a1ad6; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;firstname&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;)),&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&#039;ln_input -&amp;gt; text(user.lastname := _, Val(user.lastname)),&lt;/span&gt;&lt;span style=&quot;font-size: 9pt; line-height: 11pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; &quot;&gt;&amp;#160;&amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &amp;#160; &lt;/span&gt;&lt;span style=&quot;color: #7f7f7f; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 9pt; line-height: 12pt; opacity: 1.00; &quot;&gt;&#039;pw_input -&amp;gt; passwordL(checkPassword))&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;The first parameter in &quot;bind&quot; is the XML tag prefix that we are binding to. &amp;#160;By convention, I&#039;m binding to &quot;cs&quot; because this is the CircleShare application. &amp;#160;The second parameter is the XHTML passed from the view. &amp;#160;The &amp;lt;cs:xxx/&amp;gt; tags are the ones that &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt; will bind to. &amp;#160;The balance of the parameters are the names and values. &amp;#160;The names are the tags to bind to (e.g., &quot;email&quot; will bind to &amp;lt;cs:email /&amp;gt;). &amp;#160;If you pass in a string, it will be XML escaped. &amp;#160;You can pass in an XML element, including UnparsedData. &amp;#160;The ‘fn_input -&amp;gt; text(user.firstname := \_, Val(user.firstname)) is very interesting. &amp;#160;It binds &amp;lt;cs:fn_input /&amp;gt; to a text input field with a value set the the current first name value for the user. &amp;#160;The &quot;user.firstname := \_&quot; bit of code is actually a closure that is called when the form is submitted. &amp;#160;When the form is submitted, user.firstname is set to the value that was input in this form element.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;&quot;&gt;I&#039;ll repeat that because it&#039;s a very important concept. &amp;#160;When the form is submitted, a function (it&#039;s an anonymous function) is called and that function sets the first name of the user. &amp;#160;&quot;What user?&quot; you may ask. &amp;#160;Because it&#039;s a closure, the user is the instance of user that was created by the &quot;User.find&quot; method when the link was first processed. &amp;#160;There&#039;s no separation between the creation of the form and the action that is executed when the form is submitted. &amp;#160;It gets cooler, though... because you could write ‘fn_input -&amp;gt; user.firstname.toForm and the field would automatically generate an appropriate form input with appropriate callback. &amp;#160;No worries about keeping the setters in the controller in sync with the fields in the view.&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;&quot;&gt;But wait, there&#039;s more... you can even say &quot;user.toForm&quot; and a whole form with all the modifiable fields will be generated. &amp;#160;And it&#039;s all secure. &amp;#160;No concerns about &quot;mass assignment&quot; or tampering with fields that are not explicitly listed in the form.&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;So, &quot;bind&quot; binds the XHTML to form fields, etc. &amp;#160;If there&#039;s a &amp;lt;cs:xxx /&amp;gt; that does not have a matching bind, &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt; inserts an error message with a &quot;FIXME&quot; in it. &amp;#160;Your tests can search for FIXME in the returned page and that indicates a failure.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;We&#039;ve got our fields bound. &amp;#160;What happens when the user presses &quot;submit&quot;? &amp;#160;&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt; processes the form fields in the order that they appear in the bind statement. &amp;#160;The last field processed is &quot;password&quot;. &amp;#160;There are two copies of this field on the page. &amp;#160;This will result in a List of 2 responses. &amp;#160;The code assigns the list to the password field. &amp;#160;The code within the password field validates that the two passwords are the same and are of a minimum length. &amp;#160;The code asks the user object to validate itself. &amp;#160;If it&#039;s valid, the code saves the user, logs the user in, and redirects the browser to the download page.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;However, if validation fails (the passwords are incorrect, the first or last names are too short, etc.), the messages are displayed to the user and view is allowed to be processed. &amp;#160;There&#039;s on bit of &quot;magic&quot;: &lt;/span&gt;&lt;span style=&quot;color: #008eff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 11pt; line-height: 15pt; opacity: 1.00; &quot;&gt;mapSnippet&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 11pt; line-height: 15pt; &quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #2300dc; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 11pt; line-height: 15pt; opacity: 1.00; &quot;&gt;invokedAs&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 11pt; line-height: 15pt; &quot;&gt;, &lt;/span&gt;&lt;span style=&quot;color: #008eff; font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 11pt; line-height: 15pt; opacity: 1.00; &quot;&gt;innerAccept&lt;/span&gt;&lt;span style=&quot;font-family: &#039;Monaco&#039;, &#039;Courier&#039;, &#039;serif&#039;; font-size: 11pt; line-height: 15pt; &quot;&gt;)&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;. &amp;#160;This code says, &quot;when the view asks for whatever this snippet was called when it was first invoked, don&#039;t create a new instance, but instead call the ‘innerAccept&#039; function because it&#039;s a closure that&#039;s already bound the the user that was found when the link was first clicked.&quot; &amp;#160;This means that we don&#039;t have to temporarily log the user in (as we did in the Rails code.) &amp;#160;We don&#039;t have to put a marker in the session that says, &quot;the user we&#039;re currently validating is xxx&quot;, and we don&#039;t have to put a hidden field in the form with the user ID or the token. &amp;#160;Put another way, we&#039;re using the built in facilities of Scala to deal with managing state rather than an &quot;HTTP/HTML&quot; &quot;Web Programing&quot; way of dealing with state. &amp;#160;This leads to more secure code and it leads to fewer defects.&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; &quot;&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;I hope this gives you a sense of where I&#039;m taking &lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; font-style: italic; line-height: 14pt; &quot;&gt;lift&lt;/span&gt;&lt;span style=&quot;font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt; &quot;&gt;. &amp;#160;If you&#039;ve done Seaside work, a lot of this will be &quot;Well, Duh!&quot;&lt;/span&gt;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;&quot;&gt;I look forward to feedback, comments, and questions.&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;&quot;&gt;Thanks,&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;  text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;div class=&quot;paragraph Free_Form&quot; style=&quot;line-height: 14pt; font-family: &#039;BookAntiqua&#039;, &#039;Book Antiqua&#039;; line-height: 14pt;&quot;&gt;David&lt;/div&gt;
&lt;div class=&quot;paragraph Body&quot; style=&quot;line-height: 14pt; padding-bottom: 0pt; text-decoration: none;&quot;&gt;&amp;#160;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
 
    </content:encoded>

    <pubDate>Sat, 07 Apr 2007 15:14:08 -0700</pubDate>
    <guid isPermaLink="false">http://blog.lostlake.org/index.php?/archives/46-guid.html</guid>
    
</item>
<item>
    <title>Ruby, how you've changed in a year</title>
    <link>http://blog.lostlake.org/index.php?/archives/37-Ruby,-how-youve-changed-in-a-year.html</link>
            <category>Ruby</category>
    
    <comments>http://blog.lostlake.org/index.php?/archives/37-Ruby,-how-youve-changed-in-a-year.html#comments</comments>
    <wfw:comment>http://blog.lostlake.org/wfwcomment.php?cid=37</wfw:comment>

    <slash:comments>12</slash:comments>
    <wfw:commentRss>http://blog.lostlake.org/rss.php?version=2.0&amp;type=comments&amp;cid=37</wfw:commentRss>
    

    <author>nospam@example.com (David Pollak)</author>
    <content:encoded>
    &lt;p&gt;It was a year ago that I went to the SD Forum Silicon Valley Ruby Conference.
I listened with awe to Chad Fowler talking about language patterns, Ruby&#039;s evolution, both
as a language and as a series of idioms.  The energy in the room was warm, welcoming,
and felt like a bunch of people who had found a good path and were looking to
improve the language, the environment, and make Ruby the best language and the best
environment for folks to hang out in.
Chad talked a lot about the Ruby way.  It wasn&#039;t a religion with zealots.  It was a bunch of
folks taking a journey to make things better for themselves and others.  Cool!  Sign Me Up!!&lt;/p&gt;

&lt;p&gt;Things have changed a lot in a year.&lt;/p&gt; &lt;p&gt;A few days ago, a Rubyista made a blog post (intentionally not linked to)
calling Java programmers stupid.  The post seems to argue that anyone who needs (or likes) static typing
is stupid.&lt;/p&gt;

&lt;p&gt;Back in the day, when programmers had to free memory and then this Java thing burst onto the scene
there were flames across net news about how stupid and lazy users of managed memory were and that
managing your own memory was the one true way.  These folks had not seen the beauty of Lisp and Smalltalk.
There were benchmarks, etc.  Turns out that, for kernel development and some very, very close to the metal
high performance tasks, developer managed memory is better.  For all other tasks, let the machine do
the work.&lt;/p&gt;

&lt;p&gt;Ruby is not the end-all.  It&#039;s got a lot of very nice features, paradigms and idioms.  There are also warts 
(green threads, instability, on average for my projects, 100x slower than Java, and lack of a security model.)
Folks can view these warts as &quot;areas for improvement&quot; or as &quot;bashing from someone who doesn&#039;t
understand the one true way.&quot;&lt;/p&gt;

&lt;p&gt;For the record, I&#039;ve been doing Rails development for 18 months.  I have 8 Rails projects deployed (6 of them commercial.)
70% of my coding is in Ruby and Rails and it&#039;s split between Ruby command-line apps and Rails web apps.
I have given a dozen presentations on Ruby and Rails, mainly to help educate Java developers about a different approach that
was (past tense intentional), IMHO, a better way to do web development.  I have been
doing Java for 11 years.  I was one of the first users of WebLogic and saw J2EE evolve.  I have written popular commercial
applications in weakly typed, statically typed, and dynamically typed languages over my 29 year professional career.
I was (and no longer am after Matz said that he is not going to listen to enterprise users @ RubyConf) a proponent of
adding type checking to Ruby.  I have seen the benefits of both language level type checking and totally dynamic typing.&lt;/p&gt;

&lt;p&gt;I prefer static typing and languages like Scala and Haskell get it much more right than Java and C++ do.  This is
my &lt;b&gt;personal preference&lt;/b&gt; and I understand why &lt;a href=&#039;http://www.oreillynet.com/pub/au/2593&#039;&gt;other people&lt;/a&gt; have other preferences.
Of the languages I&#039;ve spent time in, I think Smalltalk does dynamic typing best.  Because methods and variables can&#039;t be mistaken,
the common mistake of mis-typing a variable or method name can be caught at method save time (if there is no method with a given
name implemented by any object in the Smalltalk system, you get a confirmation dialog.)  I&#039;m pretty sure that my
preferences don&#039;t make me stupid.  I don&#039;t think folks who prefer Ruby&#039;s brand of typing are stupid.  I think they&#039;ve found a groove
that works for them.&lt;/p&gt;

&lt;p&gt;So, where is all this leading?  Dunno.  What I do know is that Ruby has changed from being a &#039;way&#039; into being 
a dogma in 12 short months.  That&#039;s really sad.  Sigh.&lt;/p&gt;

&lt;p&gt;PS -- There was an original post based on the assumption that Pat was a member of the core Rails team.  I
was dead, absolutely, massively wrong about this.  I have pulled anything from this post that reflects negatively
on Rails or the Rails team because of the post.  I wanted to preserve a paragraph, however... here it is:&lt;/p&gt;

&lt;p&gt;Rails is amazing in that it took a very good approach to simplifying the common things that web developers
do.  There are other systems out there that do a similarly good job (e.g., TurboGears), but Rails popularized
the concept of &quot;programmer first&quot; web development.  Rails is kind of like the iPod of web development tools: what it
does, it does well and in a very approachable manner.&lt;/p&gt;
 
    </content:encoded>

    <pubDate>Thu, 25 Jan 2007 08:45:06 -0800</pubDate>
    <guid isPermaLink="false">http://blog.lostlake.org/index.php?/archives/37-guid.html</guid>
    
</item>
<item>
    <title>The longest journey starts with the first step</title>
    <link>http://blog.lostlake.org/index.php?/archives/17-The-longest-journey-starts-with-the-first-step.html</link>
            <category>Ruby</category>
    
    <comments>http://blog.lostlake.org/index.php?/archives/17-The-longest-journey-starts-with-the-first-step.html#comments</comments>
    <wfw:comment>http://blog.lostlake.org/wfwcomment.php?cid=17</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.lostlake.org/rss.php?version=2.0&amp;type=comments&amp;cid=17</wfw:commentRss>
    

    <author>nospam@example.com (David Pollak)</author>
    <content:encoded>
    
&lt;p&gt;I am wicked impressed with Charles Nutter and the JRuby team.  They take things step by step and improve performance and compatibility incrementally.  A few days ago, they &lt;a href=&quot;http://www.nabble.com/Performance-numbers%3A-Ola%27s-patch-and-server-VM-t2678262.html#a7469683&quot;&gt;broke the native Ruby performance barrier&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;These guys rock!
&lt;/p&gt;  
    </content:encoded>

    <pubDate>Fri, 24 Nov 2006 13:38:03 -0800</pubDate>
    <guid isPermaLink="false">http://blog.lostlake.org/index.php?/archives/17-guid.html</guid>
    
</item>
<item>
    <title>The Tail &amp; The Dog</title>
    <link>http://blog.lostlake.org/index.php?/archives/13-The-Tail-The-Dog.html</link>
            <category>Ruby</category>
    
    <comments>http://blog.lostlake.org/index.php?/archives/13-The-Tail-The-Dog.html#comments</comments>
    <wfw:comment>http://blog.lostlake.org/wfwcomment.php?cid=13</wfw:comment>

    <slash:comments>0</slash:comments>
    <wfw:commentRss>http://blog.lostlake.org/rss.php?version=2.0&amp;type=comments&amp;cid=13</wfw:commentRss>
    

    <author>nospam@example.com (David Pollak)</author>
    <content:encoded>
    
I apologize for the other factual errors and spelling errors in the blog post.  I stand corrected on the green vs. giant lock issue in YARV.  However, (and correct me if I&#039;m wrong about this as well) the performance improvements and degree of parallelization that YARV brings is marginal (&amp;lt; 40%) compared to the existing 1.8 implementation.  If I am mistaken about this please correct me.&lt;br /&gt;&lt;br /&gt;What I stand by is that Rails defines Ruby.  Let me expound on this statement.
 
First, I&#039;d like to say, the people I met at RubyConf and in the Ruby community as a whole are wicked smart and wicked passionate folks.  They care and believe and make things happen.  Being at RubyConf and putting faces to posts was a very excellent experience for me.&lt;br /&gt;&lt;br /&gt;Second, folks have done some amazing things with Ruby sans Rails.  About 50% of my coding is Ruby on its own.  Ruby is amazing in that it doesn&#039;t require much overhead if you&#039;re just writing a 10 line script.  On the other hand, it has most of the object &amp;quot;something&amp;quot; of C++ and Java and Smalltalk.  Ruby also has nice pieces like Mixins.&lt;br /&gt;&lt;br /&gt;Third, Ruby is excellent for gluing disparate system pieces together, like Perl.  Except that unlike Perl, Ruby code is maintainable by the original author *and* other folks.&lt;br /&gt;&lt;br /&gt;So far, I&#039;ve described a &amp;quot;better Perl.&amp;quot;  A language that does all the stuff that people do with Perl, except that the code is easier, more fun, and more satisfying to write and maintain.&lt;br /&gt;&lt;br /&gt;Something happened to Ruby to change its trajectory from taking a percent or two of mind and programmer share from Perl and Python each year to being one of the hottest, most recognizable names in technology.  That something is Rails.&lt;br /&gt;&lt;br /&gt;The number of attendees at RubyConf has grown from 30ish to &amp;gt; 300 since 2001.  How much of that growth has happened in the last 2 years since Rails came onto the scene?  How many of the people at RubyConf are doing &amp;gt; 50% of their coding on Rails projects?&lt;br /&gt;&lt;br /&gt;Rails has changed web development in a very positive way.  Rails makes it much easier and faster (and more fun) to develop web sites.  Rails is a very exciting tool because it allows small to medium sized teams to develop a class of web app very quickly.&lt;br /&gt;&lt;br /&gt;It is the benefits that Rails bring to the party that is raising people&#039;s awareness of Ruby.  Rails is raising corporate/enterprise awareness of Ruby.&lt;br /&gt;&lt;br /&gt;A marketing guy I work with from time to time (he did the PR that launched Yahoo!, the iMac, VeriSign, etc.) has a basic tenet: &amp;quot;In order to get the majority of people to change the way they do something, there has to be a 10x benefit.&amp;quot;  Rails delivers that 10x.&lt;br /&gt;&lt;br /&gt;By all measures that I can find, the increased visibility of Ruby and the increased interest in Ruby is primarily driven by the benefits that Rails brings to the party.  If there is someone out there that has statistics that indicates that something else is primarily responsible for the exponential growth in Ruby&#039;s popularity, please let me know.&lt;br /&gt;&lt;br /&gt;Rails is bringing people to the Ruby party.  And (okay, I don&#039;t have any statistics for this) most of the newer Ruby folks are doing Rails primarily.  They are coming and staying for Rails.  Yes, they learn the benefits of Ruby and that helps with deployment, log analysis, etc., but the primary driver is Rails.&lt;br /&gt;&lt;br /&gt;These people are consultants who can do fixed price bidding on web sites, underprice the competition, and still have fat margins.&lt;br /&gt;&lt;br /&gt;These people are in companies who need to find a way to do more with their budgets.&lt;br /&gt;&lt;br /&gt;These are companies like VeriSign that fund stuff like Mongrel in order to learn about new technologies that could improve their bottom line.&lt;br /&gt;&lt;br /&gt;These are the drivers of Rails and, because Rails runs on Ruby, the drivers of Ruby adoption.&lt;br /&gt;&lt;br /&gt;As a percentage of all deployed Ruby apps, I would bet a lot of money that Rails apps are &amp;gt; 50% and growing.&lt;br /&gt;&lt;br /&gt;Rails brings people to Ruby.  Rails apps are a substantial percentage of Ruby apps.  Managers and clients and people who are writing ever increasingly large checks for Rails-savvy consultants care about Rails.  Yeah, it sucks.  Yeah, it&#039;s not fair.  Yeah, those darn suits ruin all the good things.  But, it&#039;s what&#039;s happening.  People are coming to Ruby &amp;amp; Rails increasingly for money rather than aesthetics.  They&#039;re coming because of what Rails delivers (cost savings, more web site for less money.)&lt;br /&gt;&lt;br /&gt;As much as I believe that Ruby and Rails are different things... as much as I believe that Ruby is a thing of beauty... I understand that cash drives things.  Rails is the cash-cow.  Rails is the dominant force bringing people to Ruby and keeping people in Ruby.&lt;br /&gt;&lt;br /&gt;That&#039;s why I believe Rails is the dog that wags the Ruby tail.
 
    </content:encoded>

    <pubDate>Wed, 25 Oct 2006 12:10:26 -0700</pubDate>
    <guid isPermaLink="false">http://blog.lostlake.org/index.php?/archives/13-guid.html</guid>
    
</item>
<item>
    <title>Rails and Seaside -- Two new, great web frameworks</title>
    <link>http://blog.lostlake.org/index.php?/archives/7-Rails-and-Seaside-Two-new,-great-web-frameworks.html</link>
            <category>Ruby</category>
            <category>Smalltalk</category>
    
    <comments>http://blog.lostlake.org/index.php?/archives/7-Rails-and-Seaside-Two-new,-great-web-frameworks.html#comments</comments>
    <wfw:comment>http://blog.lostlake.org/wfwcomment.php?cid=7</wfw:comment>

    <slash:comments>18</slash:comments>
    <wfw:commentRss>http://blog.lostlake.org/rss.php?version=2.0&amp;type=comments&amp;cid=7</wfw:commentRss>
    

    <author>nospam@example.com (David Pollak)</author>
    <content:encoded>
    
I&#039;ve been casting about recently, looking for a good set of tools for building applications... mainly applications with a web interface.&lt;p&gt;&lt;br /&gt;I&#039;ve looked at a lot of environments.  Ruby/Rails and Smalltalk/Seaside offer a lot of cool, compelling features.&lt;/p&gt;&lt;p /&gt; 
Java has been my language of choice for 9+ years (since early 1996.)  With the help of Dani Pletter, I wrote a framework of domain specific languages that sat on top of the JVM for building web applications (SmartMode.)  The syntax for SmartMode was XML with embedded Java.  SmartMode compiled the domain specific languages to byte-code at run-time and shoveled them into the JVM so that one could make a change to a SmartMode managed file and the change would be reflected on the next browser refresh.  The only time the web container needs to be reloaded or restarted is when changes were made to the Database Schema (this is due to Java&#039;s strong typing.)  Dani and I were able to write applications about 10 times faster with SmartMode than with other Java tools (we built SmartMode in 2000-2001, at the time Struts was in its infancy and there were very few good OR mapping tools.)&lt;br /&gt;&lt;br /&gt;SmartMode included DSLs for Object-Relational-XML Mapping (it generated Java classes that knew how to persist themselves, call stored procedures, and update the database schema and stored procedures automatically [kind of like migrations.]), Web site navigation including access control, multi-page, multi-object Object-HTML-Object mapping (it included state management, support for multiple forms in multiple browser windows, field level validation, etc. much like ActiveRecord validation mixed with a sub-set of Seaside&#039;s state management) and a Collection-&amp;gt;HTML Table generator (this tool was much maligned, but the more times I have to iterate over objects to create HTML tables, the more I miss it.)&lt;br /&gt;&lt;br /&gt;After 5 years, it was clear that SmartMode was long in the tooth.  We never managed to open source it, although we&#039;ve been trying for almost 2 years.  That kind of made me start looking for a new environment to program in.  It would have taken a lot of effort to retool SmartMode for AJAX and quite frankly, the world doesn&#039;t need another Java framework.&lt;br /&gt;&lt;br /&gt;I looked at Spring for about 5 minutes.  It&#039;s a bloated pig.  I know it&#039;s slimmed down versus other Java frameworks, but if I have to write an XML file and 3 Java files just to get &amp;quot;Hello World!&amp;quot; it&#039;s a bloated pig.  And while Spring is all about Inversion of Control, it doesn&#039;t feel like any well done IoC app I&#039;ve ever seen.&lt;br /&gt;&lt;br /&gt;A side-note... the all-around best development environment I ever used was NextStep.  NextStep (now Mac OS X) is built on Objective-C.  ObjC is a series of SmallTalk style object extensions to the C language.  It&#039;s dynamically typed like SmallTalk.  There is much message passing.  The GUI and application framework that sits on top of ObjC is a beautiful message based framework that allows for the creation of GUI and other applications in very short order.  To give an example, I wrote the GUI for Mesa (http://www.plsys.co.uk/mesa.htm) in about 4 or 5 weeks.  When I went to write Mesa 2 (http://sundialsystems.com/mesa/index.html) it took me over 4 months to replicate a subset of Mesa&#039;s functionality using C++ and OS/2&#039;s Presentation Manager.  ObjC/OS X and SmallTalk are all about Inversion of Control and most responses to UI messages are 6 or 7 lines of code rather than the bloat that&#039;s required for a statically typed system that is requires that the developer handle the plumbing of a UI or Web request.&lt;br /&gt;&lt;br /&gt;In November, I started looking at Ruby/Rails.  My first impression was that it was very SmartMode-like.  The first thing Rails did was create the framework of an application for you.  You started filling in blanks.  Rails has a built-in web server, so with very little configuration, you can see the results of your application in your browser.  The flash-to-bang time for Rails is amazingly short.  ActiveRecord (Rails&#039; Object-Relational mapping layer) does most of the basic CRUD (Create, Read, Update, Delete) stuff that you need to do with a database very easily.  ActiveRecord has marginal, but allegedly improving, support for complex OR mapping tasks.  Between Rails and Open Source Web Design (oswd.org) one can build a simple web site very very quickly.&lt;br /&gt;&lt;br /&gt;Ruby as a language is an amalgam of Perl, SmallTalk, Lisp, and a few other languages.  As a Java developer, I was able to pick up Ruby in 30 seconds (okay, my propensity for picking up new languages is quite good, but still, compared to OCaml, Ruby was a walk in the park.)  It figure the average Java developer should be writing reasonable Ruby code in a week.  If the developer had Visual Basic experience, it&#039;ll take less time.&lt;br /&gt;&lt;br /&gt;As a dynamically typed language, Ruby gets almost everything right at the syntactic level.  It&#039;s really beautiful to read and write.  It&#039;s very expressive and, with the exception of some of the meta-programming constructs, most of Ruby makes sense to any Java, C, C++, etc. programmer.&lt;br /&gt;&lt;br /&gt;So... I was totally loving Ruby.  Until I started to push the language and the runtime.&lt;br /&gt;&lt;br /&gt;The Ruby interpreter (there is no Virtual Machine although there are many alleged to be in development) is dog slow.  The best performance I&#039;ve seen, Ruby is 7 times slower than Java (this is for a short process, including JVM start-up time that spent most other the Ruby time doing RegEx.)  Most hard-core Ruby tasks take 50-100 times more time than Java and in the case of some hard-core outliers, Java is 1,000 times faster than Ruby.&lt;br /&gt;&lt;br /&gt;The Ruby runtime is not stable.  I&#039;ve crashed it repeatedly doing floating point math.&lt;br /&gt;&lt;br /&gt;Ruby strings are based on 8 bit characters.  While there are a variety of UTF-8 libraries for Ruby, basic methods like &#039;length&#039; return the number of bytes, not characters, in a string.  This is especially surprising given that Ruby was developed in Japan.&lt;br /&gt;&lt;br /&gt;The current version of Ruby is 1.8.4.  Ruby has been at 1.8 since 2000.  Version 2.0 will not be available for at least 18 months.  This is a very long cycle, but is due to the fact that Matz seems to be the only one writing most of Ruby&#039;s core interpreter and libraries.&lt;br /&gt;&lt;br /&gt;There&#039;s no viable Ruby debugger.  In order to debug a Ruby app, you&#039;ve gotta use printfs.  I kid you not.&lt;br /&gt;&lt;br /&gt;Finally, the Ruby interpreter runs on Green Threads, so it can&#039;t make use of more than 1 CPU on the new wave of SMP machines.  This is due in large part to the underlying IO structure and the way Ruby talks to C programs.  It would break many of the existing C libraries if Ruby moved to a native threads model.&lt;br /&gt;&lt;br /&gt;For the standard fast_cgi deployment of Rails applications, very few of the above issues have a material impact and the programmer productivity gain of Rails versus Spring/J2EE (about 10x) justifies buying marginally more hardware to run more Rails processes (note that most of the time servicing web requests is spent in the database so the Ruby slowness issue translates to a 1.5-2x increase in the amount of CPU needed to service the Ruby process vs. a similar Java application.)&lt;br /&gt;&lt;br /&gt;Rails is amazing, but has its issues as well.  It is almost entirely defined around the concept that a web page request translates into a database query/update and the resultant display.  This is true in the simple case.  However, Rails doesn&#039;t have much of a security model, either at the page access level or at the database level.  Thus, each page must be protected either with code in the controller or with some third party &amp;quot;engine.&amp;quot;  The existing user management engines are binary in the way the protect pages: users that are logged in can see everything and all other users can only see the &amp;quot;public&amp;quot; pages.  Objects pulled from the database must each be checked to see if they belong to the user that is accessing them.  There are scant mechanisms to filter objects in a way that users can only see what they own.  Further, the Rails methodology of including database primary keys as part of the URL perpetuates the issue because it&#039;s very easy to change the ID in the URL and see data that belongs to others.&lt;br /&gt;&lt;br /&gt;Rails has the notion that all state with the exception of the ID of the user for the current session should be kept in the database or passed as part of a web request.  This means that making multi-step processes (e.g., checking out of a store, managing a shopping cart) is very difficult and prone to failure.  It also means that there is a lot of database traffic for each page load.  It also also means that COMET style (http://en.wikipedia.org/wiki/Comet_%28programming%29) web app development is very, very difficult.  On the other hand, scaling Rails deployments is brain-dead simple and if one of the fast_cgi processes dies, no state is lost... the user just needs to hit reload.&lt;br /&gt;&lt;br /&gt;Rails also has a bunch of security vulnerabilities.  The recent 1.1.4-1.1.5-1.1.6 3 day upgrade-o-rama fixed the ability for an attacker to execute arbitrary code on your server if they knew where the code was relative to the Ruby code.  This is because files are included by creating paths to the files in the file system and sometimes URIs are merely appended to the paths... well you get the idea.  Every Rails form submission can change any attribute on an ActiveRecord object unless the programmer has taken the affirmative step to filter out the fields returned from a POST based on the fields put in the form originally.  This means that an attacker can change the primary key of an object by appending ?foo_id=44 to a web post and voila, the object has a new primary key and can over-write another object.  There are other lurking vulnerabilities as well.  But at this point in time, Rails is as insecure as PHP was 5 years ago.&lt;br /&gt;&lt;br /&gt;For building a simple CRUD app, there&#039;s still nothing better than Rails.  For any application requiring complex user interaction or multiple user interaction, Rails is not the best solution.&lt;br /&gt;&lt;br /&gt;I have spent the last 4 days playing with Seaside (http://seaside.st)  Seaside is a Smalltalk web application framework.  It takes a 180 degree different approach to building web apps than does Rails.  First... some background.&lt;br /&gt;&lt;br /&gt;Smalltalk is the superclass of all object oriented programming systems.  It&#039;s a dynamically typed, everything is an object, language that runs on top of its own virtual machine.  It was originally developed at Xerox PARC (now known as PARC) in the 70&#039;s.  It was created in an era of limited computing resources, networks, mice, graphical displays, etc.  It&#039;s syntactically nice (not as beautiful as Ruby, but a whole like prettier than Java.)  Its performance seems to be very good.  It seems to be very stable (I&#039;m using Squeak http://www.squeak.org/ )&lt;br /&gt;&lt;br /&gt;Squeak is maintained by folks like Allan Kay.  As opposed to being &amp;quot;language hobbyists&amp;quot; (as some folks refer to Matz) these guys are the fathers of Object Oriented programming and were around for the creation of TCP/IP and most of the other things we consider advances in computing.&lt;br /&gt;&lt;br /&gt;Everything in Smalltalk is an object.  Smalltalk originated as a systems programming language (as did C) and has built in process control, etc.  However, Smalltalk objects are all live and can be modified on the fly in the running Smalltalk system.  This means you can get an exception in a running process, debug the exception by changing code, hit &amp;quot;go&amp;quot; and the process will resume where things broke.  Yes... it&#039;s that good.  It&#039;s that flexible.&lt;br /&gt;&lt;br /&gt;With the caveat that I haven&#039;t tried to beat Squeak into a bloody pulp with 90M record text files, etc., I believe that it&#039;s a very stable runtime.&lt;br /&gt;&lt;br /&gt;Smalltalk has code blocks you can pass around (in fact, almost everything is a code block that&#039;s passed around.)  Smalltalk easily allows you to build &amp;quot;continuations.&amp;quot;  You can say &amp;quot;take a snapshot of the current thread context, save it (in a hash table, array, local variable, instance variable), and start executing it later.&amp;quot;  This has very important implications for creating non-linear programs using a linear syntax (and we all think linearly.)&lt;br /&gt;&lt;br /&gt;Seaside takes advantage of Smalltalk&#039;s continuations by allowing the developer to put different components on a page at the same time and each of the actions of the components (expressed as HTML &amp;lt;a hrefs&amp;gt; or form field) executes some code when it happens.  Okay, this can be done with Java (think about a program littered with anonymous inner classes) or Ruby (lots of closures.)  For example:&lt;br /&gt;html link: &#039;add one&#039; do: [self count: self count + 1 ] .&lt;br /&gt;html link: &#039;reset&#039; do: [self count: 0 ] .&lt;br /&gt;&lt;br /&gt;However, Seaside also allows a &amp;quot;call:&amp;quot; construct which is done in the flow of the Smalltalk program.  You &amp;quot;call:&amp;quot; another Seaside component which is substituted in the HTML display for the calling component and the results of the called component are returned in the normal flow of the caller.  So, it would look something like:&lt;br /&gt;address := self call: AddressForm new .&lt;br /&gt;(address inState: &#039;NY&#039; ) ifTrue: [self alert: &#039;We don&#039;t like New Yorkers&#039; ] .&lt;br /&gt;&lt;br /&gt;The AddressForm would be substituted in the DIV where the other HTML content was (that div could be the whole HTML page or just the part of the user checkout) and the user could fill in the right values, the AddressForm could span an arbitrary number of HTTP request/response cycles, validate stuff and when it was successfully complete, the flow of control would return to the caller which tests to see if the address was in New York.&lt;br /&gt;&lt;br /&gt;We did stuff like this in SmartMode, but SmartMode could only handle a single multi-page form at once.  Seaside can handle the state of an arbitrary number of objects on a page at the same time.  So, you could have your address form, your chat with the sales person form, etc. all on the same page and Seaside takes care of managing the state among all the objects, etc.&lt;br /&gt;&lt;br /&gt;Seaside correctly manages multiple browser windows open to the same form on the same site.  Seaside correctly treats each browser window as a separate logical session.&lt;br /&gt;&lt;br /&gt;Seaside also deals correctly with state changes resulting from the back button (it does this by saving continuation snapshots of all the components that are rendered for each page load.)  And Seaside has transactional isolation so that the back button won&#039;t let you go back to a page after your credit card has been cleared.&lt;br /&gt;&lt;br /&gt;If all of this isn&#039;t cool enough, you can write your entire Seaside application in the browser.  Seaside will display the entire Smalltalk object hierarchy for you, let you add, edit, and remove methods and classes, change CSS, etc. all in the browser and you see that changes in your application.  If your app throws an exception, you can fix the code that caused the exception in the browser, hit &amp;quot;try again&amp;quot; and see how things change.  &lt;br /&gt;&lt;br /&gt;Seaside is very secure in terms of how the responses are handled.  Each link and each form element has a unique ID and if that ID doesn&#039;t exist in the runtime, it&#039;s thrown away.  This means doing replay attacks is not possible.  It means that hidden links are useless outside of the current browser&#039;s state.  It means that you can&#039;t add a parameter to an HTTP request and change the ID of a database object.  It also means that QAing a Seaside app is more difficult because automated tools won&#039;t work.&lt;br /&gt;&lt;br /&gt;Finally, Seaside has amazing AJAX integration.  Because Seaside manages what needs to be served as part of an HTTP request, it determines if all the components on a page need to be re-rendered (e.g., a Web 1.0 page load) or if only a particular component needs to be re-rendered (a component or two or three that were made dirty by an AJAX request.)&lt;br /&gt;&lt;br /&gt;DabbleDB was done in Seaside and the main Dabble developers are the guys who maintain Seaside.  Everyone I know who has played with Dabble thinks it&#039;s the best web app ever.&lt;br /&gt;&lt;br /&gt;So... what&#039;s wrong with Seaside.  Well:&lt;br /&gt;- There&#039;s no stable, well maintained Object-Relational mapping layer.&lt;br /&gt;- There&#039;s no documentation (it&#039;s worse than the lack of documentation for Ruby/Rails)&lt;br /&gt;- There&#039;s no HTML layer.  All the HTML is rendered programmatically.  This is not like CGIs from days of yore.  This is html div: [ html text: &#039;foo&#039; . html text: &#039;bar&#039; .]  It makes sense because all the formatting is done with CSS, but still, without a graphical HTML editor, it&#039;s a challenge.&lt;br /&gt;- All the state is managed in the Smalltalk image.  If the Smalltalk engine crashes, so does the state.  It also means that all requests for a particular user be sent to the same Smalltalk instance (this is doable for load balancers, but requires more work.)&lt;br /&gt;- There&#039;s a smaller community around Seaside and it may not reach critical mass.&lt;br /&gt;- It requires a totally new way of thinking.  It&#039;s not just IoC, it&#039;s much much more.  While Rails has a shallow learning curve for Java, JSP, PHP, Python guys, Seaside is much, much different.&lt;br /&gt;&lt;br /&gt;So... why this rant?  Well... even though haven&#039;t gotten to my &amp;quot;hate&amp;quot; point with Seaside (I&#039;ve gotten to that point with most technologies, although with NextStep and Java, I came back to loving them... with Ruby, the jury&#039;s still out) I think it&#039;s got the right pieces parts to make it a quantum shift in web development.  I think the kind of apps that could be commonplace with Seaside are totally not doable with any other web technology.  But... I needed to get a lot of this stuff off my chest.&lt;br /&gt;&lt;br /&gt;If any of you have a chance to check out Seaside, it&#039;s worth 4 hours of time.  I&#039;m interested in what you think.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
 
    </content:encoded>

    <pubDate>Sun, 20 Aug 2006 12:00:00 -0700</pubDate>
    <guid isPermaLink="false">http://blog.lostlake.org/index.php?/archives/7-guid.html</guid>
    
</item>

</channel>
</rss>