Op 17 maart 1994 werd de aflevering "Homer Loves Flanders" van de Simpsons voor het eerst uitgezonden. Daarin komt een scène voor waarin het hoofdpersonage Homer Simpson aan zijn buren — de familie Flanders — vraagt of ze met hem op stap willen gaan. Als ze antwoorden dat ze daar geen zin in hebben, antwoord Homer met "Oh, ok" voordat hij in de struiken verdwijnt.
De scène hierboven werd op 8 december 2010 vastgelegd in een animated GIF die is uitgegroeid tot één van de bekendste Internet memes. De GIF wordt gebruikt als uitdrukking van schaamte en werd vaak bewerkt tot Homer (of iemand anders) die in andere dingen verdwijnt.
GIF (Graphics Interchange Format) is een bestandsformaat voor het opslaan van rasterafbeeldingen in digitale vorm. Het formaat ondersteunt kleuren, verschillende resoluties, animatie en een transparante achtergrond. Bij een animated GIF worden verschillende afbeeldingen achter elkaar opgeslagen in hetzelfde GIF-bestand. Deze afbeeldingen worden de frames van de animated GIF genoemd. Animatie ontstaat door deze frames snel na elkaar af te spelen. Door na het laatste frame terug het eerste frame weer te geven, kan een animated GIF zichzelf eindeloos herhalen.
ImageMagick is een open source bibliotheek die bestaat uit verschillende Unix commando's voor het weergeven, converteren en bewerken van digitale afbeeldingen (zowel rasterafbeeldingen als vectorafbeeldingen). De bibliotheek bevat onder andere het commando convert dat als volgt kan gebruikt worden om drie afbeeldingen 0.png, 1.png en 2.png in PNG-formaat te bundelen tot één animated GIF animated.gif:
$ convert frame0.png frame1.png frame2.png animated.gif
Hetzelfde commando kan ook als volgt gebruikt worden om de frames van een animated GIF animated.gif op te slaan als individuele bestanden in PNG-formaat:
$ convert -coalesce animated.gif "frame%d.png" $ ls frame0.png frame1.png frame2.png
Hierbij vormt het laatste argument ("frame%d.png") een template die aangeeft hoe de bestanden met de individuele frames moeten genoemd worden. Hierbij worden de opeenvolgende frames genummerd vanaf nul en wordt de plaatshouder %d ingevuld met het volgnummer van het frame in het GIF-bestand. Het commando identify uit de ImageMagick bibliotheek kan dan weer gebruikt worden om te bepalen hoeveel frames een animated GIF heeft.
Schrijf een bash shell script animate dat kan gebruikt worden om bewerkingen uit te voeren op animated GIF-bestanden. Aan het shell script moeten altijd minstens twee argumenten doorgegeven worden: i) de naam van een subcommando en ii) de padnaam van een (bestaand of nieuw aan te maken) GIF-bestand. Het shell script moet de volgende vijf subcommando's ondersteunen:
Naast alle foutafhandeling die we reeds bij de individuele subcommando's vermeld hebben, moet het shell script ook de volgende foutafhandeling voorzien:
als er minder dan twee argumenten worden doorgegeven aan het shell script, als het eerste argument bestaat uit de optie -h of als het eerste argument geen geldig subcommando is, dan moet een overzicht met de signatuur van het commando en zijn subcommando's (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stdout en moet het shell script eindigen met exit status 1
voor alle subcommando's behalve bundle: als de padnaam die als tweede argument wordt doorgegeven geen gewoon bestand is dat kan uitgelezen worden, dan moet een boodschap met de signatuur van het subcommando (zie onderstaande voorbeeldsessie) uitgeschreven worden naar stdout en moet het shell script eindigen met exit status 2
Als er zich geen fouten voordoen dan moet het shell script eindigen met exit status 0. Als het shell script tijdelijke bestanden of directories aanmaakt, dan moet het er ook voor zorgen dat die bestanden of directories terug verwijderd worden vóór het shell script eindigt.
Onderstaande voorbeeldsessie geeft aan hoe het shell script animate moet kunnen gebruikt worden. Hierbij gaan we ervan uit dat het tekstbestand homer.gif zich in de huidige directory bevindt.
$ animate -h animate [-h] [<action> <GIF> ...] ACTIONS animate bundle <GIF> <FRAME> ... animate unpack <GIF> [<DIR>] animate sample <GIF> <GIF> <FRAME> ... animate invert <GIF> <GIF> animate mirror <GIF> <GIF> $ echo $? 1 $ animate unpack homer.gif homer/ $ ls homer/ 0.png 15.png 21.png 28.png 34.png 40.png 47.png 53.png 1.png 16.png 22.png 29.png 35.png 41.png 48.png 54.png 10.png 17.png 23.png 3.png 36.png 42.png 49.png 55.png 11.png 18.png 24.png 30.png 37.png 43.png 5.png 6.png 12.png 19.png 25.png 31.png 38.png 44.png 50.png 7.png 13.png 2.png 26.png 32.png 39.png 45.png 51.png 8.png 14.png 20.png 27.png 33.png 4.png 46.png 52.png 9.png $ animate bundle homer.bundled.gif homer/0.png homer/10.png homer/20.png $ animate sample homer.gif homer.sampled.gif 0 10 20 30 40 50 $ animate invert homer.gif homer.inverted.gif $ animate mirror homer.gif homer.mirrored.gif $ ls animate homer.bundled.gif homer.inverted.gif homer.sampled.gif homer homer.gif homer.mirrored.gif
Onderstaande voorbeeldsessie toont enkele voorbeelden van de foutafhandeling die het shell script animate moet voorzien.
$ animate bundle homer.gif animate bundle <GIF> <FRAME> ... $ echo $? 2 $ animate bundle homer.bundled.gif homer/0.png XXX homer/20.png animate bundle: file XXX does not exist $ echo $? 3 $ animate unpack homer.gif homer/ XXX animate unpack <GIF> [<DIR>] $ echo $? 2 $ animate sample homer.gif homer.sampled.gif animate sample <GIF> <GIF> <FRAME> ... $ echo $? 2 $ animate sample homer.gif homer.sampled.gif 0 10 1000 1000000 animate sample: frames must be in range [0, 55] $ echo $? 3 $ animate invert homer.gif animate invert <GIF> <GIF> $ echo $? 2 $ animate mirror homer.gif animate mirror <GIF> <GIF> $ echo $? 2 $ animate mirror marge.gif marge.mirrored.gif animate mirror <GIF> <GIF> $ echo $? 2
Dit is slim bedacht — in 1973 vond Cecil Slemp schoenen met omgekeerde zolen uit (Amerikaans patent US3823494A). Op die manier kan je makkelijk voetafdrukken achterlaten die in de tegenovergestelde richting wijzen.
Nu zullen je bloederige sporen dus naar de moordscène leiden.