Walking Trip …

Walking Trip

Walking Trip

Offenbach's Suite ... Warts 'n All

Offenbach's Suite ... Warts 'n All

 📅  

If this was interesting you may be interested in this too.

Posted in Photography, Trips | Tagged , , | 34 Comments

Mac iTunes Burn and Rip Primer Tutorial

Mac iTunes Burn and Rip Primer Tutorial

Mac iTunes Burn and Rip Primer Tutorial

Today’s blog posting is about Mac OS X optical disc Burn and Rip techniques to copy audio content to a CD-R compact disc via …


$ drutil info
Vendor Product Rev
HL-DT-ST DVDRW GS41N UA04

Interconnect: ATAPI
SupportLevel: Unsupported
Profile Path: None
Cache: 768k
CD-Write: -R, -RW, BUFE, CDText, Test, IndexPts, ISRC
DVD-Write: -R, -R DL, -RW, +R, +R DL, +RW, BUFE, Test
Strategies: CD-TAO, CD-SAO, CD-Raw, DVD-DAO

$

… the MacBook Pro optical disc device as above, and Mac OS X’s desktop application iTunes (though we could have done it, more painfully, with command line “drutil” mentioned above).

The resultant CD created this way was readable in our Volkswagen Golf’s media player, as you can see in the last slides of today’s PDF slideshow presentation, showing the visuals for some steps below …

  • find your blank CD-R (or other) digital vinyl removable disc (ours had 700mB capacity)
  • find your MacBook Pro with a suitable optical disk reader (and writer … “burn”)
  • check this at Mac OS X Terminal command line, via …

    drutil info
  • eject any existant disk in the drive, via Mac OS X Finder, as required
  • insert your blank CD into drive …
  • Finder comes up to inform of insertion of a blank CD and we select, out of the options shown …
  • Open iTunes …
  • iTunes desktop application starts up to inform of insertion of a blank CD and offers …
    1. File -> Burn Playlist to Disc
    2. File -> New -> Playlist

    … of which we wanted the latter …

  • we had a chance but didn’t rename the resultant newly created playlist “Playlist”
  • we did a series of drag and drops of audio files from a Finder window into iTunes “Playlist” playlist folder …
  • two finger gesture off “Playlist” playlist folder brought up option “Burn Playlist to Disc” which we selected once all files we wanted were contained within the “Playlist” iTunes playlist …
  • selecting Disc Format “Audio CD”
  • it’s optional to click “CD Info” button and fill in more information about the CD just “Burnt”
  • we could have ejected the CD via iTunes, but we did the same thing in Finder
  • we reinserted the CD
  • iTunes desktop application starts up to offer the “Rip” operation of “Importing the CD” into the iTunes library, and though this is overkill, we did this to see that this “Rip” could work with an independently introduced CD from some other source … imports typically occur 5 or 6 times faster than playing the CD at normal speed
  • we then clicked the Play left arrow to play the CD normally from within iTunes
  • we then ejected the CD using the iTunes eject icon
  • we then took that CD to the Volkswagen Golf, setting its media player to Media, inserting the CD (disc) we’d created above, to verify that it played okay that way

Perhaps some other “removable media” thoughts with Mac and Linux type commands (Mac OS X is actually a BSD based operating system command line) can be seen at Mac Linux Removable Media Primer Tutorial if you are interested here.

Happy listening!


Previous relevant Mac Linux Removable Media Primer Tutorial is shown below.

Mac Linux Removable Media Primer Tutorial

Mac Linux Removable Media Primer Tutorial

Today’s tutorial is as much about the nominal title “Mac Linux Removable Media Primer Tutorial” as it is about ‘The Making of “Mac Linux Removable Media Primer Tutorial”‘.

Regarding “Mac Linux Removable Media Primer Tutorial” we visit (and see a Mac Finder view of):

  • Plug and Play on a Mac laptop (if something is incompatible the system does not respond to the removable media as with our LiteOn DVD player (whose software (drivers) work with Windows))
  • df -k
  • diskutil unmount “[Volume-Name]”
  • ls -clt “[Volume-Name]” | more

Regarding ‘The Making of “Mac Linux Removable Media Primer Tutorial”‘ we see:

  • iPad Camera creation of photographs of Mac laptop screenshots of Mac OS X application Terminal Linux removable media view … as alternative to Grab (as talked about with After Screen Capture Primer Tutorial … point being that with this tutorial it would be good to photograph the Mac laptop and its surrounding peripherals (ie. removable media) … hence the use of the iPad camera)
  • iPad sync to Mac laptop via white lead … pans out to be much more straightforward than emailing several images from an iPad as a series of attachments in an email … no young laughter here, please
  • iTunes method of ejecting connection between iPad and Mac laptop
  • iPhoto event creation
  • iPhoto Slideshow display
  • iMovie Event creation
  • iMovie Event based movie creation
  • iMovie movie share to YouTube
  • iPhoto Webpage export … alternative slideshow idea
  • Mac Linux Removable Media … YouTube video created

Hope you get some ideas out of today’s tutorial which resulted in the YouTube video Mac Linux Removable Media.

If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.

Posted in eLearning, Hardware, Tutorials | Tagged , , , , , , , , , , , , , , | Leave a comment

Tcl/Tk macOS and Xcode Revisit Tutorial

Tcl/Tk macOS and Xcode Revisit Tutorial

Tcl/Tk macOS and Xcode Revisit Tutorial

Rather than trying to get the GUI side of Tcl, called Tk, working on our AlmaLinux public web server, we settled for a Tcl only web application there when we presented Tcl and Javascript and PHP Calculator AlmaLinux Tutorial.

But here, on our local macOS, only using Mac Intel chips, and this is important these days here in October 2026 with macOS Tahoe 26.6.1 Apple M1 chip, revisiting Tcl/Tk thoughts as we did yesterday, we wanted to reach at the end of our first day’s foray, as kilometermilestones …

  1. be able to go …

    clang --version

    … on command line (ie. in Terminal) as a C compiler … and associated with that are that Xcode projects with make become viable … as, then, after more installing, could …
  2. be able to go …

    tclsh

    … on command line with your ideal version of Tcl
  3. be able to go …

    wish

    … on command line with your ideal version of Tk (ie. GUI affect your local “DISPLAY defined” macOS is capable of) … another Tk test being …

    info patchlevel # coming back 8.6.14 for us ... but read on
    package require Tk # coming back 8.6.14 for us ... but read on
  4. be able to go …

    python3 -c "import tkinter; tkinter._test()"

    … on command line via going to Python website and installing via this installing link (ie. not using Homebrew and not using pip just installing off Python links)

