phone

    • chevron_right

      blog-libre : Terminal et puissance

      blog-libre • news.movim.eu / PlanetLibre • 15 November, 2020 • 2 minutes

    What gives people feelings of power : Ce qui donne aux gens un sentiment de puissance.

    Meilleur et supérieur

    Il y a quelques années je me sentais meilleur que les autres simplement parce que j’utilisais le terminal. Un jour je m’étais trouvé con, les doigts légèrement au-dessus du clavier, je ne savais pas faire en ligne de commande ce que je voulais alors que ça aurait pu être résolu rapidement et facilement en quelques clics. J’étais bloqué intérieurement, je ne voulais pas m’abaisser à faire comme un simple utilisateur. J’utilisais le terminal pour me distinguer d’autrui.

    Posséder ce que les autres n’ont pas ou avoir/faire mieux qu’eux permet de se démarquer, se sentir supérieur.

    Étrangement j’avais besoin d’en parler, d’assumer mon erreur et le ridicule de cette situation. Je suppose que de manière inconsciente j’ai voulu ressembler et m’identifier à une élite technique, probablement une envie d’appartenance à un groupe, de reconnaissance. Maintenant j’assume bien plus/mieux mes différences et mes erreurs, je pense que ça vient avec l’âge et la confiance en soi.

    Puissance et power user

    J’effectue à présent une majorité d’actions en ligne de commande, je confirme efficacité, rapidité, précision (et personnalisation). Je me sens surpuissant grâce à Linux, au terminal et Bash.

    Dans Humiliation, libération, volonté, puissance je disais :

    Je n’ai jamais été aussi puissant qu’aujourd’hui, je suis maître de mon ordinateur, je ne suis plus esclave de mon système d’exploitation. Je réfléchis à mes besoins, l’écosystème Linux me permet d’y répondre quand Windows me limitait. Je ne suis pas libre, j’ai enlevé mes chaînes. Je ne me traîne plus avec un boulet au pied, je cours. J’apprends à être libre et responsable.

    Quand je suis arrivé sur Linux, plus de chaînes, tout est ouvert et possible. Cependant la liberté implique de faire des choix, de comprendre ce qu’on fait, d’apprendre, c’est extrêmement coûteux . J’ai la chance d’être passionné, d’exercer un job de sysadmin Linux, j’ai bouffé de la connaissance. Je lance Firefox en ligne de commande, j’éteins et reboote mon pc avec des alias, je cherche et ouvre fichiers et dossiers avec des fonctions.

    Le savoir est à portée de main sur Linux, on peut construire. La documentation est aussi proche que la commande man , le code est ouvert, les gens partagent, on peut suivre la correction des bugs, les issues, les releases dans les repos. Impossible sur Windows et macOS où nous sommes tributaires d’applications graphiques toutes différentes, limités au niveau configuration et modification du système.

    Sur mon pc fixe, je suis en dual-boot Windows et Debian. Sur mon pc portable, chiffrement complet du disque et LVM. Grâce à Linux.

    Je ne prône pas Linux pour tous, en tant que power user je témoigne de mon avancement, de ma satisfaction. Et finalement de ma puissance grâce à Linux.

    Gravatar de blog-libre
    Original post of blog-libre .Votez pour ce billet sur Planet Libre .

    Articles similaires

    • wifi_tethering open_in_new

      This post is public

      www.blog-libre.org /2020/11/15/terminal-et-puissance/

    • chevron_right

      Ulrich Van Den Hekke : L'Application du confinement pour se déplacer

      Ulrich Van Den Hekke • news.movim.eu / PlanetLibre • 13 November, 2020 • 10 minutes

    Préambule: A cause du temps de validation du PlayStore, je publie cet article avec une semaine de retard.

    Cela fait plus d'une semaine (quand j'écris ces lignes) que le re-confinement à commencé. Quand je vais courir, je dois me cantonner à1km autour de chez moi. Mais quand je cours j'aimerais que mon téléphone intelligent me prévienne quand j'approche du rayon de 1km ouquand je le dépasse. Je ne souhaite pas avoir le nez sur une carte de mon téléphone.

    Je regarde ce qui se fait. J'ai trouvé l'application suivante sur le play store : 1km .L'application m'avait l'air de répondre à mes critères mais ne fonctionnait pas lors de mon utilisation (en plus il y avait de la pub).

    Une autre application 1km pourrait répondre à mon besoin maisje ne l'ai pas testé.

    Beaucoup d'applications ont pour but de dessiner un cercle sur une carte.

    J'ai finalement décidé d'écrire ma propre application (en plus elle sera open source).

    Voici ce dont j'ai besoin:

    • une application open source
    • un gros bouton pour démarrer la surveillance (à partir de mon point de départ)
    • un avertissement quand on approche du rayon max des 1km.
    • un avertissement régulier qand on dépasse les 1km.

    L'application

    Pour développer une application Android je vais démarrer Android Studio et commencer à développer le 1er écran. Je choisis lelanguage Java que je maîtrise plus que le language Kotlin et le SDK Minimum de Android 6.0 pour toucher 85% desutilisateurs (si l'application peut interesser d'autres personnes).

    J'imagine l'application découpée en deux parties:

    • L'activité 1 principale de l'application qui contiendra mon gros bouton, la position de départ, la position courante, et la distance à vol d'oiseau du point de départ.
    • Un service, dont le but est quand l'application est démarrée, de surveiller les déplacements et d'informer l'utilisateur.

    Nous allons donc commencer par développer l'activité

    L'activité

    Je ne suis pas graphiste ni UI/UX designer. Le design de cette première interface va alors être très simple et très sobre. Ungros bouton + les différentes informations dont j'ai besoin quand l'application est démarrée :

    Screenshoot page principale

    Lors du démarrage de l'application, j'ai besoin que celle-ci écoute le changement, les positions de l'utilisateur afin dedéfinir le point de départ. Comme ce service d'écoute me sera utile également pour le service, je développe une classe à coté.

    ArroundLocationManager

    Voici donc la classe ArroundLocationManager :

    classArroundLocationManagerextendsThread{privatestaticfinalStringTAG="ArroundLocationManager";privateLocationManagermLocationManager=null;privatestaticfinalintLOCATION_INTERVAL=1000;privatestaticfinalfloatLOCATION_DISTANCE=50f;

    Pour commencer définissons quelques constantes: je souhaite avoir la position, tous les 50m et au maximum toutes les secondes(m'enfin quelqu'un qui fait plus de 50m en une seconde à pied est trop fort pour moi).

    privateList<ArroundLocationManager.ArrroundLocationListener>listener=newArrayList<>();publicinterfaceArrroundLocationListener{voidupdateLocation(LocationstartLocation);}privateArroundLocationManager.LocationListener[]mLocationListeners=newArroundLocationManager.LocationListener[]{newArroundLocationManager.LocationListener(LocationManager.GPS_PROVIDER),newArroundLocationManager.LocationListener(LocationManager.NETWORK_PROVIDER)};publicvoidaddListener(ArroundLocationManager.ArrroundLocationListenerl){listener.add(l);}privatevoidcallListener(Locationlocation){for(ArroundLocationManager.ArrroundLocationListenerl:listener){l.updateLocation(location);}}

    Viens ensuite la définition d'un listener pour que les applications qui s'abonnent à cette classe puissent bénéficier d'unlistener et recevoir des notifications lors de la mise à jour des positions.

    Comme on peut le constater je fais tourner cette classe dans un thread. Lors de mon développement je me suis rendu compte quelorsque je quittais l'application, le service était tué également. Une des raisons à cela est que le service est dans le mêmethread que l'activité principale. L'ajout de ce thread (ainsi que d'autre chose) ont résolu le problème. (Mais il est possibleque ce soit plus lié aux autres choses qu'au thread lui même).

    Voici le coeur du thread:

    publicvoidrun(){Looper.prepare();initializeLocationManager();Looper.loop();// Never called, loop is killed when activity or thread stoppedfinalizeLocationManager();}privateArroundLocationManager.LocationListener[]mLocationListeners=newArroundLocationManager.LocationListener[]{newArroundLocationManager.LocationListener(LocationManager.GPS_PROVIDER),newArroundLocationManager.LocationListener(LocationManager.NETWORK_PROVIDER)};publicvoidinitializeLocationManager(){try{mLocationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,LOCATION_INTERVAL,LOCATION_DISTANCE,mLocationListeners[1]);}catch(java.lang.SecurityExceptionex){Log.i(TAG,"fail to request location update, ignore",ex);}catch(IllegalArgumentExceptionex){Log.d(TAG,"network provider does not exist, "+ex.getMessage());}try{mLocationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,LOCATION_INTERVAL,LOCATION_DISTANCE,mLocationListeners[0]);}catch(java.lang.SecurityExceptionex){Log.i(TAG,"fail to request location update, ignore",ex);}catch(IllegalArgumentExceptionex){Log.d(TAG,"gps provider does not exist "+ex.getMessage());}}

    On utilise le service LocationManager d'android pour écouter la position de l'utilisateur. On écoute la position venantdu Network qui permet d'avoir une position moins fiable mais rapide, puis celle venant du GPS permettant d'avoir uneposition fiable (mais lente à obtenir).

    Afin d'avoir une position la plus précise aussi, je me suis inspiré du code suivant: Obtaining the Current Location .Le code en question permet de choisir entre deux positions la plus précise (entre la position NETWORK et la position GPS).

    On notifie les appelants:

    privateclassLocationListenerimplementsandroid.location.LocationListener{publicLocationListener(Stringprovider){Log.e(TAG,"LocationListener "+provider);mLocation=newLocation(provider);}@OverridepublicvoidonLocationChanged(Locationlocation){Log.e(TAG,"onLocationChanged: "+location);if(isBetterLocation(location,mLocation)){mLocation.set(location);}callListener(mLocation);}...}

    Enfin on a une méthode pour calculer les distances avec Android.:

    publicstaticfloatgetDistance(LocationstartLocation,LocationlastLocation){float[]results=newfloat[1];Location.distanceBetween(startLocation.getLatitude(),startLocation.getLongitude(),lastLocation.getLatitude(),lastLocation.getLongitude(),results);floatdistance=results[0];returndistance;}

    MainActivity

    Retournons dans notre activité principale. Je passe la création du layout qui est fort simple.

    Dans l'activité, nous allons commencer par implémenter la phase de création du cycle de vie de notre activité:

    @OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);

    Depuis Android 6.0, il faut demander à l'utilisateur la permission d'utiliser la position de l'utilisateur. Du coupon commence par demander la permission à l'utilisateur d'avoir accès à sa position 2 .

    requestPermissionsIfNecessary(newString[]{Manifest.permission.ACCESS_FINE_LOCATION,});

    Ensuite on appelle notre location manager et on écoute les changements de positions. Pour chaque changement de positionon met à jour la position et on met à jour les textes.

    locationManager=newArroundLocationManager(this);locationManager.addListener((location)->{if(!isMyServiceRunning(ArroundService.class)){startLocation=location;}MainActivity.this.updateTextLocation();});locationManager.start();

    Enfin on initialise l'IHM.

    distanceText=findViewById(R.id.distance);startText=findViewById(R.id.start);locationText=findViewById(R.id.location);goButton=findViewById(R.id.goButton);stopButton=findViewById(R.id.stopButton);goButton.setOnClickListener(v->{setStart(true);});stopButton.setOnClickListener(v->{setStart(false);});setStart(isMyServiceRunning(ArroundService.class));MainActivity.this.updateTextLocation();}

    Comme le LocationManager est un thread, nous devons faire attention à repasser dans le thread de l'UI afin de mettreà jour les labels :

    publicvoidupdateTextLocation(){runOnUiThread(()->{if(this.startLocation!=null&&this.runLocation!=null){distanceText.setText(getString(R.string.distanceLabel,(int)ArroundLocationManager.getDistance(startLocation,runLocation)));}else{distanceText.setText("");}if(this.startLocation!=null){startText.setText(getAddress(startLocation));}else{startText.setText("");}if(this.runLocation!=null){locationText.setText(getAddress(runLocation));}else{locationText.setText("");}});}

    Pour ma part je ne connais pas la position GPS de ma maison par coeur, ni de là ou je me trouve. Cela tombe bien. Androidpropose une API pour geocoder une adresse. C'est à dire que l'on transforme une position en latitude, longitude en adresselisible:

    StringgetAddress(Locationlocation){Geocodergeocoder;List<Address>addresses;try{geocoder=newGeocoder(this,Locale.getDefault());addresses=geocoder.getFromLocation(location.getLatitude(),location.getLongitude(),1);if(addresses.size()>0&&addresses.get(0).getMaxAddressLineIndex()>=0){returnaddresses.get(0).getAddressLine(0);}return"Unknown";}catch(IOExceptione){returne.getMessage();}}

    Le service

    Le service est démarré par l'application et doit ensuite survivre à la fermeture de l'application. Pour cela nousallons créer un foreground service qui, contrairement aux services en tâche de fond qui sont déclenchés sur un évènement avecune durée de vie relativement courte, va tourner au premier plan en affichant une notification.

    Pour démarrer le service depuis l'activité principale nous avons ajouté la méthode startServer :

    privatevoidstartServer(){if(!mBounded){IntentmIntent=newIntent(this,ArroundService.class);mIntent.putExtra("startLocation",startLocation);ContextCompat.startForegroundService(this,mIntent);bindService(mIntent,mConnection,BIND_AUTO_CREATE);}}

    Ce qui est important c'est la méthode startForegroundService dont le but est de démarrer le service en mode Foreground .Cette méthode a son pendant dans le service qui est startForeground . Si cette dernière n'est pas appelée dans le serviceune erreur sera remontée par Android.

    Du coup on implémente le service et on commence par l'initialisation :

    @OverridepublicvoidonCreate(){super.onCreate();notificationManager=newArroundNotificationManager(this);locationManager=newArroundLocationManager(this);locationManager.addListener(location->{runLocation=location;callListener(location);notificationManager.send(getDistance());speakDistance();});locationManager.start();textToSpeech=newTextToSpeech(this,this);}

    On démarre le notification manager qui a pour but de notifier l'utilisateur de l'existence d'un service qui tourne au1er plan. La notification est d'ailleurs nécessaire pour un service foreground.

    On écoute aussi notre ArroundLocationManager qui lors des modifications s'occupe de mettre à jour la nouvelle positionet communique le changement de distance à l'utilisateur par voix et par notification.

    On retrouve un callListener pour avertir l'utilisateur sur l'activité principale quand cette dernière est démarrée.

    Ensuite le service démarre:

    @OverridepublicintonStartCommand(Intentintent,intflags,intstartId){Log.e(TAG,"onStartCommand");PowerManagerpowerService=(PowerManager)getSystemService(Context.POWER_SERVICE);wakeLock=powerService.newWakeLock(PowerManager.PARTIAL_WAKE_LOCK,"ArroundService::lock");wakeLock.acquire();Bundleextras=intent.getExtras();Locationlocation=(Location)extras.get("startLocation");if(location!=null){this.startLocation=location;}Notificationnotification=notificationManager.notifyDistance(0);startForeground(ArroundNotificationManager.ARROUND_ID,notification);returnSTART_STICKY;}

    Afin qu'Android et son système de gestion d'nergie ne tuent pas notre service pendant que l'on court, nous commençonspar mettre un PARTIAL_WAKE_LOCK. Ensuite nous récupérons la position (sauf si nous sommes issus d'un redémarrage del'application) et appelons la méthode startForeground avec une notification persistante que nous avons créé.

    Surtout après l'acquision du Wake Lock, il est important de le relâcher lors de la fermeture (quand l'utilisateurclique sur stop):

    publicvoidstop(){if(wakeLock!=null){if(wakeLock.isHeld()){wakeLock.release();wakeLock=null;}}stopForeground(true);stopSelf();}

    On en profite pour arrêter la notification (avec ̀ stopForeground ) et arrêter le service (avec stopSelf ).

    Pour lire à l'utilisateur la distance, nous utilisons android.speech.tts.TextToSpeech . Son utilisationest fort simple et se fait lors de l'appel à speakDistance :

    privatevoidspeakDistance(){intdistance=(int)getDistance();if(Math.abs(lastDistance-distance)>100){intstringId;if(distance>1000){stringId=R.string.speaker_meters_alert;}elseif(distance>900){stringId=R.string.speaker_meters_warn;}else{stringId=R.string.speaker_meters_info;}Stringtext=getString(stringId,distance);if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){textToSpeech.speak(text,TextToSpeech.QUEUE_FLUSH,null,null);}else{textToSpeech.speak(text,TextToSpeech.QUEUE_FLUSH,null);}lastDistance=distance;}}

    Enfin le dernier point concerne la création des notifications. Depuis la version Android O, l'application doitassocier une notification à un channel. Cela permet à Android de présenter à l'utilisateur une interface avec lesnotifications possibles et de pouvoir désactiver/activer ces dernières au cas par cas.

    AndroidNotificationManager est là pour ce but. Il va créer le channel de notification et notifier la distance àl'utilisateur.

    privatestaticfinalStringCHANNEL_DEFAULT_IMPORTANCE="Running";publicstaticfinalintARROUND_ID=1;privatevoidcreateNotificationChannel(){if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O){CharSequencename=context.getString(R.string.channel_name);Stringdescription=context.getString(R.string.channel_description);NotificationChannelchannel=newNotificationChannel(CHANNEL_DEFAULT_IMPORTANCE,name,NotificationManager.IMPORTANCE_DEFAULT);channel.setDescription(description);NotificationManagernotificationManager=context.getSystemService(NotificationManager.class);notificationManager.createNotificationChannel(channel);}}publicNotificationcreateNotification(floatdistance){IntentnotificationIntent=newIntent(context,MainActivity.class);PendingIntentpendingIntent=PendingIntent.getActivity(context,0,notificationIntent,0);returnnewNotificationCompat.Builder(context,CHANNEL_DEFAULT_IMPORTANCE).setContentTitle(context.getText(R.string.notification_title)).setContentText(context.getString(R.string.notification_message,(int)distance)).setSmallIcon(android.R.drawable.ic_menu_mylocation).setContentIntent(pendingIntent).build();}publicvoidnotifyDistance(floatdistance){Notificationn=this.createNotification(distance);NotificationManagernotificationManager=context.getSystemService(NotificationManager.class);notificationManager.notify(ARROUND_ID,n);}

    Il est important lors de l'appel à notifyDistance de toujours utiliser le même identifiant de notification afinque cette dernière soit remplacée (et non ajouté). Cela permet de mettre à jour le contenu de la notification.

    Pour finir

    Pour finir je suis content d'avoir développé cette application qui n'est pas exempte de bug, mais qui m'a pristrès peu de temps de développement.

    Vous pouvez retrouver le code source sur Github: phoenix741/1kmarround et sur le PlayStore (à ce jour l'applicationn'a pas encore été validé dans les stores et n'est donc pas disponible).

    Le plus long dans ce développement aura été:

    • faire l'icône (à partir d'une image se trouvant sur undraw.co )
    • faire le layout (même si elle est simple)
    • remplir la fiche du playstore pour mettre l'application dans les stores.

    1. Une activité est l'équivalent d'un écran dans Android.

    2. Pour demander les permissions je me suis basé sur le code suivant:

      @Overridepublic void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {    ArrayList permissionsToRequest = new ArrayList<>();    for (int i = 0; i < grantResults.length; i++) {        permissionsToRequest.add(permissions[i]);    }    if (permissionsToRequest.size() > 0) {        ActivityCompat.requestPermissions(this, permissionsToRequest.toArray(new String[0]), REQUEST_PERMISSIONS_REQUEST_CODE);    }}private void requestPermissionsIfNecessary(String[] permissions) {    ArrayList permissionsToRequest = new ArrayList<>();    for (String permission : permissions) {        if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {            // Permission is not granted            permissionsToRequest.add(permission);        }    }    if (permissionsToRequest.size() > 0) {        ActivityCompat.requestPermissions(this, permissionsToRequest.toArray(new String[0]), REQUEST_PERMISSIONS_REQUEST_CODE);    }}

    Gravatar de Ulrich Van Den Hekke
    Original post of Ulrich Van Den Hekke .Votez pour ce billet sur Planet Libre .

    • wifi_tethering open_in_new

      This post is public

      shadoware.org /post/application_du_confinement

    • chevron_right

      Simon Vieille : Mail RSS : transformer des mails en flux RSS

      Simon Vieille • news.movim.eu / PlanetLibre • 12 November, 2020 • 2 minutes

    J'essaye de plus en plus de réduire le volume de mails que je reçois. Du coup, quand une newsletter m'intéresse et que les auteurs ne fournissent pas de flux RSS, celame donne un prétexte pour écrire un nouveau projet : Mail RSS .

    Comment ça marche ?

    L'idée est assez simple : en utilisant les alias de mail dans Postfix ,on peut faire en sorte qu'un mail qui arrive sur le serveur soit traité par une commande. J'ai décidé de rediriger les mails dans un répertoire précis du serveur et jedemande à Mail RSS de les lire et de les importer.

    Prenons la newsletter de TechTrash comme exemple.

    Configuration du serveur de mail

    Il faut ajouter un alias qui va générer des fichiers.

    techtrash: "| cat > /var/lib/mailrss/techtrash-$(date +%s) && chmod o+rw /var/lib/mailrss/techtrash-$(date +%s)"

    Au préalable, j'ai créé le répertoire /var/lib/mailrss et je me suis assuré que mon applicationpouvait lire et écrire dedans, de même que Postfix ( nobody:nogroup ).

    Configuration de l'application

    On doit générer un mailing pour TechTrash. Quand on va importer les mails de TechTrash,on pourra les associer au mailing via son identifiant ( ID ). On pourra ensuiteaccéder au flux RSS via le lien généré à sa création. Évidement, on peut créerautant de mailing que l'on veut, les modifier et les supprimer.

    $ php bin/console mailing:new "TechTrash"$ php bin/console mailing:list ------------ -------------------------------------- ------------------------------------------------------------------------ --------------------- ---------------------   Label        ID                                     Feed                                                                     Created at            Updated at            ------------ -------------------------------------- ------------------------------------------------------------------------ --------------------- ---------------------   Tech Trash   xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx   https://exemple.fr/mailing/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/rss   2020-11-12 13:37:00   2020-11-12 13:37:00   ------------ -------------------------------------- ------------------------------------------------------------------------ --------------------- --------------------- 

    Enfin, il faut un script qui va traiter les fichiers de /var/lib/mailrss en les important dans le mailing correspondant et qui les supprime du serveur.

    #!/bin/shcd "/path/to/exemple.fr"find /var/lib/mailrss -name "techtrash-*" | while read MAIL_FILE; do    cat "MAIL_FILE" | php bin/console mail:import xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx    rm "MAIL_FILE"done

    Quand un mail est importé, les données récupérées sont :

    • Le sujet du mail
    • La date du mail
    • Le contenu HTML
    • Le contenu texte
    • Les pièces jointes

    Toutes ces données seront accessibles à la consultation.

    L'application s'appuie sur Symfony (en version de développement) et le code esttotalement libre 😄

    Gravatar de Simon Vieille
    Original post of Simon Vieille .Votez pour ce billet sur Planet Libre .

    • wifi_tethering open_in_new

      This post is public

      www.deblan.io /post/591/mail-rss-transformer-des-mails-en-flux-rss

    • chevron_right

      genma : Yunohost - Les mails ne marchent plus d'un seul coup

      genma • news.movim.eu / PlanetLibre • 10 November, 2020 • 1 minute

    Depuis Thunderbird ou depuis un webmail (application Roundcube ajoutée à mon Yunohost), d'un seul coup , je ne pouvais pas accéder à mes mails. Erreur de mot de passe, alors que le mot de passe me permet de me connecter via le SSO et d'accéder aux différentes applications.

    Dans les logs, dans le fichier /var/mail/log, je trouve la ligne :

    imap-login: Disconnected (auth failed, 2 attempts in 8 secs): user=, method=PLAIN, rip=127.0.0.1, lip=127.0.0.1, TLS, session=

    Dans l'interface d'administration de Yunohost (interface graphique), une fois que je me rends sur la fiche de mon utilisateur, en haut, dans la zone d'affichage des messages, j'ai le message suivant :

    "La boîte aux lettres est désactivée pour l'utilisateur genma"

    Je cherche un peu sur la fiche de mon utilisateur, dans le champ Quota de la boite aux lettres, le quota n'est pas à 0 (ce qui est une condition qui désactive la boite mail).

    Je regarde donc en ligne de commande pour changer le quota :

    # yunohost user update genma -q 1000M
    Success! User info changed
    Warning: E-mail turned off for user genma
    firstname: Genma
    fullname: Genma Kun
    lastname: Kun
    mail: genma@XXXXXXXXXX
    mail-aliases:
    - root@XXXXXXXXXX
    - admin@XXXXXXXXXX
    - webmaster@XXXXXXXXXX
    - postmaster@XXXXXXXXXX
    - root@XXXXXXXXXX
    mail-forward: genma@XXXXXXXXXX
    mailbox-quota:
    limit: 1000M
    use: ?
    username: genma

    La ligne importante

    Warning: E-mail turned off for user genma

    Recherche sur le forum

    Je recherche dans la documentation, le forum de Yunohost : rien de concluant. Aucun message lié ou correspondant à mon problème.

    En comparant avec une autre instance, j'ai pu trouvé la source du problème...

    La cause du problème et la solution

    Une fausse manipulation avait enlevée la permission "e-mail" sur mon utilisateur. Je l'ai rajouté et ça marche de nouveau. Cf la capture d'écran ci-dessous :

    C'était tout bête mais il faut le savoir !

    Documentations complémentaires

    - Sur la partie permission liées aux utilisateurs et aux applications
    - D'une façon générale sur les mails

    Gravatar de genma
    Original post of genma .Votez pour ce billet sur Planet Libre .

    • chevron_right

      Francois Aichelbaum : Too big to fall, not to fail!

      Francois Aichelbaum • news.movim.eu / PlanetLibre • 9 November, 2020 • 6 minutes

    Too big to fall, not to fail

    The late US election inspired me, mixed with several of my customers suffering from their providers’ failure, and led me to write this post to remind about the reality, and not someone’s reality.When dealing with a provider, or selecting a one, you may thing about the consequences and his failure on your business: often, you’ll prefer a big player, as he might be too big to fall. Even if falling and failing are just a character away, they are far more different.

    lem.mings (‘lem-ingz): adorable yet incredible stupid furry creatures. Without your help, they have no chance of survival.

    Lemmings Puzzle

    Internet is dead! Nope, just Facebook

    No need to go back to the beginning of Zuck’s company history: an ultra-fast search on your favorite search engine will lead you to a major crash beginning of 2020 .

    We often confuse failing our company’s box with failing our customers. That’s why I prefer the term “falling” in the first case. With this little vocabulary point, we can dig a little more into what we call the “To big to fail fall”. This has been a recurring topic since the subprime crisis of 2008. The fact that banks can fall, disappear, what about the major players in each field.

    Too-big-to-fail banks not only threaten our financial system – they also distort competition © Frédéric Hache / Finance Watch
    Too-big-to-fail banks not only threaten our financial system – they also distort competition © Frédéric Hache / Finance Watch

    The fall of “too big” would theoretically cause the whole system to fall. Although this is not without disastrous consequences, no system disappeared with the fall of the American banks. No system disappeared with the massive fall of the car manufacturers. Massive bankruptcies, unemployment, people on the street yes. But the system did not. So those “too big” can fall.

    Well, that’s not really the subject of this post, but you’ve understood: we suppose that a big actor can’t disappear because we’ll do everything we can to hold him, because after all, if he were to disappear, we suppose the consequences would be far too disastrous. So let’s move on.

    No one has ever been fired for opting for IBM

    Choosing “too big” is reassuring. It is known, it has thousands of employees, it weighs hundreds of millions of dollars, … It cannot fail fall. Nope, but it can fail.

    The first source of error is and has always been human. This is the primary reason for relying on a principle such as HAZOP (HAZard and OPerability studies). The principle of HAZOP is the decomposition of the system to be analyzed into several subsets, called “nodes” so that the risk analysis can be shared between individuals or multidisciplinary teams. Assume that something will fail, and then you can prevent the risk. In fact, in IT, we often use the expression:

    If everything went well, then you’ve forgotten something.

    Not for nothing.

    In 2017, AWS suffered a huge incident on its massive storage (AWS S3). This incident was the direct consequence of human error, to debug another situation. As a result, all companies relying on AWS’ S3 service in this region have been impacted by the service outage, but worse, some have lost data, with no hope of ever finding it again. How many customers have gone out of business due to a failure at AWS?

    Bigger is not better

    Very often, the first reaction of a customer of these “too big”, on this type of incident, is that given the massive failure, and the number of companies impacted, your own users, the end-users, will have other things to deal with.

    This is true, but within a certain limit. On the other hand, it also shows that you have not calculated the risks, and assume that this risk would be borne unilaterally by this “too big”.

    You said to say Hardy!

    Very often, in order to respond to these human errors, we decide that the best way is the constraint, the limitation, the process. Do what you are told and strictly what you are told. This is how your “too big”, under cover of a Quality certification for example, will set up various levels of support, each with its own forms, processes, …

    Here, we can echo one of my customers, who ordered from the largest French hosting provider (Hello there, OVH), servers, proudly announced available in 120s, without specifying the quantity. Well yes, marketing doesn’t have the same concern for quality process and transparency as technology: after all, it’s not a service ;)

    Anyway, servers ordered, but only partially delivered two weeks later. Impossible to have a status because the delivery process is jammed. But the fun doesn’t stop there. In order not to be caught off guard, this customer decides to start installing the servers already delivered, using the tools of this provider. Except, that these tools are bug’d. A support ticket is opened, without reaction. The customer’s teams continue to work on it all the weekend, hoping to get the whole thing up and running, and at times, receive charming mails from the provider, as:

    • you have set such a value to 0: except that the provider’s installation tool forbids such a value … which is only the result of a bug
    • stop loop crashing: except that it crashes in a loop, because installing it crashes in a loop.

    Solution proposed by the founder of OVH? Replace the famous servers with its Object Storage service. The same service, which has been in error for a week, with no solution, and where some customers are complaining about a loss of revenue of several thousand euros over the same period.

    The company feels that if we ease up just because someone dies, it will encourage other people to die
    Better off Ted

    And meanwhile, the mail open to the support, with all the details, is not read by the speakers. Why is this? It’s out of process! The emails are processed by the level 1 support, which doesn’t work on weekends, while the technicians on site only intervene on alarms. The link between the two in normal times? Level 2 support which can only be triggered by level 1. The famous level 1 unavailable. The process is therefore, once again, at fault.

    Here it is possible to distinguish several failures:

    • managerial, where the founder ignores the state of his department (voluntarily or not) and gives you inadequate recommendations
    • supply chain, where a server is missing, with no possible information, and no possible billing for the supplier.
    • support, where segmentation of teams prevents information from circulating correctly, preventing a technical solution from being implemented

    Me, myself, and the Apocalypse

    Such failures often go unnoticed by the mass of customers of these providers. However, if you take the time to search, you will always find customers. This becomes all the more true when these customers reach critical size.

    So yes, one provider can be better than another (in fact, any truly professional provider is better than a low-cost provider). However, no one is infallible, and no one is too big in the face of fails.

    If the service to be delivered to you is critical, then the skill levels of that provider are critical. But it is also your responsibility to have a plan-B outside of your provider. Processes (and certifications) will only serve you in court to ascertain whether the obligations of means and results have been met. Period.

    How about you? Do you prefer “too big”?

    Gravatar de Francois Aichelbaum
    Original post of Francois Aichelbaum .Votez pour ce billet sur Planet Libre .

    • chevron_right

      Journal du hacker : Liens intéressants Journal du hacker semaine #45

      Journal du hacker • news.movim.eu / PlanetLibre • 8 November, 2020 • 1 minute

    Pour la 45ème semaine de l'année 2020, voici 10 liens intéressants que vous avez peut-être ratés, relayés par le Journal du hacker , votre source d’informations pour le Logiciel Libre francophone !

    logo-journal-du-hacker.png

    Pour ne plus rater aucun article de la communauté francophone, voici :

    De plus le site web du Journal du hacker est « adaptatif (responsive) ». N’hésitez pas à le consulter depuis votre smartphone ou votre tablette !

    Le Journal du hacker fonctionne de manière collaborative, grâce à la participation de ses membres. Rejoignez-nous pour proposer vos contenus à partager avec la communauté du Logiciel Libre francophone et faire connaître vos projets !

    Et vous ? Qu’avez-vous pensé de ces articles ? N’hésitez pas à réagir directement dans les commentaires de l’article sur le Journal du hacker :)

    Gravatar de Journal du hacker
    Original post of Journal du hacker .Votez pour ce billet sur Planet Libre .

    Articles similaires

    • chevron_right

      Kiddo : Activer la réduction de bruit en temps réel et l’annulation acoustique d’écho pour un microphone sous Linux avec PulseAudio (et faire croire aux gens que vous roulez en Porsche)

      Kiddo • news.movim.eu / PlanetLibre • 5 November, 2020 • 2 minutes

    On se souviendra que j’avais témoigné de mon admiration pour le a coustic e cho c ancelling dans Empathy/Telepathy via PulseAudio il y a plusieurs années.

    Or, Empathy et Telepathy sont morts et enterrés, et WebRTC a largement pris leur place (ça, on le voyait venir) avec des applications comme Jitsi Meet, BigBlueButton, et plein de sites web SaaS propriétaires.

    Ce que j’avais oublié de dire en 2012, c’est que l’AEC et débruiteur peuvent également être activés de façon permanente pour toutes les applications utilisant le micro, sans que ce soit forcément Empathy/Telepathy. Cette fonctionnalité est toujours disponible dans PulseAudio en 2020*.

    Cela peut être utile si vous ne voulez pas traiter vos enregistrements dans Audacity à chaque fois, ou pour les quelques cas d’utilisation de visioconférence où l’annulation acoustique d’écho n’est pas prise en charge par votre application (n’oublions pas que echo concealment n’est pas la même chose que echo cancellation ). Ce n’est pas tellement mon cas (ayant de l’équipement de studio de production avec des microphones bien amplifiés et sans bruit de fond), mais ça peut être pratique pour les libristes moins bien équipé(e)s qui doivent tout de même participer aux appels conférence de plus en plus fréquents mais ne veulent pas infliger aux autres le bruit de leur microphone analogique pourri collé sur le ventilateur d’un ordinateur en surchauffe. Enfin, je suppose que toutes sortes de gens veulent se débarrasser de leur echo en 2020:

    Pour activer la fonctionnalité “par utilisateur” (survit aux réinstallations du système si vous préservez votre partition home), éditez le fichier ~/.config/pulse/default.pa ; Si, au contraire, vous voulez l’activer system-wide pour tous les utilisateurs, éditer /etc/pulse/default.pa , et y insérer le contenu suivant:

    load-module module-echo-cancel source_name=noechosource sink_name=noechosinkset-default-source noechosourceset-default-sink noechosink

    On aurait pu écrire “Fiji” au lieu de “noechosource” et “lavabo” au lieu de “noechosink” je suppose. Il y a aussi une pléthore d’options possibles pour le module echo cancel , mais on va garder ça simple. Comme une Toyota.

    Dans le cas de ~/.config/pulse/default.pa , n’oubliez pas que votre fichier doit hériter du fichier système, et donc commencer avec ces lignes au début du fichier:

    .include /etc/pulse/default.pa

    Puis vous pouvez redémarrer l’instance PulseAudio de votre session d’usager en le stoppant (puisqu’il redémarrera tout seul, du moins si vous êtes sous GNOME): pulseaudio --kill

    Des nouveaux périphériques virtuels d’enregistrement seront alors à votre disposition dans pavucontrol (ou le mixeur audio de GNOME Control Center). Mais avant de vous lancer dans toute cette aventure, peut-être voudrez-vous renommer vos périphériques matériels aux yeux de PulseAudio … ainsi tout le monde dans la visio croira que vous roulez en Porsche.


    *: du moins, jusqu’à ce qu’on en ait marre de PulseAudio et qu’on le remplace par un autre système qui fait le café dans les années à venir…

    Gravatar de Kiddo
    Original post of Kiddo .Votez pour ce billet sur Planet Libre .

    • wifi_tethering open_in_new

      This post is public

      fortintam.com /blog/reduction-de-bruit-de-microphone-et-anti-echo-sous-linux-avec-pulseaudio/

    • chevron_right

      RaspbianFrance : Le Raspberry Pi 400 vient de sortir, un ordinateur DANS un clavier pour 70€ !

      RaspbianFrance • news.movim.eu / PlanetLibre • 2 November, 2020 • 4 minutes

    Photo du dessus du Raspberry Pi 400

    La fondation vient d’annoncer, comme à son habitude à l’improviste, la sortie dès aujourd’hui d’une nouvelle version du Raspberry Pi, le Raspberry Pi 400, qui tranche fondamentalement avec ses prédécesseurs !

    Voyons ensemble ce que propose cette nouvelle machine, ce qu’elle a dans le ventre, à qui elle s’adresse et, bien sûr, où vous pouvez l’acheter.

    Acheter le Raspberry Pi 400 chez Kubii

    Où acheter le Raspberry Pi 400 ?

    Commençons par le point qui en intéressera beaucoup parmi vous : où acheter le Raspberry Pi 400.

    En France notre partenaire kubii.fr est actuellement le seul à proposer le Raspberry Pi 400 à la vente.

    Le Raspberry Pi 400 est actuellement proposé dans deux offres différentes :

    Pour ceux qui se posent la question, Kubii continuera bien à livrer durant cette période de confinement, et si vous achetez votre Pi 400 maintenant vous le recevrez bien évidement à temps pour Noël.

    Voir le Raspberry Pi 400 seul chez Kubii Voir le Kit Raspberry Pi 400 complet chez Kubii

    Le Raspberry Pi 400, un ordinateur dans un clavier !

    Si vous avez connu les années 80 et le célèbre Commodore 64, préparez-vous à une vague de souvenirs avec ce Pi 400.

    En effet, comme les ordinateurs des années 80, ce nouveau Raspberry est un ordinateur directement intégré dans le clavier !

    Photo du Raspberry Pi 400Le nouveau Raspberry Pi 400 est un ordinateur, directement dans un clavier !

    Oui, vous avez bien lu et vu, un ordinateur complet dans un clavier, l’écran en moins évidemment.

    Une bonne idée n’est jamais trop vielle pour être empruntée.

    Loin de cacher ses influences, la fondation revendique haut et fort son inspiration, citant explicitement dans son article de blog les machines « BBC Micros, ZX Spectrums et Commodore Amigas ».

    Mais, si la fondation a choisi de s’inspirer de ces anciens PC, ce n’est pas uniquement par nostalgie, mais avant tout pour l’aspect pratique, la puissance, mais aussi une question d’apparence, de prise en main, et particulièrement dans le cas du Raspberry, d’encombrement.

    Photo d Contrairement aux PC des années 80, le Raspberry Pi 400 ne fait que 2 centimètres d’épaisseur.

    Avec ce nouveau Raspberry Pi 400, fini donc les boîtiers, les câbles dans tous les sens sur le bureau, etc. Un câble d’alimentation, un câble pour l’écran, au besoin un câble pour la souris, le tout directement depuis le clavier.

    Le Raspberry Pi 400 est basé sur un Raspberry Pi 4, un peu boosté.

    Au niveau technique le Pi 400 est construit sur la base du Raspberry 4, mêmes ports, mêmes capacités graphiques, même mémoire, même alimentation, etc.

    Les ports GPIO sont bien sur conservés et facilement accessibles sur la face du clavier dédiée aux connectiques.

    Seule différence technique, la cadence du processeur qui est revue à la hausse, passant de 1.5 Ghz pour le Raspberry 4 à 1.8 Ghz pour le Raspberry 400.

    La forme du Raspberry Pi 4 a également été entièrement repensée pour s’adapter à ce nouveau format, comme en témoigne cette image de la fondation.

    Cette image de la fondation montre bien les différentes parties, clavier, plaque thermique, Pi 4 nouveau format.

    Autre différence, grâce à sa forme moins compacte et à l’utilisation de dissipateurs thermiques intégrés (la partie grise de l’image ci-dessus), ce Raspberry Pi 400 devrait beaucoup moins chauffer que le Raspberry Pi 4, ce que semble confirmer les tests de François du site framboise314.fr.

    Courbe de température du Raspberry Pi 400 sous forte charge processeur. Courbe de température pendant 30 minutes de charge CPU à 100%.

    Finalement, à qui s’adresse ce Raspberry Pi 400 ?

    Avec ce nouveau modèle, la fondation tranche radicalement avec son approche historique assez peu orientée expérience utilisateur, du moins au niveau physique.

    Si ce Raspberry Pi 400 ne sera clairement pas adapté ni à la domotique ni à l’embarqué, il sera en revanche particulièrement adapté aux utilisateurs découvrant l’informatique, notamment les enfants voulant découvrir la programmation.

    Le Raspberry Pi 400 devrait donc faire un excellent cadeau de Noël, comme le suggère d’ailleurs la fondation qui parle d’ailleurs du kit complet pour le Raspberry Pi 400 comme du parfait produit « Christmas morning », avec tout dans la boîte, Pi 400, câbles, souris officielle , alimentation , carte SD pré-installée, le livre officiel (hélas en anglais) guide du débutant , etc. Il n’y aura plus qu’à brancher à votre écran ou votre télé !

    Photo du kit complet du Raspberry Pi 400. Le kit complet Raspberry Pi 400.

    Ça tombe bien, cette année Noël risque de se passer en intérieur :/.

    Au delà des enfants, ce nouveau Raspberry Pi pourrait bien intéresser deux autres publics :

    • En premier lieu, les gens désireux de trouver un PC très peu cher pour une utilisation bureautique et internet, sans sacrifier l’aspect pratique.
    • En second lieu les développeurs et autres amateurs d’électronique qui pourront ainsi facilement développer et tester sur la même machine, le tout en gardant un environnement de travail propre !

    De notre coté on ne vous le cache pas, ce produit nous a vraiment séduit et va totalement trouver sa place sur notre bureau !

    Lire l'article complet : Le Raspberry Pi 400 vient de sortir, un ordinateur DANS un clavier pour 70€ !

    Gravatar de RaspbianFrance
    Original post of RaspbianFrance .Votez pour ce billet sur Planet Libre .

    • wifi_tethering open_in_new

      This post is public

      raspberry-pi.fr /raspberry-pi-400/

    • chevron_right

      Journal du hacker : Liens intéressants Journal du hacker semaine #44

      Journal du hacker • news.movim.eu / PlanetLibre • 1 November, 2020 • 1 minute

    Pour la 44ème semaine de l'année 2020, voici 10 liens intéressants que vous avez peut-être ratés, relayés par le Journal du hacker , votre source d’informations pour le Logiciel Libre francophone !

    logo-journal-du-hacker.png

    Pour ne plus rater aucun article de la communauté francophone, voici :

    De plus le site web du Journal du hacker est « adaptatif (responsive) ». N’hésitez pas à le consulter depuis votre smartphone ou votre tablette !

    Le Journal du hacker fonctionne de manière collaborative, grâce à la participation de ses membres. Rejoignez-nous pour proposer vos contenus à partager avec la communauté du Logiciel Libre francophone et faire connaître vos projets !

    Et vous ? Qu’avez-vous pensé de ces articles ? N’hésitez pas à réagir directement dans les commentaires de l’article sur le Journal du hacker :)

    Gravatar de Journal du hacker
    Original post of Journal du hacker .Votez pour ce billet sur Planet Libre .

    Articles similaires