<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>blog.base2.io</title>
    <link href="http://blog.base2.io/atom.xml" rel="self"/>
    <link href="http://blog.base2.io/"/>
    <updated>2016-05-09T17:12:34-04:00</updated>
    <id>http://blog.base2.io/</id>
    <author>
        <name>Base Two Interactive</name>
        <email>info@base2.io</email>
    </author>
    
    <entry>
        <title>Getting Started with JSCS and WebStorm</title>
        <link href="http://blog.base2.io/2015/12/30/jscs-intellij-setup/"/>
        <updated>2015-12-30T00:00:00-05:00</updated>
        <id>http://blog.base2.io/2015/12/30/jscs-intellij-setup</id>
        <content type="html">&lt;p&gt;&lt;a href=&quot;http://jscs.info/&quot;&gt;JSCS&lt;/a&gt; is my new favorite javascript tool. It helps keep all the javascript files looking the way I want it (and my team wants it). You can read more details about it at their site, but for the purposes of this blog post I&#39;m going to show you how to get it setup with &lt;a href=&quot;https://www.jetbrains.com/webstorm/&quot;&gt;WebStorm&lt;/a&gt; or other &lt;a href=&quot;https://www.jetbrains.com/&quot;&gt;JetBrains&lt;/a&gt; IDEs.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;Installing/Setup JSCS&lt;/h3&gt;

&lt;p&gt;First we need to install JSCS using &lt;a href=&quot;https://nodejs.org/en/&quot;&gt;nodejs&lt;/a&gt;.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;npm install -g jscs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Then we add a jscs config file (.jscsrc) to your project root directory. This is just a .json file. There are many settings you can set in this config file, but there are some convenient &lt;a href=&quot;http://jscs.info/overview#presets&quot;&gt;presets&lt;/a&gt; for you to use. To keep things simple we&#39;re just going to use the &lt;a href=&quot;https://github.com/jscs-dev/node-jscs/blob/master/presets/airbnb.json&quot;&gt;AirBnB preset&lt;/a&gt;. Add this to your .jscsrc file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;{
  &quot;preset&quot;: &quot;airbnb&quot;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;From here you can setup your build to run your code against these settings. We use &lt;a href=&quot;http://gulpjs.com/&quot;&gt;gulp&lt;/a&gt; so I&#39;ll just show a quick example on how to set that up.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;var gulp = require(&#39;gulp&#39;);
