Category Archives: Server

Phil 1.9.15

8:00 – 5:00 SR

  • DB backups now appear automated!
  • Failover is a problem since our servers apparently run in two different VMs
  • Discussed plans with Lenny, and the presentation with Don
  • Tried the code restructuring on my irev apps, which are a reasonably large Angular app. After a few dumb cut-and-paste errors, everything works…?
  • Next will be to inherit an app and turk controller from the postControllers.
    • Had to change any variable or function to be explicitly attached to this/self, but other than that, everything works. Broke out irevTurk to it’s own module, using an inherited postController. Deployed and running!

Phil 1.8.15

7:30 – 4:30 SR

  • DB backups
  • Some back and forth with Agenia about when to meet next. Some morning next week
  • Nearly fixed the dynamic charts.
    • ‘ISR-PMO’ chokes the query.
    • The goals seem to have problems on FY boundries.
  • Deployed Dong’s FR app on the test server and it seems to work
  • Spent some time going over the FR Angular code, and there are some very weird things. In the process of fixing(?) them, we broke the app. Dong’s looking into that now.
  • Started to pull the iRev code apart and use inheritance. The use of all the functions and pointers seems to be working fine, but there’s a lot of code to move around. I think I’ll create an iRevApps2 directory and populate with cleaned items. At this point I’m thinking that the organization should look something like this:
    • globals – contains JS objects that are used throughout the applications
    • angular – contains the actual angular code used by the application. A single file for a simple SPA should look something like this:
// The Angular code
(function(angular, ml, undefined) {
    angular.module('globalsApp', [])
            .factory('GlobalsService', [ml.factoryPtr]);

    angular.module('inheritApp', ['globalsApp'])
            .controller('MainCtrl', ['GlobalsService', ml.childPtr]);
})(angular, myLogic);
    • then I’m not sure. There needs to be a place for common/base classes. Then possibly folders for each SPA component? Here’s Google’s style guide to ponder.

Phil 1.7.15

Phil 8:00 – 5:00 SR

Phil 1.6.15

8:00 – 4:00 SR

  • Snow!
  • ITK timesheet
  • Status report
  • Made FY charts for all FY2015. It looks like the new query is using the wrong values for the Name column – e.g., it should be ‘PM Actuals’ but it’s coming back as ‘PM Actuals (Invoiced) Outlay $’
  • Angular
    • Was looking at the scatterplot app and it’s entirely broken. I’m thinking that I didn’t update all of the code to subversion when I was working on it back on the 24th. Setting that aside for the day. I think I’m going to try to understand how to do inheritance in Angular. And a darn good thing too. I found all my missing code, fixed a few things, committed it, and put it up here.
    • Rediscovered that ‘this’ is not part of a javascript function. Which makes the whole var self = this part of a controller now very confusing. Ah, in looking at the debugger, controllers get a special ‘this’ – ‘$get.Constructor’

controllerConstructor

    • There doesn’t seem to be much discussion about this – mostly this bit on stackoverflow.
    • Making slow progress. I can declare a function outside of the controller, inherit from it and use that as the controller’s function, but so far I can’t pass arguments. Since that’s only needed to inject other angular objects, I put together a tiny service that provides a string. We’ll see if I can make that pass in correctly tomorrow.

Phil 1.5.15

8:00 – 5:30 SR

  • Fix ITK timesheet for 12/21?
  • DB Backups
  • Status report
  • Angular
    • Spent most of the day trying to figure out how to get server information such as referrer. Wound up with a php hack:
<?php
// this is the only way that I know to get the referring page. We will then send this to the db.
function getReferrer(){
    $referrer = "No Referrer";
    if(isset($_SERVER['HTTP_REFERER'])) {
        $referrer = htmlentities($_SERVER['HTTP_REFERER']);
        if($referrer == ""){
            $referrer = "No Referrer";
        }
    }
    return $referrer;
}
echo '<div id="phpReferer" hidden>'.getReferrer().'</div>';
?>
    • This uses php to compile a page with a div named ‘phpReferer’. Since the page exists before Angular has a chance to process it, the hidden div is available in the document. It’s then a matter of getting the $document (passed into the controller) and looking through it. Note that the jQueryLite that angular has doesn’t allow finding divs by ID, so we have to loop over the results for <div> until we find what we’re looking for:
