Category Archives: Development

Delete Icon

How to remove a property from a javascript object

Add this to the “I-can’t-believe-I-didn’t-know-this” bucket.

If you have a javascript object that looks like this:

var myObj = { propA : "aaaa", propB : "bbbbb" };

and you need to remove all reference to propA (not just make it null), you could use the following javascript:

delete myObj.propA

which will erase propA entirely from myObj, which would then look like:

{ propB : "bbbbb" }

 

Pass multiple arguments to console.log from another javascript function

One thing we learned from our last project is that console.log can generate a LOT of noise. This noise is OK from a development environment, but once we move into production, it doesn’t make sense to still be writing to the log… that is until something goes horribly wrong in production and we need it enabled again!

For the record, nothing went horribly wrong in production.

So I devised a small helper class that will show or hide console.log messages depending on how you initialize it. The tricky part is that console.log can take multiple parameters, so I had to use console.log.apply(console, arguments); to relay those parameters untouched.

// logging utility library
function Log(_logConsole) {
	var self = this;
	this.logConsole = true;
	this.log = function() {
		if (self.logConsole) {
			console.log.apply(console, arguments);
		}
	};
	this.init = function () {
		if (_logConsole !== undefined) {
			self.logConsole = _logConsole;
		}
	};
	self.init();
}

And invoke it with:

var jsLog = new Log(true); // write to console
jsLog.log('Loading data', data, this);

Best Practice on “Project Shylock”

Our first sprint began with what I’m going to be calling “Project Shylock” that we are making for *******.

I am leading a passionate team of 3 other UI/UX developers who are all trying to make to best possible website that time will allow. The emphasis is particularly on “time will allow“.

Our organization is now known to us to as a place that will not give us realistic time to complete a project. So at some point, time will run out and we will have to make a decision on whether best practice continues, or we deliver all our required functionality.

Time will tell.

Goals

Our team’s goal for this project is:

  • To deliver code that we will be proud of in two years time
  • To use technology that will help, make sense, not just to look good on a resume
  • To be able to handover completed code that will make sense to a future UI developer who may have to maintain it.

Technology and Methodology

  • Sass style sheets
    1. Sass is fucking cool.
    2. .scss format is backwards compatible with regular .css
    3. Allows us to create style module files
    4. Re-usable variables
    5. Can comment with // (seriously, this may be the best thing about Sass!)
  • NOT using Coffeescript
    1. Harder to handover to a fresh developer
    2. Feels backwards to use a language that turns into another language
  • Mocking data with Mockjax
    1. Mocking allows us to develop without having to wait for the backend Java developers (referred to as Backend or BE) to write a service to connect to
    2. Allows us to give an example to BE to demonstrate the desired data contract
    3. We can re-use the mock in a unit test
  • Object Oriented CSS
    1. All styles are defined by classes.
    2. No objects have their own style. They use a styles from a set of rules to display themselves
    3. Close-to-zero page specific css rules
    4. Style rules dictates page layout, not the other way around
  • Unit testing with QUnit
    1. Will initially be avoiding Test Driven Development, as this approach require heavy pre-planning of design, and our delivery structure doesn’t allow for that.
    2. We will be writing unit tests after our functionality is written
    3. Using Mockjax to simulate AJAX transactions
    4. Unit tests will be reviewed in Code Reviews
    5. We will use an automated test runner to execute our unit tests on a frequent schedule
  • Code Reviews
    1. Code reviews are the best way to improve code quality as well as to cross-train team members of other’s functionality
    2. The only two times a code review won’t be required is for a basic copy text change or when development was performed as part of Paired Programming
    3. Code reviews will include copy text and localization (l10n)
    4. Code reviews will include unit tests
  • Paired Programming
    1. There is no requirement for Paired Programming, but if a developer is unsure of the best way to do something or is having difficulty fixing a problem, then why not grab a buddy and work on it together! It’s fun! 🙂
    2. If you pair program something, then you don’t have to do an additional Code Review!
  • Localization (l10n)
    1. Currently the project users don’t need a second language supported, but it will be used in multiple countries and they cannot 100% rule out that it will ALWAYS be in one language (en-US)
    2. Adding l10n once the project is completed is a special punishment reserved for those who spit gum on the street, play techno in apartments at night, or mistreat animals. If there is a chance it will be needed, we will add it to our project from the ground floor.
    3. l10n libraries will be minimalist to invoke, have helper classes and try and avoid getting in the way of development
    4. Copy Text will be organized into property files based on culture, and internally will be grouped into namespaces
  • Javascript
    1. Using jQuery because it makes everything easy and predictable
    2. All code will be enclosed in function encapsulation
    3. Functions will be broken into logical modules
    4. Common modules will be included in each page with a JSP include, so that when we are ready to combine and gzip them, it will be in one place only
    5. Functions will be written with Injection Dependency in mind. Core functionality will take parameters for UI objects and data, so that they are easier to write unit tests for.
  • Responsive
    1. Using FooTable to handle responsive table layout
    2. Using Sass media directives to handle different viewport sizes
    3. Using a percentage-based grid layout to simplify structure and flow
  • Agile Scrum
    1. Everyone says they are doing Agile Scrum, but we really are.
    2. If it’s not in JIRA, being tracked in our current sprint, then it’s not getting done
    3. Do not maintain your own personal “secret list” of things you have to get done. If you keep that list, be willing to work on that list in your own time on the weekend.
    4. Be transparent, put everything substantial into JIRA as a task so we can see what we can fit into a sprint
    5. All tasks in the current sprint to have story points.
    6. Use story point poker cards or shirt sizes to estimate all projects. Have multiple short rounds of estimates and discussions if you cannot agree initially on points
  • Mustache.js HTML Templating
    1. Our last project we chose the simplicity of Underscore.js to do our templating which gives you ERB style embedding and allows you to embed literal javascript code. This unfortunately allows you to write very messy templates with logic embeded right in them
    2. Mustache allows only template defined control blocks which makes templates easier to read
    3. No-code templates promotes MVC architecture
  • MVC (Model-View-Controller) Application Design
    1. The UI layer is broken into 3 sections, Controllers, Models & Views
    2. Models – Our JSON objects that we receive from our AJAX calls
    3. Controllers – Our javascript classes are our controllers, making ajax calls to retrieve our models. Models that are “too raw” for UI consumption are massaged into more consumable shapes
    4. Views – Using Mustache.js templates, we render business-logic-less localized templates

