Excelente, con eso queda completo el artículo.<br><br>Lo puse en mi web: <a href="http://sites.google.com/site/flaviodanesse/programacion-p/rainbow-en-la">http://sites.google.com/site/flaviodanesse/programacion-p/rainbow-en-la</a><br>
y en mi bitacora del jam: <a href="http://drupal.ceibaljam.org/?q=node/713">http://drupal.ceibaljam.org/?q=node/713</a><br><br><br>me está quedando aprender:<br><br>La red, la interfaz de la camara y el motor de voz.<br><br>
<br><br><div class="gmail_quote">El 9 de marzo de 2010 18:39, Pablo Moleri <span dir="ltr">&lt;<a href="mailto:pmoleri@gmail.com">pmoleri@gmail.com</a>&gt;</span> escribió:<br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Buenísimo que lo solucionaste y preparaste este resumen con toda la información.<br><br>Me quedó picando por qué el 0660 y no 660, y resulta que el 0 anterior es para que Python lo interpete como octal y se convierta en la máscara binaria que estuvimos discutiendo.<br>

<br>Salduos,<div><div></div><div class="h5"><br>Pablo<br><br><div class="gmail_quote">2010/3/9 Flavio Danesse <span dir="ltr">&lt;<a href="mailto:fdanesse@gmail.com" target="_blank">fdanesse@gmail.com</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">

<b>Si, eso era solo una prueba que hice, el tema es que hay un detalle con los permisos, no es 664 sino 0660 (No se que hace el 1º 0).<br><br>Ya quedó solucionado, todo ok y comprobado, les mado lo que aprendí y luego lo posteo en la web y en la bitacora del jam:</b><br>


<br>La primera vez que ejecutas una actividad x en la xo, rainbow crea un grupo para ella, por ejemplo 10005<br>Las sucesivas veces que se ejecute esa actividad, rainbow creará un nuevo usuario y lo agregará a ese grupo.<br>


<br>La primera vez será 10000, luego 10002 y así sucesivamente de 2 en 2.<br><br>rainbow genera en /home/olpc/<br>una estructura de directorios /isolation/1/<br>y dentro de ella genera los siguientes directorios:<br><br>

<span style="color: rgb(204, 0, 0);">drwxr-xr-x 2 olpc olpc bundle_id_to_gid</span><br>
<span style="color: rgb(204, 0, 0);">drwxr-xr-x 2 olpc olpc gid_pool</span><br><span style="color: rgb(204, 0, 0);">drwxr-xr-x 3 olpc olpc gid_to_data_dir<br></span><span style="color: rgb(204, 0, 0);">drwxr-xr-x 2 olpc olpc uid_pool<br>


</span><span style="color: rgb(204, 0, 0);">drwxr-xr-x 2 olpc olpc uid_to_gid<br></span><span style="color: rgb(204, 0, 0);">drwxr-xr-x 3 olpc olpc uid_to_home_dir<br></span><span style="color: rgb(204, 0, 0);">drwxr-xr-x 2 olpc olpc uid_to_instance_dir</span><br>


<span style="color: rgb(204, 0, 0);"><br></span><span style="color: rgb(0, 0, 0);">dentro de: /home/olpc/isolation/1/uid_to_gid/</span><br><br>se crea un link: <span style="color: rgb(204, 0, 0);">lrwxrwxrwx root root 10000 -&gt; 10005</span><br>


<br><span style="color: rgb(0, 0, 0);">dentro de: /home/olpc/isolation/1/uid_to_instance_dir/</span><br><br>se crea un link: <span style="color: rgb(204, 0, 0);">lrwxrwxrwx root root 10000 -&gt; /home/olpc/isolation/1/uid_to_home_dir/10000</span><br>


<br>en /home/olpc/isolation/1/uid_to_home_dir/<br><br>se crea un directorio: <span style="color: rgb(204, 0, 0);">drwxrws--- 7 10000 olpc 10000 (la s significa que adquiere los permisos de propietario del archivo o directorio)</span><br>


<br>dentro de este directorio, se crean:<br><br><span style="color: rgb(204, 0, 0);">lrwxrwxrwx 1 root olpc data -&gt; /home/olpc/isolation/1/gid_to_data_dir/10005</span><br style="color: rgb(204, 0, 0);"><span style="color: rgb(204, 0, 0);">lrwxrwxrwx 1 root olpc instance -&gt; .</span><br style="color: rgb(204, 0, 0);">


