HOAB

History of a bug

SSHPass hide password

Rédigé par gorki Aucun commentaire

Le problème :

Je n'ai pas toujours la possibilité de déposer ma clé publique sur les serveurs distants auxquels je me connecte.

Heureusement SSHpass est là, mais comme indiqué dans la documentation, il ne s'embête pas à essayer de cacher le mot de passe.

Je n'utilise pas les solutions comme PAC Manager car leur shell intégré est moins bien que le shell que j'utilise.

Solution :

SSHpass propose l'option "-e" qui permet de lire le mot de passe depuis une variable d'environnement.

Je créé un script de connexion dans mon répertoire ~/.ssh

export SSHPASS=<mypassword>
sshpass -e ssh <myuser>@<server>

Voici le résultat du ps :

5133  5132  0 11:43 pts/0    00:00:00 sshpass -e ssh <myuser1>@server1
8892  8891  0 15:31 pts/2    00:00:00 sshpass -e ssh <myuser2>@server2

Remote desktop, VirtualBox and copy stop during transfer

Rédigé par gorki Aucun commentaire

Le problème :

Je réalise des copies de fichiers d'un poste Windows à un autre en Remote Desktop, celle-ci échoue au milieu du transfert de façon aléatoire.

Comme les fichiers copiés étaient gros, j'ai mis ça sur le compte du réseau... ERREUR !!!

Pour compléter le tableau, mon Windows tourne dans une VM (eh oui je suis passé sous Linux, je vous raconterai ça une autre fois).

Solution :

J'ai remarqué qu'en faisant Ctrl+C cela interrompait la copie... 

quelques secondes de méditation plus tard... Tilt !

Le presse-papier de VirtualBox était en mode partagé, donc dès que je copiais quelque chose sous Linux.... la VM était notifiée...

Et comme, Ô joie, la copie distante sous Windows c'est un peu un presse-papier amélioré => annulation de la copie....

 

Donc j'ai désactivé la synchronisation des presse-papiers... tout roule... Tadaaaarrrh.....

SSH au travers de SQUID : connection refused !

Rédigé par gorki Aucun commentaire

Le problème :

Pour gérer plusieurs profils réseaux, j'utilise squid avec une configuration par profil. (Le NetworkManager de debian appelle un script lorsqu'une interface devient disponible, ce script met à jour la configuration squid et le redémarre).

Je voulais donc naturellement faire passer mes connexions SSH au travers de ce proxy.

Après configuration du .ss/config ainsi :

Host *
    ServerAliveInterval 240
    ProxyCommand corkscrew localhost 3128 %h %p
    Compression yes

J'obtenais l'erreur : Couldn't establish connection to proxy: Connection refused

J'ai testé les commandes :

corkscrew  localhost 3128 <mon serveur> 22

Après avoir compris que corkscrew utilise nc :

nc -vv localhost 3128

Toujours le même refus.

Solution : quel client ?

En réalité après avoir trouvé que corkscrew utilise nc les réponses sont plus nombreuses sur le net : aide

Le problème vient du fait que j'utilise Debian qui doit avoir une configuration particulière et Squid écoute exclusivement sur IPV6 :

netstat -tulnap | grep 3128

avec tcp6 dans la ligne :

tcp6       0      0 ::1:3128                :::*                    LISTEN      - 

Donc astuce squid3, modifier la configuration pour écouter sur une adresse IPV4, dans /etc/squid/squid3.conf :

http_port 0.0.0.0:3128

Ca devrait être corrigé bienôt : https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=584

Commencer un projet avec Hibernate

Rédigé par gorki Aucun commentaire

Le problème :

Utiliser Hibernate, c'est bien, on gagne du temps, mais encore faut-il se poser les bonnes questions.

Solution :

Voici une liste de questions à se poser :

  • le modèle physique de données existe-t-il ? DDL ?

Si le modèle physique existe, le mapping JPA devra s'adapter, en DDL le modèle physique est généré par hibernate, il peut même être mis à jour par Hibernate.
Il faut cependant toujours vérifier le schéma généré et le faire valider par un DBA (junior, dilettante, senior, guru, ... au choix)
Si c'est à l'application de mettre à jour le modèle de données, des produits plus évolués comme Liquibase sont préférables au DDL hibernate pur.

Préconisation : Modèle physique non géré par Hibernate.

  • les liens dans les JPA doivent-il représenter tous les liens/contraintes de la base de données ?

Quel problème à mettre toutes les relations de la base physique dans les enttités JPA ? Aucun a priori, sauf avec de jeunes développeurs qui vont se restreindre aux relations JPA plutôt que d'inventer des requêtes SQL efficaces qui ne passent pas par les relations JPA.

Exemple : Si A -> B -> C et que C peut-être relier à A par une concaténation de chaine par exemple, le développeur "de base", va faire un A join B join C alors qu'il serait possible de faire un A, C where A.toto = concat(C.titi + truc).

