(Continuing my response...)

Dan Williams wrote:
[...clipping stuff about events, Upstart, etc which satisfies the case I was thinking about...]
I don't see having multiple bundles providing the same services as
necessary or wanted.  What was the use-case you were thinking of?
Mostly branching and decentralized development. E.g., when a student wants to start experimenting with modifying an activity, they can branch it into a new activity (maybe with a new name) and start modifying it in place. Branching in this case is just making a copy. (Integer activity versions don't allow for branching without changing the name... I'm not sure what that does to things)

See, that's where it starts to get complicated :)  I think this is a
tradeoff between ease-of-development and simplicity.  I think I'd tend
towards the side of simplicity, because _everyone_ will benefit from
that, but only some percentage of kids will benefit from the
ease-of-development side of things.

My impression of how OLPC was going to be released (and please correct me if I'm wrong, as I'm inferring this from some vague things I've seen here and there) is that it's going to be released as more of a platform than a finished product. That is, the software in the first release will provide just a small part of the overall potential of the laptops. So ongoing development, especially development coming from outside of OLPC and generally decentralized development, is really important to the success of the system. And not just in a democratic principled free software kind of success, but actual concrete success in making a useful tool.

Perhaps we make it easy to archive an activity into a compressed
Activity Bundle which you can store somewhere, and the install your own
custom activity with the same service name, hack on it, and when you're
done, you archive that and install the real copy.  Make it work without
too much pain to the developer, but make it work flawlessly and simply
for everyone.

I just don't think that engineering for this use-case (even though you
and I directly benefit) is the right thing to do.  We need to make it
foolproof and simple for the 100% use-case and I think having multiple
bundles with the same service name just makes things complicated.  How
do you display #1 and #2 in the UI?  Which one "owns" the icon in the
launcher area?  When you join the activity, which one do you launch?
We're certainly not going to put up a dialog asking which one to launch.
Somewhat back to the mime-type issue too.

And then Dan wrote:
A possible solution to this issue is to lay the pain at the feet of
people who want to use multiple activities.  But anyway:

- We already know that the Activity Bundle spec says the installer can
name the activity bundle directory an arbitrary name.  The installer
somehow assigns a unique ID to the activity bundle.  This ID is
local-system-unique and is only used internally.

- We append the AB spec with the addition of a 'vendor' tag or something

- Only if the 'vendor' and 'service' tag matches some activity already
installed, does the version compare happen and one activity get deleted
or not installed

+1. We can also create some "clone this activity and mark yourself as the vendor" action.

- If the 'vendor' and 'service' tag combo is different than anything on
the system, the activity gets installed

- The _first_ activity with a unique (vendor, service) tuple is set as
the default activity for that service type

First in what way? First to have been installed? Or last to have been installed? This sounds arbitrary, which means non-repeatable between laptops and generally confusing. I guess last to have been installed probably makes the most sense, though, since it is the most recent action.

- If you want to change the default activity for a service type, you
must go through some pain, be it some arcane UI bits, or whatever, but
you can

This could probably just be part of the activity installation. Maybe another means of installation that installs an activity without disabling similar activities.

Of course when someone has "org.laptop.Chat; vendor=olpc" installed, and some buddy has installed "org.laptop.Chat; vendor=piglatin_branch" (what purpose does the branch serve? Purely to be funny. Kids will happily install and even use silly things like that)... what happens then? Does the user get queried if they want this "updated" activity? If for whatever reason they install it, decide they don't like piglatin as much as their friend, and then want to revert, then what? Perhaps in that case simply keeping a record of activities that have been installed (and why they were uninstalled) will be enough to make an easy UI for reverting.

This would seem to work, since it allows more than one 'org.laptop.Chat'
activity, for example, to work with any other activity that implements
the org.laptop.Chat protocol (which in reality is just an Avahi service
announcement with some key/value pairs).

I've noticed the service name and the interface name are almost always the same. Would it be at all useful here if they weren't the same?

If they change the service name, then anything that communicated with that service name won't be able to attach to their new code. And if they don't change the service name, everything will get hopelessly confused once they start distributing their modified code.

Right, that's the issue here, tying the service name to the network
protocols.  But once you separate the two (and have more than one
_local_ activity provide the same type of network service) things get
quite complicated WRT which one you decide to use at various points.  I
don't think we want to go there for G1.

For broadcasted signals there's no problem, right? So if an activity is just listening for signals, not for directed messages, it's not a problem.

But sure, to really support more than one activity running at the same time it probably requires work on both the activity and anything that interfaces with the activity to allow for that possibility.


Another issue that has occurred to me is localization of activities. I think I read the plan is not to distribute all localization data, just the needed data, right? Also, I would imagine that updates and contributions of localization data are going to happen faster and in a more decentralized manner than software development. It seems like localization should be handled specially in activities for these reasons.


In terms of motivation, I'm thinking about someone wanting to extend an activity they don't "own". One way to extend it is to take ownership, i.e., fork. If the upstream author had foreseen the particular extension that is desired, they might have exposed the necessary parts over dbus, which would be ideal. I'm not sure what the limits of dbus are. If you want to display something on an activity's canvas, it doesn't seem reasonable to do so over dbus, except in some constrained manner that is set up ahead of time. And maybe that's sufficient.

Some discussion was brought up about how  much of a set of tools (like
OLE) do we want to provide, and how to let other activities use those
tools.  This is in direct conflict with my last mail about all-inclusive
activities.  But I think the thought on this is, if enough activities
start using a particular bit of functionality, then we need to look at
including that functionality in the base OS images.

One way to allow common functionality to emerge is to look for opportunities to share data in activities, especially since activities at least start out as read-only after installation.

An activity might simply specify that some directories or files are possibly shareable. For Python activities, you'd do that for each package. As part of the build process you'd also give a checksum of some sort for that portion. Then on installation if the system saw that an identical directory existed it could use symlinks or something to save space (of course fixing things up if one of the pieces was removed or modified). Would this also save memory for shared libraries? Anyway, there'd still be reason to move things into the base system. And there'd still be reasons *not* to use things in the base system, if you didn't want to be effected by system updates. But it might be useful, and it doesn't seem terribly hard to implement. (Scanning for generally for opportunities to share files doesn't make much sense, but with specifically marked files it's easy enough to scan, and I think it's easy to identify what files/directories are likely to be found in multiple packages)

But that's for libraries. I don't know much about OLE or other systems like it. Does the embedded object run in-process? It seems like a complex undertaking unless every activity is similarly privileged and there's some kind of common runtime model. (Which there kind of is on the GTK level, but that most notably doesn't include EToys.) Anyway, like I said, I don't know much about this aspect so I'm just speculating.


--
Ian Bicking | [EMAIL PROTECTED] | http://blog.ianbicking.org
_______________________________________________
Sugar mailing list
[email protected]
http://mailman.laptop.org/mailman/listinfo/sugar

Reply via email to