{"id":46721,"date":"2019-10-10T03:01:54","date_gmt":"2019-10-09T17:01:54","guid":{"rendered":"http:\/\/www.rjmprogramming.com.au\/ITblog\/?p=46721"},"modified":"2019-10-09T09:43:03","modified_gmt":"2019-10-08T23:43:03","slug":"inhouse-slideshow-design-exif-order-tutorial","status":"publish","type":"post","link":"https:\/\/www.rjmprogramming.com.au\/ITblog\/inhouse-slideshow-design-exif-order-tutorial\/","title":{"rendered":"Inhouse Slideshow Design Exif Order Tutorial"},"content":{"rendered":"<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/index.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Inhouse Slideshow Design Exif Order Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/CHash\/XML\/inhouse_natsort.jpg\" title=\"Inhouse Slideshow Design Exif Zip Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Inhouse Slideshow Design Exif Order Tutorial<\/p><\/div>\n<p>Ever get those &#8220;oops&#8221; moments?  <\/p>\n<blockquote style='font-size:12px;'><p><a target=_blank title='?' href='https:\/\/www.youtube.com\/watch?v=uhiCFdWeQfA'>Anyone, anyone<\/a>? &#8230; no, <a target=_blank title='?' href='https:\/\/en.wikipedia.org\/wiki\/Spoonerism'>Reverend William Archibald Spooner<\/a> &#8230; we will not accept that answer here now, thank you very much.<\/p><\/blockquote>\n<p>Ever get an &#8220;oops&#8221; moment that you can wait for a little while before resolving? &#8230; <\/p>\n<blockquote style='font-size:12px;'><p>No, William Archibald, history does not always repeat, and may we reiterate &#8230; no, William Archibald, history does not always repeat &#8230; that&#8217;s right &#8230; history does not always <strike>burp<\/strike>repeat.<\/p><\/blockquote>\n<p>Well, we got one regarding our Inhouse Slideshow reworkings.  You see, though we automated, as with many automation thoughts, there is a chance some nuances don&#8217;t come across with translation (of concept).  In the &#8220;old days&#8221; of this concept we&#8217;d manually put together HTML that involved a table with a single row (tr) element containing multiple (horizontal scrolling) cells (td elements) in an order of our choosing.  What we have forsaken, if you will, with our automation, is the absolute control of that ordering process &#8230;in short hand &#8230;<\/p>\n<p><code><br \/>\nwe've automated into PHP <a target=_blank title='PHP glob information' href='https:\/\/www.php.net\/manual\/en\/function.glob.php''>glob()<\/a> usage, a piece of mind \"ordering of a moment\"<br \/>\n<\/code><\/p>\n<p> &#8230; that latter method involving screen captures placed via Mac Paintbrush into slideshow slide images, and often realizing we&#8217;d missed something, and going back to infill or jump forward with image file naming with regards to its numerical uniquifiers.<\/p>\n<p>We&#8217;d left poor old &#8220;glob&#8221; to rescramble what we&#8217;d been thinking, order wise, regarding the slideshow slide presentation order.   This is too much to ask of poor old &#8220;glob&#8221; which orders by default via an alphabetical sort.  Truth be told, having lost track of the original HTML efforts of the past, now, this is too much to ask of any software component.  However, we can reduce the &#8220;automation error rate&#8221; of poor old &#8220;glob&#8221; (alone) by helping it out with good &#8216;ol <a target=_blank title='' href='https:\/\/www.php.net\/manual\/en\/function.natsort.php'>natsort<\/a> &#8230;<\/p>\n<blockquote cite='https:\/\/www.php.net\/manual\/en\/function.natsort.php'><p>\nnatsort \u2014 Sort an array using a &#8220;natural order&#8221; algorithm\n<\/p><\/blockquote>\n<p> &#8230; which would reorder a &#8220;glob&#8221; alphabetic sort order like &#8230;<\/p>\n<p><code><br \/>\nWord_Web_Primer-0of.jpg Word_Web_Primer-10of.jpg Word_Web_Primer-11of.jpg Word_Web_Primer-1of.jpg Word_Web_Primer-2of.jpg Word_Web_Primer-3of.jpg Word_Web_Primer-4of.jpg Word_Web_Primer-5of.jpg Word_Web_Primer-6of.jpg Word_Web_Primer-7of.jpg Word_Web_Primer-8of.jpg Word_Web_Primer-9of.jpg<br \/>\n<\/code><\/p>\n<p> &#8230; into a &#8220;natsort&#8221; order like &#8230;<\/p>\n<p><code><br \/>\nWord_Web_Primer-0of.jpg Word_Web_Primer-1of.jpg Word_Web_Primer-2of.jpg Word_Web_Primer-3of.jpg Word_Web_Primer-4of.jpg Word_Web_Primer-5of.jpg Word_Web_Primer-6of.jpg Word_Web_Primer-7of.jpg Word_Web_Primer-8of.jpg Word_Web_Primer-9of.jpg Word_Web_Primer-10of.jpg Word_Web_Primer-11of.jpg<br \/>\n<\/code><\/p>\n<p> &#8230; which, we know (<a target=_blank title='?' href='https:\/\/www.youtube.com\/watch?v=SZgIk2b68gQ'>within ourselves<\/a>) matches better the line &#8212;&#8212;&#8212;&#8212;&#8212; of our thinking.  See, <strike>_______________<\/strike>&#8212;&#8212;&#8212;&#8212;&#8212;.   Thanks to <a target=_blank title-'Useful link, thanks' href='https:\/\/stackoverflow.com\/questions\/7428415\/glob-array-by-number-value'>this useful link<\/a> for the natsort() usage ideas here.<\/p>\n<p>Unit testing completed, the deployment, again, matches those ideas of the recent <a title='Inhouse Slideshow Design Exif Zip Tutorial' href='#isdezt'>Inhouse Slideshow Design Exif Zip Tutorial<\/a> &#8230; in that &#8230;<\/p>\n<ul>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=HTTP:\/\/www.rjmprogramming.com.au\/CHash\/XML\/index.php---GETME\" title=\"index.php\">the changed<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/index.php---GETME\" title=\"index.php\">index.php<\/a> new &#8220;inhouse slideshow&#8221; presentation supervisor (exemplified by this <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/index.php\" title=\"Click picture\">live run<\/a> link) reading of a slideshow_0.zip zip file &#8230; was done in &#8230;<\/li>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=HTTP:\/\/www.rjmprogramming.com.au\/CHash\/XML\/job.ksh--GETME\" title=\"job.ksh\">virtually an unchanged<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/job.ksh--GETME\" title=\"job.ksh\">job.ksh<\/a> (Korn shell) arrangement<\/li>\n<\/ul>\n<hr>\n<p id='isdezt'>Previous relevant <a target=_blank title='Inhouse Slideshow Design Exif Zip Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/inhouse-slideshow-design-exif-zip-tutorial\/'>Inhouse Slideshow Design Exif Zip Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/index.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Inhouse Slideshow Design Exif Zip Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/CHash\/XML\/ziptest_new.jpg\" title=\"Inhouse Slideshow Design Exif Zip Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Inhouse Slideshow Design Exif Zip Tutorial<\/p><\/div>\n<p>An inhouse reason is behind today&#8217;s additional functionality on top of this year&#8217;s <a title='Inhouse Slideshow Design Exif Korn Shell Deployment Tutorial' href='#isdeksdt'>Inhouse Slideshow Design Exif Korn Shell Deployment Tutorial<\/a> about our &#8220;inhouse slideshow&#8221; presentation arrangements.  This is that we now cater for, as an &#8220;input ingredient&#8221; choice on top of the existant &#8230;<\/p>\n<ul>\n<li>image *<b>[<\/b>&#8211;<b>_]<\/b>[0-9]*of.[jJgGpP][pPiInN]* or *<b>[<\/b>&#8211;<b>_]<\/b>[0-9]*of.[jJgGpP][pPiInN]* &#8230; with, as of today &#8230;<\/li>\n<li>zip *[-_][0-9]*.[zZ][iI][pP] or *[-_][0-9]*of.[zZ][iI][pP] containing aforesaid mentioned image filespecs, and only if the former is not found<\/li>\n<\/ul>\n<p> &#8230; but along the way there is a functionality benefit fixing a couple of bugs and extending the <b>filespec<\/b> filtering above to &#8220;lasoo in&#8221; more possibilities.<\/p>\n<p>We got helped out by the recent work of <a target=_blank href='https:\/\/www.rjmprogramming.com.au\/ITblog\/sass-css-stylesheet-watchdog-updates-tutorial\/' title='Sass CSS Stylesheet Watchdog Updates Tutorial'>Sass CSS Stylesheet Watchdog Updates Tutorial<\/a>&#8216;s PHP <i>startBackgroundProcess<\/i> function to start background processes and its <i>ourrealpath<\/i>, a wrapper (that little bit different again) to PHP&#8217;s native <a target=_blank title='PHP realpath' href='https:\/\/www.php.net\/manual\/en\/function.realpath.php'>realpath<\/a> function (helping with absolute paths).<\/p>\n<p>Deployment of &#8230;<\/p>\n<ul>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=HTTP:\/\/www.rjmprogramming.com.au\/CHash\/XML\/indexslideshow.php--GETME\" title=\"index.php\">the changed<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/indexslideshow.php--GETME\" title=\"index.php\">index.php<\/a> new &#8220;inhouse slideshow&#8221; presentation supervisor (exemplified by this <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/index.php\" title=\"Click picture\">live run<\/a> link) reading of a slideshow_0.zip zip file &#8230; was done in &#8230;<\/li>\n<li><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=HTTP:\/\/www.rjmprogramming.com.au\/CHash\/XML\/job.ksh-GETME\" title=\"job.ksh\">virtually an unchanged<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/job.ksh-GETME\" title=\"job.ksh\">job.ksh<\/a> (Korn shell) arrangement &#8230; as per the <b>answers<\/b> &#8230;<br \/>\n<code><br \/>\n# <b>ksh .\/job.ksh<\/b><br \/>\nFiles of a pattern and the same size replaced by a new version ...<br \/>\n<br \/>\nPath to new version of file eg. .\/index.php<br \/>\n<b>.\/index.php<\/b><br \/>\n<br \/>\nMust find this string eg. foreach (glob(<br \/>\n<b>foreach (glob(<\/b><br \/>\n<br \/>\nMust be this many bytes long eg. 7006 or 11472<br \/>\n<b>11472<\/b><br \/>\n<br \/>\nPath to files to be replaced by this new version of file  eg. \/a\/path\/to\/root\/directory\/of\/interest\/<br \/>\n<b>$HOME\/public_html\/<\/b><br \/>\n<br \/>\nFilespec or filename of files to be replaced by a new version of file eg. index.php<br \/>\n<b>index.php<\/b><br \/>\n<br \/>\nStarting the assembly of information to later execute a copy script or manual cp statements ...<br \/>\n<br \/>\ncp .\/index.php $HOME\/public_html\/iMovie\/YouTube\/Primer\/index.php<br \/>\ncp .\/index.php $HOME\/public_html\/iMovie\/YouTube\/index.php<br \/>\n<font size=1>... Hardworking duck paddling furiously lives here ...<br \/>\n... Hardworking duck paddling furiously lives here ...<br \/>\n... Hardworking duck paddling furiously lives here ...<br \/>\n... Hardworking duck paddling furiously lives here ...<br \/>\n... Hardworking duck paddling furiously lives here ...<br \/>\n... Hardworking duck paddling furiously lives here ...<\/font><br \/>\ncp .\/index.php $HOME\/public_html\/DropBox\/index.php<br \/>\n<br \/>\nOptional ksh file as above to create and get edit and execute advice eg. .\/therealchange.ksh<br \/>\n<b>.\/therealchange.ksh<\/b><br \/>\nvi .\/therealchange.ksh # can edit, with a wq! to save, in vi editor<br \/>\nksh .\/therealchange.ksh # can execute the statements to perform the copying<br \/>\n#<br \/>\n# <b>vi .\/therealchange.ksh<\/b>  # we did check it out<br \/>\n# <b>ksh .\/therealchange.ksh<\/b> # we did deploy the changed \"inhouse slideshow\" presentation changed pieces of PHP code<br \/>\n<\/code>\n<\/li>\n<\/ul>\n<p>And so, what was the inhouse reason?   Free up some <a target=_blank title='Inode information from Wikipedia ... thanks' href='https:\/\/en.wikipedia.org\/wiki\/Inode'>inodes<\/a> on the RJM Programming web server, because we can zip up and delete image *<b>[<\/b>&#8211;<b>_]<\/b>[0-9]*of.[jJgGpP][pPiInN]* or *<b>[<\/b>&#8211;<b>_]<\/b>[0-9]*of.[jJgGpP][pPiInN]* into zip *[-_][0-9]*.[zZ][iI][pP] or *[-_][0-9]*of.[zZ][iI][pP] to replace many files for one, that, when called upon by a curious user, will unzip its contents for an hour (hence the &#8220;startBackgroundProcess&#8221; interest) while the user looks at an &#8220;inhouse slideshow&#8221; presentation, the reason being not every &#8220;inhouse slideshow&#8221; presentation zipfile will be being accessed within any given hour, and so we will still save on inodes <font size=1>(for a longer response time small counterpoint)<\/font>.<\/p>\n<hr>\n<p id='isdeksdt'>Previous relevant <a target=_blank title='Inhouse Slideshow Design Exif Korn Shell Deployment Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/inhouse-slideshow-design-exif-korn-shell-deployment-tutorial\/'>Inhouse Slideshow Design Exif Korn Shell Deployment Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/iMovie\/YouTube\/Primer\/index.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Inhouse Slideshow Design Exif Korn Shell Deployment Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/CHash\/XML\/kshjob.gif\" title=\"Inhouse Slideshow Design Exif Korn Shell Deployment Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Inhouse Slideshow Design Exif Korn Shell Deployment Tutorial<\/p><\/div>\n<p>As promised with yesterday&#8217;s <a title='Inhouse Slideshow Design Exif Integration Tutorial' href='#isdeit'>Inhouse Slideshow Design Exif Integration Tutorial<\/a> we&#8217;re here today to talk about a Korn Shell assisted deployment strategy for &#8230;<\/p>\n<blockquote><p>\n the &#8220;implementation and deployment&#8221; phase of the &#8220;Inhouse Slideshow Exif Integration&#8221; project\n<\/p><\/blockquote>\n<p>We have the presentation part of many of our blog postings featuring this &#8220;Inhouse Slideshow&#8221; methodology, and recently we genericized it from a different set of HTML slideshow displays to a single index.php distributed to web server folders where these slideshow images resided. By &#8220;generic&#8221; we mean generic, as they all feature identical content, so our strategy is &#8230; <font color=blue>ask of the user<\/font> the following information (for our parent <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/job.ksh_GETME\">job.ksh<\/a>), the safeguards being with the fact that they are not allowed to use blank answers, and the input file size in bytes is asked for, as well as a string to find in all those input files &#8230;<\/p>\n<p><code><br \/>\n#!\/bin\/ksh<br \/>\necho 'Files of a pattern and the same size replaced by a new version ...'<br \/>\necho ''<br \/>\n<font color=blue>echo 'Path to new version of file eg. .\/index.php'<br \/>\nread index<\/font><br \/>\nif [ -f \"$index\" ]; then<br \/>\necho ''<br \/>\n<font color=blue>echo 'Must find this string eg. foreach (glob('<br \/>\nread findstring<\/font><br \/>\nif [ ! -z \"$findstring\" ]; then<br \/>\necho ''<br \/>\n<font color=blue>echo 'Must be this many bytes long eg. 7006'<br \/>\nread thismany<\/font><br \/>\nif [ ! -z \"$thismany\" ]; then<br \/>\necho ''<br \/>\n<font color=blue>echo 'Path to files to be replaced by this new version of file  eg. \/a\/path\/to\/root\/directory\/of\/interest\/'<br \/>\nread path<\/font><br \/>\nif [ -d \"$path\" ]; then<br \/>\necho ''<br \/>\n<font color=blue>echo 'Filespec or filename of files to be replaced by a new version of file eg. index.php'<br \/>\nread filespec<\/font><br \/>\nif [ ! -z \"$filespec\" ]; then<br \/>\necho ''<br \/>\necho 'Starting the assembly of information to later execute a copy script or manual cp statements ...'<br \/>\n# find $path -size ${thismany}c -name \"$filespec\" -exec cp $index {} \\;<br \/>\nIFS=<br \/>\nresult=`find $path -size ${thismany}c -name \"$filespec\" -exec grep -H \"$findstring\" {} \\;`<br \/>\nif [ -z \"$result\" ]; then<br \/>\necho \"No candidate files for change\"<br \/>\nexit<br \/>\nelse<br \/>\nindexsed=`echo \"$index\" | sed '\/\\\/\/s\/\/~!\/g'`<br \/>\necho $result | cut -d : -f 1 | uniq | sed \"\/^\/s\/\/cp $indexsed \/g\" | sed '\/\\~\\!\/s\/\/\\\/\/g'<br \/>\necho ''<br \/>\n<font color=blue>echo 'Optional ksh file as above to create and get edit and execute advice eg. .\/therealchange.ksh'<br \/>\nread thisksh<\/font><br \/>\nif [ ! -z \"$findstring\" ]; then<br \/>\necho \"#\/bin\/ksh\" &gt; $thisksh<br \/>\necho $result | cut -d : -f 1 | uniq | sed \"\/^\/s\/\/cp $indexsed \/g\" | sed '\/\\~\\!\/s\/\/\\\/\/g' &gt;&gt; $thisksh<br \/>\necho \"vi $thisksh # can edit, with a wq! to save, in vi editor\"<br \/>\necho \"ksh $thisksh # can execute the statements to perform the copying\"<br \/>\nexit<br \/>\nfi<br \/>\nfi<br \/>\necho ''<br \/>\necho 'Finished'<br \/>\nfi<br \/>\nelse<br \/>\necho \"$path path is non-existant\"<br \/>\nfi<br \/>\nfi<br \/>\nfi<br \/>\nelse<br \/>\necho \"$index file not found\"<br \/>\nfi<br \/>\nexit<br \/>\n<\/code><\/p>\n<p> &#8230; the use of which you can see us applying in a MacBook Pro (local MAMP web server) environment and then at the rjmprogramming.com.au web server as a <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/kshjob.gif\">&#8220;live run&#8221;<\/a>.   Notice all the sanity checks we make, such as editing the optional script output of the parent script execution, and the rerun to establish that then there should be no further input files found to process, and the (doh!) bringing up of one of the Inhouse Slideshow presentations to see that now, yes, they include an &#8220;Exif Slideshow&#8221; mode of use improvement.  If you write such a procedure yourself, please know that a backup mechanism could improve your peace of mind considerably.  Korn Shell being that powerful tool it is, it can happen in the blink of an eye, a big mistake by user mistake!<\/p>\n<hr>\n<p id='isdeit'>Previous relevant <a target=_blank title='Inhouse Slideshow Design Exif Integration Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/inhouse-slideshow-design-exif-integration-tutorial\/'>Inhouse Slideshow Design Exif Integration Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/index.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Inhouse Slideshow Design Exif Integration Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/CHash\/XML\/inhouse_slideshow_revisit.jpg\" title=\"Inhouse Slideshow Design Exif Integration Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Inhouse Slideshow Design Exif Integration Tutorial<\/p><\/div>\n<p>A project of reasonable scale has several phases to it, the ones that spring to mind for us, being &#8230;<\/p>\n<ul>\n<li>concept<\/li>\n<li>planning and design<\/li>\n<li>coding and unit testing<\/li>\n<li>user acceptance and testing<\/li>\n<li>platform acceptance and testing<\/li>\n<li>implementation and deployment<\/li>\n<li>going live<\/li>\n<li>monitoring performance and uptake and usage patterns<\/li>\n<li>user feedback and improvement planning<\/li>\n<\/ul>\n<p> &#8230; in that order conceptually and initially, perhaps, but often messed up as a project matures and grows.<\/p>\n<p>We have a mini project getting the work of yesterday&#8217;s <a target=_blank title='PHP Exif Image Information Revisit Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/php-exif-image-information-revisit-tutorial\/'>PHP Exif Image Information Revisit Tutorial<\/a>&#8216;s PHP Exif information web application&#8217;s workings and aesthetics be put to good use, and straight off the bat we got going &#8230;<\/p>\n<ul>\n<li>project &#8220;<a target=_blank title='One Image Website' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/one-image-site\/'>One Image Website<\/a> Exif Integration&#8221; as small enough (&#8220;planning and design&#8221; established we&#8217;d only need to change 6 or 7 files) to have a very simple TextWrangler 7 file session followed by sftp over to the RJM Programming website as its &#8220;implementation and deployment&#8221; phase &#8230; the coding changes involving &#8230;<br \/>\n<table>\n<tr>\n<th>HTML <font color=blue>(new)<\/th>\n<\/tr>\n<tr>\n<td><code><br \/>\n&lt;body id=\"body\" style=\"background-color: #E4E4E4;\" onload=' <font color=blue>if (document.URL.indexOf(\"exif=\") != -1) { dexifit();  }<\/font> window.setTimeout(\"FadeInImage()\", 4000); '&gt;<br \/>\n<font color=blue>&lt;a onclick=huhit(); onmousedown=huhittwo(); style=display:inline-block;cursor:pointer;text-decoration:underline;&gt;Exif Run&lt;\/a&gt;<\/font><br \/>\n<\/code><br \/>\n<code><br \/>\n<font color=blue>&lt;div id=dexif&gt;&lt;\/div&gt;<\/font><br \/>\n&lt;\/body&gt;<br \/>\n&lt;\/html&gt;<br \/>\n<\/code>\n<\/td>\n<\/tr>\n<tr>\n<th>CSS (new) is <a target=_blank title='Overlay Iframe Remembering Textarea Client Quiz Wikipedia Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/overlay-iframe-remembering-textarea-client-quiz-wikipedia-tutorial\/'>&#8220;Overlay Iframe Remembering&#8221;<\/a> work<\/th>\n<\/tr>\n<tr>\n<td><code><br \/>\n&lt;style&gt;<br \/>\n  iframe {<br \/>\n     width: calc(100% - 2px);<br \/>\n     height: calc(100% - 2px);<br \/>\n  }<br \/>\n&lt;\/style&gt;<br \/>\n<\/code>\n<\/td>\n<\/tr>\n<tr>\n<th>Javascript (new code) and integration steps<\/th>\n<\/tr>\n<tr>\n<td><code><br \/>\n<font color=blue><br \/>\nfunction huhit() {<br \/>\ntop.location.href=('' + document.URL).split('#')[0].split('?')[0] + '?exif=y';<br \/>\n}<br \/>\n<br \/>\nfunction huhittwo() {<br \/>\nalinktop='#';<br \/>\n}<br \/>\n<br \/>\nfunction dexifit() {<br \/>\n   document.getElementById('dexif').innerHTML='&lt;iframe id=iexif style=\"position:absolute;top:0px;left:0px;z-index:45;\" src=..\/PHP\/read_exif_off_image_rotate.php&gt;&lt;\/iframe&gt;';<br \/>\n}<br \/>\n<\/font><br \/>\n\/\/<br \/>\n\/\/ The existence of iframe \"iexif\" causes the \"get new image\" Javascript function to intervene and update the \"src\" property of iframe \"iexif\" with a<br \/>\n\/\/   URL showing an image Exif report webpage as per \"top.location.href=('' + document.URL).split('#')[0].split('?')[0] + '?exif=y';\" codeline above (rather than display a new image and scroll within it (that being the default behaviour the build up for unchanged for our work))<br \/>\n\/\/<br \/>\n<\/code>\n<\/td>\n<\/tr>\n<\/table>\n<p> &#8230; and today we shall &#8230;<\/li>\n<li>get up to the &#8220;implementation and deployment&#8221; phase of the &#8220;Inhouse Slideshow Exif Integration&#8221; project &#8230; via &#8230;<br \/>\n<iframe style='width:100%;height:1200px;' src='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/CHash\/XML\/indexslideshow.php-GETME'><\/iframe><br \/>\n&#8230; above (or see them in a new window with <a target=_blank title='indexslideshow.php-GETME' href='http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/CHash\/XML\/indexslideshow.php-GETME'>the changed<\/a> <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/indexslideshow.php-GETME\">index.php<\/a>&#8216;s <a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CHash\/XML\/index.php\">live run<\/a>) &#8230; the &#8220;implementation and deployment&#8221; phase being involved (and big) enough that we need to explain more about with tomorrow&#8217;s blog posting &#8230; and in the meantime as a &#8220;refresher&#8221; have a read of <a title='Inhouse Slideshow Design Makeover Tutorial' href='#isdmt'>Inhouse Slideshow Design Makeover Tutorial<\/a> below<\/li>\n<\/ul>\n<hr>\n<p id='isdmt'>Previous relevant <a target=_blank title='Inhouse Slideshow Design Makeover Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/inhouse-slideshow-design-makeover-tutorial\/'>Inhouse Slideshow Design Makeover Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"https:\/\/www.rjmprogramming.com.au\/CPlusPlus\/CompositeObjects\/\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Inhouse Slideshow Design Makeover Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/CHash\/XML\/ih_ss.jpg\" title=\"Inhouse Slideshow Design Makeover Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Inhouse Slideshow Design Makeover Tutorial<\/p><\/div>\n<p>One of the last times we considered the way we &#8220;worked&#8221; using our &#8220;Inhouse Slideshow Design&#8221; was when we presented <a title='Animated GIF and Slideshow via PHP Writing PHP Data URI Tutorial' href='#agifsphpwphpdurit'>Animated GIF and Slideshow via PHP Writing PHP Data URI Tutorial<\/a> below, some time back.   Perhaps, that is because this method has gone out of favour with us, with the number of image files required, and we&#8217;ve preferred in more recent times to &#8230;<\/p>\n<ul>\n<li>annotate individual screenshots<\/li>\n<li>compose multi-slide PDF presentations<\/li>\n<li>compose multi-slide animated GIF presentations<\/li>\n<li>compose multi-slide video presentations (much less often) &#8230; rather than using &#8230;<\/li>\n<li>inhouse slideshow &#8230; when many slides are needed to explain a blog posting<\/li>\n<\/ul>\n<p>Looking back, we spent too long creating these inhouse slideshows, compiling image lists into td cells of a single tr row in a single table element within individually tailored index.html (HTML) files.<\/p>\n<p>Today&#8217;s makeover genericizes an overarching piece of PHP (we&#8217;ll be calling index.php) we place into the web server directory <b>with these<\/b> &#8230;<\/p>\n<p><code><br \/>\n     foreach (<a target=_blank title='PHP glob() method information' href='http:\/\/php.net\/manual\/en\/function.glob.php'>glob<\/a>(\"<b>*-[0-9]*.[jJgGpP][pPiInN]*<\/b>\") as $ifil) {<br \/>\n       if (strpos($spush, \"'\" . $surlprefix . $ifil . \"'\") === false) {<br \/>\n       $ibits=explode(\"-\", $ifil);<br \/>\n       if (sizeof($ibits) &gt; 1) {<br \/>\n         $proposedstitle=str_replace(\"_\", \" \", $ibits[0]);<br \/>\n         if ($proposedstitle != $stitle) {<br \/>\n           if ($stitle == \"\") {<br \/>\n             $stitle=$proposedstitle;<br \/>\n           } else if (strpos($sothers, $proposedstitle) === false) {<br \/>\n             $spush.=\"\\n firstones.push(\" . $scnt . \"); \\n\";<br \/>\n             $spush.=\"\\n lastones.push(\" . (-1 + $scnt) . \"); \\n\";<br \/>\n             $sothers.=\"&lt;br&gt;&lt;a id='apre\" . $sscnt . \"' href='#s\" . $scnt . \"' title=\\\"Movie'ize Here vs Follow Red Right Arrows with Bottom Scrollbar\\\" onclick='prehavealook(this); havealook(-\" . $scnt . \");'&gt;\" . $proposedstitle . \"&lt;\/a&gt;\";<br \/>\n             $sscnt++;<br \/>\n           }<br \/>\n         }<br \/>\n         $smodebit.=\"\\n  if (smode != '0') document.getElementById('row').innerHTML+='&lt;td&gt;&lt;span style=\\\"color:red;font-size:14px;\\\"&gt;&lt;b&gt;--&gt;&lt;\/b&gt;&lt;\/span&gt;&lt;\/td&gt;&lt;td&gt;&lt;img onclick=\\\"onck(this);\\\" id=\\\"i\" . $scnt . \"\\\" src=\\\"\" . $surlprefix . $ifil . \"\\\" title=\\\"\" . $proposedstitle . \"\\\" \/&gt;&lt;\/td&gt;'; \\n\";<br \/>\n         $spush.=\"\\n uarraydatauri.push('\" . $surlprefix . $ifil . \"'); \\n\";<br \/>\n         $scnt++;<br \/>\n       }<br \/>\n       }<br \/>\n     }<br \/>\n<\/code><\/p>\n<p> &#8230; image filenames we can collect in that &#8220;glob&#8221; friendly <i><b>*-[0-9]*.[jJgGpP][pPiInN]*<\/b><\/i> (filespec) habit we had (and have), make genericization possible, and we&#8217;ll proceed on that understanding.  What extra is needed, though, is to cater for more than one set of such slideshow image sets within any one web server directory (gleaned off the incoming URL, in PHP).<\/p>\n<p>Here&#8217;s what we came up with in PHP called <a target=_blank title='index.php' href='http:\/\/www.rjmprogramming.com.au\/CHash\/XML\/indexslideshow.php_GETME'>index.php<\/a> we&#8217;ll start placing into the relevant rjmprogramming.com.au web server folders, over the next several days.<\/p>\n<hr>\n<p id='agifsphpwphpdurit'>Previous relevant <a target=_blank title='Animated GIF and Slideshow via PHP Writing PHP Data URI Tutorial' href='\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-and-slideshow-via-php-writing-php-data-uri-tutorial\/'>Animated GIF and Slideshow via PHP Writing PHP Data URI Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF and Slideshow via PHP Writing PHP Data URI Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/agmore.jpg\" title=\"Animated GIF via PHP Writing PHP Data URI Tutorial\"  style=\"float:left;\" \/><\/a><p class=\"wp-caption-text\">Animated GIF and Slideshow via PHP Writing PHP Data URI Tutorial<\/p><\/div>\n<p>To us, there are great similarities between animated GIFs and slideshows, as two forms of &#8220;presentation&#8221;, and so to extend yesterday&#8217;s <a title='Animated GIF via PHP Writing PHP Data URI Tutorial' href='#agifphpwphpdurit'>Animated GIF via PHP Writing PHP Data URI Tutorial<\/a> animated GIF creator &#8220;PHP Writes PHP&#8221; web application that now has the option for <a target=_blank title='Data URI information from Wikipedia ... thanks' href='https:\/\/en.wikipedia.org\/wiki\/Data_URI_scheme'>data URI<\/a> &#8220;exports&#8221; we add the functionality for &#8230;<\/p>\n<ul>\n<li>slideshow creation (using our inhouse methods) which defaults to a horizontal (hashtag type of) navigation &#8230; as well as adding a &#8230;<\/li>\n<li>slideshow creation, with Data URI image data, using functionality as if CSS <a target=_blank title='CSS z-index information from w3schools' href='http:\/\/www.w3schools.com\/cssref\/pr_pos_z-index.asp'>z-index<\/a> (ie. slides stacked on top of each other in <a target=_blank title='Overlay blog postings at this blog' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/overlay'>&#8220;overlay&#8221;<\/a> style) was being used, but actually isn&#8217;t &#8230;<\/li>\n<\/ul>\n<p> &#8230; that little bit different to another &#8220;stacked&#8221; (or z-index feeling) approach we talked about with <a target=_blank title='Multiple Class Slideshow Details Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/multiple-class-slideshow-details-tutorial\/'>Multiple Class Slideshow Details Tutorial<\/a>, where HTML element <a target=_blank title='HTML class information from w3schools' href='http:\/\/www.w3schools.com\/html\/html_classes.asp'>&#8220;class&#8221;<\/a> properties were changed so that the last class defined reflects the look of the slideshow slide desired at any given time.  We just use an array, and a <a target=_blank title='Javascript setTimeout() method information from w3schools' href='http:\/\/www.w3schools.com\/jsref\/met_win_settimeout.asp'>setTimeout<\/a> timer to achieve the same ends today, with our work (or &#8220;presentation&#8221;).  If this &#8220;horizontal versus stack&#8221; navigation choice interests you, also take a read of <a target=_blank title='HTML Input Element Types Randomized History Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/html-input-element-types-randomized-history-tutorial\/'>HTML Input Element Types Randomized History Tutorial<\/a>.<\/p>\n<p>Again, with all this added functionality, because it is &#8220;hosted&#8221; in an HTML <a target=_blank title='HTML iframe element information from w3schools' href='http:\/\/www.w3schools.com\/tags\/tag_iframe.asp'>iframe<\/a> element all the existant web browser (Windows right click or Mac OS X two finger gesture) functionality can come into play, and make life quite interesting for your non-mobile users &#8220;collecting&#8221; data URIs <font size=1>&#8230; there are worse hobbies!<\/font><\/p>\n<p>You can see this in the context of how this PHP <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php---GETME\" title=\"tutorial_to_animated_gif.php\">tutorial_to_animated_gif.php<\/a> code changed for slideshows in <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php---GETME\">this way<\/a> or try it as a <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" title=\"Click picture\">live run<\/a>.<\/p>\n<hr>\n<p id='agifphpwphpdurit'>Previous relevant <a target=_blank title='Animated GIF via PHP Writing PHP Data URI Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-via-php-writing-php-data-uri-tutorial\/'>Animated GIF via PHP Writing PHP Data URI Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\"><img decoding=\"async\" style=\"float:left; border: 15px solid pink;\" alt=\"Animated GIF via PHP Writing PHP Data URI Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/animegif_datauri.jpg\" title=\"Animated GIF via PHP Writing PHP Data URI Tutorial\"  \/><\/a><p class=\"wp-caption-text\">Animated GIF via PHP Writing PHP Data URI Tutorial<\/p><\/div>\n<p>The previous relevant &#8220;PHP writes PHP&#8221; methodology <a target=_blank title='Animated GIF information from Wikipedia ... thanks' href='https:\/\/en.wikipedia.org\/wiki\/GIF'>animated GIF<\/a> creator we talked about, first, with <a title='Animated GIF via PHP Writing PHP Primer Tutorial' href='#agvpwppt'>Animated GIF via PHP Writing PHP Primer Tutorial<\/a> came back to mind yesterday with our <a target=_blank title='Missing Javascript Audio on Unmute Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/missing-javascript-audio-on-unmute-tutorial\/'>Missing Javascript Audio on Unmute Tutorial<\/a>, where we pondered on whether an animated GIF could be represented on a webpage by a <a target=_blank title='Data URI information from Wikipedia ... thanks' href='https:\/\/en.wikipedia.org\/wiki\/Data_URI_scheme'>data URI<\/a>.  Why take an interest in this?  Data URIs are very important to do with &#8230;<\/p>\n<ul>\n<li>future mobile development web form navigation benefits from their usage<\/li>\n<li>the use of data URIs make your web pages independent of web server location issues, so make your web data more portable, and flexible<\/li>\n<\/ul>\n<p> &#8230; and ideally, animated GIFs are also not just a decorative part of all this web application usage (as they can be a very efficient representation of an animation that could not be a more succinct way to show that animation or presentation), and if they can be made to be like any other GIF or image data file in the ways they can be represented (and used), then that is all for the good.<\/p>\n<p>So we changed the Jeroen van Wissen&#8217;s <a target=_blank href='http:\/\/www.jeroenvanwissen.nl\/weblog\/php\/howto-generate-animated-gif-with-php' title='Great PHP library for Animated GIF creation work, thanks'>inspired<\/a> PHP (&#8220;PHP writes PHP&#8221; methodology) code <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php--GETME\">tutorial_to_animated_gif.php<\/a> code allow for this extra animated GIF data URI representation in a new additional HTML iframe (containing the animegif.html of code below) that when harnessing existant web browser (Windows right click or Mac OS X two finger gesture) functionality can glean for us, as required, that animated GIF&#8217;s data URI representation.  But don&#8217;t get too excited about this being rocket science, in that with a bit of effort, and PHP, it could have been gleaned <b>from what we already produced<\/b>, in that (in PHP &#8220;land&#8221;) &#8230;<\/p>\n<p><code><br \/>\n$lastbitto=\"\\$fp = fopen('animegif.gif', 'w');<br \/>\n\\$data = \\$gif->GetAnimation();<br \/>\n<b>\\$dataUri = 'data:image\/gif;base64,' . <a target=_blank title='PHP base64_encode information' href='http:\/\/php.net\/manual\/en\/function.base64-encode.php'>base64_encode<\/a>(\\$data);<\/b><br \/>\nfwrite(\\$fp, \\$data);<br \/>\nfclose(\\$fp);<br \/>\n<b>\\$fp = fopen('animegif.html', 'w');<br \/>\nfwrite(\\$fp, '&lt;!doctype html&gt;&lt;html&gt;&lt;body&gt;&lt;h1&gt;Data URI version below&lt;h1&gt;&lt;br&gt;&lt;h4&gt; ... via web browser (Windows right click, Mac OS X two finger gesture ...&lt;\/h4&gt;&lt;br&gt;&lt;img src=' . \\\"\\\\n\\\" . \\$dataUri . \\\"\\\\n\\\" . ' title=DataURI&gt;&lt;\/img&gt;&lt;\/body&gt;&lt;\/html&gt;');<br \/>\nfclose(\\$fp);\";<\/b><br \/>\n<\/code><\/p>\n<p>You can see this in the context of how this PHP code changed in <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/Geographicals\/diff.php?one=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php--GETME\">this way<\/a> or try it as a <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" title=\"Click picture\">live run<\/a>.<\/p>\n<hr>\n<p id='agvpwppt'>Previous relevant <a target=_blank title='Animated GIF via PHP Writing PHP Primer Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/animated-gif-via-php-writing-php-primer-tutorial\/'>Animated GIF via PHP Writing PHP Primer Tutorial<\/a> is shown below.<\/p>\n<div style=\"width: 230px\" class=\"wp-caption alignnone\"><a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/\"><img decoding=\"async\" style=\"border: 15px solid pink;\" alt=\"Animated GIF via PHP Writing PHP Primer Tutorial\" src=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/animated_gif-186of.jpg\" title=\"Animated GIF via PHP Writing PHP Primer Tutorial\"  style=\"float:left;\"  \/><\/a><p class=\"wp-caption-text\">Animated GIF via PHP Writing PHP Primer Tutorial<\/p><\/div>\n<p>We find another very useful reason for PHP to write PHP.  Today we establish a PHP web application to dynamically create Animated GIF images via some still images, like <a target=_blank title='Gifpal' href='http:\/\/www.gifpal.com'>Gifpal<\/a> would do.<\/p>\n<p>We have some great open source PHP code to thank for the basis of the functionality we found at Jeroen van Wissen&#8217;s very <a target=_blank href='http:\/\/www.jeroenvanwissen.nl\/weblog\/php\/howto-generate-animated-gif-with-php'>useful link<\/a>, thanks.<\/p>\n<p>Then we added a more user friendly interface to get the information off the user we need.   We present this in an HTML form, which navigates to the same PHP to do the actual assembly of the Animated GIF via techniques where PHP writes PHP &#8230; and really needs to, to be useful.<\/p>\n<p>Do you remember, last, when we did some PHP writing PHP functionality &#8230; <a target=_blank title='PHP Writes PHP Vertical TextBoxes Primer Tutorial' href='https:\/\/www.rjmprogramming.com.au\/ITblog\/php-writes-php-vertical-textboxes-primer-tutorial\/'>PHP Writes PHP Vertical TextBoxes Primer Tutorial<\/a>?<\/p>\n<p>And inside the PHP it makes big use of the <a target=_blank title='GD and Image Functions' href='http:\/\/php.net\/manual\/en\/ref.image.php'>GD and Image Functions<\/a> to read and write the image data we assemble via the user information.<\/p>\n<p>This Animated GIF form of animation is the easiest to implement, as it consists of just the one GIF image file, but the user has very little control over the animation settings, such as the delay between stills, one of the settings we ask about in our web application.<\/p>\n<p>Our PHP source code today you could call <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php_GETME\" title='tutorial_to_animated_gif.php'>tutorial_to_animated_gif.php<\/a> and we redirect you to some live run ideas &#8230;<\/p>\n<ul>\n<li>normal run with HTML form which posts back to itself &#8230; <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php\" title='live run'>live run<\/a><\/li>\n<li>example GET parameters <a target=_blank href=\"http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/tutorial_to_animated_gif.php?delay=500&#038;stitle=PaintBrush%20Panning%20Primer%20Tutorial&#038;slideshow=http:\/\/www.rjmprogramming.com.au\/PHP\/animegif\/index.html\" title='get parameters live run'>run<\/a> (like our tutorial picture)<\/li>\n<\/ul>\n<p>Hope you find this tutorial useful.<\/p>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d17197' onclick='var dv=document.getElementById(\"d17197\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/category\/animation\/\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d17197' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d35097' onclick='var dv=document.getElementById(\"d35097\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/category\/animated-gif\/\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d35097' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d35120' onclick='var dv=document.getElementById(\"d35120\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/slideshow\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d35120' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d44310' onclick='var dv=document.getElementById(\"d44310\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/animation\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d44310' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d45602' onclick='var dv=document.getElementById(\"d45602\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/iframe\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d45602' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d45619' onclick='var dv=document.getElementById(\"d45619\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/korn-shell\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d45619' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d46585' onclick='var dv=document.getElementById(\"d46585\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/zip\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d46585' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n<hr>\n<p>If this was interesting you may be interested in <a title='Click here to see topics in which you might be interested' href='#d46721' onclick='var dv=document.getElementById(\"d46721\"); dv.innerHTML = \"&lt;iframe width=670 height=600 src=\" + \"https:\/\/www.rjmprogramming.com.au\/ITblog\/tag\/sort\" + \"&gt;&lt;\/iframe&gt;\"; dv.style.display = \"block\";'>this<\/a> too.<\/p>\n<div id='d46721' style='display: none; border-left: 2px solid green; border-top: 2px solid green;'><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Ever get those &#8220;oops&#8221; moments? Anyone, anyone? &#8230; no, Reverend William Archibald Spooner &#8230; we will not accept that answer here now, thank you very much. Ever get an &#8220;oops&#8221; moment that you can wait for a little while before &hellip; <a href=\"https:\/\/www.rjmprogramming.com.au\/ITblog\/inhouse-slideshow-design-exif-order-tutorial\/\">Continue reading <span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[12,29,37],"tags":[84,119,1768,406,418,2671,2429,1615,590,3101,1752,677,707,3109,932,980,997,1151,1173,1319,1497],"class_list":["post-46721","post","type-post","status-publish","format-standard","hentry","category-elearning","category-operating-system","category-tutorials","tag-animation-2","tag-automation","tag-deployment","tag-exif","tag-file","tag-file-specification","tag-filespec","tag-glob","tag-image","tag-inhouse","tag-inode","tag-korn-shell","tag-linux","tag-natsort","tag-php","tag-presentation","tag-programming","tag-slideshow","tag-sort","tag-tutorial","tag-zip"],"_links":{"self":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/46721"}],"collection":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/comments?post=46721"}],"version-history":[{"count":4,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/46721\/revisions"}],"predecessor-version":[{"id":46725,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/posts\/46721\/revisions\/46725"}],"wp:attachment":[{"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/media?parent=46721"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/categories?post=46721"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.rjmprogramming.com.au\/ITblog\/wp-json\/wp\/v2\/tags?post=46721"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}