There is almost certainly more stuff we have decided on, and as I remember them I will add them to this list. Additionally, I will try to report back on what decisions worked, and which ones didn’t. I just hope we have enough time to get it done right.

Admin skull folder

Change your WordPress SuperAdmin User Name for WordPress Multisite

If you are using a Bitnami WordPress (multisite) stack like I am, then your /wp-admin/ login is going to be pre-set to “user”, which:

  • sucks as a name
  • make your login 50% easier to hack
  • can’t be changed in the web UI

If you wanted to login as a custom-named SuperAdmin, you could either

  1. make a new user and make them also a SuperAdmin when setting their role, OR
  2. rename “user” to your desired login

I chose going with route #2 because leaving a SuperAdmin with the login of “user” still leaves a security weakness.

Changing “user” login to “anotheruser” (for example)

admin-user

  1. Connect to your MySQL WordPress Database
  2. In phpMyAdmin, select your wordpress database (mine is named “bitnami_wordpress”)
  3. Navigate to your wp_users table.
    • There will be one row per user.
    • Edit the user_login column for “user” and change it to “anotheruser”
    • Save

Now, this would be ordinarily be enough to just rename your login, but you will lose your SuperAdmin access to your Network Admin if you don’t make one more change.

Making “anotheruser” SuperAdmin to be able to access Network Admin

admin-meta

    1. Count the number of characters in your new login name (eg “anotheruser” has 11 characters)
    2. Navigate to your wp_sitemeta table
    3. Edit the row with a meta-key of “site_admins” and change the meta_value from
      • “a:1:{i:0;s:4:”user“;}” to
      • “a:1:{i:0;s:11:”anotheruser“;}”
      • (the name part is quite obvious, but you also have to manually specify how many characters long the name is)
    4. For me, this change was applied automatically and instantly, but it couldn’t hurt to reboot your server and logout and log in again.
Font scaling

PX vs EM? Neither!!! Heard of REM?

I’m starting a new project at my client and we have really been given almost complete free reign over what technology and styles we want to use. it’s lovely.

The one consequence of it however is that you have to make all the decisions on what tools and styles you are going to use… and if you choose poorly you can only blame yourself.

Scouring the web for the latest and greatest on best practices, I came along this CSS genius which talks about the most obscure metric you-never-heard-of. rem.

The problem with PX is that pixels don’t resize well on old browsers and containers don’t grow well.

The problem with EM as a CSS measurement is that if you have a child item with EM with an EM on the parent, the child will either shrink or grow as you nest more deeply. There are simple hacks for it, but I’ve never been happy with them.

What is nice about REM is that it works just like EM, but the scaled size doesn’t reapply as your child items nest further down.. they use the root element’s (usually html) size as a baseline and scale off that. Everyone wins!

Here is a cool hack/example:

html { font-size: 62.5%; }
body { font-size: 1.4rem; } /* =14px */
h1 { font-size: 2.4rem; } /* =24px */

Read this amazing article for more info over at snook.ca

NOTE: You can also do some cool font vertical rhythm tricks if you’re using Sass, but that is for another post, another day.