Hors sujet… âmes sensibles et terfs, s’abstenir !

Ce n’est pas de l’informatique, et par nature, je n’aimais pas trop mélanger activité professionnelle et personnelle.

Mais ça c’était avant…

Définir la ligne éditoriale d’un blog est un exercice difficile.. C’est un délicat équilibre entre partager ce que j’aime avec vous, chers lecteurs.rices, me faire plaisir (surtout), partager (énormément), et donner à mon activité professionnelle une dimension humaine dont elle manque parfois cruellement.

Mais cela n’aura sans doute échappé à personne, nous sommes en 2020, et en train de vivre une crise économique et sociale sans précédent.

Mais au delà de cette crise, j’ai vraiment l’impression que le Covid19, plutôt que de générer un monde nouveau et meilleur comme certain.es en rêvaient, à créé un monde encore pire que l’ancien !

Alors comme je suis tombée sur ces 2 vidéos, et qu’elles m’ont particulièrement émues, informatique ou pas, j’ai décidé de vous les partager !

La première est une vidéo réalisée par l’inter LGBT pour sensibiliser à la transphobie. Attention, elle est un peu « dure » :

La seconde est une publicité pour Diesel 🙂 avec Harlow Monroe. Dommage qu’elle ne soit pour le moment diffusée qu’en Italie ! Spoiler… ce n’est pas de la promo pour de l’extasy 😉 Si vous voulez vraiment plus d’explications, voyez ici : https://jai-un-pote-dans-la.com/

Quant à moi, je continuerai à essayer, de temps en temps, de vous proposer du contenu n’ayant rien à voir avec l’informatique, mais qui me touche d’une façon ou d’une autre !

L’enregistrement NSUserDefaults en Swift

L'enregistrement clé-valeur en swift _ nsuserdefaults

L’enregistrement de données sous forme de clé-valeur en développement mobile à déjà été abordé dans l’article sur les SharedPreferences.

Aujourd’hui, je vous propose de faire la même chose, mais en Swift. C’est beaucoup plus simple, mais nous nous limitons alors aux plateformes Apple (iOS, iPadOS, MacOS, WatchOS).

Comme pour les SharedPreferences, NSUsersDefaults est donc un système simple et rapide qui permet d’enregistrer des valeurs de type Float, Bool, Double, Int, mais aussi des objets (array, dictionary…. ), et des urls. C’est donc une façon de gérer la persistance des données à la fois simple et puissante 🙂 .

Pour cette démo, j’ai créé une petite application très simple dans laquelle l’utilisateur enregistre une phrase, et celle-ci est stockée comme une clé-valeur grâce à UserDefaults :

Afin de vérifier la persistance, n’hésitez pas à relancer l’application, et vous verrez que votre phrase reste mémorisée 🙂

Alors pour utiliser UserDefaults, il faut déjà créer une instance de UserDefaults, et définir ses clés de préférences :

Ensuite, l’enregistrement d’une valeur se fait avec l’instruction « préférences.set » :

Et la lecture d’une valeur avec :

Et c’est tout !

Ce qui fait que notre controller contient juste ce code :

Je pense que c’est la méthode la plus simple en Swift pour sauvegarder des informations ! Mais elle est aussi très puissante, puisqu’il est non seulement possible d’enregistrer des valeurs « simples », comme des entiers, des nombres et de booléens, mais aussi des valeurs plus complexes, comme des tableaux et des dictionnaires. En « bidouillant » un peu, on peut même enregistrer des images !

Bref, pas de raisons de s’en priver !

Comme toujours, le code source est disponible sur mon dépôt Git : https://gitlab.com/vinceBar/swift-nsuserdefaults-ios-demo-project

Et si vous avez des questions / suggestions, n’hésitez pas, commentez !

Utiliser les préférences partagées en Flutter

Lorsque nous développons une application mobile, il se pose toujours à un moment ou un autre la question de la persistance des données.

Pour cela, plusieurs solutions existent: base de données, fichiers… et les SharedPreferences. C’est cette dernière méthode que je vais vous présenter aujourd’hui, sous Flutter. Pour la même chose en Swift, c’est par ici 🙂

