Categorieën
Geen categorie

Afstappen van Google Authenticator

Als trouwe gebruiker van Google Authenticator heb ik gemerkt dat de app, naarmate ik meer codes toevoeg voor verschillende diensten, steeds minder handig wordt. Het vinden van de juiste code wordt een steeds grotere uitdaging. Daarom ben ik gaan onderzoeken of er alternatieve apps zijn die misschien handiger zijn in gebruik.

Een vraag die bij me opkwam was: hoe kan ik mijn bestaande codes uit Google Authenticator halen? Gelukkig heeft Google in mei 2020 een functie geïntroduceerd waarmee het overzetten van codes naar een ander apparaat mogelijk is. Voor deze overdracht genereert de Google Authenticator app een QR-code (of meerdere) waarin meerdere authenticator-codes zijn gecodeerd. Met een andere Google Authenticator app is het mogelijk om deze QR-code te scannen en zo de codes over te zetten.

Na een korte zoektocht stuitte ik op de volgende bibliotheek op GitHub: dim13/otpauth. Deze bibliotheek is in staat om de gegevens van de QR-code voor het overzetten van Google Authenticator uit te lezen. Met behulp van de volgende stappen kunnen de authenticator-codes van Google Authenticator geëxporteerd worden:

  1. Maak een schermafbeelding van de Google Authenticator overzetten QR-code.
  2. Scan de schermafbeelding met de QR-code scanner functionaliteit van je telefoon.
    • Dit kan eventueel ook via CLI op je computer met bijvoorbeeld de mchehab/zbar-bibliotheek: zbarimg qrcode.jpeg.
  3. Kopieer de volledig tekst uit de QR-code.
    • Deze tekst begint met otpauth-migration://offline?data=….
  4. Gebruik de https://github.com/dim13/otpauth tool via het volgende commando:
    ~/go/bin/otpauth -link "~/go/bin/otpauth -link "otpauth-migration://offline?data=…"

De bibliotheek is ook in staat om nieuwe authenticator-QR-codes te genereren via de -qr-parameter. Deze zijn vervolgens weer te scannen met een andere authenticator app.

Categorieën
Geen categorie

Het werk is nooit alleen ‘het werk’

Inmiddels ben ik al ruim 20 jaar bezig met het ontwikkelen van websites en webapplicaties. Daarmee heb ik ook wel wat ervaring opgedaan in het maken van ureninschattingen. Toch blijkt het nog wel eens lastig om een juiste ureninschatting te maken. Zo maakte een collega recent de inschatting dat iets 5 à 6 uren aan tijd zou kosten om te ontwikkelen. Uiteindelijk bleken er heel wat meer uren nodig te zijn om het gewenste resultaat te ontwikkelen. De opdrachtgever vroeg zich natuurlijk af hoe dit kwam. Bepaalde onderdelen bleken aanzienlijk lastiger dan vooraf voorzien. Kort hierna kwam ik ook het volgende bericht tegen op X:

Webontwikkelaar Dave Stewart heeft hier een interessant artikel over geschreven: “The work is never just “the work”“. De volgende afbeelding geeft aan hoe het in de praktijk kan gaan:

Categorieën
Geen categorie

Consistente personen in Midjourney

Afgelopen maandag schreef ik in het bericht “Kunstmatige intelligentie (AI) inzetten voor generen foto’s” nog over ‘character consistency’ bij het generen van van afbeeldingen met AI. Gisteren ging het op X los over de nieuwe ‘karakterconsistentie’ functionaliteit binnen Midjourney. Via de parameter --cref gevolgd door een link (URL) naar een afbeelding van een karakter/persoon kan Midjourney deze karakter/persoon verwerken in de te genereren afbeeldingen. De --cref staat in dit geval voor ‘Character Reference’. Vergelijkbaar met de --sref parameter die staat voor ‘Style Reference’.

Categorieën
Geen categorie

Kunstmatige intelligentie (AI) inzetten voor generen foto’s

Begin dit jaar kreeg ik de vraag van een klant of kunstmatig intelligentie (AI) ook ingezet kan worden voor het genereren van foto’s van een persoon in een bepaalde situatie in de branch waarin deze klant actief is. Voor marketingdoeleinden kan dat wel handig zijn om bepaalde situaties voor je (potentiële) klanten duidelijker te maken.

