• # Distribution

    Posté par  . Évalué à 4 (+3/-1).

    Pour mon expérience, le dernier article (sur la distribution) était le plus intéressant.

    Notamment :

    Distributing applications on a couple of computers inside the same company is not an issue. A lot of products are available for automating the pushing of files onto computers. Issues might start to appear when you need to coordinate the deployment across different physical sites.

    Je ne suis pas tout à fait d'accord. Je travaille dans une petite équipe, plutôt indépendante, faisant partie d'un gros groupe, avec sa politique de distribution de logiciels. Nous, on fait les nôtres, sur le côté. C'est volontaire, et assumé, on est un peu électrons libres transversaux, pour mettre de l'huile dans les rouages quand il faut. Et bien sûr, il n'en faut pas trop non plus.

    Bref, donc on doit distribuer des logiciels. Et s'intégrer à « l'AppStore » du groupe, c'est difficile, voir pas désirable du tout, car nos logiciels ne doivent pas être installés par tout le monde.

    Pendant 10 ans (!), j'ai développé et maintenu deux applications Java/Swing, déployé avec JavaWebStart. J'ai trouvé plein de limites à Swing, et j'ai dû hacker des composants (faire de la pseudo-réflexivité dessus) pour arriver à mes fins. Par exemple, pour que le menu déroulant d'une combobox ne soit pas limité en largeur à la taille de la combobox, mais affiche le maximum d'informations :

    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.Dimension;
    import java.awt.Insets;
    import javax.swing.JComboBox;
    import javax.swing.JList;
    import javax.swing.ListModel;
    import javax.swing.event.PopupMenuEvent;
    import javax.swing.event.PopupMenuListener;
    import javax.swing.plaf.basic.BasicComboPopup;
    
    /**
     * This is a workaround for the combobox popup, whose width is equal to the component width.
     * To display very large content, it's really annoying, so this listener resize the popup if necessary.
     */
    public class ComboBoxPopupResizerListener implements PopupMenuListener {
    
        private final JComboBox<?> comboBox;
    
        /**
         * Build the listener.
         * @param comboBox The combobox whose popup will be resized.
         */
        public ComboBoxPopupResizerListener(JComboBox<?> comboBox) {
            this.comboBox = comboBox;
        }
    
        @Override
        @SuppressWarnings("unchecked")
        public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
            // Copy paste from http://forum.java.sun.com/thread.jspa?threadID=522572&messageID=2501520
            BasicComboPopup popup = (BasicComboPopup) this.comboBox.getUI().getAccessibleChild(this.comboBox, 0);//Popup
            if (popup == null) {
                return;
            }
            int preferredWidth = (int) Math.max(this.comboBox.getPreferredSize().getWidth(), this.comboBox.getWidth());
            Component comp = popup.getComponent(0);//JScrollPane
    
            // Compute height by rendering the first element
            JList<Object> popupList = popup.getList();
            ListModel<Object> popupListModel = popupList.getModel();
            int modelSize = popupListModel.getSize();
            int height;
            if (modelSize > 0) {
                // Fetch the insets to add to the rendered component
                Insets insets = popup.getInsets();
                modelSize = Math.min(modelSize, this.comboBox.getMaximumRowCount());
                height = (int) popupList.getCellRenderer()
                        .getListCellRendererComponent(popupList, popupListModel.getElementAt(0), 0, false, false)
                        .getPreferredSize().getHeight() * modelSize
                        + insets.bottom + insets.top;
            } else {
                height = (int) this.comboBox.getPreferredSize().getHeight();
            }
    
            popup.setPreferredSize(new Dimension(preferredWidth, height));
            popup.setLayout(new BorderLayout());
            popup.add(comp, BorderLayout.CENTER);
        }
    
        @Override
        public void popupMenuWillBecomeInvisible(PopupMenuEvent e) {
        }
    
        @Override
        public void popupMenuCanceled(PopupMenuEvent e) {
        }
    }

    C'est beau comme un camion avec des roues de vélo, mais je m'en suis servi partout.

    Ensuite JavaWebStart, c'est pas si beau et tout joli. C'est plein de bugs chiants, comme « tiens, je crois que le cache est pas à jour, mais faut lancer l'application deux fois pour que ça force la mise-à-jour, lalala ». On a dû plusieurs fois demander aux utilisateurs de supprimer le cache et de recommencer.
    La signature de l'application est compliquée aussi, mais ça, évidemment, c'est le problème de toute application. Le Web résout ça, en délégant cette partie au serveur, donc à l'administrateur système, et pas au développeur.

    Enfin, la sécurité des communications. En Swing, ben… on fait ce qu'on veut. C'est bien, mais il faut aussi réinventer la roue : transmission des informations via TLS, authentification, etc. En Web, c'est déjà dedans. Alors évidemment, quand on a besoin du TCP brut, ou pire, de l'UDP, c'est plus dur.

    Donc on est parti sur une réécriture en Web. Parce que ça marche, c'est « mature », ça se distribue facilement. Bien sûr, c'est pas tout rose. La multitude de frameworks est décourageante. La vitesse de dépréciation aussi. Mon application Swing, elle marche depuis 10 ans, même sur des ordinateurs récents. C'est solide, ça tient la route, ça se casse pas tout seul.

    Il y a beaucoup d'aspect des applications Web que je n'aime pas. C'est bloaté à mort, c'est souvent un gâchis de ressources monumentales. Pour beaucoup de choses, je préfère une application de bureau. Mais il ne faut pas renier pour autant les fabuleuses avancées de cette plateforme : le Web remplit beaucoup de cas d'utilisation aujourd'hui, pour la plus grande peine des utilisateurs de VisualBasic.

    • [^] # Re: Distribution

      Posté par  . Évalué à 5 (+4/-0).

      Ce qui transparait de ton message, vu d'un développeur à la petite semaine, c'est que Java/Swing déployé avec JavaWebStart c'est incomplet avec des gros défauts à corriger. Comme ça n'est pas corrigé, on se tourne vers les applis Web, qui ont d'autres défauts, mais on ferme les yeux. Ai-je bien compris ?

      • [^] # Re: Distribution

        Posté par  . Évalué à 5 (+3/-0).

        C'est à peu près ça. C'était un choix pertinent, il y a 10 ans. Aujourd'hui, la plateforme Web a gagné en fonctionnalités, et performances, et pour beaucoup de cas, c'est le meilleur choix pour l'utilisateur.

  • # Sinon y'a dotnet sur le bureau

    Posté par  . Évalué à 1 (+0/-1).

    Avec Blazor PWA, bientôt Blazor Desktop. Ou sans le moindre bout de Web, avec AvaloniaUI ou Uno ou autre… :)

    Je dis ça, je dis rien.

    "Quand certains râlent contre systemd, d'autres s'attaquent aux vrais problèmes." (merci Sinma !)

Envoyer un commentaire

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n’en sommes pas responsables.