For us, here, with our macOS Mac Intel chip scenario, after online research, we settled for version …


8.6.14

… ie. tcl8.6.14 and tk8.6.14 to be the ones of interest (ie. our ideal version is 8.6.14), and to avoid Homebrew as your installer. Wish may work with open -a Wish ahead of any installs, out of the box, but if it is not using your ideal version, that is not going to cut it to go onto your own future development work. Perhaps, here, we should say, in all likelihood, along your install path to that first day’s mission statement achievement …

You’ll run into command line errors (and Xcode IDE errors, as applicable).

But what we’d say to that, as a general good idea, is to pick out whole relevant (don’t start with /) error message individual lines (from command line work and/or from Xcode Version 26.6 (17F113) IDE work) and feed all that relevant error line into a Google search box to see what advice you get, and below, we’ve collected some of the ones we got to …

… on our quest highlighted by, getting right, commands …


  1. xcode-select --install

  2. sudo xcodebuild -runFirstLaunch

  3. cd ~/Downloads # having downloaded tcl8.66.14 and tk8.6.14 from SourceForge webpages
    # extracted in their ~/Downloads place both tcl8.6.14-src.tar.gz and tk8.6.14-src.tar.gz creating tcl8.6.14 and tk8.6.14 subfolders
    # mv tcl8.6.14 tcl
    # mv tk8.6.14 tk
    # extracted in their ~/Downloads place both tcl8.6.14-src.tar.gz and tk8.6.14-src.tar.gz again, creating tcl8.6.14 and tk8.6.14 subfolders to end up with four subfolders to work with
    make -C tcl8.6.14/macosx
    sudo make -C tcl8.6.14/macosx install
    make -C tk8.6.14/macosx
    sudo make -C tk8.6.14/macosx install

… and maybe there’ll be file permission issues and there may be reasons to create macosx subfolders off macosx subfolders that may happen involving Xcode IDE but we ended up with more joy back at Terminal command line work just using make it seemed to us.

So, our own tailored Tcl/Tk development work? That awaits!


Previous relevant Tcl and Javascript and PHP Calculator AlmaLinux Tutorial is shown below.

Tcl and Javascript and PHP Calculator AlmaLinux Tutorial

Tcl and Javascript and PHP Calculator AlmaLinux Tutorial

We want to research the wonderful …

  • tcl … programming language often accessed via the “tclsh” shell … and accompanying …
  • tk … via “wish” and/or tkinter GUI side

… on the AlmaLinux environment of the Apache/PHP/MySql web server we’re using here to host the RJM Programming domain.

We’re just touching on tcl ideas today, revisiting Tcl and Javascript and PHP Calculator Tutorial‘s calculator web application. We had in there some code scouring any local web server systems you may have, and getting the localhost:8888 port arrangements wrong for our local MAMP Apache/PHP/MySql web server, and this was causing unnecessary issues, especially because “tclsh” works, for us, up at AlmaLinux. How can we tell? We took on the excellent advice of Installing Tcl/Tk, and tried …


tclsh

… on the command line (and “exit” gets you out of it) with success. Yayyyyy!!! That’s tcl installed already, else we’d have gone dnf install tcl

That’s enough installing for today’s purposes, as we do not call on the tk GUI side of things for our calculator. But, to check on the install part to this, try …


wish

… on the command line, and check that there is a wishful response whether that be erroneous (as we were, so far, with AlmaLinux command line) or not, else we’d have gone dnf install tk

All that sorted, and we’re “good to go” with the changed calculator.php Calculator web application calling on our unchanged calculator.tcl TCL source code, as below …

Another woooorrrrlllldddd, perhaps?!


Previous relevant Tcl and Javascript and PHP Calculator Tutorial is shown below.

Tcl and Javascript and PHP Calculator Tutorial

Tcl and Javascript and PHP Calculator Tutorial

It’s a “blown mind” that has led me to involve Javascript to make the incarnation of our calculator of Tcl and PHP Calculator Tutorial allow for some round bracket functionality around the TCL (expr) “kernel” (sorry, Unix … my apologies LinusLinux). The nexus between what a user may enter, versus the hierarchy needs of TCL’s expr command just blew my mind, manperson!

So what did we turn to? Modernizing one’s thinking? We’re onto it? But we digress. Well, well.

We turned to Javascript’s eval function, not PHP’s eval, nor TCL’s eval version, thanks, but no thanks. Nevertheless … and didn’t you just know that “but” would be insulted by the paragraph above?! … use of Javascript eval (for round bracketing scenarios or operator hierarchy scenarios) is not the “cakewalk” that you may imagine. That is because …


6 ** 2 // in TCL "to the power of" operator syntax (which remains our web application display choice for the user) has ...
Math.pow(6, 2) // Javascript equivalent (behind the scenes)

… so we need to cater for that possibility. The Javascript logic is called at the document.body onload event.

As we often do here, the “progression” of logic was to convert some “hardcoded” HTML text (specifically “First Number:” and “:Second Number”) into HTML select (dropdown) elements to the left and to the right (respectively) of the “TCL kernel”, with additional options for the round bracketing the user may want. These dropdowns move out to the edges of the webpage as they make room for user entered additions to the calculation complexity of what they want to calculate. The “Math.pow()” logic needed benefits from the event timing thoughts on the dropdown’s onchange event logic, otherwise you’d be doing that dreaded of all dreadeds, in many programmers’ worlds methinks, tracking back through entered “calculator equation” texts to discover when a numerical value becomes an operator, a horrible job when a minus sign can be either, for example. These same “horrible” programming tasks would have been at the fore to making a “TCL only backend solution” come to pass, we are sure, too.