Nou volg ik via X wel een beetje de ontwikkelingen op het gebied van kunstmatige intelligentie en zie zo regelmatig leuke voorbeelden DALL·E (van de makers van ChatGPT → OpenAI), Midjourney en Adobe Firefly voorbij komen op mijn tijdlijn.

Zo ben ik zelf ook wat aan testen gegaan met deze tool, maar de resultaten vielen mijn persoonlijk nog een beetje tegen. Het was vaak wel duidelijk te zijn dat de foto’s gegenereerd waren en er zaten vaak wel wat onjuistheden in deze foto’s. Daarnaast bleek het lastig om telkens dezelfde persoon in de foto’s te krijgen. Een paar weken later zag ik een bericht van Chase Lean op X waarin hij dit ook aankaart:

Hij geeft aan dat hij met Scenario wel goede resultaten heeft kunnen bereiken. De tool richt zich voornamelijk op het generen van afbeeldingen voor games, daardoor is de style misschien niet altijd heel realistisch. Maar voor bepaalde doeleinden kan Scenario zeker wel leuke afbeeldingen generen in een consistente stijl. Voor marketing en het opvullen van een webpagina kan dit zeker van pas komen.

Craft unique and style-consistent game assets with custom-trained AI models.

Scenario

Nog weer later kwam ik het volgende bericht tegen:

Hier noemen ze de diensten van https://rendernet.ai/ en https://remix.ai/. Op de website van RenderNet noemen ze een techniek genaamd FaceLock:

Consistent characters… always!

Upload a photo of a person and create realistic AI characters with the same face.

RenderNet

Spelenderwijs zijn er zo heel veel tools beschikbaar en ontwikkelingen op dit gebied lijken razendsnel te gaan. Voor situaties waarbij het belangrijk is dat dezelfde persoon op de foto’s komt te staan is het handig om tools te zoeken die zich ook richten ‘character consistency’.

Categorieën
Geen categorie

Developer Roadmaps

https://roadmap.sh/

Categorieën
Geen categorie

Programmeren in je moedertaal of in het Engels?

Bij Pronamic hebben we als richtlijn dat we alles strict in het Engels programmeren. Stagiairs leren we daarom ook altijd om in het Engels te programmeren. Toch zijn er op internet ook vele voorbeelden te vinden waarin Nederlandse naamgeving wordt gebruikt in de code. Waarom heeft Engels dan bij ons de voorkeur? Ik ben voor de aardigheid eens op zoek gegaan naar goede argumenten. Al snel kwam ik een artikel tegen uit het boek “Het beste van PHP en MySQL“.

Engels of Nederlands

Amerikaans Engels is de voertaal onder programmeurs. Ook de meeste PHP-ontwikkelaars gebruiken Engels. Als je echter PHP-script alleen voor jezelf schrijft of als je in een team met alleen Hollanders en Vlamingen werkt, zijn er goede redenen om Nederlands te gebruiken.

Wanneer je Nederlands gebruikt voor alle namen die je zelf kunt kiezen, wordt broncode beter leesbaar. Het verschillen tussen Engelstalige termen uit PHP en zelfgekozen namen in dan direct zichtbaar. Dat is de reden waarom ik in dit boek vaker Nederlands gebruik dan Engels: het maakt de voorbeelden veel duidelijker als PHP nieuw voor je is.

De kans op naamconflicten neemt drastisch af als je Nederlands gebruikt. Als je Engels gebruikt voor bijvoorbeeld een functie die je zelf definieert, bestaat altijd het risico dat je per ongeluk een bestaande PHP-functie gebruikt. Naamconflicten kunnen ook voorkomen met andere talen die je in PHP gebruikt: HTML, CSS, SQL, HTPT, MIME, XML enzovoort gebruiken allemaal Engels.

Natuurlijk moet je niet overdreven vasthouden aan het Nederlands. Hoewel databank en gegevensbank foutloos Nederlands zijn, zeggen en schrijven ontwikkelaars altijd database. Het Nederlands kent al helemaal geen bruikbaar synoniem van query. In zulke gevallen kun je naamconflicten voorkomen door verschillende woorden of een samenstelling met Nederlands te gebruiken. Maak dan van $database en $query bijvoorbeeld $database_met_producten en $selectiequery.

