Thread: Help with some website design...

  1. #61
    Ticked and off
    Join Date
    Oct 2011
    Location
    La-la land
    Posts
    1,728
    Quote Originally Posted by phantomotap View Post
    I'm sure what point you were trying to make.
    I'm not so sure myself anymore, either. Looking at the MDN notes on it, I now realize that addEventListener() approach works on all sane browsers (with the note that IE versions prior to 9 are special flowers, and need shimming).

    Rather than reminescing how stuff worked a decade to decade and a half ago, I should read up on it. I'm just lazy. I now know that I can use the easy approach for UI events across all browsers (I'd be happy to exclude IE versions prior to 9.0, adding shims only if asked+needed).

    Quote Originally Posted by phantomotap View Post
    My point was that if you are actually trying to buy something, more robust code, you need a better shim.
    Right. I am still not up to date on browsers and Javascript, but it is already clear that the places where workarounds and shims are needed, have changed. For the better, I think.

  2. #62
    Master Apprentice phantomotap's Avatar
    Join Date
    Jan 2008
    Posts
    5,108
    For the better, I think.
    O_o

    You have no idea; at least, you will not really appreciate how much has changed until you start looking at the consistency across reasonably new versions of most browsers. I was actually dreading developing for the web when I got back into things a while back, but I wound up almost foaming at the mouth in joy. I wrote a few examples... and the pages worked. Browser stuff didn't just work back when I was really active all the year ago. If you hadn't spent twenty minutes babysitting "Internet Explorer", you weren't really doing anything.

    *sigh*

    For the better indeed...

    Soma
    “Salem Was Wrong!” -- Pedant Necromancer
    “Four isn't random!” -- Gibbering Mouther

  3. #63
    Bored Programmer
    Join Date
    Jul 2009
    Location
    Tomball, TX
    Posts
    428
    I think "return" is still one of those beautiful words that (like a warm friendly handshake) should seal any function contract.
    And makes testing a hell of alot easier. I'd prefer it to assertion tests in the dom with phantom.js.

    I'm not sure if I would use arrow functions much though, it just takes to long for me to make sense of when reading.
    Fat arrow is used for binding of the parent object calling the function. It is important for asynchronous code when "this" is controlled by the global window (process in node.js), and can change state before the function receives its callback.

    There is also implied returns now with es6. I don't follow all of it yet and you need to use use babel, traceur, or 6to5 with a package manager to make the site on a commercial sense. Most clients still ask for IE8 which makes me cry.

    If you aren't the kind of guy who would be bored by an hour long video of programming this is a good video on the changes of es6. Its a good overview.
    https://www.youtube.com/watch?v=6AytbSdWBKg

    If you like es6 Ember CLI | A command line utility for creating ambitious web applications comes out of the box with backwards support and shims for most es6. Most importantly it comes with modules. They finally added exportable classes that are scoped into JS.

    Docs for Ember are here: Ember.js - A framework for creating ambitious web applications.

    And if you want to build a full length app in just a month look into https://www.meteor.com/.

    I'm really excited about where javascript is going. Meteor is a full stack with a database that uses isomorphic data and a templating system. You only have to write one codebase of routes for what would normally take something like ruby or php on the other end.

    Browser stuff didn't just work back when I was really active all the year ago. If you hadn't spent twenty minutes babysitting "Internet Explorer", you weren't really doing anything.
    We still do have to babysit IE. Transpilers are the way to go if you want to write clean code and still support backwards. Find a solid one you trust and you can just write in the newest javascript using classes, exports, imports and a lot of added functions. Bower and npm are great package management systems for building a coding environment like that. And best part is you get to code in VIM all day xD.

    You have no idea; at least, you will not really appreciate how much has changed until you start looking at the consistency across reasonably new versions of most browsers.
    We finally have a decent model behind the standard. Instead of trying to roll giant changes out at once they have moved to a 'living standard' and it seems to be having a better impact. Each browser is still up to interpreting that standard how they want, but for the most part the ecosystem is getting more cooperative it appears.
    Last edited by Lesshardtofind; 04-28-2015 at 11:20 PM.
    Virtual reality hello world http://www.rodneybrothers.com/vr/vrh...rld/index.html in html and javascript.
    Viewable with dodocase, google cardboard, OR, and other compatible VR gear.

  4. #64
    Registered User Alpo's Avatar
    Join Date
    Apr 2014
    Posts
    877
    Bower and npm are great package management systems for building a coding environment like that. And best part is you get to code in VIM all day xD.
    Yeah I really like npm for management, it's so simple to use and control which versions of modules you are getting (though I like nano, especially with my own nanorc files ).

    I've been writing node.js stuff on my Raspberry for a few weeks, I've actually got a very neat program written using the socket.io module, it's a chat room with a shared drawing canvas for connected clients in the same room. I was a little concerned about speed, but I got 6 people on it all drawing at once and it seemed to hold up (I know that's a piddling number, but that's all the family I have :P). The drawing is done in 'line' style, the server holds clients color and line width, then the "drawing" emitter issues an object that looks like this:
    Code:
    {
        width:  lineWidths[socket.id],
        color: lineColors[socket.id],
        point: point,           // Passed in through "drawAttempt" message from client
        isBreak: false,        // True when a client processed "mouseup" event
        clientId: socket.id   // Client code collects points for drawing, so it needs to know who this point belongs to.
    }
    Then the client code processes this object by pushing the points into an array and using the CanvasRenderingContext2D API to make the line:

    Code:
        // in client:
        // 'ctx' is canvas element context.
    
                socket.on("drawing", (function (ctx) {
                    points = Object.create(null);
                    return function (toDraw) {
                        var orgColor,
                            orgWidth;
                        // If this client hasn't drawn before, create an array for them.
                        if (!points[toDraw.clientId]) {
                            points[toDraw.clientId] = [];
                        }
                        // Wait until at least 2 points have been collected
                        if (points[toDraw.clientId].push(point) > 1) {
                            // Save original rendering values for restoration
                            orgColor = ctx.strokeStyle;
                            orgWidth = ctx.lineWidth;
                            // Loop through all points drawing as we go:
                            points[toDraw.clientId].forEach(function(pt, n, arr) {
                                // Server broadcasts "drawing" message on "mouseup" of client to insert line break.
                                if (n && !pt.isBreak) {
                                    ctx.strokeStyle = pt.color;
                                    ctx.lineWidth = pt.width;
                                    ctx.beginPath();
                                    ctx.moveTo(arr[n - 1].x, arr[n - 1].y);
                                    ctx.lineTo(pt.x, pt.y);
                                    ctx.stroke();
                                }
                            });
                            // Lop off first point in array
                            points[toDraw.clientId].splice(0, 1);
                            ctx.strokeStyle = orgColor;
                            ctx.lineWidth = orgWidth;
                        }
                    }
                }(app.canvas_ui.ctx)));
    Since the server holds clients colors and line widths, the socket messages to change those are separate from drawing messages. To get the server to broadcast the "drawing" message, all any client has to do is emit a "drawAttempt" and pass in a point object containing x and y values, and a Boolean value indicating if the line is to be broken.

    Anyway, I'm currently learning boost::asio on the Raspberry, but node.js took less time so I tinker with it a lot as well. It's shocking how simple it is (the only other network API I know is the socket library). I don't know how it stacks up to a real threaded server program, but it's fun for toy programs like this.
    Last edited by Alpo; 04-29-2015 at 12:31 AM. Reason: Code formatting is wonky.
    WndProc = (2[b] || !(2[b])) ? SufferNobly : TakeArms;

  5. #65
    Bored Programmer
    Join Date
    Jul 2009
    Location
    Tomball, TX
    Posts
    428
    I like that code. You nest really hard in the return but its efficient.

    I haven't gotten into sockets enough yet. I've been stuck doing a ton of ajax event based stuff at work and been working on a URL param manager in my free time for meteor.

    The param manager is something that manages your component's state through query params and allows you to push state and replace state with it. I will preserve all other params in the url and allow you to move through your hybrid app (deployed to phones using only web tech) in a way that doesn't cause page refreshes. Its an attempt to prevent 3/4 of the rendering engine from firing when you decide to see a new "page".

    Code:
    if(Meteor.isClient){
      // Check if the Meteor.Poetic object is already populated... if we use this as a normal namespace
      // Some other module may have already declared it.. if not then it needs to be instantiated as an empty
      // object
      if (typeof Meteor.Poetic === "undefined") {
        Meteor.Poetic = {};
      }
      else{
        console.log("Meteor.Poetic already exhists");
      }
      // Register the ParamManager under the Meteor.Poetic namespace
      Meteor.Poetic.ParamManager = (function(){
    
        // Interface is the object that will be returned.. any function or variable added to this will be available
        // in the global scope Meteor.Poetic.ParamManager.[methodName]
    
        var Interface = {};
    
        // this will be an array of all param objects. This is private and should remain so.
        // A param object will follow the structure such as
        // {
        //   param: TheParameterName,
        //   value: TheValueOfThisParam,
        //   callback: TheFunctionToCallIfThisValueChanges
        // }
    
        var Params = [];
    
        // RegisterParamFunction is the method to register your parameter with a callback function.
        // based on the model above for params objects your call to this should look like
        //
        // Meteor.Poetic.ParamManager.RegisterParamFunction('user', function(value){console.log(value);});
        //
        // this will successfully console.log the new value when the value of user changes.
        // your function will most likely impliment some logic based on the value passed back.
    
        Interface.RegisterParam = function(paramName, callback){
          // TODO add a test to check if paramName or callback are null and throw and error
          Params[Params.length] = {
            param: paramName,                                    // save the parameter name passed
            value: null,
            callback: function(){
              callback(getParameterByName(paramName));
            }                                                   
          }
        }
    
        // This allows you to deregister a param callback by paramname
        Interface.DeRegisterParam = function(paramName){
          // iterate through the params object and find a match to the paramName passed then remove it
          for(var i = 0; i < Params.length; i++){
            if(Params[i].param === paramName){
              Params.splice(i, 1);
              i = Params.length;
            }
          }
        }
        // build URL is the interface set to trigger any callbacks whose state may have changed from the current set call
        // This is orientated around a direct javascript call. A template (html) linking method should be added that calls based
        // on multiple param values being changed in one link.
        function buildUrl(p, v, r){
          var base = window.location.origin;                            // get the URL currently in state
          var search = '?'                                            // save to default empty but with a param initializer
          for(var i = 0; i < Params.length; i++){                     // iterate through all params O(n) we should probably speed up
            if(Params[i].value !== null){                             // if the value isn't blank
              if(p === Params[i].param){
                search += p + "=" + v;
              }
              else{
                search += Params[i].param + "=" + Params[i].value;      // add the param name and value to the url
              }
              if(i < Params.length-1){                                // if this isn't the last parameter in the array
                search += "&";                                        // add another ampersand
              }
            }
          }
          if(r){
            window.history.replaceState({}, "OptionalTitle", base + search);  // store a new state in memory with the built url
          }
          else{
            window.history.pushState({}, "OptionalTitle", base + search);  // store a new state in memory with the built url
          }
        }
    
        // this function needs to push the state of the window, build a new URL based on values passed and then trigger any
        // callback functions that are rigistered to the change in url replace is a third optional arguement to update params
        // but not push the state forward.
        Interface.setParam = function(param, value, replace){
          buildUrl(param, value, replace);                              // pass the values to build a new url
          document.dispatchEvent(ChangedURL);                 // url has changed fire an event to trigger callbacks
        }
    
        // allow the user an easy interface to find or poll for the value of param. This shouldn't ever be needed if the que
        // Set and Link methods are used properly, but it does allow for restful principles and easier debugging.
        Interface.getParam = function(param){
          return getParameterByName(param);
        }
        // ChangedURL is the event that will be listened to for url changes. Because of this you should always use
        // the paramManager to update the parameter url or ELSE your function will NOT be called.
    
        var ChangedURL = new Event('urlchange');
    
        // executeCallbacks will iterate through every object in the params array and execute its callback.
        // It will check its current value and the value in the URL if these values are the same then its callback
        // won't be called. If the values are different then the url was Changed so then it will run its callback and then
        // update its internal value to the new value
        function executeCallbacks(){
          for(var i = 0; i < Params.length; i++){
            var curVal = getParameterByName(Params[i].param);
            if(Params[i].value !== curVal){
              Params[i].callback(curVal);
              Params[i].value = curVal;
            }
          }
        }
    
        // when the document is ready register our callbacks function on the urlchange event.
        window.onload = function(){
          document.addEventListener('urlchange', function(event){
            executeCallbacks();
          }, false);
          // register forward backwards and directly typed urls to fire this event.
          window.onpopstate = function(){
            document.dispatchEvent(ChangedURL);
          }
          document.dispatchEvent(ChangedURL);
        };
    
        // simple function that returns the value of a query param by name from the current url.
        function getParameterByName(name) {
            name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
            var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
                results = regex.exec(location.search);
            return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
        }
        return Interface;
      })();
    }
    It still needs some work and I think I have one bug in it but I'm trying to get this process going where a manager can keep url states just as well as google maps does and allow for any linking within an app to a complicated state.

    Hopfully I'll get there soon lol.

    Javascript is really fun langauge.
    Last edited by Lesshardtofind; 04-29-2015 at 01:16 AM.
    Virtual reality hello world http://www.rodneybrothers.com/vr/vrh...rld/index.html in html and javascript.
    Viewable with dodocase, google cardboard, OR, and other compatible VR gear.

  6. #66
    Master Apprentice phantomotap's Avatar
    Join Date
    Jan 2008
    Posts
    5,108
    We still do have to babysit IE.
    O_o

    No. We, as in most web developers, really don't have to babysit "Internet Explorer" anymore.

    I write polyglot HTML (HTML5/Strict HTML4), a subset of CSS, and strict Javascript according to industry recommendations derived from a great deal of research. I've not had recent "Internet Explorer" versions give anything less than excellent results. On the other hand, I've have spent a few minutes babysitting browsers shipped with some versions of "iOS" and "Android" because those bugs can't be shimmed with Javascript alone.

    The developers maintaining the third-party shim I conditionally link needs to babysit some slightly older browsers, but I don't. I refuse. I'd sooner drop support for those older browsers than repeat the horror I went through trying to make things consistent during those late 1990s years.

    Soma
    “Salem Was Wrong!” -- Pedant Necromancer
    “Four isn't random!” -- Gibbering Mouther

  7. #67
    Master Apprentice phantomotap's Avatar
    Join Date
    Jan 2008
    Posts
    5,108
    ;_;

    I just realized that I will have written my first HTML twenty years ago in just two more months.

    I feel so fogy just now...

    Soma
    “Salem Was Wrong!” -- Pedant Necromancer
    “Four isn't random!” -- Gibbering Mouther

  8. #68
    Bored Programmer
    Join Date
    Jul 2009
    Location
    Tomball, TX
    Posts
    428
    No. We, as in most web developers, really don't have to babysit "Internet Explorer" anymore.
    Comparatively to a year ago I will definitely submit to your point. I do spend quite a bit less time worrying about it. But we get the occasional client that requires IE8 and it becomes a pain.

    Honestly I spend alot less time in general worrying about it anymore most of my projects are cordova exported hybrid apps so following the standard keeps us pretty well in line. But every now and then I have to build a drupal component and I throw in some javascript or css that I take for granted these days, and a QA check gets me a @shoutout on trello.
    Virtual reality hello world http://www.rodneybrothers.com/vr/vrh...rld/index.html in html and javascript.
    Viewable with dodocase, google cardboard, OR, and other compatible VR gear.

  9. #69
    Bored Programmer
    Join Date
    Jul 2009
    Location
    Tomball, TX
    Posts
    428
    I just realized that I will have written my first HTML twenty years ago in just two more months.
    Thats intense I got about 3 1/2 to go to get there lol.
    Virtual reality hello world http://www.rodneybrothers.com/vr/vrh...rld/index.html in html and javascript.
    Viewable with dodocase, google cardboard, OR, and other compatible VR gear.

  10. #70
    Master Apprentice phantomotap's Avatar
    Join Date
    Jan 2008
    Posts
    5,108
    But we get the occasional client that requires IE8 and it becomes a pain.
    O_o

    I'd assume anyone wanting me to develop/maintain a bit of web/application targeting "Internet Explorer 8" without a third-party shim was insane.

    I legitimately hope for your sake that you don't run into insane clients all that often.

    Thats intense I got about 3 1/2 to go to get there lol.
    I just now realized that "Harmony" is scheduled for around that same time.

    I'm going to write a `blink' shim with the new juice, assuming "Harmony" lands, just for nostalgia. ^_^

    I'll then delete the code before a leak destroys the web. ;_;

    [Edit]
    Are you thinking of anyhing?
    [/Edit]

    [Edit]
    o_O

    Come to think on it, the comment is kind of ambiguous.

    Are you talking months or years?
    [/Edit]

    Soma
    Last edited by phantomotap; 04-29-2015 at 01:42 AM.
    “Salem Was Wrong!” -- Pedant Necromancer
    “Four isn't random!” -- Gibbering Mouther

  11. #71
    Registered User MutantJohn's Avatar
    Join Date
    Feb 2013
    Posts
    2,665
    Man, this topic really blew up O_o

    That being said, I figured it out! I can control how the browser responds to events! The default handling for a form submission is to re-request the page but preventing that behavior allows the user to submit the form and everything I want to happen does and everything I don't want to happen doesn't!

    Ha! That's so neat!

    Oh, web development... You confusing beast.

    I also learned there's server-side JavaScript too. But without DOM, what's the point? Does anyone here have any good experience using SSJS and it being a better choice than other popular server-side scripting languages?

  12. #72
    Bored Programmer
    Join Date
    Jul 2009
    Location
    Tomball, TX
    Posts
    428
    I legitimately hope for your sake that you don't run into insane clients all that often.
    We are just finalizing the last components and going through QA on a site that cost nearly a quarter of a million dollars and required us to support back to IE8. We will be working on another very large client after that page goes live that will also require IE8 support. You are right though no way I'd do it without JavaScript shims and we have css addons for the most part that compile our SASS files into compliant css. Just random stuff comes back in QA though.

    Come to think on it, the comment is kind of ambiguous.

    Are you talking months or years?
    Sorry yea 3 1/2 years before I hit the 20 year mark on html.

    As for planning anything with harmony I've been using babel and writing in harmony/es6/es2015 (they can't decide what to call it lol) for about 6 months now.
    Really I'm just in love with using the class keyword even though its just syntactic sugar and I really like how es6 modules behave and what kind of impact it makes on larger projects file architecture.

    The default handling for a form submission is to re-request the page but preventing that behavior allows the user to submit the form and everything I want to happen does and everything I don't want to happen doesn't!
    Alot of people have problems with this at first but everything is overwritable in JavaScript once you learn to harness this power you'll become quite formidable lol.

    I also learned there's server-side JavaScript too. But without DOM, what's the point?
    That one question could spawn a 50 page discussion of its own. I'll try to be short.
    1. Task automation (bash, batch commands from interfacing with large CMS systems such as drupal. You can create nodes in your website based on database changes)
    2. Project Generation (you can create "templates" of your apps or website "bootstrap" and generate them with one command line using tools such as yeomen)
    3. Easier API integration (Usually with a large website or phone app you have to serialize and deserialize data as it goes from client to server In javascript you can now write one codebase that tells both client and database how to handle routes)
    4. Testing (Unit testing your javascript is easier than ever using node tools. You can even get addons like phantom.js that will allow you to make a "virtual dom" and use jquery like selectors to see if things get rendered "assertion testing")
    5. Faster MVP (Most Viable Product is a important thing to deliver to a client quickly. Using the same language for all steps allows one coder to be at control of the entire phase instead of emailing the guy programming the API everytime he makes a mistype or forgets to instantiate a class)

    Basically Web firms can really focus on having strong JavaScript employees and they are able to accomplish nearly any task online or off with node.js advancements.

    On a side note, node.js + mongo has resulted in fantastic real time serverside results and template rendering inside frameworks such as meteor. Where your data in your templates is bound to the data in the database. So if you have a count of objects in your database displayed on the page anytime an update is made by anyone the number updates in realtime without refreshing your browser. AND hot-code pushes allow for web and phone apps to be updated auto-matically anytime you update the source without them having to go to app store and click upgrade.
    Virtual reality hello world http://www.rodneybrothers.com/vr/vrh...rld/index.html in html and javascript.
    Viewable with dodocase, google cardboard, OR, and other compatible VR gear.

  13. #73
    Registered User Alpo's Avatar
    Join Date
    Apr 2014
    Posts
    877
    Quote Originally Posted by Lesshardtofind;
    Code:
    function getParameterByName(name) {        name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
            var regex = new RegExp("[\\?&]" + name + "=([^&#]*)"),
                results = regex.exec(location.search);
            return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
        }
    I thought since you are requiring the results[1] spot to be the parameter value, it might also be a good idea to guard against the user passing in "(", ")" too. Although I don't know for sure that these would even be valid in the name? That's a pretty cool idea for a module .

    Quote Originally Posted by MutantJohn;
    I also learned there's server-side JavaScript too. But without DOM, what's the point? Does anyone here have any good experience using SSJS and it being a better choice than other popular server-side scripting languages?
    It's more than just server scripting though. Node.js I think is an attempt to give JavaScript some of the lower level access that other languages have, but to maintain the asynchronous nature that the browser exhibits. For instance you can do file I/O and none of it will be blocking. This model would seem to give the best performance "per thread", but Node.js is single threaded so you wouldn't want to do any huge processing of any data during a callback without spawning a new process to do it (something I'm currently not that good at handling).

    In my Chatroom/Canvas program, all the server really needs to do on any request/callback is to assign a few variables and then sometimes broadcast those to all the clients. So it handles it fast enough that for a small number of clients that it appears as if they can all draw things all at once.

    To give a small example of a very simple file server written in Node.js (From the book "Eloquent JavaScript" I think):

    Code:
    var http = require("http"), // http module
        fs = require("fs"),     // file-system module
        path = require("path"), // Contains a parser for filepaths
        mime = require("mime"), // This is an npm module, that contains a JSON based mime-type lookup table
        cache = {},             // Will cache away filedata
        defaultPath = "./public",
        defaultFile = "/hello.html",
        server;
    
    function send(response, statusCode, body, mime) {
        response.setHeader("Content-Type", mime || "text/plain");
        response.setHeader("Content-Length", Buffer.byteLength(body));
        response.writeHead(statusCode);
        response.end(body); // End the connection and send the information
    }
    
    function sendFile(response, filePath) {
        if (cache[filePath]) {
            send(response, 200, cache[filePath], mime.lookup(path.basename(filePath)));
        } else {
            // Normally you would add some checking here to see if 'filePath' is valid,
            // and also to root out some possible attacks, this is just a brief thing though.
            // Notice how we pass a function to fs.readFile, so that we continue execution directly
            // after the call, even though the file data isn't read yet.
            fs.readFile(filePath, function (error, data) {
                if (!error) {
                    cache[filePath] = data;
                    send(response, 200, data, mime.lookup(path.basename(filePath)));
                } else {
                    send(response, 500, "Server Error.");
                }
            });
        }
    }
    
    // In creating our server we also register our callback that is executed on the "request" event.
    // The 'request' parameter is a 'readable stream' so you could repond to data as it's read if 
    // you wanted to (again with a callback).
    // The 'response' object is a 'writeable stream' object, and you could pipe file data to it 
    // as it's read if you wanted.
    server = http.createServer(function (request, response) {
        // Very minimal basic routing:
        var filePath = defaultPath + (request.url === "/" ? defaultFile : request.url);
        sendFile(response, filePath);
    });
    server.listen(8000);
    Edit: The 'require' functions in the example are part of a pattern called 'Common Modules'. It's basically a synchronous request to a .js file that will assign things to the global 'module.exports' variable when it is evaluated. There is another pattern called AMD (Asynchronous Module Definition) that could possibly be used as well, but Node.js uses this one.

    Quote Originally Posted by Phantomotap;
    I just realized that I will have written my first HTML twenty years ago in just two more months.

    I feel so fogy just now...

    Soma
    Mine started about 15 years ago. Everything is so different now as to be unrecognizable. I just remember before I let off, everyone was sure XHTML would take over, and MIME was getting a ton of hype .
    Last edited by Alpo; 04-29-2015 at 11:20 AM.
    WndProc = (2[b] || !(2[b])) ? SufferNobly : TakeArms;

  14. #74
    Ticked and off
    Join Date
    Oct 2011
    Location
    La-la land
    Posts
    1,728
    Quote Originally Posted by phantomotap View Post
    I just realized that I will have written my first HTML twenty years ago in just two more months.
    I can't find the earliest timestamps for my first home page, but it was either that year or in '96. I definitely remember using Mosaic on some nice beefy DEC Alphas in '95. (But mostly just tin and pine in separate windows, with some googly-eyes following my mouse, and a clock. Of course.) I did take a course in SGML, LaTeX and HTML in spring '96; the following autumn was my first longer IT job, putting together a multimedia CD-ROM using Macromedia Director at another university. I was barely adult, then..

    Hm. I did just realize I commented on the walking stick another busrider had today. I was, I admit, a bit jealous; it was a really nice big beefy walking stick, a knotty, walking cane-looking piece of well-worn wood. Damnit, I'm getting old.

    GET OFF Mnevermind, I don't have a lawn. Frolic away.

  15. #75
    Registered User MutantJohn's Avatar
    Join Date
    Feb 2013
    Posts
    2,665
    So, I looked up "Node.js vs PHP" and they showed an example of Node.js's asynchronous nature and I'm not sure if it's a good thing or not. I think you can do the same thing in CS JS, right? Like, you declare a certain section to be asynchronous and the browser will execute the instructions in the order in which they can actually be executed and not as they appear in the actual source code. That's one thing I'm very undecided about because most languages, what you actually type is typically the order of the execution.

    It seems interesting though. I like the idea of Node.js integrating with something like MongoDB. This way I never ever have to learn MySQL.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Replies: 2
    Last Post: 12-11-2012, 12:25 AM
  2. Website Design....again
    By Sentral in forum A Brief History of Cprogramming.com
    Replies: 14
    Last Post: 10-29-2006, 05:47 AM
  3. Website design!
    By Sentral in forum A Brief History of Cprogramming.com
    Replies: 28
    Last Post: 10-07-2006, 12:38 AM
  4. website
    By the Wookie in forum Windows Programming
    Replies: 1
    Last Post: 11-07-2002, 02:25 PM