Préconisation : seulement les liens métiers forts. (assez indéfinissable en soit, c'est tout l'apport d'un architecte à ce niveau - et de se remettre en cause pour faire évoluer ces choix :))

  • quel Flushmode par défaut utiliser ?

Le flushmode.AUTO, s'il est pratique, fait qu'Hibernate réalise beaucoup d'opération

Préconisation : Ici c'est Monsieur performance qui parle : Flushmode.COMMIT par défaut. Les autres Flushmode à la demande en fonction des cas.

  • quel pool de connexion ?

Surtout le principe est de connaitre son pool de connexion et de le configurer (nb maximum de connexions, timeout, idle, requête de validation, etc...)

Préconisation : n'importe du moment qu'on puisse configurer les paramètres précédents

  • quel cache de niveau 1 ?

De la même façon que le pool de connexion, il faut savoir quel est celui utilisé et comment le configurer.

Préconisation : idem, n'importe mais le maitriser

  • utiliser ou non le cache de niveau 2 ?

Le cache de niveau 2 est partagé par toutes les sessions, en général seulement au sein de la JVM. Il est possible de partager un cache de niveau 2 au travers de plusieurs JVM via des caches distribués.

Préconisation : si 1 seule JVM, vous pouvez l'activer. Idem que les autres, maitriser le contenu du cache, sa taille, etc... Si plusieurs JVM, soit pas de cache niveau 2, soit cache distribué ou cache de niveau 2 pour des données en lecture seule.

  • spring data ou non ?

Permet de s'abstraire de pas mal de code technique pour la couche DAO.

Préconisation : Oui si vous avez Spring. Si vous n'avez pas Spring pensez-y...

  • écrire des requêtes avec les critérias, en HQL

Comment écrire les requêtes pour accéder à la base de données.

  1. en criteria : ça permet des refactors assez facile
  2. en HQL écrit à la main : très particulier pour des requêtes très flexibles
  3. en namedQuery : ça permet à la JVM de valider les requêtes au lancement

Préconisation : NamedQuery sur SpringData, Criteria pour les plus compliquées/flexibles

Quelque soit le mode d'écriture, on n'utilise QUE des paramètres bindés.

  • comment tester ? Derby / H2 ? base mémoire / base physique ?

L'avantage des bases mémoire c'est leur rapidité (de mise en oeuvre et d'exécution). Leur inconvénient est qu'il peut y avoir des écarts avec la base physique vraiment utilisé.

Par contre dans les deux cas, le problème est la création des données pour les tests, d'où l'utilisation préconisée des mocks qui simulent les accès base de données :)

Préconisation : des mocks pour les services métiers, une base réelle pour la validation des requêtes écrites par le développeur.

  • Transaction

Les transactions sont utilisées pour deux choses :

  1. garantir que plusieurs requêtes SQL sont validées en même temps
  2. conserver une connexion pour charger les objets et leurs enfants (et éviter les lazy-loading)

Les transactions en lecture seule existe et se termine quand même par un COMMIT et non pas un rollback... 

Préconisation : Déterminer les services qui ont besoin d'une transaction, leur cadre (commit globale ou optimisation de connexion). Utiliser un framework de transaction (Spring, EJB 3.1) et les tags @Transactional.

  • Monitoring

Comme pour les caches et les pools, il convient de savoir ce qui se passe dans la JVM. Des outils existent, mais l'important est d'avoir des informations sur :

- les caches (taille, nombre d'éléments, nombre de hits)
- les pools (nombre de connexions en cours /  nombre max de connexions)
- c'est pratique d'avoir un accès en lecture seule à la base de production pour consulter les informations indexs, query_plan, etc...

 

Right click paste on linux terminal with terminator

Rédigé par gorki 4 commentaires

Problem

For once, an english post as I saw many other person interest in this problem.

I just migrate from Windows to Linux, as many others, lot of little things to do to have fully functional desktop... a next post to describe this.

One of the most annoying thing was the "middle click" in terminal... Not used to, I scroll when I want to paste...

No problem, I looked for a terminal with this option.. but no one found on google !!.

Solution (since Terminator 1.0)

Just check the box "PuTTY paste mode" in the preferences, thanks for authors !

Also to display the menu on Cinnamon : shift + right click + left click (or try any of ctrl/shift + right, left, middle click)

Solution (before Terminator 1.0)

I installed Terminator, following many advices, not bad at all, except this annoying menu on right click...

I saw a feature request but author will do it maybe, one day or if someone offers this feature in option with GUI configuration, etc...

Looking for Terminator plugins system, I noticed it was coded in Python, yeah !

Few minutes later, as root :

sudo apt-get install terminator
sudo vi /usr/share/terminator/terminatorlib/terminal.py

Look for the following function :

def on_buttonpress(self, widget, event):
        """Handler for mouse events"""
        # Any button event should grab focus
        widget.grab_focus()

        if event.button == 1:
            # Ctrl+leftclick on a URL should open it
            if event.state & gtk.gdk.CONTROL_MASK == gtk.gdk.CONTROL_MASK:
                url = self.check_for_url(event)
                if url:
                    self.open_url(url, prepare=True)
        elif event.button == 2:
            # middleclick should paste the clipboard
            self.paste_clipboard(True)
            return(True)
        elif event.button == 3:
            # rightclick should display a context menu if Ctrl is not pressed
            if event.state & gtk.gdk.CONTROL_MASK == 0:
                self.popup_menu(widget, event)
                return(True)

        return(False)

I invert button test, and that's all : menu on middle click, paste on right click.

Here is the difference :

def on_buttonpress(self, widget, event):
        ...
        if event.button == 1:
            ...
        elif event.button == 3:
            ...
        elif event.button == 2:
            ...

        return(False)

With Clipman on XFCE to synchronize selection clipboard and X clipboard, it suits my needs for now.

Fil RSS des articles