Can you see from all this how well (clientside) Javascript works with (serverside) PHP? They are a very potent duo, because it is like two bites at the cherry, every time, with their different timings of the application of their logics.

The downloadable PHP source code calculator.php changed this way to achieve this extension of functionality still supervising an unchanged calculator.tcl TCL source code script, and here is a live run link for you to try this calculator for yourself.


Previous relevant Tcl and PHP Calculator Tutorial is shown below.

Tcl and PHP Calculator Tutorial

Tcl and PHP Calculator Tutorial

The Tcl and PHP Primer Tutorial was a foretaste to today’s calculator web application that …

  • uses PHP as a frontend and (HTML) form navigation destination …
  • connects to backend via PHP exec …
  • uses TCL as backend … via …

    exec("tclsh calculator.tcl < calculator.txt | tail -1 > calculator.out");

Crucial to the TCL’s backend role is TCL’s expr command, as a determinant regarding what today’s calculator is capable of.

Here is a link to some downloadable PHP source code calculator.php supervising calculator.tcl TCL source code, and here is a live run link.


Previous relevant Tcl and PHP Primer Tutorial … http://www.tcl.tk/software/tcltk/ is shown below.

Tcl and PHP Primer Tutorial ... http://www.tcl.tk/software/tcltk/

Tcl and PHP Primer Tutorial ... http://www.tcl.tk/software/tcltk/

Have you heard of Tcl/Tk? Think maybe you could introduce yourself to it with Tcl/Tk So Brilliant (but where do you start?) Primer Tutorial as shown below.

The Tcl in Tcl/Tk refers to the scripting side of things, while the Tk is a GUI framework. On some (maybe lots) of Linux or unix web servers, such as the one for this domain here at www.rjmprogramming.com.au Tcl scripting is available and that means Tcl could be used by PHP, as a server side language to use the exec method to ask something of Tcl and get something back, half of which is the arrangement we’d like to have when feeding our babies.

Today we write a webpage for finding the Country of Origin of a designated URL where PHP supervises Tcl:

  1. ask for a URL in PHP,
  2. send that to the same PHP with a different call …
  3. and use PHP exec method to send a Tcl commend line command to Tclsh and output this to a file known by the PHP,
  4. get the PHP to read the file of step 3. and send that information in a modified call of this same PHP,
  5. write out the Tcl based findings to the webpage in PHP,
  6. ask for a URL in PHP

Here is a link to some downloadable PHP source code domain.php supervising domain.tcl TCL source code, and here is a live run link.

Thanks to:


Previous relevant Tcl/Tk So Brilliant (but where do you start?) Primer Tutorial is shown below.

Tcl/Tk So Brilliant (but where do you start?) Primer Tutorial ... http://www.tcl.tk/software/tcltk/Tcl/Tk So Brilliant (but where do you start?) Primer Tutorial ... http://www.tcl.tk/software/tcltk/

Tcl/Tk So Brilliant (but where do you start?) Primer Tutorial ... http://www.tcl.tk/software/tcltk/

Have you heard of Tcl/Tk?

Tcl/Tk is open source (based on a BSD-style license), so you can use it and modify it virtually any way you want, including for commercial uses.

With Tcl/Tk have used in conjunction with C++ and Python (look out for Tkinter).

Use it for Games Programming (it makes pretty cute GUIs … you may disagree?!) and it used to work back at Mac OS X 10.5.8/XCode 3.0 (am going to try Mac OS X 10.7.5 … any advice anywhere?) and had it going on Windows XP with Visual Studio Express as well. It has a lot of cross-platform strengths.

Think Tcl/Tk is really really good.

In this primer tutorial you can see a Draw Poker game as an XCode project, see it Build and in action, then see how to arrange for *.dmg Package Distribution via Package Manager.

Link to Tcl/Tk website … Home of Tcl/Tk … where quote up the top resides
Link to Tcl/Tk jobs done … Tcl/Tk jobs done … personal experience

If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.

Posted in eLearning, GUI, Installers, Operating System, Software, Tutorials, Xcode | Tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

WordPress Mobile Ontouchmove Event Tutorial

WordPress Mobile Ontouchmove Event Tutorial

WordPress Mobile Ontouchmove Event Tutorial

For a while now we’ve been trying out, on rarefied occasions, for mobile device usage, an …


ontouchmove="alert(this.title);"

… pared down idea, in an …

  1. “easy does it, not wanting to cruel any real coded for ontouchmove event logic way” in the sense that we want to see it not adversely affecting other functionalities (and, of course, this is like a one by one scenario proposition) … because …
  2. if not interfering, it, with some more nuance we’ll talk about below, could be a bit of a way forward helping mobile device UX (ie. user experience) start to benefit from a kind of emulation of the first of two aspects non-mobile devices have over them, they being …
    • when hovering over an element with a defined title attribute, the user sees that title attribute like a tooltip
    • non-mobile users can access Web Inspectors (and/or View Page Source) to effectively know everything that is going on with a webpage if they have accessed it with most modern web browsers

And because the second idea above will probably never be possible for mobile users, we have introduced into our nuanced ontouchmove=”alert(this.title);” idea changes for a lot of this WordPress blog’s webpages you are reading, a bit of what we’d say is “hand holding” in the new Javascript code, (similarly to the ways of WordPress Javascript Coding Rearrangements Primer Tutorial), as per the changed hive_off_header_php.js‘s “at document.body onload event” intervening …


var lastelo=null;