self.phpReferer = null;
var divArray = $document.find('div');
var i;
for(i = 0; i < divArray.length; i++){
   if(divArray[i].id === 'phpReferer'){
      self.phpReferer = divArray[i].innerText;
   }
}
    • I’m not hugely happy with this, but it does work…
    • Also looked at how to do polymorphism in Angular. I found this example, which is somewhat confusing and bares further examination. The guy who described it, Miško Hevery, is one of the authors of Angular, so I give him the benifit of the doubt. And here’s a talk by him on OO and JavaScript. Currently 46 minutes in.

Phil 1.2.14

8:00 – 5:00 SR

  • DB backups
  • Angular
    • Starting db-backed ‘wizard’ directive. We’ll probably use this mechanism for the Funding Request webapp.
CREATE TABLE IF NOT EXISTS `wizard_table` (
  `uid` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(255) NOT NULL,
  `step` int(11) NOT NULL,
  `question` varchar(255) NOT NULL,
  `info` varchar(255) NOT NULL,
  `response_type` varchar(255) NOT NULL,
  `responses` int(11) NOT NULL,
  PRIMARY KEY (`uid`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;
  • Populating table with famous quotes
  • Starting the main directive code. Since this isn’t an ng-repeat, I need to load the data and set the first panel with an ng-init call.
  • Got everything working. Need to clean up a bit.

Phil 12.24.12

8:00 – 5:00 SR

  • DB backups
  • Tested scatterplot on target clients – good performance!
  • Discovered the JavaScript blog Performance Kills. Yow.
  • Angular
    • Need to make sure that the array of panels is cleared out on new loads.
    • Instrumenting directives is tricky! I wound up adding a debugText property to the panelObj object that I’m passing to the PanelManager directive. I can write into that object inside a directive’s controller and see the results that way.
    • Changed the panelArray to a panelMap. Add and delete now the appropriate-sized map. However, extra selects and hovers slip through, Need to make more robust.
    • Turning the stage div into a directive. Done. Much nicer. Isolates all the mouse interaction and matrix math too.

Phil 12.23.14

8:00 – 5:30 SR

  • DB Backups
  • Angular
    • Keeping scatterplotTest1 intact in case I break things
    • Adding a controller at the panel organization level. This should closely mimic how tabs should work – selecting a tab causes the others to go to the ‘unselected’ state. the getCssClass() call should still work though, which is nice.
    • Help from StackOverflow: http://stackoverflow.com/questions/15672709/how-to-require-a-controller-in-an-angularjs-directive
    • To make this work, the directives need to communicate, which requires a controller. To manage the instances, we must use the ‘requires’ tag. Here’s what I did:

First, excerpts from the javascript directives

sp.directive('floatingPanelManager', [function() {
   return {
      restrict: 'AE',
      scope: {
         panelObj: '='
      },
      templateUrl: 'directives/floatingPanelManager.html',
      controller: function($scope) {
         var currentId = -1;
         var hideAllPanels = false;
         $scope.panels = [];
         this.registerPanel = function(panelScope){
            $scope.panels.push(panelScope);
         }
         this.selectPanel = function(panelId) {
            currentId = panelId;
            var ps;
            for (var i = 0; i < $scope.panels.length; i++) {
               ps = $scope.panels[i];
               if(ps.$id === panelId){
                  ps.selected = !ps.selected;
                  hideAllPanels = ps.selected; // hide all the other panels if one is selected
               }else{
                  ps.selected = false;
               }
            }
         };
         this.getHideAllPanels = function(){
            return hideAllPanels;
         }
      }
   }
}]);
sp.directive('floatingPanel', ['$sce', function(sce) {
   return {
      restrict: 'AE',
      require: '^floatingPanelManager',
      scope: {
         panelObj: '=',
         stageObj: '='
      },
      templateUrl: 'directives/floatingPanel.html',
      link: function(scope, element, attr, panelMgr) {
         panelMgr.registerPanel(scope);
         scope.getCssClass = function(){
            if(scope.selected){
               return 'selectedClass';
            }
            if(panelMgr.getHideAllPanels()){
               return 'hiddenClass';
            }
            if(scope.hover){
               return 'hoverClass';
            }
            return '';
         }
         scope.selectPanel = function(){
            var sid = scope.$id;
            panelMgr.selectPanel(sid);
         }
      }
   };
}])

And here’s the directive html:

<div class="floatingPanelStyle" ng-class="getCssClass()"
     ng-click="selectPanel()"
     ng-mouseenter="hover = true"
     ng-mouseleave="hover = false"
     ng-style="{'transform':getTransformString()}" ng-bind-html="getHtml()"></div>
  • In this case, I have a ‘floatingPanel’ directive that requires (watch the spelling!!!)  ‘floatingPanelManager’. The use of ‘require’ means that angular will inject the required instance as the fourth argument to the link function.
  • It’s important to remember that we have to have a single instance here. In this case, that instance has an array of all the floating panels that are being managed. And that array needs to be attached to the $scope passed into the controller. As I understand it, that means that it is attached to the DOM.

Phil 12.22.14

8:00 – 4:30 SR

  • DB Backups
  • Angular
    • After spending most of the day puzzling out how come my transforms weren’t working correctly, I came to the realization that it’s impractical to unproject a CSS shape into screen space. It’s obvious in hindsight, but I’m used to working with projection and model matricies, and CSS3 only gives you the MODEL matrix. Perspective is determined using the perspective CSS property, which gives the distance to the z=0 plane. Short distances give wide perspectives, large distances give a telephoto effect. The problem is that there is not enough information to calculate the view frustum from this, at least in the way that xGL would do it (using 8 points, or two rectangles forming a prism).
    • Ok, after looking at the Wikipedia entry, this may not be so tough after all. http://en.wikipedia.org/wiki/3D_projection. Still tricky since this may or may not be the same matrix that the browser is using…
    • It does strike me that the way that CSS is doing things is effectively a pinhole camera, so it should be possible to work out the perspective matrix from that, but I’m not up to it today. I think instead, I’ll work on hiding/dimming items that are not selected while an item is selected. I think this calls for using controllers inside directives (pg. 216 Angular JS Up and Running)

Phil 12.19.14

8:00 – 4:00 SR

  • DB backups
  • Angular
    • Starting a page on useful javascript libraries
    • Got the inverse transforms working. It really slows things down though. As a compromise, I only apply the inverse transform to the hovered item
    • And now I cannot get the href in the hovered item to work. Ah. It’s because that to make the jquery tooltip work I have to wrap the dix in an <a> element, which you can’t nest. Something to work on next week
    • Last odd thing. When running on my home server, the hover transition is more abrupt, with the same code. No console errors.

Phil 12.18.2014

8:00 – 12:30 4:00 – 6:00 SR

  • DB backups
  • Meeting with Agenia
  • Angular
    • Working on changing states on floatingPanel
    • Got some easy ng-class changes running
    • Changed the transform call so that they use matrix3d. This way I can unproject the individual floating panels.

Phil 12.16.14

7:30 – 4:00 SR

  • DB backups
  • More mysterious paperwork. Ronda and Angine have been pinged, and I told them how our truststore was set up.
  • Cool thing for the morning: https://github.com/Automattic/atd-jquery
  • Angular
    • Add mouse tracking for more intuitive interaction. This looks like a good place that covers events
    • The mousewheel require more work, and an additional library. Monospaced labs has their hamster.js library and an angular directive that uses it. After remembering to include the name in my module’s dependencies, everything worked fine.
    • Figure out tooltips. As usual, stack overflow to the rescue. Now I need to build a lightweight directive that I can wrap in the <a href> element. Bonus points for seeing how to use the ui-jq directive that allows access to the (at least) jquery in the angular distro.
    • Set content in the divs and see if they can be brought to the front of the display. Tomorrow.

Progress for today.

  • Checked out the interaction on my touchscreen laptop and found that though the sliders are touch enabled, the mouse move events are not. It looks like I need to add ngTouch to the module. This would be easier if the laptop that I requested back in August would ever show up, but I kinda doubt if Novetta ever actually ordered it, even though they’ve been saying “it’ll be here in two weeks” for the last 5 months. Sigh.
  • Drag events work in FF but not Chrome. pinch-to-zoom needs to be trapped and used to handle the Z-axis.

Phil 12.11.14

8:00 – 2:30 SR

  • DB backups
  • Got an annotated set of screenshots for the FMP problem. Left on Dong’s desk.
  • Meeting with Agenia. Progress? There is confusion about what our landlord actually is.
  • Scatterplots
    • Got 3D transforms working. It’s important to have the root (origin) div have the perspective property set, and then the child (stage) div have the transform-style: preserve-3d set. As before, this intro to CSS 3D is most helpful.
    • The points for the pointcloud need to fit inside the dimensions (width/height) defined in the CSS for the rotations to work correctly