From: James Simmons <nices...@gmail.com>
Date: Sun, Mar 28, 2010 at 8:45 AM
Subject: Re: [Sugar-devel] New Chapter in Make Your Own Sugar
Activities needs review
To: Bert Freudenberg <b...@freudenbergs.de>


Bert,

Thanks much.  I'll fix Sugar Commander and the chapter per your
instructions.  There is NO WAY I would have figured out what you wrote
on my own.

Thanks again,

James Simmons


On Sun, Mar 28, 2010 at 7:44 AM, Bert Freudenberg <b...@freudenbergs.de> wrote:
> On 28.03.2010, at 04:04, James Simmons wrote:
>>
>> In the last version of the book I had some content on working with the
>> Journal in the "Adding Refinements" chapter but it wasn't much and
>> didn't belong there.  After finishing Sugar Commander I felt that I
>> had a good example to use for a whole chapter on working with the
>> Journal, so I removed the content from "Adding Refinements" and added
>> the new chapter.  The code in Sugar Commander works, but I'd still
>> appreciate a review of this new information to be certain that I have
>> the details right.
>
> Nice chapter :)
>
> There is one serious flaw in your Sugar Commander code:
>
>        datastore.find({})
>
> You should never call that find method without narrowing the results, at 
> least in production code. Since you only use specific properties, you should 
> tell the datastore to only return these. Otherwise, it will send megabytes of 
> unused preview data (and arbitrary meta data you cannot even anticipate) over 
> D-Bus if there are hundreds of Journal entries, which is not at all uncommon. 
> So the right way would be to write
>
>        ds_objects, num_objects = datastore.find({}, properties=['uid', 
> 'title', 'mime_type', 'mountpoint'])
>
> assuming those are the properties you need, which is not that much more 
> complicated. You always have to include 'uid', otherwise the find() method 
> breaks. Which is a bug IMHO ;)
>
> For filtering by mountpoint, it's better to give this as a query argument 
> rather than fetching all entries and discarding the unwanted entries later:
>
>        query = {}
>        if mountpoint_id is not None:
>                query['mountpoints'] = [ mountpoint_id ]
>        ds_objects, num_objects = datastore.find(query, properties=['uid', 
> 'title', 'mime_type'])
>
> This is more efficient, but not as important as specifying the returned 
> properties.
>
> The real Journal also employs the technique of only fetching the visible 
> entries, a page at a time, by adding 'limit' and 'offset' arguments to the 
> find call. This would complicate the discussion so it's okay to leave out I 
> guess. But narrowing the find() results to the needed properties is essential.
>
> Later down you write "Metadata entries for Journal objects alwayts [sic] 
> contain strings" which is only true for Sugar 0.82. In Sugar 0.84 and later 
> the entries are actually byte arrays, not strings. This also makes this later 
> statement incorrect: "... since the Journal has never been able to store 
> binaries as metadata ...". In fact, newer Sugar versions _do_ store the 
> preview as binary, not base64 encoded.
>
> This is also not quite correct: "the [preview] image file is always 320 x 240 
> pixels". The preview can actually be of arbitrary size, the recommended 
> resolution is (was?) 300 x 225 pixels, a quarter in each dimension of the 
> XO's 1200x900 screen size.
>
> I also noticed some typos, but found the chapter too entertaining to write 
> them down ... just run a spell checker ;)
>
> - Bert -
>
>
_______________________________________________
Sugar-devel mailing list
Sugar-devel@lists.sugarlabs.org
http://lists.sugarlabs.org/listinfo/sugar-devel

Reply via email to