// New mobile ontouchmove idea ... October, 2026
if (navigator.userAgent.match(/Android|BlackBerry|iPhone|iPad|iPod|Opera Mini|IEMobile/i) || eval(String.fromCharCode(32).trim() + navigator.maxTouchPoints) > 0) {
var jhoare=0, khoare=0, ihoare=[], elthingos=['a','span', 'font', 'sup', 'sub', 'table', 'select', 'button', 'textarea', 'input', 'h1', 'h2', 'h3', 'h4', 'code', 'blockquote']; // 'p',
for (khoare=0; khoare<elthingos.length; khoare++) {
ihoare=document.getElementsByTagName(elthingos[khoare]);
for (jhoare=0; jhoare<ihoare.length; jhoare++) {
if (('' + ihoare[jhoare].outerHTML).indexOf(' ontouchmove=') == -1 && ('' + ihoare[jhoare].outerHTML.split('>')[0]).replace(' title=""', '').replace(" title=''", "").indexOf(' title=') != -1) {
ihoare[jhoare].ontouchmove=function(event){ otmalert(event); };
} else if (elthingos[khoare] == 'a' && ('' + ihoare[jhoare].outerHTML.split('>')[0]).replace(' title=""', '').replace(" title=''", "").indexOf(' title=') == -1 && ('' + ihoare[jhoare].outerHTML.split('>')[0]).replace(' href=""', '').replace(" href=''", "").indexOf(' href=') != -1) {
ihoare[jhoare].title='' + ihoare[jhoare].href;
ihoare[jhoare].ontouchmove=function(event){ otmalert(event); };
} else if (('' + ihoare[jhoare].outerHTML.split('>')[0]).replace(' title=""', '').replace(" title=''", "").indexOf(' title=') == -1 && ('' + ihoare[jhoare].outerHTML.split('>gt;')[0]).replace(' class=""', '').replace(" class=''", "").indexOf(' class=') != -1) {
ihoare[jhoare].title='Class ' + ihoare[jhoare].className;
ihoare[jhoare].ontouchmove=function(event){ otmalert(event); };
}
}
}
}

… where the mild “hand holding” occurs potentially creating “on the fly” title attributes occasionally to potentially provide more information to your more curious mobile user readers of this blog, who, behind the scenes, access the following new Javascript function …


function otmalert(eloev) {
eloev.stopPropagation();
if (eloev.target != lastelo) {
lastelo=eloev.target;
if (('' + lastelo.title) != '') {
alert(lastelo.title);
}
}
}

… in their travels.

Oh, by the way, mobile users out there reading this blog, now “exploratory wiggling” is advisory!


Previous relevant WordPress Javascript Coding Rearrangements Primer Tutorial is shown below.

WordPress Javascript Coding Rearrangements Primer Tutorial

WordPress Javascript Coding Rearrangements Primer Tutorial

If you are a regular reader here reading yesterday’s Window Object Function Equals Function Primer Tutorial‘s …

… using (from within the clientside realms of the coding of this WordPress.org blog’s) Javascript …

… what might have zipped through your mind could have been the connecting phrase …

… from within good ol’ TwentyTen theme’s header.php …

… or somesuch. Because that has been what we normally do. Don’t get me wrong though, with the rearrangement idea blurb below, we could persist arranging it that way (and if the Javascript relies on PHP, we still do), but that recent Performance Review we last referenced with PHP MySql WordPress Blog Apache Restart Watchdog Tutorial got us to “see the light” somewhat and reorganize a bit regarding how Javascript code within this WordPress.org blog is organized. And so, read on.

Did you feel let down with PHP MySql WordPress Blog Performance PHP-FPM Configuration Tutorial when we said …

Codex loop.php WordPress error 404 event PHP
Overuse of file_get_contents Rearrange use of file_get_contents …
passing more work to crontab/curl overnight run

… and did not go into more detail?! So were we, but we had to think on this a lot to flesh it out, and looked into the often used around here PHP function …


file_get_contents

To our reckoning, until recently, we’d never tried PHP file_get_contents with more than one parameter. But, perhaps, it helps website bandwidth to start using those other parametersarguments (you say either, but we say neither … let’s call the whole thing off!)?

Within the 404.php (HTTP Error 404 “Not Found”) PHP file_get_contents calls what was being asked content wise included all that webpage Javascript written into good ol’ TwentyTen theme’s header.php … ouch regarding bandwidth! And so it led us to rearrange as per …

  1. set aside Javascript that was interspersed with PHP as the Javascript we’d still keep in good ol’ TwentyTen theme’s header.php … but the rest, and it was considerable …
  2. as for the rest, it could be placed into a new external Javascript file called hive_off_header_php.js (first draft of several, at time of writing) … called via the less wordy …

    <script type='text/javascript' src='//www.rjmprogramming.com.au/ITblog/hive_off_header_php.js?rand=<?php echo rand(0,1986754); ?>'></script>

… to, we’re thinking …

  1. potentially save on file_get_contents call website load bandwidth …
  2. be able to design, in 404.php, parametersarguments (you say either, but we say neither … let’s call the whole thing off!) that are measurable and definitive hence the 150000 below) … to end up with the modified 404.php codeline …

    $thisbpc=file_get_contents('http://www.rjmprogramming.com.au/ITblog/?p=' . $pnumis, FALSE, NULL, 0, 150000);

However, that is part one of two, to this part of the Performance Review. Part two will be explained in days to come.


Previous relevant Window Object Function Equals Function Primer Tutorial is shown below.

Window Object Function Equals Function Primer Tutorial

Window Object Function Equals Function Primer Tutorial

In keeping with yesterday’s Web Browser Brand Roles Primer Tutorial‘s KISS lead in, there’s a subtle difference between what happens with the two tabulated links below …

KISS KISS

… using (from within the clientside realms of the coding of this WordPress.org blog’s) Javascript …