Les SharedPreferences sont un système de stockage de type « key-value », disponible sur Android et iOS (NSUsersDefaults). C’est un système simple et rapide qui permet d’enregistrer des valeurs de type String, Int, Double et Bool.

Pour illustrer le concept, je vous propose une petite démo : On entre un texte dans un premier champ, lorsque l’on clique sur le bouton « + », celui-ci est sauvegardé comme une SharedPreference. Pour tester la persistance, n’hésitez pas à quitter l’application et à la relancer !

Prêt.es ? C’est parti !

La première des choses à faire, après avoir créé votre projet Flutter, ici shared_preferences_example, est d’importer le package « shared_preferences » dans le fichier pubspec.yaml.

Ensuite, on déclare et nomme la clé de notre préférence : « final String _myPreference = « myPreference » «  :

Pour accéder à une préférence partagée, il faut déclarer une instance de SharedPreferences : « final SharedPreferences prefs = await SharedPreferences.getInstance();« 

L’enregistrement se fait ensuite par « prefs.setString(_clé, valeur)« 

Et la lecture par « prefs.getString(_clé)« 

On peut bien sur faire de même pour les autres types de préférences 🙂

Et c’est tout !

Comme d’habitude, l’intégralité du code source est disponible sur mon dépôt Git : https://gitlab.com/vinceBar/sharedpreferencesflutterexample

Pour toute question / suggestion, n’hésitez pas, commentez !

L’application mobile Bring Me Back

Ça ne vous est jamais arrivé de garer votre voiture sur un parking de supermarché ou dans une rue d’une ville inconnue et au moment de repartir, horreur, impossible de la retrouver ?