Ward van der Put

In een boek zoals deze is het denk ik ook prima om Nederlandse code voorbeelden te gebruiken. Lezers kunnen op die manier waarschijnlijk sneller zaken herkennen. Het argument om Nederlands te gebruiken om naamconflicten te voorkomen vind ik wat minder sterk. Voor dat probleem zijn er in PHP denk ik namespaces geïntroduceerd.

Al met al nog niet hele sterke argumenten om wel of niet in het Engels of Nederlands te programmeren. Ik ben daarom verder gaan zoeken en kwam o.a. de volgende vragen / topics tegen:

Velen geven aan dat Engels de voorkeur heeft, maar om programmeren te leren je moedertaal wel fijn kan zijn.

DomQ (een Fransman) noemde nog wel de volgende aandachtspunten:

• I speak the language that the target audience will most likely understand. When coding open-source software with a global ambition, I use English. For less widely useful stuff (for instance, my Emacs configuration file), I might use French.

• I acknowledge the fact that not everyone will master English. In that perspective, using my mother tongue might actually make my code more accessible instead of less (in the example above, nobody cares about an umpteenth .emacs, except if it happens to be written in a language that they understand).

• Better to write good French than bad English. I actively discourage my subordinates from writing half-assed English especially where concision matters, eg in docstrings and version control commit messages.

https://softwareengineering.stackexchange.com/a/1764

Mattias Kihlström (een Zweed) noemde volgende argumenten om Engels te gebruiken:

• Allmost all programming languages I have ever used have been written in English (mixing languages would make the code harder to read for me)

• Most popular frameworks and third party extension are written in English (again, mixing languages would only be a distraction)

• Swedish characters (åäö) are usually not allowed when naming variables and functions

• If the other team members are from different countries we can still collaborate

• If I need support from a platform vendor it is is much easier for them to help me if they can understand my code

• It is easier to outsource support

https://softwareengineering.stackexchange.com/a/1687

Ik sluit me persoonlijk aan bij de argumenten van Mattias, dat zijn denk ik ook de redenen waarom we bij Pronamic in het Engels programmeren.

Mocht je zelf ook nog goede redenen hebben om in het Engels of juist in het Nederlands te programmeren dan hoor ik ze graag. Laat daarom gerust een reactie achter.

Categorieën
Geen categorie

Gitlabber

Als webontwikkelaar maak ik veel gebruik van Git en diensten zoals GitHub, GitLab en Bitbucket. Ook bij Pronamic maken we hier intensief gebruik van. Alle WordPress plugins en thema’s die we ontwikkelen staan keurig in een eigen Git repository. We hebben inmiddels dan ook een archief met duizenden repositories. Het komt soms voor dat we alle repositories moeten doorzoeken. Het kan dan een hele klus om alle repositories te clonen. Gelukkig zijn er tools zoals https://github.com/gabrie30/ghorg en https://github.com/ezbz/gitlabber die daarbij kunnen helpen (via https://stackoverflow.com/questions/29099456/how-to-clone-all-projects-of-a-group-at-once-in-gitlab). Ik ben vandaag eens aan de slag gegaan met gitlabber.

Categorieën
Geen categorie

ASCII kunst met FIGlet en TOIlet

Voor de nerds 🤓, ASCII kunst met FIGlet en TOIlet:

FIGlet

figlet Pronamic

Er zijn veel FIGlet fonts beschikbaar, deze kun je bekijken via het showfigfonts commando. En op http://www.figlet.org/fontdb.cgi is ook een lijst te vinden van fonts.

figlet -f shadow Pronamic

TOIlet

TOIlet werkt vergelijkbaar met FIGlet maar heeft coole kleuren filters 🦄🌈.

toilet Pronamic --filter gay

TOIlet kan ook overweg met FIGlet fonts:

toilet -d $(figlet -I 2) -f standard Pronamic --filter metal

Het subcommando figlet -I 2 geeft de standaard FIGlet font map terug zodat TOIlet weet waar de FIGlet fonts te vinden zijn.

Bronnen

Categorieën
Geen categorie