function scrollIntoViewExactly(inob) {
if (document.getElementById('nest' + inob.id) || 4 == 4) {
// var ninob=document.getElementById('nest' + inob.id);
// ninob.style.width='' + inob.width + 'px';
// ninob.style.height='' + inob.height + 'px';
//inob.style.display='inline-block';
// ninob.style.display='inline-block';
// forceVerticalOverflow(ninob);
//document.body.style.whiteSpace='nowrap';
// document.body.style.overflow='scroll';// Safely sets horizontal scroll across all modern browsers
var inobr=inob.getBoundingClientRect();
//alert('' + inobr.width + ',' + inobr.height);
//alert('' + document.body.scrollLeft);
//alert('' + eval('' + inobr.left) + ',' + eval('' + inobr.top));
//alert('{ left:' + Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)) + ', top:' + Math.floor(eval('' + inobr.top) + eval('' + document.body.scrollTop)) + ", behavior: 'smooth' }");
// ninob.style.overflowX='scroll';
// ninob.style.maxWidth='' + ninob.style.width;
//inob.innerHTML+=' ';
//ninob.style.maxHeight='200px';
// ninob.style.overflowY='scroll';
// alert(ninob.outerHTML);
//var innardsare='{ left:' + Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)) + ', top:' + Math.floor(eval('' + inobr.top) + eval('' + document.body.scrollTop)) + ", behavior: 'smooth' }";
// left: Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)),
var ioffis=eval(eval(screen.width - eval('' + document.getElementById('content').getBoundingClientRect().width)) / 2);
thenx=Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft) + eval('' + document.body.offsetLeft) + ioffis);
const innardsare = {
top: eval(120 + Math.floor(eval('' + inobr.top) + eval('' + document.body.scrollTop))),
behavior: 'smooth'
};
const xinnardsare = {
left: Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft) + eval('' + document.body.offsetLeft) + ioffis),
behavior: 'auto'
};
if (7 == 7) {
location.href='#' + inob.id;
} else {
// alert(isScrollable(ninob));
forceVerticalOverflow(document.body);
//alert(isScrollable(document.body));
//alert(innardsare);
window.scrollTo(innardsare);
//alert(Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)));
//setTimeout(function(){ document.body.style.overflowX = 'auto'; document.body.scrollBy(xinnardsare); }, 8000);
//setTimeout(function(){ alert(thenx); document.scrollingElement.scrollLeft='' + thenx + ''; }, 8000);
}
setTimeout(function(){
//document.body.overflowX='scroll';
document.body.style.cursor='progress';
document.body.style.marginLeft='-' + thenx + 'px'; //inob.scrollLeft=thenx;
inob.setAttribute('data-cb', '25');
setTimeout(countback, 1000);
setTimeout(function(){
document.body.style.cursor='pointer';
document.body.style.marginLeft='0px'; //inob.scrollLeft=thenx;
}, 25000);
}, 1000);
if (3 == 5) {
setTimeout(function(){
//document.body.style.whiteSpace='nowrap';
//document.body.style.overflow='scroll';// Safely sets horizontal scroll across all modern browsers
if (document.scrollingElement) {
document.scrollingElement.scrollLeft = thenx;
} else {
// Fallback for older browsers
document.documentElement.scrollLeft = thenx;
document.body.scrollLeft = thenx;
}
}, 5000);
}
} else {
window.scrollIntoView(inob);
}
}


Previous relevant Web Browser Brand Roles Primer Tutorial is shown below.

Web Browser Brand Roles Primer Tutorial

Web Browser Brand Roles Primer Tutorial

With a job, the day to day organization can be important, and is likely to be crucial to achieving goals.

We spend a lot of time around web browser applications, being into I.T. and creating web applications, in particular.

We’ve organized macOS MacBook Air usage mainly, around one major disk folder and four brands of web browser, the folder being, for us is …


/Applications/MAMP/htdocs

Huh?! Well, being into PHP as our “all things server” programming language, and having installed (many versions) of MAMP, as our Apache/PHP/MySql local web server brand of choice, and by default /Applications/MAMP/htdocs is MAMP’s Document Root (and defaulting to port 8888) corresponding to URL …


http://localhost:8888

Even with compiling language work, we’ll often use subfolders off /Applications/MAMP/htdocs … working to a KISS principle!

Turning to web browsers, the four we tabulate below are all very good products, and can all work well for you, especially on macOS, but a consideration to do with how you organize work, there is the consideration of what work life will be like if you have to, say, clear all web browser cookies and data, for instance. As such, in the list below, we’ve organized Google Chrome and/or Firefox as the two web browsers we can tolerate that with (but prefer to just clear Last Hour or Last 15 Minutes or Last 24 Hours usually), in our (web browser) Organization Table below …

Opera
  • RJM Programming website email … opened as this web browser’s home page
Safari
  • RJM Programming website WHM and cPanel login to domain related configurations and monitoring functionality
  • MAMP (opened when MacBook Air (re-)boots) based Animated GIF creation executions
  • Crazy Domains web hosting login to payments and Live Chat support
Firefox
  • Web application testing for tests that need to ignore Google Chrome
Google Chrome
  • RJM Programming *.php lately changed list report … opened as this web browser’s home page
  • Norton Safe Search of RJM Programming webpage … opened also when web browser loads up
  • Gmail via URL personal and work emails
  • WordPress.org blog Content Management System work
  • Web application Research and Development
  • Web application executions
  • Web application Web Inspector debugging

When there are jobs requiring command line needing to be seen next to a web browser rendition, macOS Terminal application windows can easily be arranged to not overlap any web browser brand window from the list above.

Screenshots on macOS have moved on from good ol’ Grab with the very easy keyboard shortcut …


control-command-shift-3

… working really well with good ol’ macOS version of PaintBrush‘s File->New from Clipboard functionality. Preview is good for PDF creation and compilation functionality. Gimp is good for blurring and other filtering requirements.

More and more we’ll use AirDrop to transfer from iPad or iPhone to the macOS MacBook Air, or use that iOS device’s Mail sharing option to download to the macOS MacBook Air Downloads folder usually, and then, usually, this will be copied to good ol’ /Applications/MAMP/htdocs (or a subfolder off this, especially if what is copied is a *.zip file (extracted)).

Crontab on the macOS MacBook Air has an “every minute” check of good ol’ /Applications/MAMP/htdocs changed (within last minute) *.png (primarily coming out of Paintbrush File->Save As… functionality) or *.[Hh][Ee][Ii][Cc] (off iPhone or iPad Camera app usage) ready for (PHP calling of) ImageMagick‘s convertion to versions of *.[Jj][Pp]*[Gg] images.

Uploads to (and downloads from) the RJM Programming domain are all conducted via sftp connections using the FileZilla macOS desktop application.

TextWrangler is our favourite text editor by a very large margin!

If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.

Posted in eLearning, Event-Driven Programming, iOS, Tutorials | Tagged , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

WordPress Javascript Coding Rearrangements Primer Tutorial

WordPress Javascript Coding Rearrangements Primer Tutorial

WordPress Javascript Coding Rearrangements Primer Tutorial

If you are a regular reader here reading yesterday’s Window Object Function Equals Function Primer Tutorial‘s …

