IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Dreamshield Discussion :

DreamShield : prochaines versions [Nouveauté]


Sujet :

Dreamshield

  1. #1
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut DreamShield : prochaines versions


    C'est re-moi. Je vais éssayer de tenir 1 thread avec les nouveautés et autres commentaires sur les versions en préparation. J'avais déjà fait pour la version 0.9 mais le but de ce thread et que celà serve pour toutes les futures versions .

    Donc voilà, la version 0.9 est enfin sortie et maintenant que l'année reprend je pense que j'irai beaucoup moins vite ( et oui, les vacances c'est fini ).

    La prochaine version sera la 0.91, je ne veux pas encore mettre de version 1.0 car je la réserve pour le support "parfait" de Windows Vista dans DreamShield et qui sais, certaines fonction spécifiques à Windows Vista telles qu'installer un jeu dans le gestionnaire de jeux de Windows Vista ou installer des Gadgets, j'avoue, je ne sais pas dutout comment faire mais c'est une idée.

    Pour l'instant je voudrais permettre d'inclure au choix le .NET Framework 2.0, 3.0 ou 3.5 lors de l'installation des applications et peut être coder un service avec WCF qui vérifierai l'intégrité des fichiers installés en temps réel et qui proposerai de les réinstaller s'ils étaient altérés.

    Si vous avez donc des suggestions à me faire quand aux prochaines versions, ou que vous voulez m'aider en codant certaines parties, vous pouvez me contacter ici, celà me ferai vraiment très plaisir .

    Bon c'est pas que mais j'ai une partie de Titan Quest à finir , à la prochaine
    Cdl
    Smyley

  2. #2
    Rédacteur
    Avatar de SaumonAgile
    Homme Profil pro
    Team leader
    Inscrit en
    Avril 2007
    Messages
    4 028
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Team leader
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2007
    Messages : 4 028
    Points : 6 334
    Points
    6 334
    Par défaut
    La version d'InformationBox spécial DreamShield devrait paraître sous peu, j'en ai ch.. mais j'ai réussi.
    Je créerai un nouveau sujet pour en parler sans polluer celui-là.

  3. #3
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Bon, j'ai enfin compris comment fonctionne l'UAC de Windows Vista, c'est terrible quand même : tant d'histoire et tant de sources de bugs quand on fait un installeur

    Donc voilà, DreamShield 0.91 et Windows Vista vont surement faire meilleur ménage que DreamShield 0.90 et Windows Vista, surtout à propos des autorisations des dossiers "virtualisés" sous Vista comme {Programs} ( le menu démarrer ) ...

  4. #4
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Je vien de publier la version 0.91 de DreamShield, il s'agit plus d'une correction que d'une nouvelle version. Au programme :
    Windows Vista : Support de l'UAC
    Intégration de InformationBox de SaumonAgile
    BUGFIX - Crash lors de la fin de l'assistant d'imporation de projet Visual Studio 2005
    BUGFIX - Crash lors de l'envoi d'un rapport d'erreur

    Voilà voilà, les vacances sont finies, mais j'éssérai de tenir quand même la cadance : prochaine version, DreamShield 0.92

    Pour télécharger la version actuelle de DreamShield, rendez-vous sur
    http://dreamshield.developpez.com

    Cdl
    Smyley

  5. #5
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Voilà, j'ai un ordinateur portable le revers de la médaille est que le jour même où je suis rentré chez moi pour la première fois avec mon portable, il y a une des barrettes mémoire de mon pc qui a grillé ... après quand je dit que j'ai pas de chance, on me dit que la chance n'existe pas .....
    Enfin bon, le developpement de DreamShield devrai donc reprendre petit à petit, pour peut que le campus se décide enfin à avoir une démarche claire pour l'accès au wifi ( il faut s'inscrire à la bibliothèque d'abord .. non, il faut aller au centre informatique ... mais non, il fallait d'abord s'inscrire .... )

    Enfin bref, voilà, allez, à la prochaine

  6. #6
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Citation Envoyé par smyley Voir le message
    Voilà, j'ai un ordinateur portable le revers de la médaille est que le jour même où je suis rentré chez moi pour la première fois avec mon portable, il y a une des barrettes mémoire de mon pc qui a grillé ... après quand je dit que j'ai pas de chance, on me dit que la chance n'existe pas .....
    Enfin bon, le developpement de DreamShield devrai donc reprendre petit à petit, pour peut que le campus se décide enfin à avoir une démarche claire pour l'accès au wifi ( il faut s'inscrire à la bibliothèque d'abord .. non, il faut aller au centre informatique ... mais non, il fallait d'abord s'inscrire .... )

    Enfin bref, voilà, allez, à la prochaine
    Bon courage, et tiens nous au courant

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2007
    Messages : 5
    Points : 5
    Points
    5
    Par défaut Installation d'objet COM
    Pour installer un objet COM, il faut enregistrer l'assembly avec regasm. J'ai trouvé le moyen de faire ça avec le framework ( avec System.Runtime.InteropServices.RegistrationServices ).

    Mais DreamShield offre-t-il la possibilité d'effectuer cet enregistrement sans que j'ai à coder un installer dans mon objet ? Je n'ai pas trouvé cette fonctionnalité dans la doc ni dans l'IDE (j'ai peut-être mal cherché ?).

    Sinon une question précise :
    Comment est codée l'enregistrement d'une assembly dans le GAC ? Par réflection de classes internes du framework ou bien par appel à la dll fusion.dll ?

    Si c'est fusion.dll qui est utilisée, comment déterminer avec certitude que c'est bien la dll du framework 2 qui est utilisée et non celle du framework 1.1 ? En codant "en dur" le chemin complet de la dll dans l'attribut DllImport ?

    Serait-il possible d'avoir accès à la partie du code source qui gère l'enregistrement dans le GAC ?

    Merci d'avance,
    Maxime

    EDIT :
    J'ai cherché un peu plus et je suis tombé sur la classe System.EnterpriseServices.Internal.Publish :
    http://msdn2.microsoft.com/en-us/lib...acinstall.aspx

    Qui a l'air d'avoir tout ce qu'il faut pour enregistrer une assembly dans le GAC peut-être est-ce la méthode utilisée par DreamShield ?. Je teste ça ce soir.

  8. #8
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Me voici

    Alors pour regasm, j'avoue, j'y avais pas pensé, pour l'instant il y a gacutil et installutil, je vais sans doute rajouter celà dans la prochaine version ...
    Sinon pour l'enregistrement au départ j'utilisait directement fusion.dll mais au final je suis passé à gacutil qui est moin pénible lorsqu'il y a un bug ( aller chercher un bug dans du code est toujours plus dur qu'un joli méssage d'érreur rendu par gacutil.exe ). So : je me contente juste d'appeller de manière silencieuse gacutil.exe ...
    Sinon tu pourrai inclure regasm dans l'installation et l'appeller après celle ci avec un petit plugin, ça ne serai pas trop chaud à faire

    ps. très intéréssant ton lien, par contre, je me demande si ça existe sous Mono, faudrait voir ( vu que j'espère pouvoir faire tourner DreamShield sur Mono, c'est pas le moment d'ajouter des trucs cools Windows Specific )

  9. #9
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Ah au fait, bien que mes études me prennent beaucoup, beaucoup de temps, DreamShield continue d'avancer tranquillement et je devrais peut être la semaine prochaine, publier la version O.92. Voici ce qu'il y a de nouveau dedans :
    - Possibilité de faire des "réinstaller", c-à-d le fameux menu "Réparer / Réinstaller l'application" existant dans la plupart des installeurs commerciaux
    - Ajout de plein de nouvelles options, genre : "Autoriser la désinstallation automatique des applications antérieures" ou "Ne chercher les archives manquantes que sur les CDs", etc ...
    - Dans la série "nouvelles options", vous pourrez changer le "logo" du wizard ( cf. pièce jointe )

    edit : il y aura aussi un outil perméttant de créer des SFX à partir d'une archive Zip ou Cab ... je me suis dit que ce serai cool

    Voilà pour l'instant
    Images attachées Images attachées  

  10. #10
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Voilouuu, j'ai le wifiiiiiiiiiiiiiiiiiiiiiii
    c'est dingue quand même, je suis dans une université et je suis obligé de demander un mot de passe à mon père pour pouvoir me connecter ... vive la modernité.

    Enfin bon, pour en revenir à DreamShield, ne vous inquietez pas, j'y travail, j'y travail ... je pense que pour la prochaine version je vais attendre d'avoir finit l'implémentation des mises à jour : je sais enfin à quoi ça devrai ressembler. Avec on pourrai même pouvoir faire des mises à jour standard, des service pack ou ettendre une installation existante enfin bon, tout ça il faut que je le fasse .
    D'aileurs il faudrait vraiment que je fasse des tutos mais vu que j'ai pas trop le temps ... ( celà dit, si vous voulez en faire ... )

    Enfin bon, voilà
    Cdl
    Smyley

  11. #11
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Et la grande nouvelle est ... que j'ai pas fini les mises à jour. Le bon coté est que je confirme, il y aura le support des mises à jour dans la prochaine version ( pas de trucs trop compliqués non plus ) mais pour l'instant ça me fait des bugs bizarre ( ObjectDisposedException en essayant de mettre à jour un dossier, enfin bref, des choses ... )

    Donc voilà, j'y retourne,
    Cdl
    Smyley

    edit: Bon j'avais vraiment trop d'érreur bizarres ( genre que je met à jour le package qui sert à faire la mise à jour et non pas le package à mettre à jour, etc, etc )
    Donc je vais remplacer le DefaultSequencer utilisé jusque là pour installer/désinstaller des fichiers par un nouveau moteur. L'avantage pour moi sera qu'il ... sera ... plus facile à gérer. L'avantage pour vous est que vous pourrez ( à long terme ? ) définir des conditions d'installation/désinstallation et que ce sera beaucoup plus customizable

  12. #12
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Waouu, après avoir luté d'une manière acharné contre une orde de bug géants sauvages, et après avoir gravis des milliers de lignes de code, j'ai réussit ce soir, pour la première fois ( de ma vie ! ) à faire un package de mise à jour avec mon logiciel et il fonctionne !!!!

    J'ai donc reprogramé le coeur ( maintenant il s'appelle DreamWorker ), le mode de créations des wizard ( DreamWizard ) et plein d'autres choses donc il sera possible dans la prochaine version ( et là c'est sur ) de :
    - faire des mises à jour ! ( enfin ! )
    - de faire des installations silencieuses, normales, etc etc car cette fois ci il sera simple d'écrire un nouveau provider pour l'interface car il y a desormais une séparation nette entre le moteur qui fait le boulot et l'interface, pas comme avant où les deux étaient étroitement liées.
    - j'ai donc dû refaire toute l'architecture de plugins : a terme ils seront plus puissants mais ils sont un peut plus dur à concevoir qu'avant ...
    - il n'y aura plus LUA ( mais qui s'en servait, franchement ? )

    De plus, en l'état le moteur supporte les conditions d'installation ... mais pas l'IDE mais dans les prochaines version j'éssérai de le faire ( a priori pas compliqué )

    Allez, j'y retourne, ... mais pas pour coder, j'ai un film à regarder
    Cdl
    Smyley

    Edit: L'architecture des mises à jour va offrir beaucoup de possibilités par exemple, vous pourrez mettre à jour un composant, plusieurs composants, ajouter ou supprimer un composant à l'installation d'origine et même pratiquer la philosophie des "service pack" sur des gros logiciels :
    - on met à jour petit à petit chaque composant par rapport à la version initiale, sans qu'il y ai d'ordre précis dans les mises à jour ( comme des "Hotfix" )
    - quand le besoin s'en fait sentir, on fait une mise à jour globale qui cumule tous les changements effectués depuis la précédente version et on augmente la version globale du package, ce qui fait qu'on ne pourra pas installer, par mégarde, un Hotfix venant d'une version antérieur
    - si la version installée du composant est supérieur à celle présente dans la mise à jour, l'installation du composant est annulée ( logique )

    Cependant, en perméttant de faire un arbre à plusieurs branches, celà devient difficil de permettre la désinstallation d'une mise à jour. J'ai donc mis à l'écart ce point mais en fait, vous pourrez créer un composant et le désinstaller lors de la sélection des composants installés, dans le mode "maintenance" de l'installeur.

    ça promet d'être cool non ?

  13. #13
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Regardez un peut ça ( cf. pièce jointe ) ça m'a fait suer ( des erreurs OutOfMemoryException lors du décryptage ... ) mais ça marche ... c'est beau ?
    Images attachées Images attachées  

  14. #14
    Membre expert
    Avatar de Janitrix
    Inscrit en
    Octobre 2005
    Messages
    3 391
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 3 391
    Points : 3 401
    Points
    3 401
    Par défaut
    Citation Envoyé par smyley Voir le message
    Regardez un peut ça ( cf. pièce jointe ) ça m'a fait suer ( des erreurs OutOfMemoryException lors du décryptage ... ) mais ça marche ... c'est beau ?
    C'est pas mal du tout, et la fonctionnalité est très intéressante
    Bravo

  15. #15
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Donc,

    la prochaine version est presque finalisée, il me manque juste à permettre de gérer les paramètres en ligne de commande pour Setup.exe et StdSetup.exe et après je serai tranquille.
    Ah, pour ceux qui aurai déjà rencontré un crash aléatoire dans DreamShield qui pouvait survenir lors de la compilation, c'est réglé ( si vous n'en avez pas rencontré, faites pas attention ). En fait il y avait un problème dans ma base de donnée qui pouvait créer des StackOverflow de temps en temps, mais assez rarement quand même ... dans la version 0.92, c'est réglé.
    Maintenant les plugins pourrons décider de l'emplacement des fichiers à installer ou encore de savoir s'il faut les installer/désinstaller. Je fournirai des exemples pour tout ça...

    A au fait, si vous êtes un guru en C++ natif et que vous avez envie d'aider, j'aurai bien besoin d'une petite aide pour que mon Setup.exe télécharge tout seul comme un grand le Fmwrk 2.0 ... j'envérai les sources du Setup à la personne ( enfin, si quelqu'un veux ).

    Voilà, maintenant, la date de parution dépend étroitement des admins de dvp ( je vais pas vous dire pourquoi, j'ai honte ).
    So je vous laisse, A +

  16. #16
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Je suis en train d'uploader la première release de la version 0.92 ( en espérant que ce soit la bonne ).
    Nouveautés ( en résumé ) :
    - Possibilité de changer l'icone du Setup.exe, StdSetup.exe et du SFX
    - Possibilité de changer l'image de la page d'accueil de l'assistant ( le petit écran d'ordinateur vert )
    - Possibilité de remplacer/supprimer les fichiers vérouillés par le système ( si l'installeur en détecte un, il crée un fichier temporraire et vous demande de redémarrer afin d'éffectuer le remplacement ou la suppression )
    - Possibilité de faire des mises à jour, la précédente fonction facilitant celà ( je ferai des exemples ou tutoriaux, jvais voir, pour expliquer comment faire, pour l'instant c'est pas très intuitif )
    - Possibilité de vérouiller les installations avec un mot de passe : Il sera demandé à chaque exécution de l'installeur et les archives d'installations seront cryptés.

    - Routines d'installation refaites : vous pourrez par la suite avoir un controle pointu sur les fichiers qui doivent être installés ou non, les clefs du registre et donc faire des conditions d'installation/désinstallation.
    - Architecture des plugins de l'installeur refaite ( je ferai des tutoriels ... )

    - DreamShield IDE démarre en mode élevé sous Vista : vous ne pouvez donc pas éffectuer de glisser/déposer sur la liste des fichiers ...
    -> FIX : Vous pouvez copier des fichiers, puis les coller dans la liste des fichiers du package

    - Rajout d'un utilitaire pour créer des SFX ( Cab et ZIP )
    - FIX : le SFX démarre sous Vista sans les droits d'admin ( utile pour créer des SFX n'ayant rien à voir avec des installations ) : Dans le cas d'une installation, DreamShield demandera alors une élévation.

    - Ajout d'un exemple ( dans le dossier d'installation de DreamShield, sous dossier sample ) de customization des procédures d'installation : J'ai refait l'installation de CAML Light ( originellement pour mon prof ) afin qu'il puisse s'installer sur Windows Vista : c'est un bon exemple de plugin + condition d'installations + changer le chemin de destination d'un dossier en fonction d'une condition ( condition : exécution sur Windows Vista ou non ... )

    voilà, ça devrai aller, normallement


    - BUGFIX : Crash de l'IDE lors de la compilation de projets complexes

  17. #17
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Points : 6 017
    Points
    6 017
    Par défaut

  18. #18
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    pnèz j'ai jamais de chance
    j'ai pas eu le temps d'uploader chez moi et là je suis au campus ...
    quand j'ouvre FileZilla pour relancer le server ... erreur ... il passe pas le wifi du campus ............... grrrrrrr
    so j'éssaye de voir si je peut pas trouver un client ftp online ( pour l'instant j'ai échoué )...

  19. #19
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Bon ben, DreamFromTheWeb plante, ce qui veux dire que l'installation web ne sera pas disponible ( pour l'instant ) j'usqu'à ce que je règle ça cependant :
    J'AI ENFIN REUSSIT A UPLOADER LA VERSION 0.92 ( en fait, il a fallu que je quite le campus pour rentrer chez moi avec ma VRAIE connexion à internet ... )

    Donc voilà, DreamShield 0.92 dans les bacs, bientot les tutoriels pour les plugins.
    Celà dit, dans DreamShield.92 il y a l'installation de CamlLight, ça pourrai être une bonne étude pour ceux qui désirent personnaliser leur installation.

    So voilà

  20. #20
    Expert éminent
    Avatar de smyley
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    6 270
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 6 270
    Points : 8 344
    Points
    8 344
    Par défaut
    Je suis en train de préparer la première mise à jour de l'histoire de DreamShield
    Elle devrait juste corriger un problème qu'il y avait avec DreamFromTheWeb qui ne marchait pas avec ma nouvelle architecture mais que je n'avais pas encore pu tester ... là il va marcher donc voilà, et puis en même temps, ce sera l'occasion de montrer que DreamShield peut faire des mises à jour pour lui même

Discussions similaires

  1. Réponses: 24
    Dernier message: 23/06/2011, 11h30
  2. [Qt WebKit] Les prochaines versions annoncées
    Par dourouc05 dans le forum Moteurs Web
    Réponses: 6
    Dernier message: 08/03/2011, 17h23
  3. Réponses: 44
    Dernier message: 27/05/2010, 13h20
  4. Réponses: 54
    Dernier message: 05/02/2010, 09h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo