Monday, June 5, 2017

Scaling fonts by viewport with a minimum size

In a recent design we needed a giant button that would scale well from mobile to desktop.

By combining viewport width scaling and pixel scaling with a calculation you can make a font size scale, but never scale smaller than a minimum size.

<a href="#example" style="display: block; background-color: #5588aa; padding: 20px; color: #fff; text-align: center; font-size: 30px; font-size:calc(30px + 1.6vw);">Big Button Text</a>

Big Button Text

Both calc and viewport-units have wide support right now. Remember to set a fallback font-size for fringe browsers.

More information

Friday, June 2, 2017

Redirecting a list of paths in IIS to a new location

We often do redirects like the following to move all paths from one relative location to another.


If you need more fine grained control of what url goes where, you can use a redirect map. A redirect map allows one to define a key value pair of old locations to new locations.

Here's a simple example of a rewrite map.
  <rewritemap defaultValue="" name="Redirects">
      <add key="/full/relative/path/some-page" value="" />
      <add key="/full/relative/path/another-page" value="" />
      <add key="/full/relative/path/new-exciting-post" value="https://example/com/old/news" />

You can then define that map inside a web.config to be used to reroute traffic.

<!--  Web.Config Configuration File Example for a multiple page redirect map.
  Notice you must use full relative urls for the key values.  -->
    <rewritemaps configSource="rewritemaps.config"></rewriteMaps>
        <clear />
        <rule name="RemoveTrailingSlashRule1" stopProcessing="true">
        <match url="(.*)/$" />
          <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" />
          <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" />
        <action type="Redirect" url="{R:1}" />
        <rule name="Redirect rule1 for Redirects" stopProcessing="true">
          <match url="^files/?" negate="true" />
            <add input="{Redirects:{REQUEST_URI}}" pattern="(.+)" />
          <action type="Redirect" url="{C:1}" appendQueryString="False" redirectType="Permanent" />

This example is pretty straight-forward. There are three non-standard things in the example above.

Trailing Slashes
Because my system was moving over paths which resolved with both with and without the trailing slash in the url, I had to add an extra rule to remove trailing slashes, or else I would have needed rules for both some-page and some-page/.

Excluding Certain Paths from Redirections
In the example above I wanted to redirect everything except the content within the files/ directory. These files I found were being used by other applications and the best solution was to continue to serve these as an archive. This exclusion allowed all but those files to be redirected. If you wish to redirect all requests you could remove or modify the <match negate="true" url="^files/?"> line.

Global Catch All
There were lots of extra paths (like blog tag specific urls) that no longer resolved. By adding a defaultValue to the rewrite map I was able to grab all these exceptions and route them to the new homepage.

Pitfalls to Avoid
  • The way this rule condition is written it is testing for the full relative path, not the location of the web.config. Though the web.config may be located at /full/relative/path/web.config, you still need to have the full relative path in the rewritemap (there maybe sassier way to write the condition to avoid this).
  • The rewriteMap name ("Redirects" in this example) is reused in the condition input, if this does not match the rule will fail.
  • Browsers cache redirects and 301 redirects update search engines, so use incognito or private mode when testing and you might wait to add the redirectType="Permanent" to the action until you are sure you have everything all set.

Microsoft has some more good examples and documentation of rewrite maps at

Wednesday, July 22, 2015

Remove added file from git

git rm --cached filename.ext



alias lsn="ls -l | awk '{k=0;for(i=0;i<=8;i++)k+=((substr(\$1,i+2,1)~/[rwx]/)*2^(8-i));if(k)printf(\"%0o \",k);print}'"
to my .bashrc and now I can view unix file permissions as numbers via `lsn`:

$ lsn
total 17
644 -rw-r--r-- 1 brent Administ 21655 Apr 18 2014 default.php
755 drwxr-xr-x 17 brent Administ 0 Apr 18 2014 files
644 -rw-r--r-- 1 brent Administ 11082 Apr 18 2014 settings.php

Friday, February 25, 2011

My new favorite Greasemonkey Script

Block experts-exchange from all Google search results!

No Experts Exchange UserScript
Now thanks to the magic of Geasemonkey there's more Experts-Exchange cluttering your searches.

Since I use the HTTPS-Everywhere Firefox Add-on from the Electronic Frontier Foundation, I had to add a line to the script to also block Experts-Exchange on

Here's the full script with my edit:
// ==UserScript==
// @name           No Experts Exchange
// @namespace      JRice
// @description    We HATES them, Exchange, dirty Expertsses!
// @include*
// @include*
// ==/UserScript==

var count = 0;
list = document.getElementsByTagName('a');
for (i=0; i

Thursday, October 21, 2010

The best programming site on the net, now has a dedicated GIS section at  Not much else to say here.

Monday, September 20, 2010

Simple HTTP Redirect with Querystring in IIS7

HTTP Redirect seems simple enough. Always was in IIS6 and in IIS7 there's even a button labeled HTTP Redirect that promises relative redirects.  It looks like it'll be as easy Apache finally.  That is until you try to redirect a querystring.  Then everything bombs.

Turns out it still is relatively easy, except you have to know that Microsoft changed $S$Q to $V$Q. Why? $Ss and $Gs I suspect.

And How.
In our example we'll redirect all pages under to
  1. Pick the virtual directory you want to redirect. e.g.
  2. Click HTTP Redirect under IIS in the IIS management console.
  3. In the HTTP Redirect Dialog:

    • Check Redirect requests to this destination
    • Enter your new path ending with $V$Q.  e.g.$V$Q
    • Counter-intuitively check Redirect all request to exact destination (instead of relative destination)
    • Choose the appropriate Status Code (Permanent or Temporary)
  4. Apply Changes and Test