… using (from within the clientside realms of the coding of this WordPress.org blog’s) Javascript …

… what might have zipped through your mind could have been the connecting phrase …

… from within good ol’ TwentyTen theme’s header.php …

… or somesuch. Because that has been what we normally do. Don’t get me wrong though, with the rearrangement idea blurb below, we could persist arranging it that way (and if the Javascript relies on PHP, we still do), but that recent Performance Review we last referenced with PHP MySql WordPress Blog Apache Restart Watchdog Tutorial got us to “see the light” somewhat and reorganize a bit regarding how Javascript code within this WordPress.org blog is organized. And so, read on.

Did you feel let down with PHP MySql WordPress Blog Performance PHP-FPM Configuration Tutorial when we said …

Codex loop.php WordPress error 404 event PHP
Overuse of file_get_contents Rearrange use of file_get_contents …
passing more work to crontab/curl overnight run

… and did not go into more detail?! So were we, but we had to think on this a lot to flesh it out, and looked into the often used around here PHP function …


file_get_contents

To our reckoning, until recently, we’d never tried PHP file_get_contents with more than one parameter. But, perhaps, it helps website bandwidth to start using those other parametersarguments (you say either, but we say neither … let’s call the whole thing off!)?

Within the 404.php (HTTP Error 404 “Not Found”) PHP file_get_contents calls what was being asked content wise included all that webpage Javascript written into good ol’ TwentyTen theme’s header.php … ouch regarding bandwidth! And so it led us to rearrange as per …

  1. set aside Javascript that was interspersed with PHP as the Javascript we’d still keep in good ol’ TwentyTen theme’s header.php … but the rest, and it was considerable …
  2. as for the rest, it could be placed into a new external Javascript file called hive_off_header_php.js (first draft of several, at time of writing) … called via the less wordy …

    <script type='text/javascript' src='//www.rjmprogramming.com.au/ITblog/hive_off_header_php.js?rand=<?php echo rand(0,1986754); ?>'></script>

… to, we’re thinking …

  1. potentially save on file_get_contents call website load bandwidth …
  2. be able to design, in 404.php, parametersarguments (you say either, but we say neither … let’s call the whole thing off!) that are measurable and definitive hence the 150000 below) … to end up with the modified 404.php codeline …

    $thisbpc=file_get_contents('http://www.rjmprogramming.com.au/ITblog/?p=' . $pnumis, FALSE, NULL, 0, 150000);

However, that is part one of two, to this part of the Performance Review. Part two will be explained in days to come.


Previous relevant Window Object Function Equals Function Primer Tutorial is shown below.

Window Object Function Equals Function Primer Tutorial

Window Object Function Equals Function Primer Tutorial

In keeping with yesterday’s Web Browser Brand Roles Primer Tutorial‘s KISS lead in, there’s a subtle difference between what happens with the two tabulated links below …

KISS KISS

… using (from within the clientside realms of the coding of this WordPress.org blog’s) Javascript …


function scrollIntoViewExactly(inob) {
if (document.getElementById('nest' + inob.id) || 4 == 4) {
// var ninob=document.getElementById('nest' + inob.id);
// ninob.style.width='' + inob.width + 'px';
// ninob.style.height='' + inob.height + 'px';
//inob.style.display='inline-block';
// ninob.style.display='inline-block';
// forceVerticalOverflow(ninob);
//document.body.style.whiteSpace='nowrap';
// document.body.style.overflow='scroll';// Safely sets horizontal scroll across all modern browsers
var inobr=inob.getBoundingClientRect();
//alert('' + inobr.width + ',' + inobr.height);
//alert('' + document.body.scrollLeft);
//alert('' + eval('' + inobr.left) + ',' + eval('' + inobr.top));
//alert('{ left:' + Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)) + ', top:' + Math.floor(eval('' + inobr.top) + eval('' + document.body.scrollTop)) + ", behavior: 'smooth' }");
// ninob.style.overflowX='scroll';
// ninob.style.maxWidth='' + ninob.style.width;
//inob.innerHTML+=' ';
//ninob.style.maxHeight='200px';
// ninob.style.overflowY='scroll';
// alert(ninob.outerHTML);
//var innardsare='{ left:' + Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)) + ', top:' + Math.floor(eval('' + inobr.top) + eval('' + document.body.scrollTop)) + ", behavior: 'smooth' }";
// left: Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)),
var ioffis=eval(eval(screen.width - eval('' + document.getElementById('content').getBoundingClientRect().width)) / 2);
thenx=Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft) + eval('' + document.body.offsetLeft) + ioffis);
const innardsare = {
top: eval(120 + Math.floor(eval('' + inobr.top) + eval('' + document.body.scrollTop))),
behavior: 'smooth'
};
const xinnardsare = {
left: Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft) + eval('' + document.body.offsetLeft) + ioffis),
behavior: 'auto'
};
if (7 == 7) {
location.href='#' + inob.id;
} else {
// alert(isScrollable(ninob));
forceVerticalOverflow(document.body);
//alert(isScrollable(document.body));
//alert(innardsare);
window.scrollTo(innardsare);
//alert(Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)));
//setTimeout(function(){ document.body.style.overflowX = 'auto'; document.body.scrollBy(xinnardsare); }, 8000);
//setTimeout(function(){ alert(thenx); document.scrollingElement.scrollLeft='' + thenx + ''; }, 8000);
}
setTimeout(function(){
//document.body.overflowX='scroll';
document.body.style.cursor='progress';
document.body.style.marginLeft='-' + thenx + 'px'; //inob.scrollLeft=thenx;
inob.setAttribute('data-cb', '25');
setTimeout(countback, 1000);
setTimeout(function(){
document.body.style.cursor='pointer';
document.body.style.marginLeft='0px'; //inob.scrollLeft=thenx;
}, 25000);
}, 1000);
if (3 == 5) {
setTimeout(function(){
//document.body.style.whiteSpace='nowrap';
//document.body.style.overflow='scroll';// Safely sets horizontal scroll across all modern browsers
if (document.scrollingElement) {
document.scrollingElement.scrollLeft = thenx;
} else {
// Fallback for older browsers
document.documentElement.scrollLeft = thenx;
document.body.scrollLeft = thenx;
}
}, 5000);
}
} else {
window.scrollIntoView(inob);
}
}


