Here are my comments on the proposal at http://wiki.opensocial.org/index.php?title=Temporary_vars_in_templates_and_data_pipelining&oldid=3812:
- Allowing both <os:Var key="a" value="${foo}"/> and <os:Var key="a">${foo}</os:Var> seems redundant. Let's pick one. Which one depends on the kinds of usages we want.
- The array examples show defining constant arrays. They should show how a dynamic array can be made. For example, are repeaters expected to work inside <os:Var>?
- The syntax for defining arrays looks overly verbose, and, arbitrarily, favors arrays but not dictionaries. Perhaps allowing JSON would be better? I really dislike defining "special" tags like <Array> and <Item>.
In general, I liked Adam's original proposal of <os:Var key="a" value="${foo}"/>, where value could evaluate to an object. Putting value in the content seems like a workable solution - as long as the content gets EL expressions evaluated.
Adding @type and special array syntax seems like a lot of complexity, and I'm not sure I see the advantage, since this doesn't really show how to create complex objects other than hard-coding them.
--
You received this message because you are subscribed to the Google Groups "OpenSocial and Gadgets Specification Discussion" group.
To post to this group, send email to opensocial-an...@googlegroups.com.
To unsubscribe from this group, send email to opensocial-and-gadg...@googlegroups.com.
For more options, visit this group at http://groups.google.com/group/opensocial-and-gadgets-spec?hl=en.
- The array examples show defining constant arrays. They should show how a dynamic array can be made. For example, are repeaters expected to work inside <os:Var>?
-1 on dynamic arrays inside templates. As mentioned above - maybe in Data Pipelining?
The alternating color row is one of the prime use cases for defining
> You end up needing full expression support for common HTML use
> cases (mod operator for alternating background colors, + operator for
> correct pagination if it is 0 based),
literal arrays.
I firmly believe we will see the EL and templating
drift toward a full programming language over time. Once it achieve
adequate functionality there will be many use cases where use of
Javascript is disallowed.
Making that change is akin to making os:Var useless. If the object
> A possibility is saying you can only do <os:Var key="foo" value="${bar}"/>
> and if ${bar} evaluates to an array, that's the only way to
> set an array variable.
being assigned is already an array, why would I ever both re-assigning
it to another variable name.
> A possibility is saying you can only do <os:Var key="foo" value="${bar}"/>
> and if ${bar} evaluates to an array, that's the only way to
> set an array variable.
Making that change is akin to making os:Var useless. If the object
being assigned is already an array, why would I ever both re-assigning
it to another variable name. Our offer to accept the param-as-XML-
elements argument for creating arrays that is going on in the thread
on clarifying template parameters is contingent on os:Var including an
alternate syntax for creating complex array constructs. Lev has
stated at least twice he finds the syntax too verbose, so we are open
to hearing an alternative syntax proposed, but we're not willing to
strike the array syntax in its entirety.
[1]
<os:Var key="saveKeystrokes" value="${a.really.long.expression.that.is.used.repeatedly}"/>
${saveKeystrokes.aProperty} ${saveKeystrokes.anotherProperty}
[2]
<os:Var key="sum" value="0"/>
<os:Repeat expression="${some.list.of.integers}">
<os:Var key="sum" value=${sum + Cur}/>
</os:Repeat>
To unsubscribe from this group, send email to opensocial-and-gadg...@googlegroups.com.
<os:Repeat expression="${some.list.of.integers}">
<os:Var key="sum" value=${sum + Cur}/>
</os:Repeat>To unsubscribe from this group, send email to opensocial-and-gadg...@googlegroups.com.For more options, visit this group at http://groups.google.com/group/opensocial-and-gadgets-spec?hl=.
For more options, visit this group at http://groups.google.com/group/opensocial-and-gadgets-spec?hl=en.
What is your objection to this example?
Hmm.. Ok... I think such optimized processing may be very difficult in the ad-hoc world of templates (I was once involved in implementing something similar in a much more structured setting). But yes, it would be completely impossible with the accumulator use case above.
But what about using <os:Var> inside of loops like this:
<div repeat="${friends}">
<os:Var key="address" value="${Cur.addresses[0]}"/>
${Cur.name} lives at ${address.street} in ${address.city}
</div>
Perhaps we should say that <os:Var> works in the local scope of the innermost repeater or custom tag?
> ...
>
> read more »
To further illustrate why reassignment with os:Var isn't creating any
new issues, we can look at doing the same thing with the javascript
API as with os:Var.
<div repeat="${activities}">
${title} Activity ${Context.Index + 1} of ${Context.Count}
<osVar key="somevar" value="${Cur.title" />
</div>
versus
<div repeat="${activities}">
${title} Activity ${Context.Index + 1} of ${Context.Count}
<script type="text/javascript">
opensocial.data.getDataContext().putDataSet("somevar", "$
{Cur.title}");
</script>
</div>
> ...
>
> read more »
My feeling is that in these situations we should be erring on the side
of what's good for the developers, not the implementers. We're
building this as a platform for developers, after all. Having os:Var
be immutable amounts to making it os:Const, which I disagree with.
I can think of a couple ways to achieve the partial re-render you talk
about while still correctly interpreting os:Var evaluation: Full
evaluation of the template on an in-memory DOM node, then diff the
innerHTML of the two instances and replace the changed areas.
Alternately, walk the DOM tree, evaluating all os:Var instances and
only re-writing DOM sections that have changed.
I'm OK with making os:Var immutable in data pipeline sections, but I
don't see this as a blocking issue for partial template re-rendering.
I also disagree with your statement that this is a relatively minor
developer benefit. I see lots of cases where there is real benefit to
having mutable variables in the template language. Particularly in
views where we're disallowing any app-generated javascript.
> ...
>
> read more »
Thanks for putting this together, Chris. I went trough and added some comments.
I think largely they are cosmetic except for two points:
- I don't see why variables created in inline templates should be global when
custom tag-created vars are temporary. I think the right thing to do is to have
them all be temporary.
- I *really* don't like the ability to put content into <os:Var>, especially
for the purposes of sticking markup into a variable.
> ...
>
> read more »
Lev, to your comments:
1. The choice of making variables from inline templates become global
to the view has to do with the fact that only custom tag template
instances have a unique scope (aka ${My}). Creating scope for inline
templates would involve creating a new scoping construct, which I
wanted to avoid.
2. Markup content defined in a variable seems reasonable, so I wanted
to call it out explicitly. Since we agreed to leave os:Html within
the spec, that would be used to allow proper unescaped display.
With the explicit addition of JSON support, I can't imagine any sane
developer wanting to use an XML syntax to define complex objects.
That leaves the only practical use being for markup.
You seem to be getting hung up on the word "temporary". As written,
this proposal allows both temporary and literal variable creation.
Looking more at the issue of scoping for inline templates, this
appears analogous to how inline JavaScript blocks behave. Declaring a
variable in one script block makes it available to all subsequent
script blocks - it does not restrict the variable just to the block in
which it was declared.
Ex:
<script type="text/javascript">
var foo = "someval";
</script>
... some markup
<script type="text/javascript">
var bar = foo + " other";
</script>
The behavior speced for os:Var matches the behavior of javascript
variables, so this is not an implementation-driven decision, but one
modeled on existing behaviors in JavaScript, which will be familiar to
gadget developers. If we adjust our thinking so that this is not so
much temporary variables as an alternate way of creating variables
within Data Context, this behavior is perfectly logical.
WRT the behavior of markup, we can strike the text from the patch, but
that doesn't address how to handle markup within a variable - it
simply ignores the issue. If the decision is to strip markup (like
accessing via innerText), how would you reconcile this behavior with
the behavior of referencing another variable that already has markup.
Ex:
contents of "some_url_to_html" = <h1>Hello world</h1>
<os:HttpRequest key="myfragment_key_is_long" format="text"
href="some_url_to_html" />
...
<os:Var key="kshort" value="${myfragment_key_is_long}" />
<os:Var key="kshort2" /><h1>Hello world</h1></os:Var>
Given the above example, what would your expected outputs be on the
three variables. My expectation is that they would all have identical
content. Just because the same content is bounced from an external
server doesn't mean it should be mangled. If instead we say that
os:Var strips all markup, then the behavior of using os:Var to create
shortened reference keys becomes broken (case "kshort").
Not having explicit behavior defined on many of these edge cases is
what makes 0.9 such a problematic spec - too much is left for
interpretation. My preference is to define correct and sensible
behavior on the edge cases.
Evan, to your question about scoping the variable, I think your code
has errors in it. My java chops aren't what they were a few years
ago, but in c# that sample code is going to generate a compile time
error. Java and C# require explicit variable declaration and also
allow block-level scoping.
In your java example (assuming c# rule are the same as java):
int sum = 0;
for (int cur : integers)
int sum = sum + cur;
}
You'll get a compilation error because you're redefining a variable in
a narrower scope. If we eliminate the the "int sum =0;" that's above
the loop then you'll get the behavior I think you're going for, which
is the "sum" variable will fall out of scope outside the loop.
JavaScript, in turn, only allows scoping either at the global (window)
level or the function level. Your example is written in a
particularly confusing way, but in all instances the "var sum"
statement is referring to the same variable.
I double checked it with this code and the answer is, in fact, 9 and
var sum = 0;
for (var i = 0; i < integers.length; i++) {
var sum = sum + integers[i];
}
not 3 or 6.
function doit(){
var integers=[1,2,3];
var sum = 3;document.getElementById("answer").innerHTML=sum;
for (var i = 0; i < integers.length; i++) {
var sum = sum + integers[i];
}
}
> (Evan)
> I looked through the example code again and realized that the proposed specThe rules in the os:Var syntax are written to follow the JavaScript
> enhancement allows for declaring the same <os:Var> multiple times in a given
> scope.
scoping rules. That means that if the given variable already exists
in given scope, it is used. If it doesn't exist, it is created on
first reference. Since the client-side execution will be in
JavaScript it seemed logical to follow the same scoping rules. This
doesn't create any problems and actually reduces confusion since it
follows the same rules as JavaScript.
I'd go ahead and edit the patch to remove the section stating that
variables exist across templates, as you've requested.
I'd rather not make only the attribute @value be the only way to
specify values. In cases of complex JSON, this will be difficult to
author for developers and difficult to read.
EX:
<os:Var key="myjson">
{
foo: ["one fish", "two fish", 'red fish', "blue fish"],
bar: {
first: "${firstEL}",
second: 2
}
}
</os:Var>
Rewritten using the @value syntax
<os:Var key="myjson" value="{foo: [\"one fish\", \"two fish\", 'red
fish', \"blue fish\"], bar: { first: \"${firstEL}\", second: 2}}" />
Since, as you acknowledge, the markup could be included within the
attribute value, eliminating use of the innerXML to define values is
not actually restricting values that can be placed in a variable. Any
markup has to be rendered with os:Html (when in html escaping mode),
so allowing this is not introducing any new behavior.
To unsubscribe from this group, send email to opensocial-and-gadg...@googlegroups.com.
> Yes, it will be a compilation error - that was the point I was trying to
> make :)
OpenSocial gadgets don't necessarily have a compilation stage, so I
feel this is an inappropriate comparison to make. We view this entire
spec as functioning as a loosely-typed interpreted language. Imposing
strong typing rules found in compiled languages on this doesn't smell
right to me, given we have to support executing in a JavaScript
environment.
> You would normally not increment sum with a variable declaration - you would
> use a statement, i.e.
A more appropriate tag name might be <os:SetVar > for what we've
proposed. Perhaps that will remove some of the confusion, since the
intent is to set (and possible create) a variable, not declare a
variable for later use.
--
clc
> var sum = *sum *+ integers[i]
Perhaps we've chosen an improper name for the tag. We're modeling
it's behavior on behavior in JavaScript of variable and the <cfset>
tag from ColdFusion (http://livedocs.adobe.com/coldfusion/6.1/htmldocs/
tags-pc5.htm).
OpenSocial gadgets don't necessarily have a compilation stage, so I
> Yes, it will be a compilation error - that was the point I was trying to
> make :)
feel this is an inappropriate comparison to make. We view this entire
spec as functioning as a loosely-typed interpreted language. Imposing
strong typing rules found in compiled languages on this doesn't smell
right to me, given we have to support executing in a JavaScript
environment.
A more appropriate tag name might be <os:SetVar > for what we've
> You would normally not increment sum with a variable declaration - you would
> use a statement, i.e.
proposed. Perhaps that will remove some of the confusion, since the
intent is to set (and possible create) a variable, not declare a
variable for later use.
--
clc
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Sample os:Var Gadget
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<?xml version="1.0" encoding="utf-8"?>
<Module xmlns:os="http://ns.opensocial.org/2008/markup"
xmlns:myspace="http://ns.opensocial.org/2008/x" xmlns:my="http://
ns.opensocial.org/2008/z">
<ModulePrefs title="OsVar Test Gadget" description="Test cases on
osVar"
thumbnail=""
>
<Require feature="opensocial-0.9"/>
<Require feature="opensocial-templates"/>
<Require feature="opensocial-data"/>
</ModulePrefs>
<Content type="html" view="canvas">
<script type="text/os-data">
<os:ViewerRequest key='vwr' />
<os:PeopleRequest key='myfriends' userid="@viewer"
groupid="@friends" />
<os:Var key="dpVar" >I am registered with Data Pipeline</os:Var>
<os:Var key="jsonArrayVar" >[1,"one", "three"]</os:Var>
<os:Var key="jsonObjectVar" >{"id":'jsonId',"displayName":"faux
Person"}</os:Var>
</script>
<script type="text/os-template" tag="vartest:Embedded">
<div style="border:4px solid gray;padding:4px;margin:
10px;float:left;">
vartest:Embedded tag <br/>
<b>My.someVal:</b> ${My.someVal}
</div>
</script>
<script type="text/os-template" tag="vartest:InDefinition">
<os:Var key="altKey" >Built altKey contains someVal: ${My.someVal}</
os:Var>
<div style="border:4px solid red;padding:4px;margin:
10px;float:left;">
vartest:InDefinition tag <br/>
<b>altKey:</b> ${altKey}
</div>
</script>
<script type="text/os-template" tag="vartest:InDefinition2">
<os:Var key="altKey" >Built altKey contains someVal: ${My.someVal}</
os:Var>
<div style="border:4px solid orange;padding:4px;margin:
10px;float:left;">
vartest:InDefinition2 tag <br/>
<b>altKey:</b> ${My.altKey}
</div>
</script>
<script type="text/os-template">
<h1>os:Var Test Cases</h1>
<p>
Testing var "foo"
</p>
<p>Before set: ${foo}</p>
<os:Var key="foo" value="0" />
<p>Initial set: ${foo}</p>
<os:Var key="foo" >${foo + 1}</os:Var>
<p>Added one with EL: ${foo}</p>
<os:Var key="sum" value="0" />
<h3>Looping increment to sum</h3>
<os:Repeat expression="${Top.myfriends}">
<os:Var key="sum" value="${sum+1}" />
<div>
Item: ${Context.Index} is ${Cur.displayName}
</div>
</os:Repeat>
<p>Sum: ${sum}</p>
<hr />
<h2>Custom Tags</h2>
<vartest:Embedded someVal="Created with attr param" />
<vartest:Embedded >
<someVal>Created with Element Param</someVal>
</vartest:Embedded>
<vartest:Embedded >
<os:Var key="someVal">osVar registered value</os:Var>
</vartest:Embedded>
<br style="clear:both;" />
<vartest:InDefinition >
<os:Var key="someVal">Any value will do here</os:Var>
</vartest:InDefinition>
<vartest:InDefinition2 >
<os:Var key="someVal">Another value is good</os:Var>
</vartest:InDefinition2>
<br style="clear:both;" />
<p>Deregistered altKey (should be empty): <span id='afterDeregKey'>$
{altKey}</span></p>
<hr style="clear:left;" />
<h2>Data Pipeline variables</h2>
string: ${dpVar}
<hr />
<h2>Json Data</h2>
jsonArrayVar.length: ${jsonArrayVar.length} <br/>
jsonArrayVar[0]: ${jsonArrayVar[0]} <br/>
jsonArrayVar[1]: ${jsonArrayVar[1]} <br/>
jsonArrayVar[2]: ${jsonArrayVar[2]} <br/>
jsonObjectVar.length: ${jsonObjectVar.length} <br/>
jsonObjectVar.id: ${jsonObjectVar.id} <br/>
jsonObjectVar.displayName: ${jsonObjectVar.displayName} <br/>
<h4>Repeating Data</h4>
<b>jsonArrayVar</b>
<ul>
<li repeat="jsonArrayVar">${Cur}</li>
</ul>
<b>jsonObjectVar</b>
<ul>
<li repeat="jsonObjectVar">${Cur}</li>
</ul>
<script type="text/javascript">
function testKeyDeregistration(){
var el = document.getElementById("afterDeregKey");
if(el.innerHTML.length > 0){
el.style.backgroundColor="red";
el.style.color="white";
}
else{
el.style.backgroundColor="#CCFFCC;";
}
}
testKeyDeregistration();
</script>
</script>
</Content>
</Module>
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rendered os:Var Gadget Result
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://
www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html><head><title>
OsVar Test Gadget
</title>
<!-- script snipped -->
<body >
<div class="xcontentblockview-canvas "
id="_osmlContentBlock_appid166877__osmlContentBlock_0">
<h1>os:Var Test Cases</h1>
<p>
Testing var "foo"
</p>
<p>Before set: </p>
<p>Initial set: 0</p>
<p>Added one with EL: 1</p>
<h3>Looping increment to sum</h3>
<div>
Item: 0 is Tom
</div>
<div>
Item: 1 is Rob Cooper
</div>
<div>
Item: 2 is Philadelphia
</div>
<div>
Item: 3 is annemarie
</div>
<div>
Item: 4 is WES AMC
</div>
<p>Sum: 5</p>
<hr />
<h2>Custom Tags</h2>
<div style="border:4px solid gray;padding:4px;margin:
10px;float:left;">
vartest:Embedded tag <br/>
<b>My.someVal:</b> Created with attr param
</div>
<div style="border:4px solid gray;padding:4px;margin:
10px;float:left;">
vartest:Embedded tag <br/>
<b>My.someVal:</b> Created with Element Param
</div>
<div style="border:4px solid gray;padding:4px;margin:
10px;float:left;">
vartest:Embedded tag <br/>
<b>My.someVal:</b> osVar registered value
</div>
<br style="clear:both;" />
<div style="border:4px solid red;padding:4px;margin:10px;float:left;">
vartest:InDefinition tag <br/>
<b>altKey:</b> Built altKey contains someVal: Any value will do here
</div>
<div style="border:4px solid orange;padding:4px;margin:
10px;float:left;">
vartest:InDefinition2 tag <br/>
<b>altKey:</b> Built altKey contains someVal: Another value is good
</div>
<br style="clear:both;" />
<p>Deregistered altKey (should be empty): <span id='afterDeregKey'></
span></p>
<hr style="clear:left;" />
<h2>Data Pipeline variables</h2>
string: I am registered with Data Pipeline
<hr />
<h2>Json Data</h2>
jsonArrayVar.length: 3 <br/>
jsonArrayVar[0]: 1 <br/>
jsonArrayVar[1]: one <br/>
jsonArrayVar[2]: three <br/>
jsonObjectVar.length: 2 <br/>
jsonObjectVar.id: jsonId <br/>
jsonObjectVar.displayName: faux Person <br/>
<h4>Repeating Data</h4>
<b>jsonArrayVar</b>
<ul>
<li>1</li><li>one</li><li>three</li></ul>
<b>jsonObjectVar</b>
<ul>
<li>[id, jsonId]</li><li>[displayName, faux Person]</li></ul>
<script type="text/javascript">
function testKeyDeregistration(){
var el = document.getElementById("afterDeregKey");
if(el.innerHTML.length > 0){
el.style.backgroundColor="red";
el.style.color="white";
}
else{
el.style.backgroundColor="#CCFFCC;";
}
}
testKeyDeregistration();
</script>
</div>
<script type="text/javascript" >
//<![CDATA[
/*
opensocial.data.getDataContext().putDataSet("vwr",
{"displayName":"joe","hasApp":"true","id":"myspace.com.person.
26000001","msUserType":"RegularUser"});
opensocial.data.getDataContext().putDataSet("myfriends", {"snip"});
opensocial.data.getDataContext().putDataSet("dpVar", "I am registered
with Data Pipeline");
opensocial.data.getDataContext().putDataSet("jsonArrayVar",
"MySpace.DataPipeline.JsonData");
opensocial.data.getDataContext().putDataSet("jsonObjectVar",
"MySpace.DataPipeline.JsonData");
opensocial.data.getDataContext().putDataSet("foo", "1");
opensocial.data.getDataContext().putDataSet("sum", "5");
gadgets.util.registerOnLoadHandler(function(){
MyOpenSpace.ClientRequestProcessor.resolveRequests();
});
*/
//]]>
</script>
<script type="text/javascript" >
//<![CDATA[
/*
opensocial.template._rawTemplates = [];
MyOpenSpace.template.TemplateProcessor.templatesXml
["vartest:Embedded"] = "<Template xmlns:os=\"http://opensocial.org/
templates\" xmlns:vartest=\"http://opensocial.org/templates\">\n<div
style=\"border:4px solid gray;padding:4px;margin:10px;float:left;\">
\nvartest:Embedded tag <br/>\n<b>My.someVal:</b> ${My.someVal}\n</div>
\n </Template>";
MyOpenSpace.template.TemplateProcessor.templatesXml
["vartest:InDefinition"] = "<Template xmlns:os=\"http://opensocial.org/
templates\" xmlns:vartest=\"http://opensocial.org/templates\">\n
<os:Var key=\"altKey\" >Built altKey contains someVal: ${My.someVal}</
os:Var>\n <div style=\"border:4px solid red;padding:4px;margin:
10px;float:left;\">\n vartest:InDefinition tag <br/>\n <b>altKey:</b> $
{altKey}\n </div>\n</Template>";
MyOpenSpace.template.TemplateProcessor.templatesXml
["vartest:InDefinition2"] = "<Template xmlns:os=\"http://
opensocial.org/templates\" xmlns:vartest=\"http://opensocial.org/
templates\">\n <os:Var key=\"altKey\" >Built altKey contains someVal: $
{My.someVal}</os:Var>\n <div style=\"border:4px solid orange;padding:
4px;margin:10px;float:left;\">\n vartest:InDefinition2 tag <br/>\n
<b>altKey:</b> ${My.altKey}\n </div>\n</Template>";
*/
//]]>
</script>
</body></html>
Possible Values:
os:Var (currently proposed)
os:SetVar (alternate one)
os:Set (alternate two - this aligns with cf:set found in
ColdFusion, which this proposal was somewhat modelled on)
Evan, you seem to feel farily strongly that "os:Var" has connotations
of variable declaration, but not (re)assignment. We feel variable
reassignment is an important behavior, even if it's left out of this
round of the spec, and both declaration and assignment should all be
handled by a single tag.
From my perspective, os:SetVar is a horribly clunky name and should be
rejected out of hand. That leaves us with os:Var or os:Set. If we
can get some quick votes from the people following this thread, I'll
update the patch with the next version.
Also, I think we're all getting spec fatigue. I believe the only two
remaining contentious issues are: os:Var behavior as a parameter to a
custom tag instance, and the treatment of markup with os:Var. Would
everyone be comfortable with simply striking these sections from the
proposal and leaving the behavior in these situations undefined for
this round of the spec?
--
clc
> ...
>
> read more »
On Jan 11, 10:02 am, Lane LiaBraaten <lliab...@google.com> wrote:
> Please commit these changes to svn so we can publish RC1 at EOD today. If
> there are particular sections you want to call out for extra attention
> during review, use
>
> <x:draft note="Describe why this section needs special attention"
> href="http://
> example.com">
> ...
> </x:draft>
>
> Thanks,
> Lane
>
> [1]http://wiki.opensocial.org/index.php?title=Spec_Changes#Propose_and_a...
> ...
>
> read more »
On Jan 11, 1:02 pm, Lane LiaBraaten <lliab...@google.com> wrote:
> Please commit these changes to svn so we can publish RC1 at EOD today. If
> there are particular sections you want to call out for extra attention
> during review, use
>
> <x:draft note="Describe why this section needs special attention"
> href="http://
> example.com">
> ...
> </x:draft>
>
> Thanks,
> Lane
>
> [1]http://wiki.opensocial.org/index.php?title=Spec_Changes#Propose_and_a...
> ...
>
> read more »
Lane,
Do you need some help getting RC1 out?
> ...
>
> read more »
> ...
>
> read more »
> ...
>
> read more »