<span style="color: rgb(204, 0, 0);">drwx--S--- 2 10000 10005 tmp</span><br><br>Cuando se utiliza:<br><br><span style="color: rgb(204, 0, 0);">os.path.join(os.environ[&#39;SUGAR_ACTIVITY_ROOT&#39;])</span><br><br>o lo que es igual:<br>


<br><span style="color: rgb(204, 0, 0);">os.path.join(activity.get_activity_root())</span><br><br>Se devolverá: /home/olpc/isolation/1/uid_to_home_dir/10000<br>Cada vez que ejecutes la actividad, devolverá un directorio diferente, debido a lo explicado al principio de este artículo:<br>


/home/olpc/isolation/1/uid_to_home_dir/10000 (este ultimo numero aumenta de 2 en 2 para cada ejecución de la actividad)<br><br>Rainbow asegura persistencia de datos entre reinicios solo dentro de os.path.join(activity.get_activity_root(), &quot;data&quot;).<br>


Pero, cada ejecución de la actividad genera un nuevo usuario por lo que os.path.join(activity.get_activity_root(), &quot;data&quot;) siempre será diferente.<br>Sin embargo, os.path.join(activity.get_activity_root(), &quot;data&quot;), siempre será un link a /home/olpc/isolation/1/gid_to_data_dir/10005 que es el directorio para persistencia de datos del grupo de usuarios de la actividad.<br>


Cualquier archivo almacenado allí, se guardará con los permisos 644<br><b><br>Como ejemplo:</b><br><span style="color: rgb(204, 0, 0);">-rw-r--r-- 1 10002 10005 Radios.db</span><br><br>(recordar que 10002 varía. Acá 10002 nos indica que el archivo se creó en la segunda instancia de ejecución de la actividad)<br>


Para poder modificar estos archivos en diferentes instancias de la actividad, es necesario cambiar sus permisos para que pueda ser modificado por todos los usuarios del grupo al que pertenece la actividad.<br><br>Se puede cambiar los permisos de estos archivos mediante:<div>

<br>
<br><span style="color: rgb(204, 0, 0);">directorio_base = os.path.join(activity.get_activity_root(), &#39;data/&#39;)</span><br style="color: rgb(204, 0, 0);"></div><span style="color: rgb(204, 0, 0);">os.chmod(os.path.join(directorio_base, &#39;Radios.db&#39;), 0660)</span><br>


<br>En este caso, cambiamos los permisos del archivo creado, de 644 a 664 ya que el segundo 6 da permisos de escritura para todo el grupo, el 4 solo daba permisos de lectura al grupo.<br><br><b>De modo que el código de este ejemplo sería:</b><br>


<br style="color: rgb(204, 0, 0);"><span style="color: rgb(204, 0, 0);">from sugar.activity import activity</span><br style="color: rgb(204, 0, 0);"><span style="color: rgb(204, 0, 0);">from ManejodeBasedeDatos import ManejodeBasedeDatos</span><div>

<br style="color: rgb(204, 0, 0);">
<br style="color: rgb(204, 0, 0);"><span style="color: rgb(51, 51, 255);"># Directorio para crear la base de datos</span><br style="color: rgb(204, 0, 0);"><span style="color: rgb(204, 0, 0);">directorio_base = os.path.join(activity.get_activity_root(), &#39;data/&#39;)</span><br style="color: rgb(204, 0, 0);">


<span style="color: rgb(204, 0, 0);">mi_base = os.path.join(directorio_base + &quot;Radios.db&quot;)</span><br style="color: rgb(204, 0, 0);"><br style="color: rgb(51, 51, 255);"><span style="color: rgb(51, 51, 255);"># Si el directorio no existe, crearlo</span><br style="color: rgb(204, 0, 0);">


<span style="color: rgb(204, 0, 0);">if not os.path.exists(directorio_base):</span><br style="color: rgb(204, 0, 0);"><span style="color: rgb(204, 0, 0);">    os.mkdir(directorio_base)</span><br style="color: rgb(204, 0, 0);">


<br style="color: rgb(51, 51, 255);"><span style="color: rgb(51, 51, 255);"># Si la base de datos no existe, crearla</span><br style="color: rgb(204, 0, 0);"><span style="color: rgb(204, 0, 0);">if not os.path.exists(mi_base):</span><br style="color: rgb(204, 0, 0);">


<span style="color: rgb(204, 0, 0);">    BasedeDatos = ManejodeBasedeDatos(mi_base)</span><br style="color: rgb(204, 0, 0);"><span style="color: rgb(204, 0, 0);">    BasedeDatos.CrearBasededatos()</span><br style="color: rgb(204, 0, 0);">


<span style="color: rgb(204, 0, 0);">    BasedeDatos.Llenar_Base()</span><br style="color: rgb(204, 0, 0);"></div><span style="color: rgb(204, 0, 0);">    os.chmod(os.path.join(directorio_base, &#39;Radios.db&#39;), 0660)</span><br>


<br><br><br><br><br><br><br><div class="gmail_quote">El 9 de marzo de 2010 17:00, Pablo Moleri <span dir="ltr">&lt;<a href="mailto:pmoleri@gmail.com" target="_blank">pmoleri@gmail.com</a>&gt;</span> escribió:<div><div></div>

<div><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
Ojo, <span style="color: rgb(204, 0, 0);">644</span><span style="color: rgb(204, 0, 0);"> </span><span style="color: rgb(204, 0, 0);"></span>se traduce como:<br>          6      4     4<br><div style="margin-left: 40px;">


<span style="font-family: tahoma,sans-serif;">110  100  100</span><br style="font-family: tahoma,sans-serif;">
<span style="font-family: tahoma,sans-serif;">rwx  rwx  rwx     (read, write, execute)</span><br><span style="font-family: tahoma,sans-serif;">prop grp  otros</span><br><span style="font-family: tahoma,sans-serif;"></span></div>



<span style="font-family: tahoma,sans-serif;">O sea que propietario es el único con acceso de escritura.<br><br></span><span style="font-family: tahoma,sans-serif;">Tengo entendido que en rainbow cada ejecución se hace con un usuario distinto, por lo tanto en la segunda ejecución ya no es el propietario y por eso no lo puede modificar. Sin embargo rainbow asegura que para una misma aplicación el grupo es el mismo, por lo tanto agregando permisos de escritura al grupo estarías hecho:<br>



<br></span><span style="color: rgb(204, 0, 0);">os.chmod(os.path.join(directorio_base, &#39;Radios.db&#39;), 664)</span><br><br>Espero que esto te sea de ayuda.<br><br>Saludos,<br>Pablo<br><br><div class="gmail_quote">2010/3/9 Flavio Danesse <span dir="ltr">&lt;<a href="mailto:fdanesse@gmail.com" target="_blank">fdanesse@gmail.com</a>&gt;</span><div>


<div></div><div><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">No, hay un error en lo que dije en el mail anterior, no es correcto, estoy haciendo pruebas ya les cuento que saco en claro.<br>



<br><br><br><br><div class="gmail_quote">El 9 de marzo de 2010 16:05, Flavio Danesse <span dir="ltr">&lt;<a href="mailto:fdanesse@gmail.com" target="_blank">fdanesse@gmail.com</a>&gt;</span> escribió:<div><div></div><div>



<br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Hola gabriel y pablo, gracias por responder y tan rapido.<br><br>El tema es así:<br><br>La idea del código es que la primera vez que se ejecute la actividad, busque la base de datos y si no la encuentra la crea ya que las radios están definidas en el código. Las siguientes veces que se ejecute la actividad la base sólo se carga desde ese directorio.<br>





<br>La primera vez que ejecuto el código, se crea la base y puedo agregar elementos en ella, pero la proxima vez que ejecute el codigo, accedo a la base pero si intento escribir en ella me dice que es solo lectura.<br><br>





Para probar el tema de los permisos intenté:<br><span style="color: rgb(204, 0, 0);">os.chmod(os.path.join(directorio_base, &#39;Radios.db&#39;), 644)</span><br>No funcionó (probé diferentes permisos, incluso todos)<br><br>





No es lo mismo:<br><span style="color: rgb(153, 0, 0);">os.path.join(os.environ[&#39;SUGAR_ACTIVITY_ROOT&#39;],&#39;data/&#39;)</span><br>que:<div><br><span style="color: rgb(153, 0, 0);">os.path.join(activity.get_activity_root(), &#39;data/&#39;)</span><br>





<br></div>Son diferentes directorios, sin embargo, en la práctica no hay diferencia, pasa lo mismo.<br><br>Subí el paquete .xo que tengo hasta el momento a: <a href="http://sites.google.com/site/sugaractivities/ceibalradio-1-0" target="_blank">http://sites.google.com/site/sugaractivities/ceibalradio-1-0</a><br>





(para agregar una radio hay que hacer click con boton derecho sobre cualquier radio de las existentes)<br><br><br><br><br><br><br><br><div class="gmail_quote">El 9 de marzo de 2010 11:41, Gabriel Eirea <span dir="ltr">&lt;<a href="mailto:geirea@gmail.com" target="_blank">geirea@gmail.com</a>&gt;</span> escribió:<div>




<div></div><div><br>
<blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">Flavio:<br>
<br>
No sé si tendrá algo que ver, pero para acceder al directorio donde<br>
uno puede escribir en vez de usar activity.get_activity_root() yo uso<br>
la variable de entorno SUGAR_ACTIVITY_ROOT, así:<br>
<br>
os.path.join(os.environ[&#39;SUGAR_ACTIVITY_ROOT&#39;],&#39;data&#39;)<br>
<br>
También habría que ver como dice Pablo con qué permisos se crea el<br>
archivo, podés mandar el código de la clase ManejodeBasedeDatos?<br>
<br>
Saludos,<br>
<br>
Gabriel<br>
<br>
<br>
<br>
<br>
El día 8 de marzo de 2010 23:57, Pablo Moleri &lt;<a href="mailto:pmoleri@gmail.com" target="_blank">pmoleri@gmail.com</a>&gt; escribió:<br>
<div><div></div><div>&gt; Flavio, no me queda claro si no podés &quot;acceder&quot; o &quot;modificar&quot; la base de<br>
&gt; datos. En cualquiera de los casos sería bueno que miraras con que permisos<br>
&gt; queda creado el archivo &quot;Radios.db&quot; (ls -l), es necesario que los permisos<br>
&gt; del grupo permitan lectura y escritura.<br>
&gt;<br>
&gt; Saludos,<br>
&gt; Pablo<br>
&gt;<br>
&gt; 2010/3/8 Flavio Danesse &lt;<a href="mailto:fdanesse@gmail.com" target="_blank">fdanesse@gmail.com</a>&gt;<br>
&gt;&gt;<br>
&gt;&gt; Tengo una base de datos que la actividad crea así:<br>
&gt;&gt;<br>
&gt;&gt; # Directorio para crear la base de datos<br>
&gt;&gt; directorio_base = os.path.join(activity.get_activity_root(), &#39;data/&#39;)<br>
&gt;&gt; mi_base = os.path.join(directorio_base + &quot;Radios.db&quot;)<br>
&gt;&gt;<br>
&gt;&gt; # Si el directorio no existe, crearlo<br>
&gt;&gt; if not os.path.exists(directorio_base):<br>
&gt;&gt;     os.mkdir(directorio_base)<br>
&gt;&gt;<br>
&gt;&gt; # Si la base de datos no existe, crearla<br>
&gt;&gt; if not os.path.exists(mi_base):<br>
&gt;&gt;     BasedeDatos = ManejodeBasedeDatos(mi_base)<br>
&gt;&gt;     BasedeDatos.CrearBasededatos()<br>
&gt;&gt;     BasedeDatos.Llenar_Base()<br>
&gt;&gt;<br>
&gt;&gt; Luego, en la actividad tengo código que permite agregar datos a la base y<br>
&gt;&gt; actualizarla, sin embargo solo funciona la primera vez que ejecuto la<br>
&gt;&gt; actividad.<br>
&gt;&gt;<br>
&gt;&gt; Es decir:<br>
&gt;&gt;<br>
&gt;&gt; Instalo la actividad.<br>
&gt;&gt; La ejecuto por primera vez, con lo cual se crea la base.<br>
&gt;&gt; Agrego 1 registro y todo funciona perfecto, los datos se almacenan y se<br>
&gt;&gt; conservan luego de reiniciar.<br>
&gt;&gt;<br>
&gt;&gt; Sin embargo, en instancias sucesivas de la actividad no puedo modificar la<br>
&gt;&gt; base de datos.<br>
&gt;&gt;<br>
&gt;&gt; _______________________________________________<br>
&gt;&gt; Olpc-uruguay mailing list<br>
&gt;&gt; <a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
&gt;&gt; <a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
&gt;&gt;<br>
&gt;<br>
&gt;<br>
&gt; _______________________________________________<br>
&gt; Olpc-uruguay mailing list<br>
&gt; <a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
&gt; <a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
&gt;<br>
&gt;<br>
_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
</div></div></blockquote></div></div></div><br>
</blockquote></div></div></div><br>
<br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div></div></div><br>
<br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div></div></div><br>
<br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org" target="_blank">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div><br>
</div></div><br>_______________________________________________<br>
Olpc-uruguay mailing list<br>
<a href="mailto:Olpc-uruguay@lists.laptop.org">Olpc-uruguay@lists.laptop.org</a><br>
<a href="http://lists.laptop.org/listinfo/olpc-uruguay" target="_blank">http://lists.laptop.org/listinfo/olpc-uruguay</a><br>
<br></blockquote></div><br>