Previous relevant Web Browser Brand Roles Primer Tutorial is shown below.

Web Browser Brand Roles Primer Tutorial

Web Browser Brand Roles Primer Tutorial

With a job, the day to day organization can be important, and is likely to be crucial to achieving goals.

We spend a lot of time around web browser applications, being into I.T. and creating web applications, in particular.

We’ve organized macOS MacBook Air usage mainly, around one major disk folder and four brands of web browser, the folder being, for us is …


/Applications/MAMP/htdocs

Huh?! Well, being into PHP as our “all things server” programming language, and having installed (many versions) of MAMP, as our Apache/PHP/MySql local web server brand of choice, and by default /Applications/MAMP/htdocs is MAMP’s Document Root (and defaulting to port 8888) corresponding to URL …


http://localhost:8888

Even with compiling language work, we’ll often use subfolders off /Applications/MAMP/htdocs … working to a KISS principle!

Turning to web browsers, the four we tabulate below are all very good products, and can all work well for you, especially on macOS, but a consideration to do with how you organize work, there is the consideration of what work life will be like if you have to, say, clear all web browser cookies and data, for instance. As such, in the list below, we’ve organized Google Chrome and/or Firefox as the two web browsers we can tolerate that with (but prefer to just clear Last Hour or Last 15 Minutes or Last 24 Hours usually), in our (web browser) Organization Table below …

Opera
  • RJM Programming website email … opened as this web browser’s home page
Safari
  • RJM Programming website WHM and cPanel login to domain related configurations and monitoring functionality
  • MAMP (opened when MacBook Air (re-)boots) based Animated GIF creation executions
  • Crazy Domains web hosting login to payments and Live Chat support
Firefox
  • Web application testing for tests that need to ignore Google Chrome
Google Chrome
  • RJM Programming *.php lately changed list report … opened as this web browser’s home page
  • Norton Safe Search of RJM Programming webpage … opened also when web browser loads up
  • Gmail via URL personal and work emails
  • WordPress.org blog Content Management System work
  • Web application Research and Development
  • Web application executions
  • Web application Web Inspector debugging

When there are jobs requiring command line needing to be seen next to a web browser rendition, macOS Terminal application windows can easily be arranged to not overlap any web browser brand window from the list above.

Screenshots on macOS have moved on from good ol’ Grab with the very easy keyboard shortcut …


control-command-shift-3

… working really well with good ol’ macOS version of PaintBrush‘s File->New from Clipboard functionality. Preview is good for PDF creation and compilation functionality. Gimp is good for blurring and other filtering requirements.

More and more we’ll use AirDrop to transfer from iPad or iPhone to the macOS MacBook Air, or use that iOS device’s Mail sharing option to download to the macOS MacBook Air Downloads folder usually, and then, usually, this will be copied to good ol’ /Applications/MAMP/htdocs (or a subfolder off this, especially if what is copied is a *.zip file (extracted)).

Crontab on the macOS MacBook Air has an “every minute” check of good ol’ /Applications/MAMP/htdocs changed (within last minute) *.png (primarily coming out of Paintbrush File->Save As… functionality) or *.[Hh][Ee][Ii][Cc] (off iPhone or iPad Camera app usage) ready for (PHP calling of) ImageMagick‘s convertion to versions of *.[Jj][Pp]*[Gg] images.

Uploads to (and downloads from) the RJM Programming domain are all conducted via sftp connections using the FileZilla macOS desktop application.

TextWrangler is our favourite text editor by a very large margin!

If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.

Posted in eLearning, Tutorials | Tagged , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , | Leave a comment

Window Object Function Equals Function Primer Tutorial

Window Object Function Equals Function Primer Tutorial

Window Object Function Equals Function Primer Tutorial

In keeping with yesterday’s Web Browser Brand Roles Primer Tutorial‘s KISS lead in, there’s a subtle difference between what happens with the two tabulated links below …

KISS KISS

… using (from within the clientside realms of the coding of this WordPress.org blog’s) Javascript …


function scrollIntoViewExactly(inob) {
if (document.getElementById('nest' + inob.id) || 4 == 4) {
// var ninob=document.getElementById('nest' + inob.id);
// ninob.style.width='' + inob.width + 'px';
// ninob.style.height='' + inob.height + 'px';
//inob.style.display='inline-block';
// ninob.style.display='inline-block';
// forceVerticalOverflow(ninob);
//document.body.style.whiteSpace='nowrap';
// document.body.style.overflow='scroll';// Safely sets horizontal scroll across all modern browsers
var inobr=inob.getBoundingClientRect();
//alert('' + inobr.width + ',' + inobr.height);
//alert('' + document.body.scrollLeft);
//alert('' + eval('' + inobr.left) + ',' + eval('' + inobr.top));
//alert('{ left:' + Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)) + ', top:' + Math.floor(eval('' + inobr.top) + eval('' + document.body.scrollTop)) + ", behavior: 'smooth' }");
// ninob.style.overflowX='scroll';
// ninob.style.maxWidth='' + ninob.style.width;
//inob.innerHTML+=' ';
//ninob.style.maxHeight='200px';
// ninob.style.overflowY='scroll';
// alert(ninob.outerHTML);
//var innardsare='{ left:' + Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)) + ', top:' + Math.floor(eval('' + inobr.top) + eval('' + document.body.scrollTop)) + ", behavior: 'smooth' }";
// left: Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)),
var ioffis=eval(eval(screen.width - eval('' + document.getElementById('content').getBoundingClientRect().width)) / 2);
thenx=Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft) + eval('' + document.body.offsetLeft) + ioffis);
const innardsare = {
top: eval(120 + Math.floor(eval('' + inobr.top) + eval('' + document.body.scrollTop))),
behavior: 'smooth'
};
const xinnardsare = {
left: Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft) + eval('' + document.body.offsetLeft) + ioffis),
behavior: 'auto'
};
if (7 == 7) {
location.href='#' + inob.id;
} else {
// alert(isScrollable(ninob));
forceVerticalOverflow(document.body);
//alert(isScrollable(document.body));
//alert(innardsare);
window.scrollTo(innardsare);
//alert(Math.floor(eval('' + inobr.left) + eval('' + document.body.scrollLeft)));
//setTimeout(function(){ document.body.style.overflowX = 'auto'; document.body.scrollBy(xinnardsare); }, 8000);
//setTimeout(function(){ alert(thenx); document.scrollingElement.scrollLeft='' + thenx + ''; }, 8000);
}
setTimeout(function(){
//document.body.overflowX='scroll';
document.body.style.cursor='progress';
document.body.style.marginLeft='-' + thenx + 'px'; //inob.scrollLeft=thenx;
inob.setAttribute('data-cb', '25');
setTimeout(countback, 1000);
setTimeout(function(){
document.body.style.cursor='pointer';
document.body.style.marginLeft='0px'; //inob.scrollLeft=thenx;
}, 25000);
}, 1000);
if (3 == 5) {
setTimeout(function(){
//document.body.style.whiteSpace='nowrap';
//document.body.style.overflow='scroll';// Safely sets horizontal scroll across all modern browsers
if (document.scrollingElement) {
document.scrollingElement.scrollLeft = thenx;
} else {
// Fallback for older browsers
document.documentElement.scrollLeft = thenx;
document.body.scrollLeft = thenx;
}
}, 5000);
}
} else {
window.scrollIntoView(inob);
}
}