var jscs = require(&#39;gulp-jscs&#39;);

gulp.task(&#39;lint&#39;, function() {
 return gulp.src(&#39;src/**/*.js&#39;)
   .pipe(jscs())
   .pipe(jscs.reporter());
});
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Running &lt;code&gt;gulp lint&lt;/code&gt; will run jscs and show you if there are any issues.&lt;/p&gt;

&lt;h3&gt;WebStorm Settings&lt;/h3&gt;

&lt;p&gt;Now here&#39;s the main part of the post... Get WebStorm setup to format and lint your code based on the jscs config settings. Most of these steps can be done in JetBrain&#39;s other IDEs. For example, my screenshots are from IntelliJ, but I&#39;ll refer to it as WebStorm for the purposes of this post.&lt;/p&gt;

&lt;p&gt;First let&#39;s setup WebStorm&#39;s javascript JSCS settings so it&#39;ll show us the errors in the editor. Open Settings and go to &lt;strong&gt;Languages &amp;amp; Frameworks &gt; Javascript &gt; Code Quality Tools &gt; JSCS&lt;/strong&gt;. Then you&#39;ll want to enable the checkbox and set the node interpreter and jscs package location. By default JSCS will look for the default config file in the root of your project. You can leave this selected but optionally if you need to select a config file in another location you can do so by selecting the second option. The Code style preset can be set from this window, but we&#39;ve basically already done that by creating our .jscsrc file and setting the preset as airbnb there.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/k4t5I9M.png&quot; alt=&quot;JSCS Settings&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This should start working once you hit ok and you&#39;ll see any format/style issues with your projects javascript files. You can manually clean them up, but I prefer to make my IDE do the work for me. I found a neat way to import your jscs config into WebStorm&#39;s code style settings. Lets set that up now.&lt;/p&gt;

&lt;p&gt;Open &lt;strong&gt;Settings&lt;/strong&gt; and go to &lt;strong&gt;Editor &gt; Code Style &gt; Javascript&lt;/strong&gt;. Then select the &lt;strong&gt;Manage...&lt;/strong&gt; button.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/paw2sxV.png&quot; alt=&quot;Javascript Code Style Settings&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will open another window, select &lt;strong&gt;Import&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/ttmSNi7.png&quot; alt=&quot;Code Style Schemes&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This opens yet another window, select &lt;strong&gt;JSCS config file&lt;/strong&gt; and click &lt;strong&gt;OK&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/GVM7N2m.png&quot; alt=&quot;Scheme Import From&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This will open a &lt;strong&gt;Select Path&lt;/strong&gt; dialog window. Just find your project&#39;s root directory and select the .jscsrc file located in the root. Then click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/LmacVz7.png&quot; alt=&quot;Select Path&quot; /&gt;&lt;/p&gt;

&lt;p&gt;You can select to update the scheme you had selected, or create a new scheme. We&#39;ll create a new scheme called JSCS. Optionally you could also select a Code Style Preset from this window as well. Last click &lt;strong&gt;OK&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/gFJWKTW.png&quot; alt=&quot;Import from JSCS config&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now you can close the &lt;strong&gt;Code Style Schemes&lt;/strong&gt; dialog. Your javascript code style settings will be as close as possible to your settings in the .jscs config file. Now for the really cool part, the IDE will try to format your javascript based on these setting as you code. You can also take a whole file or section and run &lt;strong&gt;Reformat Code&lt;/strong&gt; (my shortcut is &lt;kbd&gt;opt&lt;/kbd&gt; + &lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;L&lt;/kbd&gt;) and it will try to clean up that code based on these settings. This is great and will help format your code, but there are some JSCS things this will not fix.&lt;/p&gt;

&lt;p&gt;JSCS has the ability to fix a lot of those issues though and you can run the command line&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;jscs /my/project/root --fix
jscs myfilename.js --fix
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Or WebStorm has an option to fix JSCS issues in line via context menu on the problem area. Here&#39;s a visual example of what that looks like:&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/cOABQHg.png&quot; alt=&quot;Fix JSCS context menu&quot; /&gt;&lt;/p&gt;

&lt;p&gt;This is a little tricky to get this to popup, but if you click on the red squiggly and look for the red light bulb, you have an option to &quot;Fix the current file with JSCS&quot;. This basically does the command line example above, but its a nice in editor feature. After doing this to a few files I was was cleaning up it felt tricky and cumbersome to keep doing it this way and I thought to myself &quot;There must be a shortcut to make this happen?&quot; And so I found one, but you have to manually set it.&lt;/p&gt;

&lt;h3&gt;Add JSCS Shortcut&lt;/h3&gt;

&lt;p&gt;Open Settings and select Keymap. Search for JSCS. Then select the Fix JSCS Problems and push the edit (green pencil) button. I set mine to &lt;kbd&gt;opt&lt;/kbd&gt; + &lt;kbd&gt;cmd&lt;/kbd&gt; + &lt;kbd&gt;S&lt;/kbd&gt; which was unused, but feel free to set it to something else that makes sense to you and/or your team.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/DvfLmsi.png&quot; alt=&quot;Keymap JSCS Fix shortcut&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Now whenever you see JSCS errors just use the shortcut key and it&#39;ll clean those babies right up!&lt;/p&gt;

&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>June is for Shortcuts</title>
        <link href="http://blog.base2.io/2015/06/01/shortcut-month/"/>
        <updated>2015-06-01T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2015/06/01/shortcut-month</id>
        <content type="html">&lt;p&gt;Keyboard shortcuts are a great way to improve your overall efficiency with your computer, but they can be difficult to commit to memory all at once. This month we will suggest a new shortcut each day that we find helpful in our day-to-day lives as front-end web developers. By learning a new shortcut each day you will be well on your way to living a mouse-free life.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;Preface&lt;/h3&gt;

&lt;p&gt;I do much of my day-to-day work on a Windows 7 machine using WebStorm, Visual Studio 2013, and Google Docs. As such, this list of keyboard shortcuts may not be as helpful to users of different platforms and software, though there are generally similar shortcuts available on those systems.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;1&quot;&gt;&lt;/a&gt; 6/1 Move windows in Windows&lt;/h4&gt;

&lt;p&gt;I find the ability to manipulate the position of windows via the keyboard in Windows 7 as one of the greatest features the OS offers - yet many users somehow overlook this simple set of shortcuts. By holding the Windows key and using your keyboard arrow keys you&#39;ll no longer need your mouse to move the active window.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;left-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Split left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;right-arrow&lt;/kbd&gt;&lt;/td&gt;
&lt;td&gt; Split right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;up-arrow&lt;/kbd&gt;   &lt;/td&gt;
&lt;td&gt; Maximize&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;down-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Minimize&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Also, if you have multiple monitors, you can move the window from monitor to monitor by continuing to click the left or right arrow key while holding down the Windows key.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;2&quot;&gt;&lt;/a&gt; 6/2: Move that cursor&lt;/h4&gt;

&lt;p&gt;Until you learn these simple cursor management shortcuts you likely won&#39;t realize how much time you&#39;ve wasted using your mouse to move the cursor and select words in word documents. Once these are committed to muscle memory you&#39;ll be able to type and edit documents like a pro.&lt;/p&gt;

&lt;p&gt;You likely already know that the arrow keys can be used to move the cursor, and you may know that holding the shift key while arrowing allows you to select a character at a time. From there you simply need to remember that the &lt;kbd&gt;ctrl&lt;/kbd&gt; key can be used as a modifier to do things in larger chunks.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Left Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;left-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;left-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor left to the beginning of the word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;home&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor left to the beginning of the line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;home&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor to the beginning of the document (super-duper left)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + key combo &lt;/td&gt;
&lt;td&gt; select text between cursor start and end point&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Right Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;right-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;right-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor right to the end of the word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;end&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor right to the end of the line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;end&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor to the end of the document (super-duper right)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + key combo &lt;/td&gt;
&lt;td&gt; select text between cursor start and end point&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;h4&gt;&lt;a name=&quot;3&quot;&gt;&lt;/a&gt; 6/3: Google Docs - Shortcut for everything&lt;/h4&gt;

&lt;p&gt;Have you ever been working in a Google Doc and wanted to add a numeric list (&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;7&lt;/kbd&gt;), a bulleted list (&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;8&lt;/kbd&gt;), or perhaps center the text (&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;E&lt;/kbd&gt;)? You likely reached for your mouse and visually scanned the format bar for these features because it&#39;s too difficult to remember the individual shortcuts (or there isn&#39;t a shortcut at all as in the case of changing the font). Well, you&#39;re in luck. There&#39;s a single magical shortcut that does it all.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;/&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; search the menu within Google Docs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;This simple key combination allows you to search the menu options. So, if you want to change the font to &quot;Courier New&quot; you can hit &lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;/&lt;/kbd&gt;, type &quot;cour&quot;, and hit enter.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/myyRI6w.png&quot; alt=&quot;Google Docs search menu&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Generally the individual shortcut for each feature is still faster, but a shortcut that you can remember is better than one you cannot. Plus, when you use the &lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;/&lt;/kbd&gt; key combination it will show you the shortcut combination to the right of the option before you apply it - so you have a way to learn the more granular ones over time. If you&#39;d like to learn all of the shortcut keys available in Google Docs there&#39;s a shortcut for that too: &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;/&lt;/kbd&gt;.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;4&quot;&gt;&lt;/a&gt; 6/4: Super pasting powers&lt;/h4&gt;

&lt;p&gt;Often times adding &lt;kbd&gt;shift&lt;/kbd&gt; to a keyboard shortcut changes or enhances the shortcut. Most people know that &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; will paste whatever was copied to the clipboard, but many applications offer an enhanced paste with &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt;.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Paste without formatting (Google Docs / Microsoft Word), Select from clipboard (Web Storm, Visual Studio)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;In Google Docs and Microsoft Word using &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; acts as &quot;paste special&quot;. This allows you to paste the clipboard contents in the document&#39;s format rather than the originally copied format. For example, if you copy bold Comic Sans text from a web page, and then paste into your Arial Google Doc with &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt;, it will paste in bold Comic Sans (which you clearly don&#39;t want because you&#39;re not a monster); however, if you were to paste with &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; it will paste the text content from the website in the matching Arial font style and size.&lt;/p&gt;

&lt;p&gt;In IDEs, such as Web Storm and Visual Studio, &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; allows you to paste previously copied text. In Web Storm &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; will provide a window to select which of the previously copied texts to paste.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/9a65jrl.png&quot; alt=&quot;WebStorm paste special&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Visual Studio will progressively paste the next most recently copied item with each &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; click (while holding &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt;). In both applications &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; will paste the most recently copied text.&lt;/p&gt;

&lt;p&gt;Copy this post (&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt;) and give it a try!&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;5&quot;&gt;&lt;/a&gt; 6/5: Lock it down&lt;/h4&gt;

&lt;p&gt;Before heading out of the office for lunch (or just going to the bathroom) you should probably lock your computer. Rather than reaching for your mouse and meandering over to the start button, learn this simple shortcut.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;l&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Lock screen (in Windows)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;l&lt;/kbd&gt; (l for lock) will immediately lock your Windows screen.&lt;/p&gt;

&lt;p&gt;Now you can go to the bathroom with the peace of mind that nobody will replace you &lt;a href=&quot;http://www.wikihow.com/Pull-a-Computer-Prank-on-Your-Friends&quot; target=&quot;_blank&quot;&gt;desktop background&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;6&quot;&gt;&lt;/a&gt; 6/6: Show me the Desktop&lt;/h4&gt;

&lt;p&gt;It&#39;s the weekend and you want to see that pretty desktop image of yours rather than all of the work-related applications and windows. Windows 7 has the nifty little feature that allows you to minimize everything and go straight to your desktop by clicking on the very bottom right of the screen, but that approach is for mouse-lovers, who we are not.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Show desktop (and minimize all windows) in Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; (d for desktop) will take you straight to your desktop without ever glancing at your mouse. If you want to bring all of your applications back up simply hit &lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; again.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;7&quot;&gt;&lt;/a&gt; 6/7: One-handed Browser Tab Management&lt;/h4&gt;

&lt;p&gt;At times you may find yourself browsing the web and you think of something different that you want to search for. Many people may click the &quot;add tab&quot; button toward the top of the browser, but that would require touching the mouse and moving it several millimeters up. With just your left hand you can quickly open a new tab and start typing your search.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;t&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Create new tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;w&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Close tab or application (Browsers, Windows Explorer, and many other applications)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;t&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Re-open closed tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;tab&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Switch to next tab to the right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;tab&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Switch to next tab to the left&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;t&lt;/kbd&gt; will open a new tab in most browsers, and will place the focus in the address bar so that you can immediately begin typing your search (at least in Chrome, which is the browser you should be using). When you&#39;re done with the tab you can close it with &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;w&lt;/kbd&gt; (w for close?).&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;tab&lt;/kbd&gt; will allow you to quickly switch to the tab to the right. Adding shift to the close or move right shortcuts will reverse their behavior thereby re-opening the closed tab or moving to the tab on the left (oh the magic of the shift key).&lt;/p&gt;

&lt;p&gt;Now you&#39;re able to create, switch, and remove browser tabs all with just your left hand, which frees your right hand to throw your mouse across the room.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;8&quot;&gt;&lt;/a&gt; 6/8: Spreadsheet Column/Row Selection&lt;/h4&gt;

&lt;p&gt;It&#39;s Monday and you&#39;re back to work. If you find yourself modifying spreadsheets for even a portion of the day then it&#39;s worthwhile learning some common shortcuts. Today we&#39;ll go over how to select columns and rows without using the mouse.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/x3gocRv.png&quot; alt=&quot;Select column&quot; /&gt;&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;space&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Select column (Google Spreadsheet, Microsoft Excel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;space&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Select row (Google Spreadsheet, Microsoft Excel)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;In both Google Spreadsheets and Microsoft Excel you can use &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;space&lt;/kbd&gt; to select the column of the active cell (&lt;kbd&gt;ctrl&lt;/kbd&gt; for &lt;strong&gt;C&lt;/strong&gt;olumn). This is helpful when you want to clear the contents of the column (by clicking &lt;kbd&gt;delete&lt;/kbd&gt;), draw your attention to the column, or act on the column in some other way (we&#39;ll go over column insertion and removal in a future post). You can then use &lt;kbd&gt;shift&lt;/kbd&gt; and arrow keys to select more columns.&lt;/p&gt;

&lt;p&gt;If rows are more your thing then you can use &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;space&lt;/kbd&gt; to select a row (&lt;kbd&gt;shift&lt;/kbd&gt; for &quot;&lt;strong&gt;S&lt;/strong&gt;ooo not a column&quot;).&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;9&quot;&gt;&lt;/a&gt; 6/9: Spreadsheet Column/Row Insert and Delete&lt;/h4&gt;

&lt;p&gt;With yesterday&#39;s shortcut you now know how to select a column or row in a spreadsheet. Now it&#39;s time to learn how to do two of the most popular spreadsheet actions: insertion and deletion.&lt;/p&gt;

&lt;p&gt;Sadly this is an area where Microsoft Excel and Google Spreadsheet shortcuts differ. We&#39;ll go over Excel shortcuts first.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Excel Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;+&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add column(s) or row(s) above or to the left of the selected column(s) or row(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;-&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Remove selected column(s) or row(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;In Excel you first must select the column(s) or row(s) that you wish to act on. Then you can use &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;+&lt;/kbd&gt; to add columns or rows or &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;-&lt;/kbd&gt; to remove columns or rows. When adding columns or rows it inserts the same number of columns or rows that you have selected either left of the selected columns or above the selected rows.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Google Spreadsheet Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;i&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add column(s) to the left of the selected column(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;i&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add row(s) above the selected row(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;e&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Remove selected column(s) or row(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Since the column and row shortcuts found in Excel are already browser shortcuts used to zoom in and out (note: if you accidentally zoomed in or out you can use &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;0&lt;/kbd&gt; to return to 100%), Google had to come up with different, less obvious, shortcuts. It is not necessary to select the column or row before using the insertion shortcuts, but by selecting more than one column or row the insertion action will insert the number that is selected.&lt;/p&gt;

&lt;p&gt;The insertion shortcuts are &lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;i&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt; for &quot;&lt;strong&gt;I&lt;/strong&gt;nsert &lt;strong&gt;C&lt;/strong&gt;olumn&quot; and &lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;i&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; for &quot;&lt;strong&gt;I&lt;/strong&gt;nsert &lt;strong&gt;R&lt;/strong&gt;ow&quot;. Column and row deletion is &lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;e&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; for &quot;&lt;strong&gt;E&lt;/strong&gt;dit &lt;strong&gt;D&lt;/strong&gt;elete&quot;.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;10&quot;&gt;&lt;/a&gt; 6/10: Jump to the Address Bar&lt;/h4&gt;

&lt;p&gt;All too often users shift their mouse to the top of the screen simply to place their cursor in the browser address bar. Cut that bad habit with this simple shortcut.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/wC5hjP9.png&quot; alt=&quot;Browser address bar&quot; /&gt;&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Place cursor in address bar (all browsers and Windows Explorer)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;When in a browser or Windows folder (Windows Explorer) pressing &lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; will place focus in the address bar, and highlight the contents of the address bar so that you can immediately begin typing. This is also helpful when you want to copy the address of the page you are on via &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pro tip:&lt;/strong&gt; Add a &lt;kbd&gt;?&lt;/kbd&gt; at the beginning of you address bar to force a Google search rather than it potentially being treated as a url as is the case when you search for &quot;asp.net&quot;.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;11&quot;&gt;&lt;/a&gt; 6/11: Switch Active Windows&lt;/h4&gt;

&lt;p&gt;This one is an oldie and a goodie. Many people already know and use this shortcut without even thinking about it, but for anybody who doesn&#39;t already know how to switch between applications this shortcut is a life changer.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;tab&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Switch between open applications and windows&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;If you have multiple applications open you can switch between them with &lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;tab&lt;/kbd&gt; rather than clicking on the taskbar icons with your mouse. Using this keyboard combination will switch you to the most recently used application. If you press the combination again it will switch you back. If you press &lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;tab&lt;/kbd&gt; but keep holding down the &lt;kbd&gt;alt&lt;/kbd&gt; key you will see a list of the applications to switch between, and while holding &lt;kbd&gt;alt&lt;/kbd&gt; it will switch the selected application for each press of the &lt;kbd&gt;tab&lt;/kbd&gt; key.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;12&quot;&gt;&lt;/a&gt; 6/12: Back and Forward Navigation&lt;/h4&gt;

&lt;p&gt;When browsing the web you will inevitably need to navigate backward - whether it&#39;s to get back to your search results or to return to an embarrassingly &lt;a href=&quot;http://api.ning.com/files/OQbVc*b-KB9N8WhlPa*p43ZhR5D2*6BzUXEABZ-BvbE*si9pe31-k6QHTC6RP0wiV1YKvbHXTJCadfhxHgVI9CDC4JZ*vNiK/cutedog1920x1200.jpg&quot; target=&quot;_blank&quot;&gt;cute picture&lt;/a&gt; that you stumbled upon. You&#39;re in luck - there&#39;s a shortcut for that.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/VMZT1KD.png&quot; alt=&quot;Browser navigation&quot; /&gt;&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;left-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Navigate back in browsers and Windows Explorer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;right-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Navigate forward in browsers and Windows Explorer&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Using &lt;kbd&gt;alt&lt;/kbd&gt; and you&#39;re left and right arrow keys you can navigate your browser history like a pro. This also works with Windows Explorer so you can quickly open folders and navigate back all day. Note that &lt;kbd&gt;backspace&lt;/kbd&gt; and &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;backspace&lt;/kbd&gt; will also navigate backward / forward assuming you&#39;re focus isn&#39;t in an input field, but the &lt;kbd&gt;alt&lt;/kbd&gt; key approach is convenient because it always works.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;13&quot;&gt;&lt;/a&gt; 6/13: Facebook Stream Navigation&lt;/h4&gt;

&lt;p&gt;I&#39;m sure you don&#39;t use Facebook at work, but now that it&#39;s the weekend it&#39;s fair game. There&#39;s a better way to scroll through your stream than using the mouse or arrow keys.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;j&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Scroll to next post (Facebook, Google+, various other sites)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;k&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Scroll to previous post (Facebook, Google+, various other sites)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Using the &lt;kbd&gt;j&lt;/kbd&gt; key you can scroll down your social stream while sipping on your weekend &lt;a href=&quot;https://eytanuliel.files.wordpress.com/2013/05/giant-margarita.jpg&quot; target=&quot;_blank&quot;&gt;margarita&lt;/a&gt;. If you skipped past something interesting click &lt;kbd&gt;k&lt;/kbd&gt;. Be careful that you don&#39;t have focus in an input field otherwise you&#39;re going to have a pretty funny status update (jjjjjkjkjjk).&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;14&quot;&gt;&lt;/a&gt; 6/14: Browser Refresh&lt;/h4&gt;

&lt;p&gt;Web developers refresh their browser approximately 1337 times a day, but even the average user occasionally needs to refresh.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Refresh the browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Refresh the browser ignoring cache (Chrome, Firefox)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; will refresh the browser as if you clicked the browser refresh button. Chrome and Firefox also provide &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt;, which will reload the page and all of the assets rather than relying on cached data. This comes in handy when you&#39;re a web developer troubleshooting a problem.&lt;/p&gt;

&lt;p&gt;Note that &lt;kbd&gt;F5&lt;/kbd&gt; and &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;F5&lt;/kbd&gt; perform the same refresh and refresh ignoring cache actions, but they&#39;re a bit more of a finger stretch.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;15&quot;&gt;&lt;/a&gt; 6/15: Folder and File Browsing&lt;/h4&gt;

&lt;p&gt;The most common (and slowest) way to browse folders and files is to double click on My Computer, and then begin clicking and scrolling folders. Using a few keyboard shortcuts will get you where you want to be in a snap.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;e&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens Windows Explorer (the equivalent of double clicking &quot;My Computer&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens the Run window&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;If you like starting at &quot;My Computer&quot; (labeled as just &quot;Computer&quot; in Windows 7) then &lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;e&lt;/kbd&gt; is your new best friend. It opens the Computer directory up immediately so that you can begin to navigate the folders.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/johmmCX.png&quot; alt=&quot;My computer&quot; /&gt;&lt;/p&gt;

&lt;p&gt;Folders can be navigated quickly by arrowing down/up to the folder you wish to open and then clicking &lt;kbd&gt;enter&lt;/kbd&gt;. If you&#39;re staring at a long list of folders then you can jump quickly to the folder you want by beginning to type the name of the folder. If you&#39;ve opened a folder by accident you can use the &lt;a href=&quot;#12&quot;&gt;navigate back shortcut&lt;/a&gt; that we learned previously (&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;left-arrow&lt;/kbd&gt;). When you&#39;re done navigating you can close the folder with &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;w&lt;/kbd&gt; as we learned in &lt;a href=&quot;#7&quot;&gt;One-handed Browser Tab Management&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you prefer to start at a different folder than Computer you can use the run command &lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; and then type the folder you want to jump to (such as c:/windows), and the click &lt;kbd&gt;enter&lt;/kbd&gt;.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;16&quot;&gt;&lt;/a&gt; 6/16: Rename Folder or File&lt;/h4&gt;

&lt;p&gt;Yesterday you learned how to navigate folders and files without a mouse, but if you wanted to rename one of those folders or files you would still need to right click with your mouse. No more! Today we learn the simple shortcut that allows for renaming.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F2&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Rename file in Windows Explorer, edit cell in Microsoft Excel&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Yes, the function keys in the great north of your keyboard do have a purpose. When browsing files and folders clicking &lt;kbd&gt;F2&lt;/kbd&gt; will put the selected folder or file in rename mode with the full name already selected. Therefore if you want to fully rename the folder or file you can just start typing. If, instead, you only wanted to modify the name then after hitting &lt;kbd&gt;F2&lt;/kbd&gt; hit &lt;kbd&gt;arrow-right&lt;/kbd&gt; to remove the highlight.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;17&quot;&gt;&lt;/a&gt; 6/17: New Browser Window&lt;/h4&gt;

&lt;p&gt;Occasionally you want a new browser window rather than a new tab - especially if you plan to split screen or you are using multiple monitors. Before you drag that new tab out of the window learn this shortcut.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Open new window (Browsers, Windows Explorer, varios applications)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Open new icognito window (Chrome)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Use &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; to open a new window (&lt;strong&gt;n&lt;/strong&gt; for &lt;strong&gt;N&lt;/strong&gt;ew window). This shortcut works similarly in various other applications. For instance, &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; will create a new document in Word and a new tab in &lt;a href=&quot;http://www.sublimetext.com/&quot; target=&quot;_blank&quot;&gt;Sublime Text&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/AI7u4Ek.png&quot; alt=&quot;Chrome incognito&quot; /&gt;&lt;/p&gt;

&lt;p&gt;If you&#39;re feeling a little sneakier you open a new Icognito window in Chrome via &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt;. Icognito mode allows your to browse without storing history, cookies, etc. This is helpful if you&#39;re doing web development or if you&#39;re buying your significant other a surprise gift.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;18&quot;&gt;&lt;/a&gt; 6/18: Find What You&#39;re Looking For&lt;/h4&gt;

&lt;p&gt;When you&#39;re looking for a specific term on a web page or document the application&#39;s search functionality can be a savior, but ironically the search functionality can be difficult to find. Stop searching for the search so that you can begin searching with these shortcuts.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/gTzjt7w.png&quot; alt=&quot;My computer&quot; /&gt;&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;f&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens find in most applications and Windows Explorer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F3&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Find next in most applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;F3&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Find previous in most applications&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Next time there is a term you want to search for simply press &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;f&lt;/kbd&gt; to be placed in the application&#39;s search form. You can then generally begin typing your search (you may need to hit enter to submit it). If there are multiple results you can go to the next result with &lt;kbd&gt;F3&lt;/kbd&gt;, and if you accidentally pass what you were looking for you can search backward with &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;F3&lt;/kbd&gt;.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;19&quot;&gt;&lt;/a&gt; 6/19: Start with the Win Key&lt;/h4&gt;

&lt;p&gt;The Windows 7 Start menu is fairly useful, but most people don&#39;t know the shortcuts to take full advantage of it.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens the start menu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; and then &lt;kbd&gt;up-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Move selection up to &quot;All Programs&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; and then &lt;kbd&gt;down-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Move selection to the top item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; and then &lt;kbd&gt;tab&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Move selection to next section (right column, shutdown, left column)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; and then type &lt;/td&gt;
&lt;td&gt; Search applications and files&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Pressing the &lt;kbd&gt;win&lt;/kbd&gt; key will open the Start menu. From there you can immediately start typing to search for and open applications. For instance, if you want to open Google Chrome you can generally hit &lt;kbd&gt;win&lt;/kbd&gt;, type &quot;ch&quot;, and hit &lt;kbd&gt;enter&lt;/kbd&gt; (you may need to type more than just &quot;ch&quot; depending on your installed applications and how recently you&#39;ve opened Chrome in this manner).&lt;/p&gt;

&lt;p&gt;Once the Start menu is open you can also use the arrow keys, &lt;kbd&gt;tab&lt;/kbd&gt;, and &lt;kbd&gt;enter&lt;/kbd&gt; to navigate. The arrow keys will move up and down the current column, &lt;kbd&gt;tab&lt;/kbd&gt; will move you between the sections (right column, shutdown, left column), and &lt;kbd&gt;enter&lt;/kbd&gt; will open the currently selected item.&lt;/p&gt;

&lt;p&gt;So hit &lt;kbd&gt;win&lt;/kbd&gt; and give it a try!&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;20&quot;&gt;&lt;/a&gt; 6/20: Create New Folder and More&lt;/h4&gt;

&lt;p&gt;If you organizing a lot of files, such as vacation images, you may find the need to create one or more folders. Use this simple shortcut that you&#39;ve already seen before instead of using the mouse&#39;s right-click context menu.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Create new folder (Windows Explorer)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Like many shortcuts, &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; acts differently depending on where it is used. We learned in the &lt;a href=&quot;#17&quot;&gt;New Browser Window&lt;/a&gt; post that it opens a new Incognito window in Google Chrome. When used in Windows Explorer, &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; creates a new folder with the name highlighted so that you can immediately begin typing to rename the folder. With this shortcut you can quickly create multiple folders without ever lifting your hands off of the keyboard.&lt;/p&gt;

&lt;p&gt;Also remember that many other shortcuts that you likely are familiar with work within Windows Explorer.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;a&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Select all file(s) and folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Copy selected file(s) and folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;x&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Cut selected file(s) and folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Paste copied or cut file(s) and folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;z&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Undo (delete, paste, rename, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;delete&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Delete selected file(s) or folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;h4&gt;&lt;a name=&quot;21&quot;&gt;&lt;/a&gt; 6/21: Undo / Redo&lt;/h4&gt;

&lt;p&gt;Today is Father&#39;s Day so we&#39;ll keep this one short and sweet. We&#39;re all prone to make mistakes (especially fathers suffering from sleep deprivation). That&#39;s why it&#39;s worth mastering the art of undo and redo.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;z&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Undo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;z&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Redo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;y&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Redo (additional shortcut option)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;If you make a mistake in a word document, browser field, Windows Explorer, or almost any other application &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;z&lt;/kbd&gt; will reverse the mistake. Think &lt;strong&gt;Z&lt;/strong&gt; for &lt;a href=&quot;http://s.emuparadise.org/fup/up/95763-Zorro_(1995)_(1995)(Capstone_Software)-1.jpg&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;Z&lt;/strong&gt;orro&lt;/a&gt; cutting through your mistake. Most applications keep a list of changes so that you can undo multiple times.&lt;/p&gt;

&lt;p&gt;If after an undo you realize that the change was valid and you want to undo the undo (aka redo) use the power of the &lt;kbd&gt;shift&lt;/kbd&gt; key to reverse the shortcut (&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;z&lt;/kbd&gt;).&lt;/p&gt;

&lt;p&gt;You can also access the redo functionality with &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;y&lt;/kbd&gt; as in wh&lt;strong&gt;Y&lt;/strong&gt; does this shortcut exist?&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;22&quot;&gt;&lt;/a&gt; 6/22: Print Screen and Window Capture&lt;/h4&gt;

&lt;p&gt;Occasionally you want to take a screenshot so that you can share what you&#39;re looking at with another person, but is there a shortcut for that?&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;print screen&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Capture full screen onto clipboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;print screen&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Capture selected window onto clipboard&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Pressing &lt;kbd&gt;print screen&lt;/kbd&gt; will seem like it didn&#39;t do anything, but it tells Windows to take a screenshot of the full screen and add it to your clipboard. Once added to your clipboard you can use &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; to paste it into an email, word document, or any other application that supports images. Just want to capture the current window rather than the full screen? Add &lt;kbd&gt;alt&lt;/kbd&gt; to the mix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tip:&lt;/strong&gt; If you&#39;d like to capture something smaller than the active window you can use Windows 7&#39;s &quot;Snipping Tool&quot;. Open it using the Start Menu shortcuts you learned in &lt;a href=&quot;#19&quot;&gt;Start with the Win Key&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;23&quot;&gt;&lt;/a&gt; 6/23: Gmail Shortcuts&lt;/h4&gt;

&lt;p&gt;Gmail has a wealth of shortcuts, but you have to opt-in to use them. We&#39;ll review some of the most useful shortcuts to coax you into opting-in.&lt;/p&gt;

&lt;p&gt;With Gmail shortcuts turned on the following shortcuts (and &lt;a href=&quot;http://static.googleusercontent.com/media/www.google.com/en/us/support/enterprise/static/gapps/learningcenter/Gmail-Keyboard-shortcuts.pdf&quot; target=&quot;_blank&quot;&gt;many more&lt;/a&gt;) are now available to you:&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;up-arrow&lt;/kbd&gt; / &lt;kbd&gt;down-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Move the focus up / down the inbox list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;c&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Compose new email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;x&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Check / uncheck the focused inbox item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;enter&lt;/kbd&gt;                            &lt;/td&gt;
&lt;td&gt; Open the focused inbox item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;l&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Label the opened or checked email(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;e&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Archive the opened or checked email(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;#&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Delete the opened or checked email(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;k&lt;/kbd&gt;              &lt;/td&gt;
&lt;td&gt; Insert link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;?&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Show all shortcuts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;To opt-in to Gmail shortcuts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Open the desktop version of Gmail (on your computer not a mobile device).&lt;/li&gt;
&lt;li&gt;Click the gear icon in the upper right corner, and select &lt;strong&gt;Settings&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Within the &lt;strong&gt;Keyboard shortcuts&lt;/strong&gt; section select &lt;strong&gt;Keyboard shortcuts on&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Save Changes&lt;/strong&gt; at the bottom of the screen.&lt;/li&gt;
&lt;/ol&gt;


&lt;h4&gt;&lt;a name=&quot;24&quot;&gt;&lt;/a&gt; 6/24: Submit Post When Enter Doesn&#39;t Work&lt;/h4&gt;

&lt;p&gt;On many websites, such as Facebook, pressing &lt;kbd&gt;enter&lt;/kbd&gt; will add a newline rather than submit your post. This is helpful when you&#39;re typing up your status, but how can you submit that status for the world to see without condescending to use the mouse to click the Post button?&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;enter&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Submit / send post (Facebook, Gmail)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;enter&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Newline (Excel, Google Spreadsheet)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Clicking &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;enter&lt;/kbd&gt; when typing a Facebook post submits that post. It&#39;s like telling Facebook &quot;&lt;a href=&quot;https://www.youtube.com/watch?v=mI5ijh15OYg&amp;feature=youtu.be&amp;t=17s&quot; target=&quot;_blank&quot;&gt;This is my final answer&lt;/a&gt;&quot;. This shortcut also works in Gmail to send an email that you are composing.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/YG4uNGU.png&quot; alt=&quot;Facebook post&quot; /&gt;&lt;/p&gt;

&lt;p&gt;On the flipside, if you&#39;re in a field that uses the &lt;kbd&gt;enter&lt;/kbd&gt; key to submit the entry (such as Excel cells), you can generally use &lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;enter&lt;/kbd&gt; to create a newline.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;25&quot;&gt;&lt;/a&gt; 6/25: Jump to Website Search Box&lt;/h4&gt;

&lt;p&gt;Have you ever wondered if there is a shortcut that immediately places your cursor in a website&#39;s search box? Probably not, but after learning this shortcut you&#39;ll never risk wondering.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/xUhbXtO.png&quot; alt=&quot;Twitter search&quot; /&gt;&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;/&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Place cursor in search box (Gmail, Facebook, Twitter, Google+, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;When you are within Gmail, Facebook, Twitter, Google+, and many other websites pressing the &lt;kbd&gt;/&lt;/kbd&gt; (front slash) key will place your cursor in the search box so that you can search mouse-free. Since the front slash shares the key with the &lt;kbd&gt;?&lt;/kbd&gt; you can remember this shortcut by thinking, &quot;How can I find what I&#39;m looking for &lt;strong&gt;?&lt;/strong&gt;&quot;.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;26&quot;&gt;&lt;/a&gt; 6/26: Gmail Bullets and Indentation&lt;/h4&gt;

&lt;p&gt;Numeric and bulleted lists are a clean and concise way to communicate a list of items, but Gmail hides the options within the formatting bar. Learn these shortcuts to be a top lister.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;7&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add numeric list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;8&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add bulleted list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;]&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Indent line or selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;[&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Unindent line or selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;enter&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add new line without bullet&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/c4KgJfU.png&quot; alt=&quot;Gmail bulleting&quot; /&gt;&lt;/p&gt;

&lt;p&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;7&lt;/kbd&gt; will get you started with a numeric list. If bullets are more your thing than swap the &lt;kbd&gt;7&lt;/kbd&gt; for an &lt;kbd&gt;8&lt;/kbd&gt;. &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;]&lt;/kbd&gt; can be used to indent a line, and &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;[&lt;/kbd&gt; will unident it. Think of the braces as really flat arrows pointing in the direction you want the list to be indented. If you&#39;ve ever wondered how to add a new line between bullets without adding a new bullet you simply need to add &lt;kbd&gt;shift&lt;/kbd&gt; to the &lt;kbd&gt;enter&lt;/kbd&gt; for &lt;a href=&quot;https://www.youtube.com/watch?v=TkyLnWm1iCs&amp;feature=youtu.be&amp;t=1m38s&quot; target=&quot;_blank&quot;&gt;more power&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Learning these shortcuts will help you create bulleted lists both in Gmail and Google Docs.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;27&quot;&gt;&lt;/a&gt; 6/27: Browser Bookmarks&lt;/h4&gt;

&lt;p&gt;Want to add the current website as a bookmark? There&#39;s a shortcut to make that bookmark star turn yellow.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add current page to bookmarks (Chrome, Firefox, IE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;b&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Toggle bookmark bar open/close (Chrome, Firefox, IE)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;To bookmark the current page press &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; (try it now!). Think &lt;strong&gt;D&lt;/strong&gt; as in &quot;&lt;strong&gt;D&lt;/strong&gt;oubt I&#39;ll remember this website if I don&#39;t bookmark it&quot;.&lt;/p&gt;

&lt;p&gt;If you&#39;d like to see your bookmark bar (or hide it) &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;b&lt;/kbd&gt; is the way to do it.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;28&quot;&gt;&lt;/a&gt; 6/28: Slack Channel Selector&lt;/h4&gt;

&lt;p&gt;We use &lt;a href=&quot;https://slack.com/&quot; target=&quot;_blank&quot;&gt;Slack&lt;/a&gt; for our company&#39;s internal communications. It&#39;s what you would get if AIM and IRC had a much cuter baby. It provides multiple channels (like chat rooms) to have conversations, but having to click on the channel you want to view is silly when there is a shortcut for that.&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/7PpM4MT.jpg&quot; width=&quot;300&quot; alt=&quot;Slack logo&quot; /&gt;&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;k&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens channel selection window in Slack&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;With &lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;k&lt;/kbd&gt; you can jump between Slack conversations without lifting your fingers off of the keyboard.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;29&quot;&gt;&lt;/a&gt; 6/29: Chrome Dev Tools&lt;/h4&gt;

&lt;p&gt;The Chrome Dev Tools is an indispensable tool for web developers, but even non-developers can use it to get a better understanding of what may be going wrong with a web page that they are viewing. Here is a list of shortcuts that I use on a daily basis.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F12&lt;/kbd&gt;  &lt;/td&gt;
&lt;td&gt; Open Chrome Dev Tools (to last used tab)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;j&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Open Chrome Dev Tools (to Console tab)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;esc&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Toggle Console open / closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;o&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Navigate to source file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;g&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Go to line number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;b&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add breakpoint (when in source file)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F8&lt;/kbd&gt;  &lt;/td&gt;
&lt;td&gt; Resume from breakpoint while debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F10&lt;/kbd&gt;  &lt;/td&gt;
&lt;td&gt; Step over next function while debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F11&lt;/kbd&gt;  &lt;/td&gt;
&lt;td&gt; Step into next function while debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;l&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Clear console&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;The average user may only care to know how to open the Chrome Dev Tools (&lt;kbd&gt;F12&lt;/kbd&gt;), which is great, but if you&#39;re a web developer you should commit to memorizing all of these shortcuts to make your working life a little bit easier.&lt;/p&gt;

&lt;h4&gt;&lt;a name=&quot;30&quot;&gt;&lt;/a&gt; 6/30: A Shortcut for Shortcuts&lt;/h4&gt;

&lt;p&gt;We&#39;ve covered a lot of shortcuts this month, but there are plenty of others out there. Perhaps one of the best shortcuts to learn is one that tells you what other shortcuts are available.&lt;/p&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;?&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Lists the available shortcuts for many website applications (Gmail, Facebook, Twitter, Google+, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;p&gt;Many of the websites that you use every day provide a list of supported shortcuts when you press the &lt;kbd&gt;?&lt;/kbd&gt; key (outside of an input box). This single shortcut can make you a shortcut expert in Gmail, Facebook, Twitter, Google+, and many other websites.&lt;/p&gt;

&lt;h4&gt;Conclusion&lt;/h4&gt;

&lt;p&gt;Over these past 30 days we&#39;ve discussed many keyboard shortcuts. You may had already known some, but hopefully you found many new and helpful. If so, then please bookmark this blog (&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt;), and share it with others!&lt;/p&gt;

&lt;h5&gt;Share These Shortcuts by Using These Shortcuts&lt;/h5&gt;

&lt;ol&gt;
&lt;li&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; to jump to the address bar&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt; to copy the address&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;t&lt;/kbd&gt; to create a new tab&lt;/li&gt;
&lt;li&gt;type: facebook.com &lt;kbd&gt;enter&lt;/kbd&gt; to navigate to Facebook&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;p&lt;/kbd&gt; to post a new status&lt;/li&gt;
&lt;li&gt;Type a flattering description of how helpful this was&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; to paste the address&lt;/li&gt;
&lt;li&gt;&lt;kbd&gt;enter&lt;/kbd&gt; to share your new-found shortcut knowledge&lt;/li&gt;
&lt;/ol&gt;


&lt;h5&gt;Bonus Shortcut (now with more mouse)&lt;/h5&gt;

&lt;p&gt;When browsing the web you can open a link in a new tab by holding &lt;kbd&gt;ctrl&lt;/kbd&gt; while clicking the link with your mouse (yes, even I use the mouse occasionally).&lt;/p&gt;

&lt;h5&gt;Solidified Shortcut Sheet&lt;/h5&gt;

&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Key combination    &lt;/th&gt;
&lt;th&gt; Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;left-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Split left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;right-arrow&lt;/kbd&gt;&lt;/td&gt;
&lt;td&gt; Split right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;up-arrow&lt;/kbd&gt;   &lt;/td&gt;
&lt;td&gt; Maximize&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;down-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Minimize&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;left-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;left-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor left to the beginning of the word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;home&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor left to the beginning of the line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;home&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor to the beginning of the document (super-duper left)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + key combo &lt;/td&gt;
&lt;td&gt; select text between cursor start and end point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;right-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;right-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor right to the end of the word&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;end&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor right to the end of the line&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;end&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; move cursor to the end of the document (super-duper right)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + key combo &lt;/td&gt;
&lt;td&gt; select text between cursor start and end point&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;/&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; search the menu within Google Docs&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Paste without formatting (Google Docs / Microsoft Word), Select from clipboard (Web Storm, Visual Studio)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;l&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Lock screen (in Windows)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Show desktop (and minimize all windows) in Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;t&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Create new tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;w&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Close tab or application (Browsers, Windows Explorer, and many other applications)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;t&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Re-open closed tab&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;tab&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Switch to next tab to the right&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;tab&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Switch to next tab to the left&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;space&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Select column (Google Spreadsheet, Microsoft Excel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;space&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Select row (Google Spreadsheet, Microsoft Excel)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;+&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add column(s) or row(s) above or to the left of the selected column(s) or row(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;-&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Remove selected column(s) or row(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;i&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add column(s) to the left of the selected column(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;i&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add row(s) above the selected row(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;e&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Remove selected column(s) or row(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Place cursor in address bar (all browsers and Windows Explorer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;tab&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Switch between open applications and windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;left-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Navigate back in browsers and Windows Explorer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;right-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Navigate forward in browsers and Windows Explorer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;j&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Scroll to next post (Facebook, Google+, various other sites)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;k&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Scroll to previous post (Facebook, Google+, various other sites)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Refresh the browser&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Refresh the browser ignoring cache (Chrome, Firefox)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;e&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens Windows Explorer (the equivalent of double clicking &quot;My Computer&quot;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; + &lt;kbd&gt;r&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens the Run window&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F2&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Rename file in Windows Explorer, edit cell in Microsoft Excel&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Open new window (Browsers, Windows Explorer, varios applications)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Open new icognito window (Chrome)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;f&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens find in most applications and Windows Explorer&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F3&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Find next in most applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;F3&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Find previous in most applications&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens the start menu&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; and then &lt;kbd&gt;up-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Move selection up to &quot;All Programs&quot;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; and then &lt;kbd&gt;down-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Move selection to the top item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; and then &lt;kbd&gt;tab&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Move selection to next section (right column, shutdown, left column)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;win&lt;/kbd&gt; and then type &lt;/td&gt;
&lt;td&gt; Search applications and files&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;n&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Create new folder (Windows Explorer)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;a&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Select all file(s) and folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;c&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Copy selected file(s) and folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;x&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Cut selected file(s) and folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;v&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Paste copied or cut file(s) and folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;z&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Undo (delete, paste, rename, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;delete&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Delete selected file(s) or folder(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;z&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Undo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;z&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Redo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;y&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Redo (additional shortcut option)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;print screen&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Capture full screen onto clipboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;print screen&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Capture selected window onto clipboard&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;up-arrow&lt;/kbd&gt; / &lt;kbd&gt;down-arrow&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Move the focus up / down the inbox list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;c&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Compose new email&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;x&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Check / uncheck the focused inbox item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;enter&lt;/kbd&gt;                            &lt;/td&gt;
&lt;td&gt; Open the focused inbox item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;l&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Label the opened or checked email(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;e&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Archive the opened or checked email(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;#&lt;/kbd&gt;                                &lt;/td&gt;
&lt;td&gt; Delete the opened or checked email(s)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;k&lt;/kbd&gt;              &lt;/td&gt;
&lt;td&gt; Insert link&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;enter&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Submit / send post (Facebook, Gmail)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;alt&lt;/kbd&gt; + &lt;kbd&gt;enter&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Newline (Excel, Google Spreadsheet)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;/&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Place cursor in search box (Gmail, Facebook, Twitter, Google+, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;7&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add numeric list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;8&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add bulleted list&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;]&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Indent line or selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;[&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Unindent line or selection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;enter&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add new line without bullet&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;d&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add current page to bookmarks (Chrome, Firefox, IE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;b&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Toggle bookmark bar open/close (Chrome, Firefox, IE)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;k&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Opens channel selection window in Slack&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F12&lt;/kbd&gt;  &lt;/td&gt;
&lt;td&gt; Open Chrome Dev Tools (to last used tab)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;shift&lt;/kbd&gt; + &lt;kbd&gt;j&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Open Chrome Dev Tools (to Console tab)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;esc&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Toggle Console open / closed&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;o&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Navigate to source file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;g&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Go to line number&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;b&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Add breakpoint (when in source file)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F8&lt;/kbd&gt;  &lt;/td&gt;
&lt;td&gt; Resume from breakpoint while debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F10&lt;/kbd&gt;  &lt;/td&gt;
&lt;td&gt; Step over next function while debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;F11&lt;/kbd&gt;  &lt;/td&gt;
&lt;td&gt; Step into next function while debugging&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;ctrl&lt;/kbd&gt; + &lt;kbd&gt;l&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Clear console&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;kbd&gt;?&lt;/kbd&gt; &lt;/td&gt;
&lt;td&gt; Lists the available shortcuts for many website applications (Gmail, Facebook, Twitter, Google+, etc.)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;


&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Regex - Replace with Groups</title>
        <link href="http://blog.base2.io/2015/05/13/regex-replace-with-groups/"/>
        <updated>2015-05-13T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2015/05/13/regex-replace-with-groups</id>
        <content type="html">&lt;p&gt;I was recently confronted with a situation that required me to search and replace my code in a way that the left and right of my search needed to be replaced, but the middle needed to remain the same. Could this be done with a single search and replace?&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;The Problem&lt;/h3&gt;

&lt;p&gt;For reasons that I do not care to detail here, I found myself needing to replace every instance of my Visual Studio solution where a &lt;code&gt;template&lt;/code&gt; line matching&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;template: require(&#39;Project/DynamicComponentName/DynamicComponentName.html&#39;)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;is replaced with a &lt;code&gt;templateUrl&lt;/code&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;templateUrl: &#39;Project/DynamicComponentName/DynamicComponentName.html&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;In this example the DynamicComponentName is different in every instance.&lt;/p&gt;

&lt;p&gt;Rather than manually identifying every template line and make the necessary changes I wanted to do a single search and replace and be done with it. Regex felt like the right answer, but how?&lt;/p&gt;

&lt;h3&gt;Regex Groups&lt;/h3&gt;

&lt;p&gt;Regex, or regular expressions, is a very powerful (read as: &quot;complicated to use and understand&quot;) pattern matching grammar. It provides for more advanced searching capabilities than a standard text-base search. Luckily Visual Studio provides for searching via Regex (screenshot is of Visual Studio 2013).&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/MAzCFjd.jpg&quot; alt=&quot;Visual Studio regex search option&quot; /&gt;&lt;/p&gt;

&lt;p&gt;With &lt;strong&gt;Use Regular Expressions&lt;/strong&gt; selected in Visual Studio we can take advantage of regex, including its group capturing via parentheses.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Find what&lt;/strong&gt; we can place the following regex query&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;template: require\(&#39;Project/(.*)&#39;\)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This tells Visual Studio to match everything that directly matches &lt;code&gt;template: require(Project/&lt;/code&gt;&amp;lt;any number of characters&amp;gt;&lt;code&gt;)&#39;&lt;/code&gt;. Note that the require&#39;s parentheses needed to be escaped with &lt;code&gt;\&lt;/code&gt; because the parentheses are part of the regex syntax. You can use the &lt;a href=&quot;http://www.regexr.com/&quot;&gt;http://www.regexr.com/&lt;/a&gt; online tool to test the regex matcher on your own.&lt;/p&gt;

&lt;p&gt;Now if we place the following in the &lt;strong&gt;Replace with&lt;/strong&gt; field we&#39;ll be able to place the contents captured by the &lt;code&gt;(.*)&lt;/code&gt; capture group using the &lt;code&gt;$&lt;/code&gt; syntax.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;templateUrl: &#39;Project$1&#39;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The contents of the capture group will be placed in the &lt;code&gt;$1&lt;/code&gt; slot. If you had more than one capture group then you would simply increment the &lt;code&gt;$&lt;/code&gt; (&lt;code&gt;$1&lt;/code&gt;, &lt;code&gt;$2&lt;/code&gt;, etc) based on the order that the capture groups appeared in the search term.&lt;/p&gt;

&lt;p&gt;Now hit &lt;strong&gt;Replace&lt;/strong&gt; for each instance and you&#39;re good to go.&lt;/p&gt;

&lt;p&gt;In my situation I really wanted to use &lt;strong&gt;Replace All&lt;/strong&gt;, but Visual Studio 2013 seems to have an issue with Replace All using regex. Using Replace All results in Visual Studio stating that it cannot find any matches. &lt;a href=&quot;https://www.youtube.com/watch?v=VDrW7sc52Ck&amp;amp;feature=youtu.be&amp;amp;t=48&quot;&gt;Silly Visual Studio&lt;/a&gt;.&lt;/p&gt;

&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Git Configured</title>
        <link href="http://blog.base2.io/2015/05/06/git-configured/"/>
        <updated>2015-05-06T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2015/05/06/git-configured</id>
        <content type="html">&lt;p&gt;Git configurations are like snowflakes - no two are exactly the same. At least that&#39;s what we found to be true at &lt;a href=&quot;http://base2.io&quot;&gt;Base Two&lt;/a&gt;. Each developer had his own ignores, aliases, and other tricks, which worked fine in isolation, but became troublesome when we tried to describe to one another how to interact with Git in the console. To restore sanity we have begun to standardize our Git configurations.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;p&gt;The standardization of our Git configuration files is part of our larger effort to document our overall &lt;a href=&quot;https://github.com/b2io/development-standards&quot;&gt;development standards&lt;/a&gt;. In addition to configuration files we&#39;re outlining our overall Git workflow and commit messaging standards, but I &lt;a href=&quot;http://gph.to/1EPa17p&quot;&gt;digress&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;The two primary divergents in our configurations were aliases and ignore files.&lt;/p&gt;

&lt;h3&gt;Alias all the things&lt;/h3&gt;

&lt;p&gt;If you&#39;re working with Git from the command line (that&#39;s what all the cool kids do) your fingers are going to get tired without aliases. Who has the time to type &lt;code&gt;git status&lt;/code&gt; when you could accomplish the same thing with &lt;code&gt;git s&lt;/code&gt;? That&#39;s &lt;a href=&quot;https://www.npmjs.com/package/five&quot;&gt;5&lt;/a&gt; fewer characters!&lt;/p&gt;

&lt;p&gt;Honestly, though, aliases are a great way to make Git on the command line manageable. Here is the global &lt;code&gt;.gitconfig&lt;/code&gt; file that contains the aliases that we use:&lt;/p&gt;

&lt;script src=&quot;http://gist-it.appspot.com/https://github.com/b2io/development-standards/blob/master/source-control/.gitconfig&quot;&gt;&lt;/script&gt;


&lt;h3&gt;Ignore some of the things&lt;/h3&gt;

&lt;p&gt;Source control is great for keeping your code safe, but mixed with all of that code are IDE files, merge files, build artifacts, and plenty of other files you&#39;d prefer to not have pollute your repository. That&#39;s where &lt;code&gt;.gitignore&lt;/code&gt; files come into play. You likely already have one or more gitignore files in your repository, but did you know that you can create a global ignore file? This is a great place to configure all of the common files you&#39;d like to ignore, which is especially appreciated when you wish to contribute to an open source project (the other people on the project likely don&#39;t care about your Visual Studio Resharper user settings file).&lt;/p&gt;

&lt;p&gt;To create a global ignore file simply add &lt;code&gt;excludesfile = ~/.gitignore&lt;/code&gt; to the &lt;code&gt;[core]&lt;/code&gt; section of your global &lt;code&gt;.gitconfig&lt;/code&gt; file (see above), and then create a &lt;code&gt;.gitignore&lt;/code&gt; file as a peer to the &lt;code&gt;.gitconfig&lt;/code&gt;. Here is the ignore file that we recommend:&lt;/p&gt;

&lt;script src=&quot;http://gist-it.appspot.com/https://github.com/b2io/development-standards/blob/master/source-control/.gitignore&quot;&gt;&lt;/script&gt;




&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Web Development Project Puzzle Pieces</title>
        <link href="http://blog.base2.io/2014/08/04/angular-rails-api-template/"/>
        <updated>2014-08-04T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2014/08/04/angular-rails-api-template</id>
        <content type="html">&lt;p&gt;Web development can be like trying to complete a puzzle that has had its pieces dumped into a box with multiple other puzzles. There are so many puzzle pieces that it can be difficult to even know what picture you should end up with at the end.&lt;/p&gt;

&lt;p&gt;While every project is it&#39;s own puzzle, there are a lot of common pieces out there. Here&#39;s a walk-through of how we got some of our favorite pieces (&lt;strong&gt;Angular&lt;/strong&gt;, &lt;strong&gt;Rails&lt;/strong&gt;, &lt;strong&gt;Vagrant&lt;/strong&gt;, and more) to fit together.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;What Pieces Do We Have?&lt;/h3&gt;

&lt;p&gt;Below is the list of technologies we use in this example. For your reference I&#39;m on a 64 bit version of Windows 7. Be aware that if you&#39;re using something else your results may vary.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://sourceforge.net/projects/console/files/&quot;&gt;RubyGems&lt;/a&gt;&lt;/strong&gt; (2.3.0): Ruby&#39;s package system.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://github.com/rails-api/rails-api&quot;&gt;Rails-api&lt;/a&gt;&lt;/strong&gt; (0.2.1): A lightweight version of Rails to provide API capabilities without the extra pieces that Rails brings to the table.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://www.vagrantup.com/&quot;&gt;Vagrant&lt;/a&gt;&lt;/strong&gt; (1.4.3) with &lt;strong&gt;&lt;a href=&quot;https://www.virtualbox.org/&quot;&gt;VirtualBox&lt;/a&gt;&lt;/strong&gt; (4.3.14): Allows for the configuration of reproducible and portable virtual machines.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://puppetlabs.com/puppet/puppet-open-source&quot;&gt;Puppet&lt;/a&gt;&lt;/strong&gt;: Provisioner for Vagrant.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;https://angularjs.org/&quot;&gt;Angular&lt;/a&gt;&lt;/strong&gt; (1.2.16): Front-end JavaScript framework.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://git-scm.com/&quot;&gt;Git&lt;/a&gt;&lt;/strong&gt; (1.9.0): Distributed source control.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://nodejs.org/&quot;&gt;npm&lt;/a&gt;&lt;/strong&gt; (1.4.14): We use this for the installation of some of the other tools.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://yeoman.io/&quot;&gt;Yeoman&lt;/a&gt;&lt;/strong&gt; (1.2.0): Web scaffolding tool that we use to scaffold angular via the &lt;a href=&quot;https://github.com/yeoman/generator-angular&quot;&gt;angular generator&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt;&lt;/strong&gt; (0.1.13): The build system that comes with Yeoman.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href=&quot;http://bower.io/&quot;&gt;Bower&lt;/a&gt;&lt;/strong&gt; (1.3.8): The package manager that comes with Yeoman.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Generate the Rails App&lt;/h3&gt;

&lt;p&gt;There are many ways that we can begin to put this puzzle together. We&#39;re going to start by generating the Rails app. For this example we&#39;ll use &lt;code&gt;my_app&lt;/code&gt; as our application&#39;s name.&lt;/p&gt;

&lt;p&gt;In your terminal (I use &lt;a href=&quot;http://sourceforge.net/projects/console/files/&quot;&gt;Console2&lt;/a&gt;) navigate to the location you&#39;d like your application&#39;s root folder to be placed in. If you don&#39;t already have rails-api installed then do that now.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;gem install rails-api
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Generate your Rails app with the following&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;rails-api new my_app
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now let&#39;s make a few changes to what was auto-generated for us. &lt;code&gt;cd my_app&lt;/code&gt; and remove the &lt;code&gt;/test/&lt;/code&gt; directory because we&#39;ll be using rspec for testing instead.&lt;/p&gt;

&lt;p&gt;Open your &lt;code&gt;Gemfile&lt;/code&gt; and update it to include the gems that you&#39;ll need. Here&#39;s what we used, but you&#39;ll want to upgrade to the latest packages for your application.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/tborres/67ed702ad8cfafaeec05.js?file=Gemfile&quot;&gt;&lt;/script&gt;


&lt;p&gt;We also need to change our &lt;code&gt;database.yml&lt;/code&gt; file because we&#39;ll be using PostgreSQL rather than SQLite.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/tborres/67ed702ad8cfafaeec05.js?file=database.yml&quot;&gt;&lt;/script&gt;


&lt;h3&gt;Vagrant and Puppet&lt;/h3&gt;

&lt;p&gt;Now that our bare-bones Rails-api app is created we’ll setup Vagrant. Vagrant will allow us to provision and run a virtual machine in a consistent way. This will remove the “it worked on my machine” problem that often plagues developers.&lt;/p&gt;

&lt;p&gt;We’ll use the rails-dev-box as our base since it has many of the features we’ll need. You can clone the repository from here: &lt;a href=&quot;https://github.com/rails/rails-dev-box&quot;&gt;https://github.com/rails/rails-dev-box&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now copy the &lt;code&gt;Vagrantfile&lt;/code&gt; and the &lt;code&gt;/puppet/&lt;/code&gt; directory from the rails-dev-box into the root of your application (as a peer to your Rails &lt;code&gt;/app/&lt;/code&gt; directory). Open the &lt;code&gt;Vagrantfile&lt;/code&gt; in your favorite text editor (I use &lt;a href=&quot;http://www.sublimetext.com/&quot;&gt;Sublime Text 2&lt;/a&gt;), and change the &lt;code&gt;config.vm.hostname&lt;/code&gt; from &lt;code&gt;‘rails-dev-box’&lt;/code&gt; to the name of your app. This will make it a little less confusing when you’re in your VM.&lt;/p&gt;

&lt;p&gt;Now open the &lt;code&gt;/puppet/manifests/default.pp&lt;/code&gt; puppet manifest file. This file contains a lot of optional configurations that we will not be using. Make the following changes to the file:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Change &lt;code&gt;$ar_databases&lt;/code&gt; values to your application name rather than &lt;code&gt;activerecord_unittest&lt;/code&gt;.
Example: &lt;code&gt;$ar_databases = [&#39;my_app_dev&#39;, &#39;my_app_test&#39;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Remove the SQLite and MySQL sections because we’ll be using PostgreSQL&lt;/li&gt;
&lt;li&gt;Add the following Puppet modules (&lt;em&gt;which can be installed on Windows by first downloading the tar.gz file, extracting it, copying the resulting folder into the app&#39;s &lt;code&gt;/puppet/modules/&lt;/code&gt; directory, and then renaming the folder to it&#39;s module name&lt;/em&gt; :

&lt;ul&gt;
&lt;li&gt;nodejs: &lt;a href=&quot;https://forge.puppetlabs.com/puppetlabs/nodejs&quot;&gt;https://forge.puppetlabs.com/puppetlabs/nodejs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;stdlib: &lt;a href=&quot;https://forge.puppetlabs.com/puppetlabs/stdlib&quot;&gt;https://forge.puppetlabs.com/puppetlabs/stdlib&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;apt: &lt;a href=&quot;https://forge.puppetlabs.com/puppetlabs/apt&quot;&gt;https://forge.puppetlabs.com/puppetlabs/apt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;This version of Ubuntu’s npm is out of date so we need to make an adjustment to the &lt;code&gt;/puppet/modules/nodejs/manifests/init.pp&lt;/code&gt; file. You&#39;ll need to set &lt;code&gt;$manage_repo = true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Within the &lt;code&gt;default.pp&lt;/code&gt; file replace the nodejs section with &lt;code&gt;include nodejs&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add the puppet-yeoman module from &lt;a href=&quot;https://github.com/nickhartjes/puppet-yeoman&quot;&gt;https://github.com/nickhartjes/puppet-yeoman&lt;/a&gt; by

&lt;ul&gt;
&lt;li&gt;Cloning the repository&lt;/li&gt;
&lt;li&gt;Copy the &lt;code&gt;init.pp&lt;/code&gt; file into the &lt;code&gt;/puppet/modules/yeoman/manifests/init.pp&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Remove &lt;code&gt;“curl”&lt;/code&gt; from the yeomanPackages because it already exists in our &lt;code&gt;default.pp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Change &lt;code&gt;require =&amp;gt; Exec[&#39;apt-get update&#39;]&lt;/code&gt; to &lt;code&gt;require =&amp;gt; Class[&#39;apt_get_update&#39;]&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Add a call to the module at the bottom of the &lt;code&gt;default.pp&lt;/code&gt; file with &lt;code&gt;include yeoman&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Add the angular generator for yeoman by adding the following to the bottom of your &lt;code&gt;default.pp&lt;/code&gt; file:&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;&lt;code data-gist-id=&quot;67ed702ad8cfafaeec05&quot; data-gist-file=&quot;default.pp&quot; data-gist-line=&quot;109-113&quot;&gt;&lt;/code&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to the root of your Rails directory in your console and start vagrant with the &lt;code&gt;vagrant up&lt;/code&gt; command.&lt;/li&gt;
&lt;li&gt;Now access your VM via ssh&lt;/li&gt;
&lt;/ol&gt;


&lt;pre&gt;&lt;code&gt;vagrant ssh
&amp;gt; cd /vagrant/
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Update the bundle, and rake the database&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;gt; bundle update
    &amp;gt; rake db:create
&lt;/code&gt;&lt;/pre&gt;

&lt;h3&gt;Angular!&lt;/h3&gt;

&lt;p&gt;Now we&#39;ll add a basic angular structure to our application.&lt;/p&gt;

&lt;p&gt;Create an &lt;code&gt;/angular/&lt;/code&gt; directory within your rails directory (as a peer to the &lt;code&gt;/app/&lt;/code&gt; directory).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;gt; mkdir angular &amp;amp;&amp;amp; cd angular
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Run the angular generator (within your Vagrant VM) and answer the questions to match your needs (I answered yes to all).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;gt; yo angular my_app
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you ran into any errors during the generation you may need to run the bower install and npm install manually.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;gt; bower install
    &amp;gt; sudo npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now adjust your &lt;code&gt;Gruntfile.js&lt;/code&gt; within the &lt;code&gt;/angular/&lt;/code&gt; directory so that dist places the build files in the rails &lt;code&gt;/public/&lt;/code&gt; directory.&lt;/p&gt;

&lt;p&gt;&lt;code data-gist-id=&quot;67ed702ad8cfafaeec05&quot; data-gist-file=&quot;Gruntfile.js&quot; data-gist-line=&quot;21-24&quot;&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Also add the following to the connect section (replacing the livereload section) so that your files are proxied during development.&lt;/p&gt;

&lt;p&gt;&lt;code data-gist-id=&quot;67ed702ad8cfafaeec05&quot; data-gist-file=&quot;Gruntfile.js&quot; data-gist-line=&quot;76-98&quot;&gt;&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Build the angular assets with Grunt (from within the &lt;code&gt;/angular/&lt;/code&gt; directory)!&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    &amp;gt; grunt build
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;If you see an error dealing with lodash it is likely the result of long file paths. The latest stable version of npm does not support a fix for this. You’ll need to run npm and grunt from your local development machine rather than Vagrant.&lt;/p&gt;

&lt;h3&gt;Done! - Frame that puzzle (with Git)&lt;/h3&gt;

&lt;p&gt;You&#39;ve successfully created your bare structure for web development. It may feel like you just put all the pieces of the puzzle together to find that the picture is blank, but at least now you have a canvas to paint a your cat pictures on. Let keep that canvas safe by storing it on Git.&lt;/p&gt;

&lt;p&gt;Initialize the git repository from the root Rails directory (this can be done within the console of your local development machine).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;gt; git init
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Add the following to the &lt;code&gt;.gitignore&lt;/code&gt; file:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/.vagrant   #this contains your local vm box info which is not needed by the team
&lt;/code&gt;&lt;/pre&gt;

&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>ASP.NET vNext TL;DR</title>
        <link href="http://blog.base2.io/2014/05/12/asp-net-vnext/"/>
        <updated>2014-05-12T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2014/05/12/asp-net-vnext</id>
        <content type="html">&lt;p&gt;Scott Hanselman just wrote a blog entry about what&#39;s next for ASP.NET (vNext). The &lt;a href=&quot;http://www.hanselman.com/blog/IntroducingASPNETVNext.aspx&quot;&gt;article&lt;/a&gt; has pretty pictures and is worth a read, but if you&#39;re too busy to read it here are the things that stood out to me.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;ul&gt;
&lt;li&gt;&lt;code&gt;packages.config&lt;/code&gt;, &lt;code&gt;nuspec&lt;/code&gt;, and project files (&lt;code&gt;csproj&lt;/code&gt;) merged into a unified view of project dependencies expressed as &lt;code&gt;project.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The ability to patch open source libraries with a simple override folder&lt;/li&gt;
&lt;li&gt;“No-compile compile” - i.e. The ability to update a C# class and refresh the browser to see the change without needing to recompile the project&lt;/li&gt;
&lt;li&gt;ASP.NET MVC and Web API unified into a single programming model&lt;/li&gt;
&lt;li&gt;Dependency injection out of the box&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Using Heroku Multi Build Packs to Deploy a Yeoman/Bower/Grunt Application on Rails</title>
        <link href="http://blog.base2.io/2014/03/14/using-multi-buildpacks-to-deploy-a-yeoman-bower-grunt-application-on-rails/"/>
        <updated>2014-03-14T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2014/03/14/using-multi-buildpacks-to-deploy-a-yeoman-bower-grunt-application-on-rails</id>
        <content type="html">&lt;p&gt;At Base Two, we expect our developers be familiar working with multiple layers of the web stack. Many of us got our feet wet building Rails applications and have recently been having a lot of fun building single page javascript and mobile applications with &lt;a href=&quot;http://yeoman.io/&quot;&gt;Yeoman&lt;/a&gt;, &lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt; and &lt;a href=&quot;http://www.bower.io&quot;&gt;Bower&lt;/a&gt;.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;Thick Client === Happy Clients&lt;/h3&gt;

&lt;p&gt;First some background on us. We are a technology company that builds web, mobile, desktop and embedded solutions for clients big and small. We have worked to get our startup clients from the incubator to &lt;a href=&quot;http://techcrunch.com/2014/01/29/cincinnati-startup-sqrl-raises-550k-and-launches-document-reminder-service/&quot;&gt;seed-stage funding&lt;/a&gt; and have helped our large corporate clients like &lt;a href=&quot;http://www.aep.com&quot;&gt;AEP&lt;/a&gt; communicate better by converting processes typically carried out in excel spreadsheet into rich web experiences (and on Internet Explorer 8, no less!).&lt;/p&gt;

&lt;p&gt;When we first began our work with AEP, we had just been contracted to do some shadow IT for one of the company&#39;s business units. Our first question in our first meeting was, &quot;We know you do a lot of .NET here, but would you mind if we gave Ruby on Rails a go?&quot;. It should have been a red flag that there were no internal IT representatives in the room, but we weren&#39;t about to look a gift horse in the mouth. The business unit signed off on our project and gave us the go-ahead to write a Rails application.&lt;/p&gt;

&lt;p&gt;We decided that -- given the project&#39;s requirements -- a thick javascript client with a Rails JSON API made a lot of sense. We were comfortable developing BDD Rails applications quickly and felt like a clear separation of the front and back-end would allow developers to work better in parallel.&lt;/p&gt;

&lt;p&gt;Three months later, when our client&#39;s IT department stepped in to mandate that the project be completed in .NET, we had a single page javascript application and knew what the JSON endpoints were supposed to look like. Over the next 6 months, we swapped the Rails services for .NET and continued adding features to our thick client application. All of this to say, thick clients + JSON APIs are a really flexible way to do development and, while they aren&#39;t the answer to every problem, they rock, we have fun building them and in this particular case, they saved our client a lot of time and money.&lt;/p&gt;

&lt;h3&gt;Automating Front-end Workflow&lt;/h3&gt;

&lt;p&gt;Last fall, I viewed a slide deck from &lt;a href=&quot;https://twitter.com/addyosmani&quot;&gt;Addy Osmani&lt;/a&gt; that completely blew my mind. The name of that deck was &lt;a href=&quot;https://speakerdeck.com/addyosmani/automating-front-end-workflow&quot;&gt;&quot;Automating Front-end Workflow&quot;&lt;/a&gt;, and it has completely changed the way I do development.&lt;/p&gt;

&lt;p&gt;In particular, we have adopted &lt;a href=&quot;http://yeoman.io/&quot;&gt;Yeoman&lt;/a&gt; for scaffolding new applications, &lt;a href=&quot;http://gruntjs.com/&quot;&gt;Grunt&lt;/a&gt; for automating tasks (minifying scripts, compiling SASS and Coffeescript, running static code analysis, unit and end to end tests, and even removing unused CSS rules) and &lt;a href=&quot;http://www.bower.io&quot;&gt;Bower&lt;/a&gt; for managing dependencies. Scaffolding, previewing, testing and building a new &lt;a href=&quot;http://angularjs.org/&quot;&gt;AngularJS&lt;/a&gt; with Yeoman is as simple as:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/ztbrown/9549171.js&quot;&gt;&lt;/script&gt;


&lt;p&gt;At this point, if we wanted, we could begin test-driving the front-end with mock services while another developer begins writing Rails/PHP/.NET/Go/etc.&lt;/p&gt;

&lt;h3&gt;Build Artifacts in Version Control !== Best Practice&lt;/h3&gt;

&lt;p&gt;So, here&#39;s where the dream died a little for me. We use Heroku for hosting our Rails applications and deploy to Heroku with Git. When Heroku receives the push, it recognizes and builds our Rails application just fine, but does nothing to the subdirectory containing our javascript application.&lt;/p&gt;

&lt;p&gt;Our build workflow looked like this:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After merging changes into &lt;code&gt;master&lt;/code&gt; checkout new branch called &lt;code&gt;build&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;grunt build&lt;/code&gt; (target is &lt;code&gt;./public&lt;/code&gt; in the Rails root directory)&lt;/li&gt;
&lt;li&gt;Commit changes&lt;/li&gt;
&lt;li&gt;Push to remote&lt;/li&gt;
&lt;li&gt;Issue pull request to &lt;code&gt;master&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Merge changes&lt;/li&gt;
&lt;li&gt;Push &lt;code&gt;master&lt;/code&gt; to Heroku&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I get worn out just reading that list.&lt;/p&gt;

&lt;p&gt;If the threat of extra work isn&#39;t compelling enough to convince you that this isn&#39;t the right way to be doing things, how about this: build artifacts simply do not belong in source control. If only Heroku could recognize our Rails application and also know to fetch our front-end dependencies and run our Grunt tasks.&lt;/p&gt;

&lt;h3&gt;Automating Multiple Builds on Heroku&lt;/h3&gt;

&lt;p&gt;I&#39;d like to say that I got fed up with the above build process and went searching for a better way, but that would be--at best--a half-truth. A few months ago, we got an email from an Advocate at Heroku named Christopher Lauer asking if he could chat with us about ways to improve our Heroku experience. I had no idea they did this kind of thing and was thrilled to get a forum to ask questions about the platform.&lt;/p&gt;

&lt;p&gt;This is where Christopher turned me on to the idea of using multiple build packs. I had no idea what buildpacks were, so I started poking around. From the documentation:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;When you &lt;code&gt;git push heroku&lt;/code&gt;, Heroku’s slug compiler prepares your code for execution by the Heroku dyno manager. At the heart of the slug compiler is a collection of scripts called a buildpack.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Ok, so buildpacks are the steps Heroku uses to build my application once it recognizes that I&#39;m using Ruby/Node/etc. So how do I tell Heroku that it should stop trying to recognize my environment and instead let me call the shots? It&#39;s a simple environment variable. So, if I want Heroku to look for a Ruby/Rails application, I would configure it to use the ruby buildpack:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/ztbrown/9549245.js&quot;&gt;&lt;/script&gt;


&lt;p&gt;If, instead, I would like it to run a package.json and install dependencies like Compass and Grunt, I would configure it like this:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/ztbrown/9549263.js&quot;&gt;&lt;/script&gt;


&lt;p&gt;But this doesn&#39;t yet solve my problem. Enter, multi build packs.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/ztbrown/9549269.js&quot;&gt;&lt;/script&gt;


&lt;p&gt;Now, when you push to Heroku, the service will first look for a package.json and Gruntfile in the root (I point the Gruntfile to the Gruntfile in my subdirectory with grunt-hub) before bundling and spinning up a Rails server.&lt;/p&gt;

&lt;h3&gt;Wrapping up&lt;/h3&gt;

&lt;pre&gt;&lt;code class=&quot;sh &quot;&gt;$ git rm -rf /public
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Removing my build artifacts from Github was a triumphant moment. Concurrently developing for the front and back-end feels humane.&lt;/p&gt;

&lt;p&gt;I&#39;m sure that there were likely some holes in this document and more than a few logical jumps. I&#39;ll keep an eye on the comments and plan on linking a few resources below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://devcenter.heroku.com/articles/buildpacks&quot;&gt;Buildpack Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ddollar/heroku-buildpack-multi&quot;&gt;Heroku Multi Build Pack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://jeff.konowit.ch/posts/yeoman-rails-angular/&quot;&gt;Angular + Rails + Yeoman = Angrailman?&lt;/a&gt; - the directory structure we chose for combining Rails and Angular&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Wireframes for Developers</title>
        <link href="http://blog.base2.io/2014/03/09/wireframes-for-developers/"/>
        <updated>2014-03-09T00:00:00-05:00</updated>
        <id>http://blog.base2.io/2014/03/09/wireframes-for-developers</id>
        <content type="html">&lt;p&gt;Wireframes are a great way to visually communicate the expected user behavior of an application to your team and your client. So, is this post for an information architect to better understand what developers are looking for, or for developers wanting to create wireframes for their clients? Well, the answer is both.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;p&gt;On smaller teams, where the developer is the one gathering the requirements, wireframes can help to demonstrate to the client that the team understands the overall solution. Wireframes also can save everybody a lot of time by identifying usability issues upfront - before the application is coded.&lt;/p&gt;

&lt;p&gt;Larger teams may have a dedicated information architect who acts as a liaison between the client and the development team. In this case the wireframes are the primary artifact for the developers to understand the requirements of the application. Therefore it is important that the edge cases that developers look for are accounted for in the wireframes.&lt;/p&gt;

&lt;h3&gt;Know Your Tool&lt;/h3&gt;

&lt;p&gt;There are a lot of good wireframing tools available online. The one we use is &lt;a href=&quot;http://balsamiq.com/products/mockups/&quot;&gt;Balsamiq Mockups&lt;/a&gt;. It is reasonably priced, easy to use, and contains the basic functionality needed to create wireframes without a lot of extra fluff. Depending on your teams needs this tool may or may not work for you. Regardless of your wireframing tool, I recommend that you take some time to learn your tool.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Shortcuts - Does the application have shortcuts that will help you wireframe with ease?&lt;/li&gt;
&lt;li&gt;Templating - Is there a way to template common items so that changes can be made in one place rather than copying and pasting?&lt;/li&gt;
&lt;li&gt;Presentation - How can the final wireframes be demonstrated? Export to pdf, png, or live presentation mode?&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;Know Your Resolution&lt;/h3&gt;

&lt;p&gt;Are you creating a website, desktop app, or mobile app? Your wireframes should be sized based on the lowest resolution the application will support. If you are targeting multiple platforms then it will be necessary to create different sets of wireframes. For instance, you may need to have a set that is based on a mobile device, and another set at 1024x768 for a web browser.&lt;/p&gt;

&lt;h3&gt;Data Matters&lt;/h3&gt;

&lt;p&gt;In most cases lorem ipsum is not going to cut it. Developers may not read your annotations (and they probably won’t), but they will expect the data on the screen to be consistent. Your example data and wireframes should tell a story. If you show John Doe selected in a list then John Doe should be selected in the detail view as well. Also, you shouldn’t simply copy and paste a bunch on “John Doe” items to populate the list. Doing this could lead the developer to think that each person should be listed multiple times.&lt;/p&gt;

&lt;p&gt;To make example data easier and more fun to create go out to &lt;a href=&quot;http://www.imdb.com/&quot;&gt;imdb&lt;/a&gt; and use the cast of one of your favorite shows. It’s especially helpful if you use a tv show or movie that works with your type of application. For instance, if the application is for a business then &lt;em&gt;Mad Men&lt;/em&gt; may work. A To-do app could be &lt;em&gt;Breaking Bad&lt;/em&gt;. However, be aware that your show selection may say more about yourself then you care to share, and not all shows are client-safe.&lt;/p&gt;

&lt;h3&gt;Think Like a User&lt;/h3&gt;

&lt;p&gt;The most important player in this game is the user. So it’s important to think like one. Mentally navigate the application like a user. Log in, go to the home screen, and think “What do I want to do now?”. You can get all of the client’s features in the application, but if the user doesn’t know how to intuitively navigate to those features it’s a loss cause.&lt;/p&gt;

&lt;h3&gt;Think Like a Developer&lt;/h3&gt;

&lt;p&gt;Developers think in edge cases. They don’t question if the glass is half full or half empty - they ask, “What if there is no glass? What if there is no table for the glass to sit on?”. It’s important to show the happy path in your wireframes so that everybody knows how it works, but it’s also important to show how the application should react when things go wrong. What happens if required data is not entered, the user forgets his or her password, or there are no results to show in a list?&lt;/p&gt;

&lt;h3&gt;Think Like an Application&lt;/h3&gt;

&lt;p&gt;Unlike your wireframes, the application you’re designing is not static. The screen size may be different, and the result list may be large or small. Your wireframes should visually describe how the application should adjust to handle these differences. Where can scrolling occur? Do certain portions of the screen stretch as more space is available? Should text truncate with an ellipsis when it is too long to fit?&lt;/p&gt;

&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Autocomplete and the Three Algorithms</title>
        <link href="http://blog.base2.io/2014/02/25/autocomplete-and-the-three-algorithms/"/>
        <updated>2014-02-25T00:00:00-05:00</updated>
        <id>http://blog.base2.io/2014/02/25/autocomplete-and-the-three-algorithms</id>
        <content type="html">&lt;p&gt;A lot of our projects have some form of autocomplete functionality baked into them; but recently we had a client ask for something a little more &lt;em&gt;mistake proof&lt;/em&gt;. A lot of users in this particular application will be searching for something based on the sound of a word and not really know the exact spelling.&lt;/p&gt;

&lt;p&gt;In talking over examples of how the new autocomplete should match, the product owner sent us in the direction of a possible solution he&#39;d had some experience with in the past: the Soundex algorithm.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;This one is too cold&lt;/h3&gt;

&lt;p&gt;To give a little more context, this particular application is hosted on Heroku and uses a PostgreSQL database for persistent storage. Given that, we started by seeing what PostgreSQL can do for us. As it turns out, it&#39;s got support for Soundex &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/fuzzystrmatch.html&quot;&gt;right out of the box&lt;/a&gt;.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;The Soundex system is a method of matching similar-sounding names by converting them to the same code. It was initially used by the United States Census in 1880, 1900, and 1910. Note that Soundex is not very useful for non-English names.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;That might be exactly what another application needed, but we aren&#39;t dealing with people&#39;s names, we&#39;re dealing with brand names. Time to break out our SQL-fu and see how the results hold up.&lt;/p&gt;

&lt;p&gt;First things first, you&#39;ll need to have the &lt;code&gt;fuzzystrmatch&lt;/code&gt; module installed on PostgreSQL database. You can do that by dropping into the PSQL console and running: &lt;code&gt;CREATE EXTENSION fuzzystrmatch;&lt;/code&gt;. Now in a query you can run something a query to get some results:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/9223335.js?file=soundex.sql&quot;&gt;&lt;/script&gt;


&lt;p&gt;Looking those over for our data-set, we aren&#39;t getting at all the results we&#39;d want. Time to start looking at other options…&lt;/p&gt;

&lt;h3&gt;This one is too hot&lt;/h3&gt;

&lt;p&gt;A little farther down &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/fuzzystrmatch.html&quot;&gt;that page of PostgreSQL documentation&lt;/a&gt; is the Levenshtein distance algorithm.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;This function calculates the Levenshtein distance between two strings.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;That sounds promising, let&#39;s give that a try. The Levenshtein function comes packaged in the &lt;code&gt;fuzzystrmatch&lt;/code&gt; module with Soundex, so no need to go back into the PSQL console, instead we&#39;ll start with a query:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/9223335.js?file=levenshtein.sql&quot;&gt;&lt;/script&gt;


&lt;p&gt;It wasn&#39;t immediately clear how Levenstein was sorting the results. But further investigations revealed that output of the function is the &lt;em&gt;edit distance&lt;/em&gt; between the two strings; which is to say: how many changes you need to make to the get from one string to the other.&lt;/p&gt;

&lt;p&gt;Once again, the results from this aren&#39;t really what we&#39;re looking for, so it&#39;s back to the drawing board…&lt;/p&gt;

&lt;h3&gt;This one is just right&lt;/h3&gt;

&lt;p&gt;After a broader search, we came upon the &lt;code&gt;pg_trgm&lt;/code&gt; module that adds &lt;a href=&quot;http://www.postgresql.org/docs/8.3/static/pgtrgm.html&quot;&gt;Trigram similarity&lt;/a&gt; to PostgreSQL.&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;A trigram is a group of three consecutive characters taken from a string. We can measure the similarity of two strings by counting the number of trigrams they share. This simple idea turns out to be very effective for measuring the similarity of words in many natural languages.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;That sounds &lt;strong&gt;much&lt;/strong&gt; more promising, let&#39;s get to the query and see what results we get. Similar to the other two algorithms, we&#39;ll have to add the module to PostgreSQL first by running &lt;code&gt;CREATE EXTENSION pg_trgm;&lt;/code&gt; in the PSQL console. From there, we can hop back to the query interface:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/9223335.js?file=trigram.sql&quot;&gt;&lt;/script&gt;


&lt;p&gt;We&#39;ve got results that match up to our use case. A search for &quot;hazienda&quot; matches first to the brand named &quot;Hacienda&quot;, and then to some other sensible results. Perfect!&lt;/p&gt;

&lt;p&gt;Now we just need to step back into our Rails API server and get this query running. That should be easy, right?&lt;/p&gt;

&lt;h3&gt;The bears came home, and they were upset&lt;/h3&gt;

&lt;p&gt;Perhaps incorrectly, our first instinct was to try and avoid reinventing the wheel. So we did some searching for reputable gems that wrap the &lt;code&gt;pg_trgm&lt;/code&gt; module&#39;s Trigram search functionality and came across &lt;a href=&quot;https://github.com/textacular/textacular&quot;&gt;textacular&lt;/a&gt; and &lt;a href=&quot;https://github.com/Casecommons/pg_search&quot;&gt;pg_search&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you couldn&#39;t tell from the section header, some things went wrong here, but before we get into that let me say that both of these gems are awesome. They&#39;ve got test coverage, quality metrics, semantic versioning, multiple contributors, etc. In short, they&#39;ve got all the indicators of healthy, vibrant repositories.&lt;/p&gt;

&lt;p&gt;That said, let&#39;s talk about what went wrong. Of the two gems, textacular is much more straightforward (though not as feature rich) and has all the functionality we want. The &lt;code&gt;fuzzy_search&lt;/code&gt; finder it adds is perfect, we should just be able to call from our &lt;code&gt;Brand&lt;/code&gt; model like &lt;code&gt;Brand.fuzzy_search(name: &#39;hazienda&#39;).limit(10)&lt;/code&gt; and we should get our Trigram similarity matches.&lt;/p&gt;

&lt;p&gt;The catch is, textacular adds in a &lt;code&gt;WHERE&lt;/code&gt; clause that was incompatible with our use case. The clause they put in makes sure the fuzzy search term is a substring in the column before running the similarity match. This is probably a performance optimization for large tables and complex combination queries, but for our purposes the raw query was fast enough and the substring match killed our ability to catch spelling mistakes.&lt;/p&gt;

&lt;h3&gt;Goldilocks made her own porridge&lt;/h3&gt;

&lt;p&gt;In the end, we decided to roll our own. Following one of the &lt;a href=&quot;http://blog.codeclimate.com/blog/2012/10/17/7-ways-to-decompose-fat-activerecord-models/&quot;&gt;wonderful model refactoring patterns from Code Climate&lt;/a&gt; (#4), we extracted it as a query object:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/9223335.js?file=similar_brands_query.rb&quot;&gt;&lt;/script&gt;




&lt;script src=&quot;https://gist.github.com/9223335.js?file=brands_controller.rb&quot;&gt;&lt;/script&gt;




&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Link Roundup #4</title>
        <link href="http://blog.base2.io/2013/12/14/link-roundup-4/"/>
        <updated>2013-12-14T00:00:00-05:00</updated>
        <id>http://blog.base2.io/2013/12/14/link-roundup-4</id>
        <content type="html">&lt;!-- #REST#BEGIN --&gt;


&lt;h4&gt;Libaries&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kentcdodds/genie&quot;&gt;kentcdodds/genie&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/linkedin/hopscotch&quot;&gt;linkedin/hopscotch&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/lgierth/promise.rb&quot;&gt;lgierth/promise.rb&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/loadfive/knwl.js&quot;&gt;loadfive/Knwl.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/blackgate/bg-splitter&quot;&gt;blackgate/bg-splitter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Talks&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=uDaBtqEYNBo&quot;&gt;How I architected my big Rails app for success!&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.confreaks.com/events/rubyconf2013&quot;&gt;Ruby Conference 2013 Videos&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Articles&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://technotes.iangreenleaf.com/posts/2013-12-09-reddits-empire-is-built-on-a-flawed-algorithm.html&quot;&gt;Reddit’s empire is founded on a flawed algorithm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.useronboard.com/features-vs-benefits/&quot;&gt;User Onboarding&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.codeclimate.com/blog/2013/12/05/refactoring-without-good-tests&quot;&gt;Refactoring Without Good Tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.codeclimate.com/blog/2013/10/09/unexpected-outcomes-of-code-reviews/&quot;&gt;The Unexpected Outcomes Of Code Review&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.honeybadger.io/blog/2013/12/11/beginners-guide-to-angular-js-rails&quot;&gt;Getting Started with AngularJS and Rails 4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://asanderson.org/posts/2013/06/03/bootstrapping-angular-rails-part-1.html&quot;&gt;Bootstrapping an AngularJS app in Rails 4.0 - Part 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gaslight.co/blog/maintainable-and-scalable-systems-with-rails-engines&quot;&gt;Maintainable and Scalable Systems with Rails Engines&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.stormconsultancy.co.uk/blog/development/how-to-get-more-bang-for-your-heroku-buck-while-making-your-rails-site-super-snappy-redux&quot;&gt;How to get More Bang for your Heroku Buck While Making Your Rails Site Super Snappy [Redux]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Tools&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.vagrantup.com/blog/vagrant-1-4.html&quot;&gt;Vagrant 1.4&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/indieisaconcept/grunt-styleguide&quot;&gt;indieisaconcept/grunt-styleguide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://rails-assets.org&quot;&gt;Rails Assets&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Link Roundup #3</title>
        <link href="http://blog.base2.io/2013/12/07/link-roundup-3/"/>
        <updated>2013-12-07T00:00:00-05:00</updated>
        <id>http://blog.base2.io/2013/12/07/link-roundup-3</id>
        <content type="html">&lt;!-- #REST#BEGIN --&gt;


&lt;h4&gt;Libaries&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/elabs/pundit&quot;&gt;elabs/pundit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Talks&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.confreaks.com/videos/2873-rubyconf2013-test-driven-neural-networks-with-ruby&quot;&gt;Test Driven Neural Networks with Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.confreaks.com/videos/2864-rubyconf2013-repl-driven-development-with-pry&quot;&gt;REPL driven development with Pry&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Articles&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://exciting.io/2012/04/12/hello-printer/&quot;&gt;Hello, Printer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.phptherightway.com/&quot;&gt;PHP: The Right Way&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bbatsov/ruby-style-guide&quot;&gt;Ruby Style Guide&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://sideproject.io/front-end-and-ui-style-guides/&quot;&gt;Front-end and UI style guides&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://product.voxmedia.com/post/68085482982/polygon-feature-design-svg-animations-for-fun-and&quot;&gt;Polygon feature design: SVG animations for fun and profit&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Tools&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://bitbucket.org/jonforums/uru&quot;&gt;Unleash Ruby&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Link Roundup #2</title>
        <link href="http://blog.base2.io/2013/11/30/link-roundup-2/"/>
        <updated>2013-11-30T00:00:00-05:00</updated>
        <id>http://blog.base2.io/2013/11/30/link-roundup-2</id>
        <content type="html">&lt;!-- #REST#BEGIN --&gt;


&lt;h4&gt;Libaries&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/wilsonpage/fastdom&quot;&gt;wilsonpage/fastdom&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/bbatsov/rubocop&quot;&gt;bbatsov/rubocop&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/nathanl/authority&quot;&gt;nathanl/authority&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Talks&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=1OeXsL5mr4g&quot;&gt;Super VanJS 2013: Steven Luscher - Developing User Interfaces With Facebook&#39;s React&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Articles&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.arkency.com/2013/09/story-of-size-1/&quot;&gt;Developers oriented project management: Story of size 1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://zachholman.com/talk/how-github-no-longer-works/&quot;&gt;How GitHub (No Longer) Works&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Tools&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://app.raw.densitydesign.org/#/&quot;&gt;RAW&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Link Roundup #1</title>
        <link href="http://blog.base2.io/2013/11/23/link-roundup-1/"/>
        <updated>2013-11-23T00:00:00-05:00</updated>
        <id>http://blog.base2.io/2013/11/23/link-roundup-1</id>
        <content type="html">&lt;p&gt;The first in a (hopefully weekly) recurring post where we collect interesting links from the week.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h4&gt;Libaries&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/kickstarter/rack-attack&quot;&gt;kickstarter/rack-attack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/samsymons/RedditKit.rb&quot;&gt;samsymons/RedditKit.rb&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Articles&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://practicingruby.com/articles/infrastructure-automation?u=c94a53804e&quot;&gt;Infrastructure automation by example&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.codeship.io/2013/11/07/building-vagrant-machines-with-packer.html&quot;&gt;Building Vagrant Machines with Packer&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://railsadventures.wordpress.com/2013/09/25/11-steps-to-make-your-rspec-specs-awesome/&quot;&gt;11 Steps To Make Your RSpec Specs Awesome&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://blog.heroku.com/archives/2013/11/14/oauth-sso&quot;&gt;OAuth as Single Sign On&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://robots.thoughtbot.com/content-compression-with-rack-deflater/&quot;&gt;Honey, I shrunk the internet! - Content Compression via Rack::Deflater&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;Tools&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://leanpub.com/&quot;&gt;Leanpub: Publish Early, Publish Often&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.omniref.com/&quot;&gt;omniref&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://goosecode.com/watson/&quot;&gt;watson, an inline issue manager&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Conditionally Mock $httpBackend</title>
        <link href="http://blog.base2.io/2013/10/29/conditionally-mock-http-backend/"/>
        <updated>2013-10-29T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2013/10/29/conditionally-mock-http-backend</id>
        <content type="html">&lt;p&gt;I recently followed &lt;a href=&quot;http://blogs.burnsidedigital.com/2013/09/and-httpbackend-mock-for-all-unit-e2e-testings/&quot;&gt;this awesome blog post&lt;/a&gt; to mock $httpBackend for my end-to-end tests. The problem I immediately ran into is that, while mock data is fine for my e2e tests, I want to connect to a local backend when developing and get real data.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;Conditionally inject e2e-mocks&lt;/h3&gt;

&lt;p&gt;The Burnside Digital blog post suggests including the following script in your application&#39;s index.html.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/ztbrown/7215173.js&quot;&gt;&lt;/script&gt;


&lt;p&gt;Karma&#39;s end-to-end tests open your application in an iFrame. To conditionally inject the mocked $httpBackend, we can check to see if we are in an iFrame and only include e2e-mocks if we are.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/ztbrown/7215241.js&quot;&gt;&lt;/script&gt;


&lt;p&gt;Now, when developing, you can work with your development server and when testing you can use mocked data.&lt;/p&gt;

&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Karma + Circle CI</title>
        <link href="http://blog.base2.io/2013/10/18/karma-tests-circle-ci/"/>
        <updated>2013-10-18T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2013/10/18/karma-tests-circle-ci</id>
        <content type="html">&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;
I recently discovered a much smarter way to be doing this. Here it is:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/ztbrown/7215433.js&quot;&gt;&lt;/script&gt;


&lt;p&gt;&lt;a href=&quot;http://circleci.com&quot;&gt;Circle CI&lt;/a&gt; is an awesome, affordable continuous integration solution. I am currently using it in an Angular + Rails project, scaffolded with Yeoman, following a workflow similar to &lt;a href=&quot;http://jeff.konowit.ch/posts/yeoman-rails-angular/&quot;&gt;this&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here&#39;s the problem I ran into: Circle was automatically recognizing and running my rspec tests, but not my angular app&#39;s (located at rails_root/angular) karma tests.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;Circle.yml&lt;/h3&gt;

&lt;p&gt;Boom. The npm/bower package management is a little time-consuming, but this runs both my rspec and karma tests.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/ztbrown/7043015.js&quot;&gt;&lt;/script&gt;




&lt;!-- #REST#END --&gt;



</content>
    </entry>
    
    <entry>
        <title>Startup Magnet Poetry</title>
        <link href="http://blog.base2.io/2013/08/23/startup-magnet-poetry/"/>
        <updated>2013-08-23T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2013/08/23/startup-magnet-poetry</id>
        <content type="html">&lt;p&gt;This morning during our weekly meeting, I came up with an idea to facilitate our twenty percent time / new product brainstorming.
We often find ourselves explaining our ideas by comparing them to existing products or services. StumbleUpon + LinkedIn. Google Glass
meets Nike+ meets Yelp, etc.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;Magnets, How Do They Work?&lt;/h3&gt;

&lt;p&gt;I spent a couple hours this afternoon and got a working proof of concept! It was such a rewarding thing to go from concept to
finished product so quickly!&lt;/p&gt;

&lt;p&gt;&lt;img src=&quot;http://i.imgur.com/rLPiq0K.jpg&quot; alt=&quot;magnetic startup poetry&quot; /&gt;&lt;/p&gt;

&lt;h3&gt;Desperately Seeking Contributions&lt;/h3&gt;

&lt;p&gt;I think this could be a fun, valuable thing. If you feel the same way, &lt;a href=&quot;https://github.com/ztbrown/startup-magnet-art&quot;&gt;please fork and contribute!&lt;/a&gt;&lt;/p&gt;

&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Seeding with progress</title>
        <link href="http://blog.base2.io/2012/11/30/seeding-with-progress/"/>
        <updated>2012-11-30T00:00:00-05:00</updated>
        <id>http://blog.base2.io/2012/11/30/seeding-with-progress</id>
        <content type="html">&lt;p&gt;If you&#39;re doing database seeding in a rails app through &lt;code&gt;seeds.rb&lt;/code&gt; you might be interested in this snippet, especially if you&#39;re
using CSV files to help you do it.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;Mo Rows, Mo Problems&lt;/h3&gt;

&lt;p&gt;A couple of our recent projects have had rather large CSV files that need to be seeded. Running a &lt;code&gt;rake db:seed&lt;/code&gt; command
takes an agonizing couple of minutes (several of the files have tens of thousands of rows). To help soothe our neurotic impulses
to kill the process midway through we decided to have a bit of fun sprucing up the console feedback while the seeding
is underway.&lt;/p&gt;

&lt;p&gt;We started out with a simple &lt;code&gt;puts &quot;Seeding Models...&quot;&lt;/code&gt;, but that really doesn&#39;t tell you anything about how many more models
need to be seeded. We decided to take a page out of the UNIX playbook and give the user a bit more information.&lt;/p&gt;

&lt;h3&gt;The UNIX way&lt;/h3&gt;

&lt;p&gt;There&#39;s a nifty utility named &lt;code&gt;wget&lt;/code&gt; in UNIX that will let you download things given a URL. It gives you a nice visual
representation of the progress in the console using a text-based progress bar that looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vagrant@lucid64:~$ wget https://www.google.com/images/srpr/logo3w.png
--2012-12-01 04:59:29--  https://www.google.com/images/srpr/logo3w.png
Resolving www.google.com... 173.194.75.99, 173.194.75.147, 173.194.75.106, ...
Connecting to www.google.com|173.194.75.99|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 7007 (6.8K) [image/png]
Saving to: `logo3w.png&#39;

100%[=========================================================================&amp;gt;] 7,007       --.-K/s   in 0.007s

2012-12-01 04:59:29 (958 KB/s) - `logo3w.png&#39; saved [7007/7007]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With a bit of digging, we found the &lt;code&gt;\r&lt;/code&gt; special character for the &lt;code&gt;print&lt;/code&gt; method, which allows you to do some UNIX-style magic in
updating what you&#39;ve already printed to the console. The &lt;code&gt;\r&lt;/code&gt; character will clear the current line of the display in the console.&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/4179185.js?file=genre.rb&quot;&gt;&lt;/script&gt;




&lt;script src=&quot;https://gist.github.com/4179185.js?file=genres.csv&quot;&gt;&lt;/script&gt;




&lt;script src=&quot;https://gist.github.com/4179185.js?file=seeds.rb&quot;&gt;&lt;/script&gt;


&lt;p&gt;Running a &lt;code&gt;rake db:seed&lt;/code&gt; will now give you live progress updates:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;vagrant@lucid64:/vagrant$ rake db:seed
Seeding Genre:
100.00% [=====================================================================&amp;gt;]
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Ah, much better!&lt;/p&gt;

&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Vagrants and Chefs and Librarians... oh my!</title>
        <link href="http://blog.base2.io/2012/05/01/vagrants-and-chefs-and-librarians-oh-my/"/>
        <updated>2012-05-01T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2012/05/01/vagrants-and-chefs-and-librarians-oh-my</id>
        <content type="html">&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;
Thanks to &lt;a href=&quot;/2012/05/01/vagrants-and-chefs-and-librarians-oh-my/#comment-677428811&quot;&gt;SDude&lt;/a&gt;, &lt;a href=&quot;/2012/05/01/vagrants-and-chefs-and-librarians-oh-my/#comment-584010225&quot;&gt;zibuki&lt;/a&gt;, &lt;a href=&quot;/2012/05/01/vagrants-and-chefs-and-librarians-oh-my/#comment-537553234&quot;&gt;bilke&lt;/a&gt;, and &lt;a href=&quot;/2012/05/01/vagrants-and-chefs-and-librarians-oh-my/#comment-521570237&quot;&gt;Anthony Goddard&lt;/a&gt; for helping to keep this post up-to-date and working.&lt;/p&gt;

&lt;p&gt;For those of you out there doing development, you&#39;ve probably run into some or all of the following problems:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your development environment doesn&#39;t mirror your production environment.&lt;/li&gt;
&lt;li&gt;It&#39;s difficult or impossible to keep everyone&#39;s development environment consistent in multi-developer projects.&lt;/li&gt;
&lt;li&gt;You can never remember how to get all the configuration nuances right for whatever dependencies your project requires.&lt;/li&gt;
&lt;li&gt;It takes real, significant amounts of time to get yourself ready to go when starting or switching projects.&lt;/li&gt;
&lt;li&gt;The dependencies of one project might conflict with another project.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;These issues kill your productivity with time-consuming and difficult-to-isolate issues that have &lt;em&gt;nothing&lt;/em&gt; to do with the problem you actually want to solve. To get around these issues and give ourselves some other advantages (more on that later) we&#39;re using a gem called &lt;a href=&quot;http://vagrantup.com&quot;&gt;Vagrant&lt;/a&gt; to create a portable development environment.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;h3&gt;A Vagrant&#39;s life&lt;/h3&gt;

&lt;p&gt;Vagrant is essentially a command-line wrapper on top of &lt;a href=&quot;http://www.virtualbox.org/&quot;&gt;Oracle&#39;s VirtualBox&lt;/a&gt;. This lets you initialize, suspend, resume, and destroy virtual machines right from your terminal easily. Getting started is as easy as:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2564740.js?file=vagrant&quot;&gt;&lt;/script&gt;


&lt;p&gt;For a more detailed setup guide, check the &lt;a href=&quot;http://vagrantup.com/v1/docs/getting-started/index.html&quot;&gt;Getting Started&lt;/a&gt; documentation for Vagrant.&lt;/p&gt;

&lt;p&gt;So with a nice, fresh virtual machine to play with, we can go ahead and setup all the things we need in our development environment. We can even do our best to mirror our production environment so we can avoid all those &quot;it worked on my machine&quot; issues.&lt;/p&gt;

&lt;p&gt;But we&#39;re still left with a problem, this virtual machine isn&#39;t &lt;em&gt;portable&lt;/em&gt;. If someone else joins the project, they&#39;ll have to go through whatever manual setup steps we did to get the dependencies installed on their own Vagrant box.&lt;/p&gt;

&lt;p&gt;Not to worry though, Vagrant has the perfect solution for you: &lt;a href=&quot;http://vagrantup.com/v1/docs/getting-started/provisioning.html&quot;&gt;Provisioning&lt;/a&gt;. Provisioning allows you to automate the setup of your development environment using either &lt;a href=&quot;http://puppetlabs.com/puppet/what-is-puppet/&quot;&gt;Puppet&lt;/a&gt; or &lt;a href=&quot;http://wiki.opscode.com/display/chef/Home&quot;&gt;Chef&lt;/a&gt;. Based on our research, Chef seemed like the right way to go.&lt;/p&gt;

&lt;h3&gt;The Chef and the Librarian&lt;/h3&gt;

&lt;p&gt;Chef is a provisioning tool, and as you might expect it makes it possible to automatically configure a machine (virtual or otherwise) into a specific state. In keeping with the culinary metaphor Chef has &lt;em&gt;recipes&lt;/em&gt; which represent a specific configuration (e.g.: setting up an Apache server). Recipes are organized into &lt;em&gt;cookbooks&lt;/em&gt;, which are really just containers for all those configuration options.&lt;/p&gt;

&lt;p&gt;There&#39;s a mountain of technical detail involved in Chef, it can be used to mainain an entire cloud infrastructure. To keep things simple, and within our abilities, we&#39;re going to be focusing on a use of Chef called &lt;a href=&quot;http://wiki.opscode.com/display/chef/Chef+Solo&quot;&gt;Chef Solo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;When you looked at the Vagrant &lt;a href=&quot;http://vagrantup.com/v1/docs/getting-started/provisioning.html&quot;&gt;Getting Started documentation for Provisioning&lt;/a&gt; you might have noticed the following use of Chef Solo to provision their sample box:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2564740.js?file=Vagrantfile-Getting-Started&quot;&gt;&lt;/script&gt;


&lt;p&gt;This kind of usage is great for a &quot;Hello World&quot; example, but not so great for showing you how to use Chef  Solo to provision in a more realistic context. We ran into some stumbling blocks with Chef Solo: How do we manage the cookbooks and recipes properly? Should we install them in the user directory? The project directory? How do we ensure everyone is using the same version?&lt;/p&gt;

&lt;p&gt;At some point in our search for sanity in that process we ran across a great gem called &lt;a href=&quot;https://github.com/applicationsonline/librarian&quot;&gt;Librarian&lt;/a&gt; that aims to solve this exact problem. To setup Librarian for our project we need to run the following commands:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2564740.js?file=librarian&quot;&gt;&lt;/script&gt;


&lt;p&gt;What you&#39;re doing there is ignoring a few folders in git and initializing the project for Librarian. Part of that initialization is to create a &lt;code&gt;Cheffile&lt;/code&gt; which serves as your way to define what cookbooks/recipes you need in a clean and portable way.&lt;/p&gt;

&lt;p&gt;To set the stage a bit, let&#39;s say we&#39;re starting a Ruby on Rails project and we know we&#39;re going to need the following things:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An up-to-date system (through &lt;code&gt;aptitude&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Ruby (through &lt;code&gt;rvm&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Git (through &lt;code&gt;git-core&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Not the most complicated set of requirements, but sufficient for getting this project off the ground. Let&#39;s take a look at a &lt;code&gt;Cheffile&lt;/code&gt; that gets us the recipes we need:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2564740.js?file=Cheffile&quot;&gt;&lt;/script&gt;


&lt;p&gt;After we&#39;ve set that, we simply run &lt;code&gt;librarian-chef install&lt;/code&gt; to have Librarian pull down all those cookbooks and install them into our project. Now we just need to setup Vagrant to provision our environment:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2564740.js?file=Vagrantfile&quot;&gt;&lt;/script&gt;


&lt;p&gt;Pretty straight-forward stuff there, we&#39;re just telling Vagrant to provision using Chef Solo, telling it where to find our cookbooks, and which recipes to use. After we&#39;ve got those changes in place, we run &lt;code&gt;vagrant up&lt;/code&gt; to have Vagrant initialize and provision our virtual machine.&lt;/p&gt;

&lt;p&gt;At this point, you should be able to &lt;code&gt;vagrant ssh&lt;/code&gt; into your box and run &lt;code&gt;ruby -v&lt;/code&gt; to confirm that everything went as planned. Vagrant will also yell at you during the provisioning phase if something about the process didn&#39;t go according to plan.&lt;/p&gt;

&lt;h3&gt;The finale&lt;/h3&gt;

&lt;p&gt;So what have we really accomplished here? Well, we&#39;ve created a simple, automated, and portable way for you to setup all the dependencies for your project &lt;em&gt;without&lt;/em&gt; cluttering your system. No more &quot;works on my system&quot;, no more cross-contamination from projects. And if you&#39;re on Windows now, no more &quot;only supported on *nix&quot; frustrations. Let&#39;s take a look at what a new developer coming onto the project would need to do to get setup:&lt;/p&gt;

&lt;script src=&quot;https://gist.github.com/2564740.js?file=finale&quot;&gt;&lt;/script&gt;


&lt;p&gt;Take a moment to look at that...&lt;/p&gt;

&lt;h3&gt;Four. Commands.&lt;/h3&gt;

&lt;p&gt;Four commands and you&#39;ve checkout out the project from version control and setup a clean, fully provisioned, and isolated virtual machine to do your development in.&lt;/p&gt;

&lt;p&gt;As you can see, Vagrant, Chef, and Librarian make a seriously powerful addition to your development arsenal. As such, there&#39;s a lot more things you can do with them; here&#39;s some links to get you started:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://vagrantup.com/v1/docs/index.html&quot;&gt;Vagrant Documentation&lt;/a&gt; -- more detail on how you can use Vagrant to setup virtual development environments.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.opscode.com/display/chef/Chef+Solo&quot;&gt;Chef Solo Wiki&lt;/a&gt; -- more detail on how you can use Chef Solo to provision your Vagrant box.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/applicationsonline/librarian/blob/master/README.md&quot;&gt;Librarian README&lt;/a&gt; -- more detail on how you can use Librarian to manage your chef cookbooks and recipes.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/opscode/cookbooks&quot;&gt;Opscode&#39;s cookbooks&lt;/a&gt; -- the company behind Chef maintains this repository of cookbooks.&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Now, with more Jekyll</title>
        <link href="http://blog.base2.io/2012/04/30/now-with-more-jekyll/"/>
        <updated>2012-04-30T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2012/04/30/now-with-more-jekyll</id>
        <content type="html">&lt;p&gt;We&#39;ve let our blog languish for a long time now -- while talking about the reasons behind that, one thing that kept coming up is that it didn&#39;t seem like it was part of our normal workflow. In an attempt to remedy some of that, we&#39;ve switched over from &lt;a href=&quot;http://blogger.com&quot;&gt;Blogger&lt;/a&gt; to &lt;a href=&quot;https://github.com/mojombo/jekyll/wiki&quot;&gt;Jekyll&lt;/a&gt; (via &lt;a href=&quot;http://pages.github.com&quot;&gt;Github Pages&lt;/a&gt;).&lt;!-- #REST#BEGIN --&gt; Below are a few of the advantages we&#39;ve found so far:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complete control over the presentation.&lt;/li&gt;
&lt;li&gt;Familiar (git style) workflow (branch, write, test, merge, push).&lt;/li&gt;
&lt;li&gt;Dead-simple local testing with &lt;code&gt;jekyll --server&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Free, reliable hosting on Github.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;So far, the experience has been great. We&#39;re actually &lt;em&gt;excited&lt;/em&gt; about writing new posts now. And hey, we&#39;ve posted again so that&#39;s good... right?&lt;/p&gt;

&lt;h3&gt;Further Reading&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://pages.github.com/&quot;&gt;Github Pages&lt;/a&gt; -- First steps to getting a site setup using Jekyll on Github Pages.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mojombo/jekyll/wiki/Usage&quot;&gt;Jekyll Usage&lt;/a&gt; -- A good primer on the concepts involved.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mojombo/jekyll/wiki/yaml-front-matter&quot;&gt;YAML Front Matter&lt;/a&gt; -- How you associate metatdata with your posts and pages.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://liquidmarkup.org/&quot;&gt;Liquid Markup&lt;/a&gt; -- The templating language used by Jekyll.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/mojombo/jekyll/wiki/Sites&quot;&gt;Jekyll Sites&lt;/a&gt; -- A list of sites using Jekyll that can help you understand how Jekyll is used in the wild.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://developmentseed.org&quot;&gt;Development Seed&lt;/a&gt; has a &lt;a href=&quot;http://developmentseed.org/blog/2011/09/09/jekyll-github-pages/&quot;&gt;great article&lt;/a&gt; on their reasoning for switching to Jekyll.&lt;/li&gt;
&lt;/ul&gt;


&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
    <entry>
        <title>Open For Business!</title>
        <link href="http://blog.base2.io/2011/08/26/open-for-business/"/>
        <updated>2011-08-26T00:00:00-04:00</updated>
        <id>http://blog.base2.io/2011/08/26/open-for-business</id>
        <content type="html">&lt;p&gt;We are proud to announce that Base Two Interactive, a creative digital agency based in Columbus, Ohio, co-founded by former Clutch Interactive employees Andrew Miller and Zack Brown, has officially opened for business. Our team has delivered innovative digital content for agencies, local businesses, and multinational companies, including McGraw-Hill, Home Depot, Wendy’s, Cardinal Health, Limited Brands, Donatos, The Ohio State University, Resource Interactive, and Mills James.&lt;/p&gt;

&lt;!-- #REST#BEGIN --&gt;


&lt;p&gt;Developing interactive experiences is our passion. We leverage Flash, Flex, AIR, and HTML5 to deliver engaging content for the web and desktop, tablets and mobile devices, kiosks and digital signage. Our attention to detail and deep understanding of software architecture and best practices enables us to consistently deliver for our clients.&lt;/p&gt;

&lt;p&gt;We take a lot of pride in our work. We also take a lot of pride in where we work. Our offices are located at &lt;del&gt;1158 Corrugated Way&lt;/del&gt; (our new location is 21 E. 5th Ave #102, Columbus, OH 43201), in the brand-new tech wing of the Columbus Idea Foundry, our business development partner. The Columbus Idea Foundry is Columbus’s own community workshop, DIY learning center, creative space, and small business incubator. We are very excited to have the opportunity to collaborate with The Columbus Idea Foundry and its member businesses.&lt;/p&gt;

&lt;p&gt;We are always looking for opportunities to make creative, interactive content. If you would like to contact us, send us an email at &lt;a href=&quot;mailto:info@base2.io&quot;&gt;info@base2.io&lt;/a&gt; or call us at (614) 636-0003.&lt;/p&gt;

&lt;!-- #REST#END --&gt;

</content>
    </entry>
    
</feed>