Et bien moi, cela m’arrive tout le temps :(, et je ne vous parle même pas de la galère quand en plus c’est dans un pays étranger…

Alors je sais, il y a Google Maps… Sauf que voilà, je trouve que rajouter un point de repère nécessite trop de manipulations… et surtout j’avais envie de faire un peu de Flutter 🙂

Donc Bring me Back ne sait faire qu’une chose, mais elle fait simplement : vous ramener à votre point de départ.

En pratique, vous avez juste à mémoriser votre point de départ, et a demander à l’application de vous y ramener quand vous le désirez !

L’intérêt de Flutter, c’est bien sûr le multiplateforme, et la rapidité de développement. Et je n’ai pas été déçue ! Grâce à l’utilisation du package « Flutter_mapbox_navigation« , la partie la plus compliquée se fait très simplement. Un grand merci à l’auteur ! Je pense d’ailleurs que l’usage de ce package fera l’objet tôt ou tard d’un tutoriel !

En attendant que je me décide à mettre l’application sur le Play Store et peut-être l’App Store, vous pouvez déjà télécharger le fichier .apk ici : https://www.dropbox.com/

N’hésitez pas à me faire des retours de bugs, suggestions… !

Deep Learning avec TensorFlow

Ce qu’il y a de bien avec le confinement, c’est que les week-ends semblent durer plus longtemps ! Du coup, cela me laisse le temps de me cultiver !

Le dernier livre en date, « Deep Learning avec TensorFlow », est en fait la suite du livre « Le Machine Learning avec Python », dont je parle ici.

Pour celleux qui ne seraient pas encore trop au clair avec les notions de Machine Learning (ML), Deep Learning, Intelligence Artificielle (AI), voici un petit résumé des épisodes précédents 🙂

Les débuts de l’Intelligence Artificielle remontent assez loin, on cite souvent Alan Turing dans les années 1950. Elle désigne tous les traitements automatisés que l’on retrouve en Industrie (automates) et en informatique (logiciels). Là, je sens que j’ai cassé un mythe…

En fait, dans l’imaginaire collectif, AI désigne surtout une Intelligence Artificielle Forte (AGI), qui serait totalement autonome et auto-apprenante. Hélas (?), cela n’existe pas encore à l’heure où j’écris ces lignes – a priori – 😉

Le Machine Learning, c’est déjà plus glamour, car là, ce sont les machines qui « apprennent par elles-mêmes ». Attention cependant, tout cela est basé sur des mathématiques, des statistiques, il n’y a donc pas d’AGI ni de miracle derrière tout cela, seulement beaucoup d’intelligence humaine. On utilise des modèles de type régression, Naïve Bayes, clustering, arbres de décision, random Forest…

Le deep learning enfin fait partie du ML, mais fait appel à des réseaux de neurones. Elle fonctionne par bio-mimétisme : la machine essaye de reproduire le mécanisme de notre cerveau ! Il est apparu il y a 10 ans environ, notamment dans la reconnaissance d’images ou de langage naturel.

On en vient alors à TensorFlow !

TensorFlow est un outil d’apprentissage automatique développé par Google, il est open source et basé sur Google Brain.

Du coup, on parle de Deep Learning, donc de réseaux de neurones.

Après une courte (ré)-introduction aux concepts de base du ML, ce livre fait donc une introduction aux réseau de neurones artificiels et à leur entrainement.

Il aborde successivement les réseaux de neurones convolutifs, les réseaux de neurones récurrents, les autoencodeurs et enfin l’apprentissage par renforcement.

Perso, plus j’avance dans mon apprentissage du ML, plus j’ai l’impression que l’on se rapproche des méthodes d’apprentissages que l’on utilise avec nos animaux domestiques. L’apprentissage par renforcement, qui utilise les récompenses, en est un exemple. Même si bien sûr nous sommes encore loin, pour le moment, de la complexité d’un cerveau animal. Mais cela à toujours un coté « magique » 🙂 !

En tous cas, je suis de plus en plus captivée par le ML, et si vous aussi vous avez envie d’approfondir le sujet, ce livre est fait pour vous !

En attendant, n’hésitez pas à laisser des remarques / commentaires si vous en avez !

Créer facilement ses classes modèles en Dart à partir d'un JSON

Convertir du json en modele dart facilement

Travaillant actuellement sur un projet en Dart / Flutter, j’ai fait la connaissance du super travail de Javier Lecuona, qu’il trouve ici mon éternelle gratitude 🙂 .

En effet, créer un modèle à partir de fichier JSON est potentiellement source de bugs, surtout lorsque le JSON est un peu complexe. C’est ici qu’intervient l’outil « JSON to Dart » : https://javiercbk.github.io/json_to_dart/

L’usage est simplisme ! Vous récupérez l’intégralité de votre JSON (ici un exemple issu de jsonplaceholder.com) :

Vous le collez dans l’interface de JSON to Dart :

Vous ajoutez le nom que vous désirez donner à votre classe, et il ne reste plus qu’à appuyer sur le bouton « Generate Dart » et à copier / coller le code généré !

Génial je vous dit !

Si vous connaissez la même chose pour Swift, n’hésitez pas à me le faire savoir ! 😉

Des manuels scolaires consultables via Internet

Il va falloir s’y faire, au vu des annonces faites par le président Macron hier, nos habitudes vont devoir changer, et on va devoir se serrer les coudes !

Le changement d’organisation va nécessiter pas mal d’adaptations, dont certaines potentiellement positives 🙂

Par exemple, pour faciliter la vie des parents, les éditions Bordas, Nathan, Le Robert et Retz on eu la bonne idée de proposer leurs manuels scolaires en libre consultation. C’est pas cool ça ?

A consulter ici : https://adistance.manuelnumerique.com/

La Machine learning avec Python

Lorsque l’on s’intéresse au machine learning, ce ne sont pas les ressources qui manquent… mais généralement, elles sont en anglais… Ce n’est pas forcément un problème, mais c’est quand même plus agréable (pour moi) lorsque je trouve des ressources en langue française 🙂

Du coup, je me suis procurée ce livre auprès d’un grand site de vente en ligne… et je désirais vous partager ma satisfaction 🙂

Avec ce livre, si vous avez quelques bases de Python (ou pas, mais faut quand même avoir de bonnes bases dans un langage de programmation, vous aurez une initiation au ML sans devoir passer des jours de remise à niveau en mathématiques.

Le principal intérêt est que, contrairement à beaucoup de tutos en lignes, on part de la pratique pour arriver aux principes mathématiques sous-jacents. Perso, cette manière d’apprendre me convient beaucoup mieux.

En se basant principalement sur scikit-learn, sont abordés :

  • L’apprentissage supervisé avec ses les différents modèles, leur usage, leurs avantages et leur limites, ainsi que les méthodes pour estimer leur incertitude.
  • Idem pour l’apprentissage non supervisé
  • La représentation des donnés
  • L’évaluation et l’amélioration des modèles
  • Le Chaînage d’algorithmes et pipelines
  • Le travail avec les données textuelles

Cela fait quand même un bon aperçu des techniques de ML actuelles !

Et pour aller plus loin, voici quelques liens que je trouve intéressants :

Bonnes lectures et si vous avez des suggestions, n’hésitez pas, commentez !

L’application Reiki Energy est sortie en version 4…

Il s’agit surtout d’une mise à jour technique, mais elle apporte quand même son lot d’amélioration :

  • Une meilleure compatibilité avec iOS 13 et IPadOS 13
  • Une meilleure gestion du mode sombre
  • La durée totale d’une séance complète est maintenant affichée au démarrage du soin
  • Quelques bugs (dont un dans la gestion des préférences) ont été corrigés 🙂

D’un point de vue technique, cette version intégralement en Swift 5 et contient (enfin..) des tests unitaires et des tests d’interfaces. Cela me permettra d’envisager plus sereinement les évolutions !

Comme d’habitude, l’application est téléchargeable ici :

Et je suis à votre disposition pour toute suggestion / commentaire ici : https://vincent-barousse.blog/contact/

Développement Swift / iOS : Améliorer la qualité de son code grâce à SwiftLint

La qualité du code est actuellement LE sujet dans le monde du dev (et avec raison !). Si vous êtes développeur.se pro et passionné.e, vous n’êtes sans doute pas passé à coté !

Donc, si le TDD est votre religion, que vos tests unitaires sont nickels et couvrent 100% du code, qu’Xcode ne retourne plus un seul warning, et que Sonarqube est devenu votre meilleur ami… Et bien vous pouvez encore vous améliorer, grâce à SwiftLint !

Si Sonarqube fera l’objet d’un autre article de blog, je vais aujourd’hui vous parler de SwiftLint.

SwiftLint, c’est un outil créée et maintenu par Realm pour améliorer le respect des conventions d’écritures en Swift, disponible ici : https://github.com/realm/SwiftLint

Comme souvent, il y a plusieurs manières de l’intégrer dans un projet, personnellement, j’aime bien Cocoapods !

Comme code d’exemple, je vais reprendre la démo « InfoKayak », mise à jour pour Swift 5.

Sans SwiftLint, Xcode 11.3 ne trouve rien à redire au code (pas de warning, pas d’erreur) :

Editez maintenant le fichier Podfile en y ajoutant la ligne :  » pod ‘SwiftLint’  » :

Mettez à jour et installer les pods, puis rouvrez le projet avec Xcode. Pour le moment, il n’y a pas de changements 🙂

En fait, pour activer SwiftLint, il faut un petit script. Dans les « Build Phases » du projet, cliquez sur le « + » , ajoutez une « New run script phase », et mettez-y ce script :

On Build et Oh ! 286 warnings et 22 erreurs 😦 WTF ?

Allez, avant de faire un burn out, une bonne nouvelle, SwiftLint est capable de corriger automatiquement une grosse partie de ces problèmes 🙂 .

Pour cela, depuis un terminal, mettez vous dans le dossier de votre projet, et exécutez la commande « ./Pods/SwiftLint/swiftlint autocorrect« .

Ensuite, effacez le dossier de build d’Xcode, et au besoin, relancez l’IDE. Normalement, la situation devrait s’être grandement améliorée : il n’y a plus que 2 erreurs et 5 warnings à corriger manuellement, chose que je fais immédiatement… 😉

Dans certaines situations, on ne peux pas corriger (cas de librairie externes lesquelles nous n’avons pas la main…), il est donc possible de paramétrer SwiftLint plus finement.

Pour tout ce qui est règles globales, il faut créer un fichier .swiftlint à la racine de votre projet. Par exemple, le mien contient ceci :

Lorsqu’il s’agit d’un besoin temporaire, on peut désactiver une règle directement dans le code avec l’instruction // swiftlint:disable <rule> . La liste des règles se trouve ici : https://realm.github.io/SwiftLint/rule-directory.html

Voilà, j’espère que cette petite introduction vous aura donné envie de vous mettre à Swiftlint et à vous mettre à la qualité ! En tous cas moi, je suis accro !