Previous relevant Web Browser Brand Roles Primer Tutorial is shown below.

Web Browser Brand Roles Primer Tutorial

Web Browser Brand Roles Primer Tutorial

With a job, the day to day organization can be important, and is likely to be crucial to achieving goals.

We spend a lot of time around web browser applications, being into I.T. and creating web applications, in particular.

We’ve organized macOS MacBook Air usage mainly, around one major disk folder and four brands of web browser, the folder being, for us is …


/Applications/MAMP/htdocs

Huh?! Well, being into PHP as our “all things server” programming language, and having installed (many versions) of MAMP, as our Apache/PHP/MySql local web server brand of choice, and by default /Applications/MAMP/htdocs is MAMP’s Document Root (and defaulting to port 8888) corresponding to URL …


http://localhost:8888

Even with compiling language work, we’ll often use subfolders off /Applications/MAMP/htdocs … working to a KISS principle!

Turning to web browsers, the four we tabulate below are all very good products, and can all work well for you, especially on macOS, but a consideration to do with how you organize work, there is the consideration of what work life will be like if you have to, say, clear all web browser cookies and data, for instance. As such, in the list below, we’ve organized Google Chrome and/or Firefox as the two web browsers we can tolerate that with (but prefer to just clear Last Hour or Last 15 Minutes or Last 24 Hours usually), in our (web browser) Organization Table below …

Opera
  • RJM Programming website email … opened as this web browser’s home page
Safari
  • RJM Programming website WHM and cPanel login to domain related configurations and monitoring functionality
  • MAMP (opened when MacBook Air (re-)boots) based Animated GIF creation executions
  • Crazy Domains web hosting login to payments and Live Chat support
Firefox
  • Web application testing for tests that need to ignore Google Chrome
Google Chrome
  • RJM Programming *.php lately changed list report … opened as this web browser’s home page
  • Norton Safe Search of RJM Programming webpage … opened also when web browser loads up
  • Gmail via URL personal and work emails
  • WordPress.org blog Content Management System work
  • Web application Research and Development
  • Web application executions
  • Web application Web Inspector debugging

When there are jobs requiring command line needing to be seen next to a web browser rendition, macOS Terminal application windows can easily be arranged to not overlap any web browser brand window from the list above.

Screenshots on macOS have moved on from good ol’ Grab with the very easy keyboard shortcut …


control-command-shift-3

… working really well with good ol’ macOS version of PaintBrush‘s File->New from Clipboard functionality. Preview is good for PDF creation and compilation functionality. Gimp is good for blurring and other filtering requirements.

More and more we’ll use AirDrop to transfer from iPad or iPhone to the macOS MacBook Air, or use that iOS device’s Mail sharing option to download to the macOS MacBook Air Downloads folder usually, and then, usually, this will be copied to good ol’ /Applications/MAMP/htdocs (or a subfolder off this, especially if what is copied is a *.zip file (extracted)).

Crontab on the macOS MacBook Air has an “every minute” check of good ol’ /Applications/MAMP/htdocs changed (within last minute) *.png (primarily coming out of Paintbrush File->Save As… functionality) or *.[Hh][Ee][Ii][Cc] (off iPhone or iPad Camera app usage) ready for (PHP calling of) ImageMagick‘s convertion to versions of *.[Jj][Pp]*[Gg] images.

Uploads to (and downloads from) the RJM Programming domain are all conducted via sftp connections using the FileZilla macOS desktop application.

TextWrangler is our favourite text editor by a very large margin!

If this was interesting you may be interested in this too.


If this was interesting you may be interested in this too.

Posted in eLearning, Event-Driven Programming, OOP, Tutorials | Tagged , , , , , , , , , , , | Leave a comment

Screen Co-ordinates Helper Primer Tutorial

Screen Co-ordinates Helper Primer Tutorial

Screen Co-ordinates Helper Primer Tutorial

There’s a really good macOS keyboard shortcut we’d like to discuss today. It’s …


shift-command-4

To take a screenshot of part of the screen, press Shift-Command-4 and then drag the cursor to outline the area you want to capture. If you want to capture a specific window, press Shift-Command-4. Hit the spacebar.

But it’s the “half-way” point with this we particularly noticed using web browsers. In the past when we’ve constructed HTML image maps we’ve often relied on Mobilefish.Com and its excellent Image Map Creation software to help us out, but this shift-command-4 keyboard shortcut’s way of displaying screen pixel co-ordinates could be another option here. Or it could be used in overlay position:absolute; left:[X]px; top:[Y]px; positioning scenarios, to good effect, we can envisage.

Mind you, other environments have their equivalents, too!

The woooooorrrrrllllllddd’s your better X and Y positioned oyyyyyyyster!

If this was interesting you may be interested in this too.

Posted in eLearning, Operating System, Tutorials | Tagged , , , , , , , , , , , , | Leave a comment