Return-Path: Delivered-To: apmail-incubator-esme-dev-archive@minotaur.apache.org Received: (qmail 25813 invoked from network); 8 Nov 2010 14:08:04 -0000 Received: from unknown (HELO mail.apache.org) (140.211.11.3) by 140.211.11.9 with SMTP; 8 Nov 2010 14:08:04 -0000 Received: (qmail 12620 invoked by uid 500); 8 Nov 2010 14:08:36 -0000 Delivered-To: apmail-incubator-esme-dev-archive@incubator.apache.org Received: (qmail 12548 invoked by uid 500); 8 Nov 2010 14:08:34 -0000 Mailing-List: contact esme-dev-help@incubator.apache.org; run by ezmlm Precedence: bulk List-Help: List-Unsubscribe: List-Post: List-Id: Reply-To: esme-dev@incubator.apache.org Delivered-To: mailing list esme-dev@incubator.apache.org Received: (qmail 12524 invoked by uid 99); 8 Nov 2010 14:08:33 -0000 Received: from athena.apache.org (HELO athena.apache.org) (140.211.11.136) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 08 Nov 2010 14:08:33 +0000 X-ASF-Spam-Status: No, hits=2.5 required=10.0 tests=FREEMAIL_FROM,FREEMAIL_REPLY,RCVD_IN_DNSWL_NONE,SPF_PASS,T_TO_NO_BRKTS_FREEMAIL X-Spam-Check-By: apache.org Received-SPF: pass (athena.apache.org: domain of hirsch.dick@gmail.com designates 209.85.214.175 as permitted sender) Received: from [209.85.214.175] (HELO mail-iw0-f175.google.com) (209.85.214.175) by apache.org (qpsmtpd/0.29) with ESMTP; Mon, 08 Nov 2010 14:08:29 +0000 Received: by iwn42 with SMTP id 42so6203915iwn.6 for ; Mon, 08 Nov 2010 06:08:08 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=domainkey-signature:mime-version:received:received:in-reply-to :references:date:message-id:subject:from:to:content-type :content-transfer-encoding; bh=IUIExXYYv4lpBErjCMTwsYALyMQNGUlWioeCrnFeEok=; b=ahCbezGqCY+rYTmpnvBRYRwVwx5ybEsKyLlkXBRRjWlPKGtvcj1ejqSTANaR796AUs xFOQeSPu/qReCbfdtuzhR2wqTKw0j6vPPXXGrHfAaj3UwVwE0S3kjZvU97x/GwCi/LxZ 9aRbEwzUZdfT08r3INsnvKz+vdkzV6fvMnZeA= DomainKey-Signature: a=rsa-sha1; c=nofws; d=gmail.com; s=gamma; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :content-type:content-transfer-encoding; b=daIAZPNMWgApsSf1eRAfiKpjiLSYh/jMm5/FmRlV0bT8YzCy+pF5ks4QzXmIfjicrC bIETIefv6EgV5A+rzOzhIYK0HyLekEj/k47atf7MOY4GgpEbZ7kkmN9fu3+uceRtsAOP nybRhv/W4VoYzo8wB5YncupHaGPBuxRfPfrqA= MIME-Version: 1.0 Received: by 10.231.12.2 with SMTP id v2mr3897391ibv.3.1289225285835; Mon, 08 Nov 2010 06:08:05 -0800 (PST) Received: by 10.231.33.10 with HTTP; Mon, 8 Nov 2010 06:08:05 -0800 (PST) In-Reply-To: References: Date: Mon, 8 Nov 2010 15:08:05 +0100 Message-ID: Subject: Re: The 'other' Anne breaks the timeline From: Richard Hirsch To: esme-dev@incubator.apache.org Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable On Mon, Nov 8, 2010 at 2:57 PM, Vassil Dichev wrote: > The invisible messages are "invisible" because they are not saved to > the database. This means that: > 1) if you grab a list of the last 40 messages in Anne's timeline, you > won't get to see the "invisible" ones > 2) "invisible" messages don't survive a restart But look at this user's timeline: http://esmecloudserverapache.dickhirsch.staxapps.net/user/matyjas He also has information from an RSS feed. Some of it is from Sunday which is before the last restart. Aren't these messages also "invisible"? > 3) "invisible" messages cannot be retrieved using a query, but only > via some listener actor > > There is an easy way to catch one of these messages in your timeline- > just bind the "every X mins" test to a "resend" action. I don't think > it's just as easy to make a wish come true though ;-) > > Maybe it's clearer if call these messages non-persistent than > invisible and then some of these phenomena would also be > self-explanatory. > > Vassil > > > On Mon, Nov 8, 2010 at 3:09 PM, Ethan Jewett wrote: >> Yup, that is the beginning of it. The end-game comes in Message.scala, a= t >> line 370. It looks like it fails before the nameMap method gets called. >> Makes me think maybe it is a message with an at_name element that exists= but >> with an id that is blank, or something like that. >> >> Is there any way we can grab a a list of the last 40 or so messages in >> Anne's timeline off of the database? Would that be OK Anne? >> >> On the unrelated topic, the fabled "invisible messages" are messages tha= t >> are generated by "every X mins" action tests. I believe they have mailbo= x >> reason RegularReason. What actually seems to happen when you set up an >> action with a test like this is that an Action is set up to listen for o= ne >> of these messages and then do something. There is also a timer set up th= at >> sends one of these messages at the specified interval. These messages ar= e >> not displayed in the timeline, but some queries don't properly restrict = them >> out of the query scope. When you search for the last 40 messages in my >> mailbox with no restriction on MailboxReason, then a lot of the messages >> that come back will be invisible. If there are 40 or these invisible >> messages, they push all other messages out of the mailbox and I appear t= o >> have a blank timeline. We fixed this problem for normal mailbox operatio= ns >> several months ago, but I think maybe we missed a query the repopulates = the >> mailbox after a restart. >> >> Rumor has it that if you catch one of these messages in your timeline, y= ou >> get to make a wish ;-) >> >> Ethan >> >> On Mon, Nov 8, 2010 at 12:59 PM, Richard Hirsch w= rote: >> >>> here is the exception - I don't know whether there are two exceptions >>> or just one. >>> >>> I've turned all other logging, so I'll be able to keep closer tabs on >>> the instance. >>> >>> This line is interesting : >>> org.apache.esme.snippet.UserDisplay$.userInfo(UserDisplay.scala:63) >>> >>> What do you mean by "invisible messages"? >>> >>> D. >>> >>> --------------- >>> >>> ERROR - Array(scala.collection.Map$class.default(Map.scala:169), >>> scala.collection.immutable.EmptyMap.default(EmptyMap.scala:22), >>> scala.collection.Map$class.apply(Map.scala:80), >>> scala.collection.immutable.EmptyMap.apply(EmptyMap.scala:22), >>> >>> org.apache.esme.model.Message$$anonfun$toXml$3$$anonfun$apply$10$$anonf= un$apply$11.apply(Message.scala:371), >>> >>> org.apache.esme.model.Message$$anonfun$toXml$3$$anonfun$apply$10$$anonf= un$apply$11.apply(Message.scala:370), >>> scala.Option.map(Option.scala:70), >>> >>> org.apache.esme.model.Message$$anonfun$toXml$3$$anonfun$apply$10.apply(= Message.scala:370), >>> >>> org.apache.esme.model.Message$$anonfun$toXml$3$$anonfun$apply$10.apply(= Message.scala:368), >>> scala.Seq$class.map(Seq.scala:280), >>> scala.xml.NodeSeq.map(NodeSeq.scala:34), >>> org.apache.esme.model.Message$$anonfun$toXml$3.apply(Message.scala:368)= , >>> org.apache.esme.model.Message$$anonfun$toXml$3.apply(Message.scala:368)= , >>> scala.Seq$class.map(Seq.scala:280), >>> scala.xml.NodeSeq.map(NodeSeq.scala:34), >>> org.apache.esme.model.Message.toXml(Message.scala:368), >>> org.apache.esme.model.Message.digestedXHTML(Message.scala:384), >>> >>> org.apache.esme.lib.MessageUtils$$anonfun$bindMessages$1.apply(MessageU= tils.scala:47), >>> >>> org.apache.esme.lib.MessageUtils$$anonfun$bindMessages$1.apply(MessageU= tils.scala:43), >>> scala.List.flatMap(List.scala:1132), >>> org.apache.esme.lib.MessageUtils$.bindMessages(MessageUtils.scala:43), >>> >>> org.apache.esme.snippet.UserDisplay$$anonfun$userInfo$3.apply(UserDispl= ay.scala:70), >>> >>> org.apache.esme.snippet.UserDisplay$$anonfun$userInfo$3.apply(UserDispl= ay.scala:70), >>> >>> net.liftweb.util.BindHelpers$FuncBindParam.calcValue(BindHelpers.scala:= 227), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1$$anon= fun$apply$24.apply(BindHelpers.scala:499), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1$$anon= fun$apply$24.apply(BindHelpers.scala:492), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:491), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:490), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.in_bind$1(BindHelpers.scal= a:490), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:512), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:490), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.in_bind$1(BindHelpers.scal= a:490), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:512), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:490), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.in_bind$1(BindHelpers.scal= a:490), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:512), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:490), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.in_bind$1(BindHelpers.scal= a:490), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:512), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:490), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.in_bind$1(BindHelpers.scal= a:490), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:512), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:490), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.in_bind$1(BindHelpers.scal= a:490), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:512), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:490), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.in_bind$1(BindHelpers.scal= a:490), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:512), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2$$anonfun$in_bind$1$1.apply= (BindHelpers.scala:490), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.in_bind$1(BindHelpers.scal= a:490), >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.apply(BindHelpers.scala:51= 7), >>> net.liftweb.util.BindHelpers$$anonfun$bind$2.apply(BindHelpers.scala:47= 5), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.util.BindHelpers$class.bind(BindHelpers.scala:475), >>> net.liftweb.util.Helpers$.bind(Helpers.scala:34), >>> net.liftweb.util.BindHelpers$class.bind(BindHelpers.scala:444), >>> net.liftweb.util.Helpers$.bind(Helpers.scala:34), >>> net.liftweb.util.BindHelpers$class.bind(BindHelpers.scala:414), >>> net.liftweb.util.Helpers$.bind(Helpers.scala:34), >>> org.apache.esme.snippet.UserDisplay$.userInfo(UserDisplay.scala:63), >>> bootstrap.liftweb.Boot$$anonfun$5.apply(Boot.scala:174), >>> bootstrap.liftweb.Boot$$anonfun$5.apply(Boot.scala:174), >>> >>> net.liftweb.http.LiftSession$$anonfun$locSnippet$1$1$$anonfun$apply$65.= apply(LiftSession.scala:905), >>> >>> net.liftweb.http.LiftSession$$anonfun$locSnippet$1$1$$anonfun$apply$65.= apply(LiftSession.scala:905), >>> net.liftweb.common.Full.map(Box.scala:398), >>> >>> net.liftweb.http.LiftSession$$anonfun$locSnippet$1$1.apply(LiftSession.= scala:905), >>> >>> net.liftweb.http.LiftSession$$anonfun$locSnippet$1$1.apply(LiftSession.= scala:904), >>> net.liftweb.common.Full.flatMap(Box.scala:400), >>> net.liftweb.http.LiftSession.locSnippet$1(LiftSession.scala:904), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68$$anonfun$app= ly$70.apply(LiftSession.scala:919), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68$$anonfun$app= ly$70.apply(LiftSession.scala:919), >>> net.liftweb.common.EmptyBox.or(Box.scala:467), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68.apply(LiftSe= ssion.scala:918), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68.apply(LiftSe= ssion.scala:919), >>> net.liftweb.http.S$.doSnippet(S.scala:1749), >>> net.liftweb.http.LiftSession$$anonfun$23.apply(LiftSession.scala:917), >>> net.liftweb.http.LiftSession$$anonfun$23.apply(LiftSession.scala:916), >>> net.liftweb.common.Full.map(Box.scala:398), >>> net.liftweb.http.LiftSession.net >>> $liftweb$http$LiftSession$$processSnippet(LiftSession.scala:916), >>> >>> net.liftweb.http.LiftSession$$anonfun$_defaultLiftTagProcessing$1.apply= (LiftSession.scala:1032), >>> >>> net.liftweb.http.LiftSession$$anonfun$_defaultLiftTagProcessing$1.apply= (LiftSession.scala:1020), >>> net.liftweb.util.NamedPF.apply(NamedPartialFunction.scala:36), >>> net.liftweb.util.NamedPF$.apply(NamedPartialFunction.scala:82), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82$$anonfun$apply$83$$anonfun$apply$84.apply(Li= ftSession.scala:1134), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82$$anonfun$apply$83$$anonfun$apply$84.apply(Li= ftSession.scala:1134), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.S$.setVars(S.scala:1585), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82$$anonfun$apply$83.apply(LiftSession.scala:11= 33), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82$$anonfun$apply$83.apply(LiftSession.scala:11= 33), >>> net.liftweb.http.S$.withAttrs(S.scala:1604), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82.apply(LiftSession.scala:1132), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82.apply(LiftSession.scala:1132), >>> net.liftweb.http.S$.doSnippet(S.scala:1749), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81.apply(LiftSession.scala:1131), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81.apply(LiftSession.scala:1131), >>> net.liftweb.http.LiftSession.net >>> $liftweb$http$LiftSession$$processOrDefer(LiftSession.scala:1116), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1.apply= (LiftSession.scala:1130), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1.apply= (LiftSession.scala:1124), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.http.LiftSession.processSurroundAndInclude(LiftSession.scal= a:1123), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1.apply= (LiftSession.scala:1144), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1.apply= (LiftSession.scala:1124), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.http.LiftSession.processSurroundAndInclude(LiftSession.scal= a:1123), >>> >>> net.liftweb.builtin.snippet.Surround$$anonfun$render$1$$anonfun$apply$2= .apply(Surround.scala:39), >>> >>> net.liftweb.builtin.snippet.Surround$$anonfun$render$1$$anonfun$apply$2= .apply(Surround.scala:36), >>> net.liftweb.common.Full.map(Box.scala:398), >>> >>> net.liftweb.builtin.snippet.Surround$$anonfun$render$1.apply(Surround.s= cala:36), >>> >>> net.liftweb.builtin.snippet.Surround$$anonfun$render$1.apply(Surround.s= cala:35), >>> net.liftweb.common.Full.flatMap(Box.scala:400), >>> net.liftweb.builtin.snippet.Surround$.render(Surround.scala:35), >>> >>> net.liftweb.builtin.snippet.Surround$$anonfun$dispatch$1$$anonfun$apply= $1.apply(Surround.scala:31), >>> >>> net.liftweb.builtin.snippet.Surround$$anonfun$dispatch$1$$anonfun$apply= $1.apply(Surround.scala:31), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68$$anonfun$app= ly$71$$anonfun$apply$73.apply(LiftSession.scala:936), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68$$anonfun$app= ly$71$$anonfun$apply$73.apply(LiftSession.scala:920), >>> net.liftweb.common.EmptyBox.openOr(Box.scala:465), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68$$anonfun$app= ly$71.apply(LiftSession.scala:920), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68$$anonfun$app= ly$71.apply(LiftSession.scala:920), >>> net.liftweb.common.EmptyBox.openOr(Box.scala:465), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68.apply(LiftSe= ssion.scala:919), >>> >>> net.liftweb.http.LiftSession$$anonfun$23$$anonfun$apply$68.apply(LiftSe= ssion.scala:919), >>> net.liftweb.http.S$.doSnippet(S.scala:1749), >>> net.liftweb.http.LiftSession$$anonfun$23.apply(LiftSession.scala:917), >>> net.liftweb.http.LiftSession$$anonfun$23.apply(LiftSession.scala:916), >>> net.liftweb.common.Full.map(Box.scala:398), >>> net.liftweb.http.LiftSession.net >>> $liftweb$http$LiftSession$$processSnippet(LiftSession.scala:916), >>> >>> net.liftweb.http.LiftSession$$anonfun$_defaultLiftTagProcessing$1.apply= (LiftSession.scala:1032), >>> >>> net.liftweb.http.LiftSession$$anonfun$_defaultLiftTagProcessing$1.apply= (LiftSession.scala:1020), >>> net.liftweb.util.NamedPF.apply(NamedPartialFunction.scala:36), >>> net.liftweb.util.NamedPF$.apply(NamedPartialFunction.scala:82), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82$$anonfun$apply$83$$anonfun$apply$84.apply(Li= ftSession.scala:1134), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82$$anonfun$apply$83$$anonfun$apply$84.apply(Li= ftSession.scala:1134), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.S$.setVars(S.scala:1585), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82$$anonfun$apply$83.apply(LiftSession.scala:11= 33), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82$$anonfun$apply$83.apply(LiftSession.scala:11= 33), >>> net.liftweb.http.S$.withAttrs(S.scala:1604), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82.apply(LiftSession.scala:1132), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81$$anonfun$apply$82.apply(LiftSession.scala:1132), >>> net.liftweb.http.S$.doSnippet(S.scala:1749), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81.apply(LiftSession.scala:1131), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1$$anon= fun$apply$81.apply(LiftSession.scala:1131), >>> net.liftweb.http.LiftSession.net >>> $liftweb$http$LiftSession$$processOrDefer(LiftSession.scala:1116), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1.apply= (LiftSession.scala:1130), >>> >>> net.liftweb.http.LiftSession$$anonfun$processSurroundAndInclude$1.apply= (LiftSession.scala:1124), >>> scala.Seq$class.flatMap(Seq.scala:294), >>> scala.xml.NodeSeq.flatMap(NodeSeq.scala:34), >>> >>> net.liftweb.http.LiftSession.processSurroundAndInclude(LiftSession.scal= a:1123), >>> >>> net.liftweb.http.LiftSession$$anonfun$processTemplate$1$2.apply(LiftSes= sion.scala:546), >>> >>> net.liftweb.http.LiftSession$$anonfun$processTemplate$1$2.apply(LiftSes= sion.scala:544), >>> net.liftweb.common.Full.map(Box.scala:398), >>> net.liftweb.http.LiftSession.processTemplate$1(LiftSession.scala:544), >>> >>> net.liftweb.http.LiftSession$$anonfun$14$$anonfun$apply$39$$anonfun$app= ly$42.apply(LiftSession.scala:598), >>> >>> net.liftweb.http.LiftSession$$anonfun$14$$anonfun$apply$39$$anonfun$app= ly$42.apply(LiftSession.scala:598), >>> net.liftweb.common.EmptyBox.or(Box.scala:467), >>> >>> net.liftweb.http.LiftSession$$anonfun$14$$anonfun$apply$39.apply(LiftSe= ssion.scala:597), >>> >>> net.liftweb.http.LiftSession$$anonfun$14$$anonfun$apply$39.apply(LiftSe= ssion.scala:597), >>> net.liftweb.util.StackableMaker$class.doWith(Maker.scala:141), >>> net.liftweb.http.Factory$FactoryMaker.doWith(Factory.scala:37), >>> net.liftweb.util.StackableMaker$class.doWith(Maker.scala:135), >>> net.liftweb.http.Factory$FactoryMaker.doWith(Factory.scala:37), >>> net.liftweb.http.LiftSession$$anonfun$14.apply(LiftSession.scala:596), >>> net.liftweb.http.LiftSession$$anonfun$14.apply(LiftSession.scala:591), >>> net.liftweb.common.EmptyBox.or(Box.scala:467), >>> net.liftweb.http.LiftSession.processRequest(LiftSession.scala:591), >>> net.liftweb.http.LiftServlet.net >>> $liftweb$http$LiftServlet$$dispatchStatefulRequest(LiftServlet.scala:28= 5), >>> net.liftweb.http.LiftServlet$$anonfun$3.apply(LiftServlet.scala:188), >>> net.liftweb.http.LiftServlet$$anonfun$3.apply(LiftServlet.scala:188), >>> net.liftweb.http.S$.net$liftweb$http$S$$wrapQuery(S.scala:1042), >>> >>> net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_nest2InnerInit$1$$anon= fun$apply$26.apply(S.scala:1182), >>> net.liftweb.http.S$.net$liftweb$http$S$$doAround(S.scala:979), >>> >>> net.liftweb.http.S$$anonfun$net$liftweb$http$S$$doAround$1.apply(S.scal= a:980), >>> >>> net.liftweb.mapper.MetaProtoExtendedSession$myWrapper$.apply(ProtoExten= dedSession.scala:81), >>> net.liftweb.http.S$.net$liftweb$http$S$$doAround(S.scala:980), >>> >>> net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_nest2InnerInit$1.apply= (S.scala:1180), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.S$.net$liftweb$http$S$$_nest2InnerInit(S.scala:1179), >>> >>> net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$a= pply$29$$anonfun$apply$30$$anonfun$apply$31$$anonfun$apply$32.apply(S.scala= :1205), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.S$.withReq(S.scala:1214), >>> >>> net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$a= pply$29$$anonfun$apply$30$$anonfun$apply$31.apply(S.scala:1204), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$a= pply$29$$anonfun$apply$30.apply(S.scala:1203), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1$$anonfun$a= pply$29.apply(S.scala:1202), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.S$$anonfun$net$liftweb$http$S$$_innerInit$1.apply(S.sc= ala:1201), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.S$.net$liftweb$http$S$$_innerInit(S.scala:1200), >>> >>> net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39$$anonfun$apply$40= $$anonfun$apply$41$$anonfun$apply$42$$anonfun$apply$43.apply(S.scala:1254), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39$$anonfun$apply$40= $$anonfun$apply$41$$anonfun$apply$42.apply(S.scala:1253), >>> net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:329), >>> net.liftweb.http.RequestVarHandler$.apply(Vars.scala:250), >>> >>> net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39$$anonfun$apply$40= $$anonfun$apply$41.apply(S.scala:1252), >>> net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:329), >>> net.liftweb.http.TransientRequestVarHandler$.apply(Vars.scala:254), >>> >>> net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39$$anonfun$apply$40= .apply(S.scala:1251), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.S$$anonfun$_init$1$$anonfun$apply$39.apply(S.scala:125= 0), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.S$$anonfun$_init$1.apply(S.scala:1249), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.S$._init(S.scala:1248), >>> net.liftweb.http.S$.init(S.scala:887), >>> net.liftweb.http.LiftServlet.doService(LiftServlet.scala:187), >>> net.liftweb.http.LiftServlet$$anonfun$doIt$1$1.apply(LiftServlet.scala:= 86), >>> net.liftweb.http.LiftServlet$$anonfun$doIt$1$1.apply(LiftServlet.scala:= 86), >>> net.liftweb.util.TimeHelpers$class.calcTime(TimeHelpers.scala:326), >>> net.liftweb.util.Helpers$.calcTime(Helpers.scala:34), >>> net.liftweb.util.TimeHelpers$class.logTime(TimeHelpers.scala:335), >>> net.liftweb.util.Helpers$.logTime(Helpers.scala:34), >>> net.liftweb.http.LiftServlet.doIt$1(LiftServlet.scala:85), >>> net.liftweb.http.LiftServlet.service(LiftServlet.scala:93), >>> >>> net.liftweb.http.provider.HTTPProvider$$anonfun$service$3.apply(HTTPPro= vider.scala:61), >>> >>> net.liftweb.http.provider.HTTPProvider$$anonfun$service$3.apply(HTTPPro= vider.scala:61), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.URLRewriter$.doWith(Req.scala:618), >>> >>> net.liftweb.http.provider.HTTPProvider$class.service(HTTPProvider.scala= :60), >>> net.liftweb.http.LiftFilter.service(LiftServlet.scala:586), >>> >>> net.liftweb.http.provider.servlet.ServletFilterProvider$class.protected= $service(ServletFilterProvider.scala:67), >>> net.liftweb.http.LiftFilter.protected$service(LiftServlet.scala:586), >>> >>> net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilt= er$1$$anonfun$apply$1.apply(ServletFilterProvider.scala:67), >>> >>> net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilt= er$1$$anonfun$apply$1.apply(ServletFilterProvider.scala:62), >>> >>> net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$= 10$$anonfun$apply$11$$anonfun$apply$12.apply(Vars.scala:335), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$= 10$$anonfun$apply$11.apply(Vars.scala:334), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$= 10.apply(Vars.scala:333), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9.apply(Vars.scal= a:332), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:331), >>> net.liftweb.http.RequestVarHandler$.apply(Vars.scala:250), >>> >>> net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilt= er$1.apply(ServletFilterProvider.scala:61), >>> >>> net.liftweb.http.provider.servlet.ServletFilterProvider$$anonfun$doFilt= er$1.apply(ServletFilterProvider.scala:61), >>> >>> net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$= 10$$anonfun$apply$11$$anonfun$apply$12.apply(Vars.scala:335), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$= 10$$anonfun$apply$11.apply(Vars.scala:334), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9$$anonfun$apply$= 10.apply(Vars.scala:333), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> >>> net.liftweb.http.CoreRequestVarHandler$$anonfun$apply$9.apply(Vars.scal= a:332), >>> net.liftweb.util.ThreadGlobal.doWith(ThreadGlobal.scala:71), >>> net.liftweb.http.CoreRequestVarHandler$class.apply(Vars.scala:331), >>> net.liftweb.http.TransientRequestVarHandler$.apply(Vars.scala:254), >>> >>> net.liftweb.http.provider.servlet.ServletFilterProvider$class.doFilter(= ServletFilterProvider.scala:60), >>> net.liftweb.http.LiftFilter.doFilter(LiftServlet.scala:586), >>> >>> org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(Applic= ationFilterChain.java:235), >>> >>> org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFil= terChain.java:206), >>> >>> org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperVal= ve.java:233), >>> >>> org.apache.catalina.core.StandardContextValve.invoke(StandardContextVal= ve.java:191), >>> >>> org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.jav= a:127), >>> >>> org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.jav= a:102), >>> >>> org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve= .java:109), >>> >>> net.stax.appserver.webapp.RequestMonitorValve.invoke(RequestMonitorValv= e.java:35), >>> >>> net.stax.appserver.admin.StaxApplicationQueryValve.invoke(StaxApplicati= onQueryValve.java:42), >>> >>> net.stax.appserver.webapp.RequestSetupValve.invoke(RequestSetupValve.ja= va:31), >>> org.apache.catalina.valves.RemoteIpValve.invoke(RemoteIpValve.java:632)= , >>> >>> org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:= 298), >>> >>> org.apache.coyote.http11.Http11NioProcessor.process(Http11NioProcessor.= java:883), >>> >>> org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.proc= ess(Http11NioProtocol.java:721), >>> >>> org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.= java:2258), >>> >>> java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecut= or.java:886), >>> >>> java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.j= ava:908), >>> java.lang.Thread.run(Thread.java:619)) >>> >>> On Mon, Nov 8, 2010 at 12:39 PM, Ethan Jewett wrot= e: >>> > Hmmm, Anne's user page isn't working now. Can you check the logs for = the >>> > last 2 hrs? >>> > >>> > My timeline is always like that (empty) after a server restart. I'm n= ot >>> sure >>> > why that happens to me, but I bet it has to do with the invisible >>> messages >>> > in my timeline from the "every 5 mins" actions. I have been meaning t= o >>> try >>> > to refactor and evict those messages into a whole separate messaging >>> > subsystem for the actors, but I haven't even gotten around to thinkin= g >>> about >>> > if that makes sense, much less creating a Jira item for it :-) >>> > >>> > Ethan >>> > >>> > On Mon, Nov 8, 2010 at 10:10 AM, Richard Hirsch >> >wrote: >>> > >>> >> Still looks good - I'll look into the stax log every once in a while >>> >> to see if have any more exceptions. >>> >> >>> >> On Mon, Nov 8, 2010 at 9:08 AM, Richard Hirsch >>> >> wrote: >>> >> > Just deployed on stax with vassil's code change. >>> >> > >>> >> > Anne's timeline is now visible without an error. What is even stra= nger >>> >> > is that ethan's timeline is also visible but just with my last >>> >> > message. Normally Ethan's timeline is empty, so I was a little bit >>> >> > surprised. >>> >> > >>> >> > I'll take another look in 5 minutes to see if everything is still >>> visible >>> >> > >>> >> > D. >>> >> > >>> >> > On Sun, Nov 7, 2010 at 3:59 PM, Richard Hirsch >> > >>> >> wrote: >>> >> >> @vassil Thanks for fixing the bug - it was filling our stax log >>> >> >> >>> >> >> I'll do a new stax deployment tomorrow and then we'll see if the = prob >>> >> >> was the rss feed. >>> >> >> >>> >> >> D. >>> >> >> >>> >> >> On Sat, Nov 6, 2010 at 9:16 AM, Vassil Dichev >>> >> wrote: >>> >> >>> You're right, it doesn't seem like parsing the feed should break= the >>> >> >>> timeline, but it's good to fix this so that we eliminate any dou= bt >>> >> >>> that it causes problems. Besides, it's not a good idea to assume >>> that >>> >> >>> only correctly formatted dates will be passed our way, so I want= ed >>> to >>> >> >>> put an end to ESME-275. >>> >> >>> >>> >> >>> I've just committed a fix and closed the issue. >>> >> >>> >>> >> >>> Vassil >>> >> >>> >>> >> >>> >>> >> >>> On Sat, Nov 6, 2010 at 10:06 AM, Ethan Jewett >>> >> wrote: >>> >> >>>> Dick, >>> >> >>>> >>> >> >>>> If you want to disable my actions to test, that's fine. I'm fai= rly >>> >> >>>> confident my actions are responsible for the stack trace you se= nt. >>> >> >>>> (Thanks for looking in to it Vassil.) >>> >> >>>> >>> >> >>>> I just don't see how an issue with actions could be the cause o= f >>> the >>> >> >>>> timeline issue. As far as I know, loading a timeline does not >>> trigger >>> >> >>>> this action code that is failing. I could definitely be wrong, = but >>> I >>> >> >>>> think there should be a second stack trace or a Lift error mess= age >>> >> >>>> that shows up in the logs when someone tries to load Anne or >>> David's >>> >> >>>> user page. >>> >> >>>> >>> >> >>>> Ethan >>> >> >>>> >>> >> >>>> On Saturday, November 6, 2010, Vassil Dichev >>> >> wrote: >>> >> >>>>> The reason for the stack trace is that a date in an RSS feed >>> cannot >>> >> be >>> >> >>>>> parsed properly, or there is no date at all (which as I see is >>> >> allowed >>> >> >>>>> by the RSS spec). It would help if we can find which RSS feed = is >>> the >>> >> >>>>> culprit, but I will try to come up with a patch anyway. >>> >> >>>>> >>> >> >>>>> Vassil >>> >> >>>>> >>> >> >>>>> >>> >> >>>>> On Sat, Nov 6, 2010 at 9:05 AM, Richard Hirsch < >>> >> hirsch.dick@gmail.com> wrote: >>> >> >>>>>> I'm working on the following assumptions: >>> >> >>>>>> >>> >> >>>>>> =A0 1) =A0that someone anne follows is the culprit >>> >> >>>>>> =A0 2) That the reason is some sort of an action that is call= ed >>> every >>> >> 5 >>> >> >>>>>> minutes or so >>> >> >>>>>> =A0 3) Checking the database shows that the most of these act= ions >>> are >>> >> from Ethan >>> >> >>>>>> >>> >> >>>>>> What I'm going to try is to create a test user and then follo= w >>> the >>> >> >>>>>> users that anne follows. >>> >> >>>>>> >>> >> >>>>>> However, you are correct in saying that I'm following you as = well >>> >> and >>> >> >>>>>> my timeline is working. >>> >> >>>>>> >>> >> >>>>>> If you want, we can wait until I do this test before taking s= uch >>> >> >>>>>> drastic "Big Brother" actions. >>> >> >>>>>> >>> >> >>>>>> D. >>> >> >>>>>> >>> >> >>>>>> >>> >> >>>>>> >>> >> >>>>>> On Fri, Nov 5, 2010 at 8:25 PM, Ethan Jewett >> > >>> >> wrote: >>> >> >>>>>>> I knew I shouldn't have implied it might be me :-) >>> >> >>>>>>> >>> >> >>>>>>> I definitely have RSS actions, but I'm wondering what makes = you >>> >> think it's >>> >> >>>>>>> my actions that are breaking only Anne & Dave's timelines? Y= ou >>> and >>> >> several >>> >> >>>>>>> others follow me, and your timelines are not broken. Before = we >>> saw >>> >> this sort >>> >> >>>>>>> of thing happened because of special characters in some >>> messages, >>> >> right? >>> >> >>>>>>> >>> >> >>>>>>> I'm really wondering if the stack trace you found was the on= ly >>> >> error. I >>> >> >>>>>>> think the stack trace you found was the issue in Jira item >>> >> >>>>>>> https://issues.apache.org/jira/browse/ESME-275 =A0This appea= rs to >>> >> still be >>> >> >>>>>>> unresolved, but I don't think we ever linked it to an issue = with >>> >> displaying >>> >> >>>>>>> a timeline (which should have nothing to do with a feed or >>> action). >>> >> >>>>>>> >>> >> >>>>>>> Ethan >>> >> >>>>>>> >>> >> >>>>>>> On Fri, Nov 5, 2010 at 7:42 PM, Richard Hirsch < >>> >> hirsch.dick@gmail.com>wrote: >>> >> >>>>>>> >>> >> >>>>>>>> Going through the database - looks like Ethan might be the >>> culprit >>> >> - >>> >> >>>>>>>> though I don't know why. >>> >> >>>>>>>> >>> >> >>>>>>>> @Ethan do want to disable your rss actions manually or shou= ld I >>> do >>> >> it >>> >> >>>>>>>> via big brother ;-> >>> >> >>>>>>>> >>> >> >>>>>>>> D. >>> >> >>>>>>>> >>> >> >>>>>>>> On Fri, Nov 5, 2010 at 2:07 PM, Anne Kathrine Petter=F8e >>> >> >>>>>>>> wrote: >>> >> >>>>>>>> > LOL :-) >>> >> >>>>>>>> > >>> >> >>>>>>>> > >>> >> >>>>>>>> > On 5 November 2010 13:29, Ethan Jewett >>> >> wrote: >>> >> >>>>>>>> > >>> >> >>>>>>>> >> I hope it's not me. [Shakes in boots.] =A0 :-) >>> >> >>>>>>>> >> >>> >> >>>>>>>> >> On Fri, Nov 5, 2010 at 12:16 PM, Richard Hirsch < >>> >> hirsch.dick@gmail.com >>> >> >>>>>>>> >> >wrote: >>> >> >>>>>>>> >> >>> >> >>>>>>>> >> > I can look at the DB when I get home and see who the >>> culprit >>> >> is. >>> >> >>>>>>>> >> > >>> >> >>>>>>>> >> > D. >>> >> >>>>>>>> >> > >>> >> >>>>>>>> >> > On Fri, Nov 5, 2010 at 11:44 AM, Anne Kathrine Petter= =F8e >>> >> >>>>>>>> >> > wrote: >>> >> >>>>>>>> >> > > Do we know who has set up an action that would creat= e >>> the >>> >> problem? >>> >> >>>>>>>> >> > > >>> >> >>>>>>>> >> > > /Anne >>> >> >>>>>>>> >> > > >>> >> >>>>>>>> >> > > On 5 November 2010 10:07, Ethan Jewett < >>> esjewett@gmail.com> >>> >> wrote: >>> >> >>>>>>>> >> > > >>> >> >>>>>>>> >> > >> Yup, that would explain it. When you sent the stack >>> trace >>> >> before, >>> >> >>>>>>>> was >>> >> >>>>>>>> >> > that >>> >> >>>>>>>> >> > >> the only one that you saw in the Stax environment o= r >>> where >>> >> there >>> >> >>>>>>>> >> others? >>> >> >>>>>>>> >> > >> >>> >> >>>>>>>> >> > >> Ethan >>> >> >>>>>>>> >> > >> >>> >> >>>>>>>> >> > >> On Fri, Nov 5, 2010 at 9:34 AM, Richard Hirsch < >>> >> >>>>>>>> hirsch.dick@gmail.com >>> >> >>>>>>>> >> > >> >wrote: >>> >> >>>>> -- >>> >> >>>>> Twitter: http://twitter.com/vdichev >>> >> >>>>> Blog: http://speaking-my-language.blogspot.com >>> >> >>>>> >>> >> >>>> >>> >> >>> >>> >> >>> >>> >> >>> >>> >> >>> -- >>> >> >>> Twitter: http://twitter.com/vdichev >>> >> >>> Blog: http://speaking-my-language.blogspot.com >>> >> >>> >>> >> >> >>> >> > >>> >> >>> > >>> >> > > > > -- > Twitter: http://twitter.com/vdichev > Blog: http://speaking-my-language.blogspot.com >