PHPUnit geen kleuren output in Composer script

Bij Pronamic maken we binnen WordPress projecten veel gebruik van Composer, PHPUnit en andere tools. Om het aanroepen van scripts te vereenvoudigen maken we ook wel gebruik van Composer scripts. In plaats van bijvoorbeeld vendor/bin/phpunit te typen kunnen we dan composer phpunit gebruiken.

{
	"name": "…",
	"description": "…",
	"config": {
		"sort-packages": true
	},
	"require": {
		"php": ">=5.6.0"
	},
	"require-dev": {
		"phpunit/phpunit": "^5.7"
	},
	"scripts": {
		"phpunit": "vendor/bin/phpunit"
	}
}

Nadeel daarvan was echter dat composer phpunit geen kleuren output gaf. Terwijl het aanroepen van vendor/bin/phpunit wel een kleuren output gaf. Dit terwijl in het PHPUnit configuratie bestand phpunit.xml.dist wel colors="true" stond. Na een kleine zoektocht kwam ik de oorzaak en oplossing tegen op Stack Overflow:

I added --colors=always from PHPUnit master (4.6) branch which did the trick. It seems PHPUnit actually detects it is called through another scripts and suppresses the colors itself.

Haralan Dobrev – https://stackoverflow.com/questions/27024298/keep-color-output-when-running-scripts-on-composer#comment44218731_27024464
{
	"name": "…",
	"description": "…",
	"config": {
		"sort-packages": true
	},
	"require": {
		"php": ">=5.6.0"
	},
	"require-dev": {
		"phpunit/phpunit": "^5.7"
	},
	"scripts": {
		"phpunit": "vendor/bin/phpunit --colors=always"
	}
}

Hoe we dit bij Pronamic in gebruik hebben is bijvoorbeeld te zien in de WordPress pay core bibliotheek:

https://github.com/wp-pay/core

Categorieën
Geen categorie

Disney emoji quiz

  1. 🔎🐠
    Finding Nemo (Op zoek naar Nemo)
  2. 🏴‍☠️⚓️🏝
    Pirates of the Caribbean
  3. 🐝🐛🐌🐞🐜
    A Bug’s Life
  4. 🦁🐗🐘🌅👑
    The Lion King (De Leeuwenkoning)
  5. 👹🕯🕑🌹✨👩🏻‍🦰
    Beauty and the Beast (Belle en het Beest)
  6. 🐶🍝🐶🎹🎁
    Lady en de Vagebond (Lady and the Tramp)
  7. 👾🎮🔨👊🍭🏅
    Wreck-It Ralph
  8. 🐠🐚🐟🔱🐙🌊🧜‍♀️
    The Little Mermaid (De kleine zeemeermin)
  9. 🐭🎪👂🐘
    Dumbo (Dombo)
  10. 👦🏼👴🏻🏠🎈⬆️
    Up
  11. ☃️👸😨
    Frozen
  12. 🐍🐻🧒📖
    The Jungle Book (Jungle Boek)
  13. 📖🤠👢🌵🚀👨‍🚀🍕
    Toy Story
  14. 💯1️⃣🐶
    101 Dalmatians (101 Dalmatiërs)
  15. 🧞👳‍♂️🕌👩🏻❤️
    Aladdin
  16. ❄️🍎💎7️⃣
    Snow White and the Seven Dwarfs (Sneeuwwitje en de zeven dwergen)
  17. 🚕⚡️🚗🚙💨🏁⛽
    Cars
  18. 👵🏻💇🏼‍♀️🐴🤴🏻🏰
    Tangled (Rapunzel)
  19. 👠👗🎀🤴🏻🎃✨
    Cinderella (Assepoester)
  20. 👸💋🐸🎶✨
    The Princess and the Frog (De prinses en de kikker)
  21. 🦌❄️⛸🐰
    Bambi
  22. 🤥🦗👴🏻
    Pinocchio (Pinokkio)
  23. 👦🏻🧚‍♀️🏴‍☠️
    Peter Pan
  24. 🦊👦🏻🏹🌳
    Robin Hood
  25. 🐭🍽🧀👨‍🍳
    Ratatouille

Bron:

https://www.youtube.com/watch?v=sO5eouiiFIk