├── 404 └── index.html ├── CNAME ├── assets ├── data │ ├── 404 │ │ └── index.json │ ├── asp-net-40-to-asp-net-core │ │ └── index.json │ ├── fix-my-computer │ │ └── index.json │ ├── one-simple-rule-for-successful-consulting │ │ └── index.json │ ├── signalr-logging │ │ └── index.json │ ├── enhancing-your-applications-for-windows-7 │ │ └── index.json │ ├── simple-html-formatting-in-sublime-text │ │ └── index.json │ ├── learn-about-windows-7-task-dialogs │ │ └── index.json │ ├── wildcard-search-with-linq │ │ └── index.json │ ├── powershell-how-to-recursively-delete-files-based-of-file-extension │ │ └── index.json │ ├── 50-ways-to-avoid-find-and-fix-asp-net-performance-issues │ │ └── index.json │ ├── interview-with-michael-rollins-for-hrdevfest-2016 │ │ └── index.json │ ├── if-you-reach-just-one-person │ │ └── index.json │ ├── specifying-visual-studio-version-in-npm-installs │ │ └── index.json │ ├── base-gitignore │ │ └── index.json │ ├── exploring-csharp70-out-variables │ │ └── index.json │ ├── quick-introduction-to-signalr-streaming │ │ └── index.json │ ├── named-callbacks-in-javascript │ │ └── index.json │ ├── how-to-run-visual-studio-code-from-zsh-on-mac-osx │ │ └── index.json │ ├── online-vs-retail-stores │ │ └── index.json │ ├── how-to-run-visual-studio-code-from-terminal-on-mac-osx │ │ └── index.json │ ├── preloading-multiple-audio-tags-in-internet-explorer-9 │ │ └── index.json │ ├── no-matter-what-you-do-add-value │ │ └── index.json │ ├── console-games-why-do-we-have-to-press-start │ │ └── index.json │ ├── mongodb-setting-ttl-on-documents │ │ └── index.json │ ├── review-7-recurring-revenue-recipes-for-freelancers │ │ └── index.json │ ├── swift-kick-show-unbelievable-and-complex-advancements-in-machine-learning-with-ankur-kalra │ │ └── index.json │ ├── moving-on-to-greener-pastures │ │ └── index.json │ ├── calendar-roulette │ │ └── index.json │ ├── the-10-rule-to-presentations │ │ └── index.json │ ├── user-group-food │ │ └── index.json │ ├── a-diet-programmers-can-relate-to │ │ └── index.json │ ├── my-attempt-at-linq-pagination │ │ └── index.json │ ├── building-better-connectionstrings-with-connectionstringbuilder │ │ └── index.json │ ├── running-a-conference-like-a-startup │ │ └── index.json │ ├── swift-kick-show-nosql-shouldnt-mean-nosecurity-with-matt-groves │ │ └── index.json │ ├── leaving-it-better-than-you-found-it │ │ └── index.json │ ├── banks-atms-and-horrible-user-experiences │ │ └── index.json │ ├── are-we-too-dependent-on-the-internet │ │ └── index.json │ ├── node-js-using-require-to-load-your-own-files │ │ └── index.json │ ├── the-zen-of-free-labor │ │ └── index.json │ ├── speaker-gifts │ │ └── index.json │ ├── good-bye-email │ │ └── index.json │ ├── maintaining-signalr-connectionids-across-page-instances │ │ └── index.json │ ├── book-review-financially-stupid-people-are-everywhere │ │ └── index.json │ ├── open-source-mentality-of-choosing-your-tech-stack │ │ └── index.json │ ├── beating-email-addiction │ │ └── index.json │ ├── definition-of-a-computer-scientist │ │ └── index.json │ ├── user-group-sponsor-relationship │ │ └── index.json │ ├── colossal-failures │ │ └── index.json │ ├── about-blog-posts │ │ └── index.json │ ├── i-suck-at-writing-unit-tests │ │ └── index.json │ ├── index.json │ ├── using-unity-for-dependency-injection-with-signalr │ │ └── index.json │ ├── what-makes-a-good-bug-report │ │ └── index.json │ └── signalr-transports-explained │ │ └── index.json ├── static │ ├── favicon.1539b60.9bb7ffafafc09ac851d81afb65b8ef59.png │ ├── favicon.62d22cb.9bb7ffafafc09ac851d81afb65b8ef59.png │ ├── favicon.7b22250.9bb7ffafafc09ac851d81afb65b8ef59.png │ ├── favicon.ac8d93a.9bb7ffafafc09ac851d81afb65b8ef59.png │ ├── favicon.b9532cc.9bb7ffafafc09ac851d81afb65b8ef59.png │ ├── favicon.ce0531f.9bb7ffafafc09ac851d81afb65b8ef59.png │ ├── favicon.dc0cdc5.9bb7ffafafc09ac851d81afb65b8ef59.png │ └── favicon.f22e9f3.9bb7ffafafc09ac851d81afb65b8ef59.png ├── js │ ├── page--node-modules-gridsome-app-pages-404-vue.e4711ebb.js │ ├── page--src-templates-article-vue.fe6cfc9d.js │ └── page--src-pages-index-vue.e8d64122.js └── css │ └── 0.styles.dc844d61.css ├── README.md ├── 404.html ├── asp-net-40-to-asp-net-core └── index.html ├── one-simple-rule-for-successful-consulting └── index.html ├── fix-my-computer └── index.html ├── enhancing-your-applications-for-windows-7 └── index.html ├── simple-html-formatting-in-sublime-text └── index.html ├── signalr-logging └── index.html ├── wildcard-search-with-linq └── index.html ├── learn-about-windows-7-task-dialogs └── index.html ├── 50-ways-to-avoid-find-and-fix-asp-net-performance-issues └── index.html ├── interview-with-michael-rollins-for-hrdevfest-2016 └── index.html ├── powershell-how-to-recursively-delete-files-based-of-file-extension └── index.html ├── specifying-visual-studio-version-in-npm-installs └── index.html ├── if-you-reach-just-one-person └── index.html ├── base-gitignore └── index.html ├── exploring-csharp70-out-variables └── index.html └── quick-introduction-to-signalr-streaming └── index.html /CNAME: -------------------------------------------------------------------------------- 1 | v3.kevgriffin.com -------------------------------------------------------------------------------- /assets/data/404/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":null,"context":{}} -------------------------------------------------------------------------------- /assets/static/favicon.1539b60.9bb7ffafafc09ac851d81afb65b8ef59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1kevgriff/kevgriffin.v3.public/master/assets/static/favicon.1539b60.9bb7ffafafc09ac851d81afb65b8ef59.png -------------------------------------------------------------------------------- /assets/static/favicon.62d22cb.9bb7ffafafc09ac851d81afb65b8ef59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1kevgriff/kevgriffin.v3.public/master/assets/static/favicon.62d22cb.9bb7ffafafc09ac851d81afb65b8ef59.png -------------------------------------------------------------------------------- /assets/static/favicon.7b22250.9bb7ffafafc09ac851d81afb65b8ef59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1kevgriff/kevgriffin.v3.public/master/assets/static/favicon.7b22250.9bb7ffafafc09ac851d81afb65b8ef59.png -------------------------------------------------------------------------------- /assets/static/favicon.ac8d93a.9bb7ffafafc09ac851d81afb65b8ef59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1kevgriff/kevgriffin.v3.public/master/assets/static/favicon.ac8d93a.9bb7ffafafc09ac851d81afb65b8ef59.png -------------------------------------------------------------------------------- /assets/static/favicon.b9532cc.9bb7ffafafc09ac851d81afb65b8ef59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1kevgriff/kevgriffin.v3.public/master/assets/static/favicon.b9532cc.9bb7ffafafc09ac851d81afb65b8ef59.png -------------------------------------------------------------------------------- /assets/static/favicon.ce0531f.9bb7ffafafc09ac851d81afb65b8ef59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1kevgriff/kevgriffin.v3.public/master/assets/static/favicon.ce0531f.9bb7ffafafc09ac851d81afb65b8ef59.png -------------------------------------------------------------------------------- /assets/static/favicon.dc0cdc5.9bb7ffafafc09ac851d81afb65b8ef59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1kevgriff/kevgriffin.v3.public/master/assets/static/favicon.dc0cdc5.9bb7ffafafc09ac851d81afb65b8ef59.png -------------------------------------------------------------------------------- /assets/static/favicon.f22e9f3.9bb7ffafafc09ac851d81afb65b8ef59.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1kevgriff/kevgriffin.v3.public/master/assets/static/favicon.f22e9f3.9bb7ffafafc09ac851d81afb65b8ef59.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | Add static files here. Files in this directory will be copied directly to `dist` folder during build. For example, /static/robots.txt will be located at https://yoursite.com/robots.txt. 2 | 3 | This file should be deleted. -------------------------------------------------------------------------------- /assets/js/page--node-modules-gridsome-app-pages-404-vue.e4711ebb.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[2],{231:function(n,t,e){"use strict";e.r(t);var s=e(44),u=Object(s.a)({},(function(){var n=this.$createElement;return(this._self._c||n)("h1",[this._v("404 - not found")])}),[],!1,null,null,null);t.default=u.exports}}]); -------------------------------------------------------------------------------- /assets/data/asp-net-40-to-asp-net-core/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"6df6717ba25e2bbd30775394f5c94a54","title":"Upgrading Your ASP.NET 4.0+ Skills to ASP.NET Core","date":"April 12, 2019","categories":["ASP.NET Core"],"permalink":"asp-net-40-to-asp-net-core","content":"

Have you recently attended one of my talks on \"Upgrading Your ASP.NET 4.0+ Skills to ASP.NET Core\"?

\n

I hope you enjoyed it! I would love to chat more about any questions you have!

\n

CodeStock 2019 Slides

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/fix-my-computer/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"86cc49c6fca10bb607b5ecb667fcfe1d","title":"Fix My Computer","date":"May 02, 2017","categories":[],"permalink":"fix-my-computer","content":"

I get a lot of requests for companies in the Norfolk and Virginia Beach area that fix personal computers. Here are a couple references that I think are looking at.

\n
\n

These references come from friends of mine in the industry. I have not vetted any of these companies. Your milage might vary.

\n
\n

P&P PC\n2468 East Little Creek Road, Norfolk VA 23518\n(757)-531-3196\nhttp://www.pandppc.com

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/one-simple-rule-for-successful-consulting/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"ac480ffeee01d9a3c40a5fad081d2a98","title":"One Simple Rule for Successful Consulting","date":"September 03, 2014","categories":["Business"],"permalink":"one-simple-rule-for-successful-consulting","content":"

When you're suggesting business decisions for a client, think about it this way:

\n
\n

If you were to flip the roles, would you take the advice you are offering?

\n
\n

Simply put: when I recommend tools, technologies, and other solutions to my clients, I want to always make sure that the suggestion I am providing is something I would do for my own business.

\n

Do that, and the clients will always keep coming back.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/signalr-logging/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"4d72e21480ae1e68d6c9295e2cdfbf84","title":"Enable SignalR Logging with One Simple Line","date":"August 28, 2015","categories":["Development - ASP.NET"],"permalink":"signalr-logging","content":"

It is easy to think that SignalR works within a black box, but if you are deploying JavaScript clients, here is an EASY trick to learning what is happening underneath the scenes.

\n

Before you start your connection, add this ONE line of code:

\n
$.connection.hub.logging = true;\n$.connection.hub.start();\n
\n

Tada! You have logging in your browser console:

\n

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/js/page--src-templates-article-vue.fe6cfc9d.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[4],{221:function(t,e,n){},222:function(t,e){},225:function(t,e,n){"use strict";var a=n(221);n.n(a).a},226:function(t,e,n){"use strict";var a=n(222),i=n.n(a);e.default=i.a},229:function(t,e,n){"use strict";n.r(e);var a={metaInfo:function(){return{title:this.$page.article.title}}},i=(n(225),n(44)),c=n(226),s=Object(i.a)(a,(function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("Layout",[n("div",{staticClass:"article"},[n("h1",[t._v(t._s(t.$page.article.title))]),n("span",[t._v(t._s(t.$page.article.date))]),n("div",{directives:[{name:"g-image",rawName:"v-g-image"}],staticClass:"content",domProps:{innerHTML:t._s(t.$page.article.content)}})])])}),[],!1,null,null,null);"function"==typeof c.default&&Object(c.default)(s);e.default=s.exports}}]); -------------------------------------------------------------------------------- /assets/data/enhancing-your-applications-for-windows-7/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"7331a97f5bfccda9e150ee7624598e0a","title":"Enhancing Your Applications For Windows 7","date":"November 17, 2009","categories":["Development"],"permalink":"enhancing-your-applications-for-windows-7","content":"

I invite you to head over to Developer Fusion, and read my article on "Enhancing Your Applications For Windows 7”.  If you haven’t played with the Windows 7 API Code Pack yet, I definitely recommend it.

http://www.developerfusion.com/article/70531/enhancing-your-applications-for-windows-7/

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/simple-html-formatting-in-sublime-text/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"730","title":"Simple HTML Formatting in Sublime Text","date":"February 27, 2013","categories":["Development"],"permalink":"simple-html-formatting-in-sublime-text","content":"

One common questions I've asked and seen asked quite a bit about Sublime Text is how to quickly and easily format HTML while editing.  There isn't a default key binding for this, but if you select all text and then go to:

\n
Edit -> Lines -> Reindent
\n

Want to create your own keybinding?  Go to Preferences, Key Bindings - User and add this line:

\n
{ \"keys\": [\"ctrl+shift+r\"], \"command\": \"reindent\" , \"args\": {\"single_line\": false}}
\n

Enjoy!

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/js/page--src-pages-index-vue.e8d64122.js: -------------------------------------------------------------------------------- 1 | (window.webpackJsonp=window.webpackJsonp||[]).push([[3],{223:function(e,t,n){},224:function(e,t){},227:function(e,t,n){"use strict";var a=n(223);n.n(a).a},228:function(e,t,n){"use strict";var a=n(224),i=n.n(a);t.default=i.a},230:function(e,t,n){"use strict";n.r(t);var a={},i=(n(227),n(44)),r=n(228),s=Object(i.a)(a,(function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("Layout",{staticClass:"home"},[n("ul",e._l(e.$page.allArticle.edges,(function(t){var a=t.node;return n("li",{key:a.id},[n("router-link",{attrs:{to:a.permalink}},[n("h2",{directives:[{name:"g-image",rawName:"v-g-image"}],domProps:{innerHTML:e._s(a.title)}})]),n("span",{directives:[{name:"g-image",rawName:"v-g-image"}],domProps:{innerHTML:e._s(a.date)}})],1)})),0)])}),[],!1,null,"0079142a",null);"function"==typeof r.default&&Object(r.default)(s);t.default=s.exports}}]); -------------------------------------------------------------------------------- /assets/data/learn-about-windows-7-task-dialogs/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"635","title":"Learn about Windows 7 Task Dialogs","date":"December 01, 2009","categories":["Development"],"permalink":"learn-about-windows-7-task-dialogs","content":"

Please take a few minutes and travel over to DeveloperFusion where my latest article on Windows 7 Task Dialogs has been published.  If you’ve never used a task dialog before, I would definitely recommend them.  I consider them “Message Box 2.0”.

http://www.developerfusion.com/article/71793/smarten-up-your-ui-with-task-dialogs-the-message-box-20/

Let me know what you think!

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/wildcard-search-with-linq/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"d849b5b8c0f9293bb98ae63eb9fc23b4","title":"Wildcard search with LINQ","date":"April 21, 2009","categories":["Development - C#"],"permalink":"wildcard-search-with-linq","content":"

I just a situation where I needed to perform a wildcard search on a table in my database.  When I used to do ADO.NET, I would simply write my SELECT statements with LIKE keywords to do wildcard searches.

\n

However, in this project, I'm using LINQ to Entities and the solution didn't work the same way as it did back in SQL land.  My alternative was to use the .Contains() method.

\n

For example:

\n
var userList = from u in entity.Users\nwhere u.FirstName.Contains(searchParameter) ||\nu.LastName.Contains(searchParameter)\nselect u;
\n

Hope this helps if you ever run into this problem.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/powershell-how-to-recursively-delete-files-based-of-file-extension/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"789","title":"Powershell: How to recursively delete files based of file extension?","date":"July 15, 2016","categories":["Development"],"permalink":"powershell-how-to-recursively-delete-files-based-of-file-extension","content":"

File this under \"took me WAY too long to figure out how to do\".

\n

I just finished doing a Git merge, and ran into an issue where my working folder was polluted with .orig files.

\n

I wanted to recursively delete all the .orig files. That is apparently harder than it sounds, because it took me 15 minutes to figure out the correct command line.

\n

So you don't go fumbling like I did:

\n
Get-ChildItem . -recurse -include *.orig | remove-item\n
\n

Replace . and *.orig accordingly. Have fun!

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/50-ways-to-avoid-find-and-fix-asp-net-performance-issues/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"728","title":"50 Ways to Avoid, Find and Fix ASP.NET Performance Issues","date":"January 25, 2013","categories":["Self Promotion"],"permalink":"50-ways-to-avoid-find-and-fix-asp-net-performance-issues","content":"

A couple weeks ago there was a public request on Twitter from the great folks at RedGate to provide tips and tricks for performance in ASP.NET applications.  Come to find out, they selected one of my tips and published it in their ebook \"50 Ways to Avoid, Find and Fix ASP.NET Performance Issues\".

\n

It's a free download: http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/entrypage/avoid-find-fix-asp-problems

\n

Go grab it today!

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/interview-with-michael-rollins-for-hrdevfest-2016/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"ba4f6877090896a3798ca6356dd14ec9","title":"Interview with Michael Rollins for HRDevFest 2016","date":"September 01, 2016","categories":["Community, User Groups, and Conferences"],"permalink":"interview-with-michael-rollins-for-hrdevfest-2016","content":"

Recently, I had the opportunity to sit down with my friend Michael Rollins to talk about life as a mobile SDK developer, drones, and his upcoming HRDevFest keynote on growth through suffering.

\n

Watch the interview for yourself! Get your tickets for HRDevfest at http://hrdevfest.org!

\n\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/if-you-reach-just-one-person/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"660","title":"If You Reach Just One Person","date":"March 29, 2010","categories":["Deep Thoughts"],"permalink":"if-you-reach-just-one-person","content":"

After giving a talk, it’s really difficult to judge if you reached any of the attendee’s.  Normally, you get the occasional “good job” or “thanks, that was a big help.”  Today I got a small mention by Johnathan Bracken, who was sitting in my jQuery From The Ground Up talk at Roanoke Code Camp.  This means a lot, because it shows that my talk stayed in Johnathan’s head past the end of the talk. 

He just started blogging, and mentioned me in his entry I Will Not Run from JavaScript No More. This is very cool to see.  I wish Johnathan the best of luck in his jQuery adventures!  And I expect him to give a jQuery talk at next year’s code camp.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/specifying-visual-studio-version-in-npm-installs/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"b0498a5be32fa46e7c187e1066303b38","title":"Specifying Visual Studio Version in NPM Installs","date":"May 14, 2013","categories":["Development"],"permalink":"specifying-visual-studio-version-in-npm-installs","content":"

Sometimes when you install a NPM package, you'll run into an issue like this:

\n
C:\\Program Files (x86)\\MSBuild\\Microsoft.Cpp\\v4.0\\V110\\Microsoft.Cpp.Platform.targets(35,5): error MSB8020: The builds tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found. To build using the v100 build tools, either click the Project menu or right-click the solution, and then select \"Update VC++ Projects...\". Install Visual Studio 2010 to build using the Visual Studio 2010 build tools.
\nNormally you'll get this if you're only running VS2012 and it wants VS2010/VS2008.  You can ask NPM to use Visual Studio 2012 instead by using with \"--msvs_version=2012\" command.\n

Example:

\n
npm install socket.io --msvs_version=2012
\nTada.  This should work almost every time.\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/css/0.styles.dc844d61.css: -------------------------------------------------------------------------------- 1 | *{margin:0;padding:0}a{color:#4dba87;text-decoration:none}h1,h2,h3,h4,h5,h6{font-family:Mali,cursive}h1{font-size:48px}h6{font-size:20px}body{font-family:Nunito,sans-serif;margin:0;font-size:16px;padding:0}.heading-link{color:#000;text-decoration:none}.layout{max-width:600px;margin:0 auto;padding-left:20px;padding-right:20px;margin-top:30px;margin-bottom:50px}.heading{margin-bottom:20px;font-family:Mali,cursive;font-weight:700}.article{margin-top:15px}.article h1{font-size:40px}.article img{width:100%;border-radius:5px}.article a{color:#4dba87;text-decoration:underline}.article a:hover{text-decoration:none}.article span{font-size:80%;margin-bottom:20px}.article ol,.article ul{list-style-position:outside}.article ul{list-style:disc;padding-left:20px}.article .content p:first-child{margin-top:15px}.article .content p{margin-top:0;margin-bottom:10px;line-height:1.5}.home[data-v-0079142a] .heading{margin-bottom:70px}ul[data-v-0079142a]{list-style:none;padding:0}ul li[data-v-0079142a]{margin-bottom:20px}ul li a h2[data-v-0079142a]{margin-bottom:10px}span[data-v-0079142a]{font-size:80%;padding:0}ul li p[data-v-0079142a]:first-child{margin-top:3px}ul li p[data-v-0079142a]{margin:0;line-height:1.5} -------------------------------------------------------------------------------- /assets/data/base-gitignore/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"ddb253a45d051681c18b3ef24678dcee","title":"My Defacto .gitignore file","date":"November 12, 2012","categories":["Development"],"permalink":"base-gitignore","content":"

Every time I create a new Git repo, I always have to go look for a previous copy of my .gitignore file.  I thought it would be a great idea to just post it up for all to find, in case they were looking for it.  This particular file is built around Visual Studio projects.

\n
# Ignore file for Visual Studio\n\n# use glob syntax\nsyntax: glob\n\n# Ignore Config files with keys and passwords\n#ServiceConfiguration*.cscfg\n#Web*.config\n#App*.config\n\n# Ignore Visual Studio files\n*.obj\n#*.exe\n#*.pdb\n*.user\n*.aps\n*.pch\n*.vspscc\n*.vshost.*\n*_i.c\n*_p.c\n*.ncb\n*.suo\n*.tlb\n*.tlh\n*.bak\n*.cache\n*.ilk\n*.log\n*.lib\n*.sbr\n*.scc\n*.orig\nUpgradeLog*.*\nUpgradeReport*.*\n[Bb]in\n[Dd]ebug*/\nobj/\n[Rr]elease*/\n_ReSharper*/\n[Tt]est[Rr]esult*\n[Bb]uild[Ll]og.*\n*.[Pp]ublish.xml\nglob:*.vs10x\n*.ReSharper\n[Pp]ublish\n[Rr]eleaseFiles\n[Cc]sx/\n[Bb]ackup1/\n[Pp]ackages/\n\n# Mac Files\n.DS_Store\n*.DS_Store\n._*
\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/exploring-csharp70-out-variables/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"37e68e98e8c0f867d2dd9d83f025b71a","title":"Exploring C# 7.0: Out Variables","date":"November 08, 2016","categories":["Development - C#"],"permalink":"exploring-csharp70-out-variables","content":"

In this series, I want to explore a couple of the new C# 7.0 features coming down the pipeline. As with most things, I am working with preview bits, so these features are not guaranteed to work the same way in production.

\n

Using the out keyword within C# is nothing new. If you declare a variable within a method called with out, you are instructing the compile that you are expecting the method to set the values of those at runtime.

\n\n

Commonly the problem is that you have to declare the variable before the method call using out. In C# 7.0, there is the concept of out variables, which will save you a couple keystrokes by allowing you to declare the variable inline.

\n

The above example can be quickly refactored:

\n\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/quick-introduction-to-signalr-streaming/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"86656586be640a54d6709456394b3a31","title":"Quick Introduction to SignalR Streaming","date":"December 13, 2018","categories":["ASP.NET Core"],"permalink":"quick-introduction-to-signalr-streaming","content":"

For my entry this year for C# Advent, I wanted to do something a little bit different.

\n

As of late, I've been wanting to start doing several tidbits around cool things that I see in .NET Core and ASP.NET Core. And by the recommendation of my friend, Brady Gaster, I took a look at the new Streaming APIs built into SignalR (for ASP.NET Core).

\n

And WOW! I'm super impressed with that I saw.

\n

Check out my video introduction below, and lemme know what you think in the comments!

\n\n

Source code for this project is available at on GitHub.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/named-callbacks-in-javascript/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"07a60d2a81a5f467d244f11ba37c03b9","title":"Named Callbacks in JavaScript","date":"August 06, 2013","categories":["Development"],"permalink":"named-callbacks-in-javascript","content":"

You've been taught bad JavaScript for years and years.  What do I mean?  I'm sure you've written code like this more than once in your career:

\n
someMethod(function (){\n     console.log(\"doing stuff...\");\n});
\n

So what's wrong with that?  It runs and doesn't error.  Heck, even JSLint won't complain about it.  But what happens something goes wrong inside of your callback?  Most debuggers will list the callback as an \"anonymous method\" in the call stack.  Not very helpful is it?  Isn't there something simple we can do make our callbacks easier to read in a call stack?

\n

NAME YOUR CALLBACKS.

\n

Take the example above, and let's name the callback.

\n
someMethod(function myCallback(){\n     console.log(\"doing stuff...\");\n});
\n

Simple!  Let's imagine doing a jQuery AJAX call with this approach (and yes, I'm ignore the fact that you should use promises -- which are WAY better):

\n
$.ajax({\n  url: \"/myUrl\",\n  success: function onAjaxSuccess (data){\n           },\n  error: function onAjaxError (error) {\n           }\n});
\n

You're welcome :)

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/how-to-run-visual-studio-code-from-zsh-on-mac-osx/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"74ca8ce609f7fb286f29f707f28292b2","title":"How to run Visual Studio Code from Zsh on Mac OSX","date":"May 07, 2015","categories":["Development"],"permalink":"how-to-run-visual-studio-code-from-zsh-on-mac-osx","content":"

EDIT: You can just do this from Visual Studio Code now.

\n

Using Visual Studio Code on your Mac, but can't call it from Zsh?

\n

Using Terminal? Go here

\n

Currently, there isn't an automatic method for doing this, but with a little code in your .zshrc file, you can configure it.

\n
function code {\n    if [[ $# = 0 ]]\n    then\n        open -a \"Visual Studio Code\"\n    else\n        local argPath=\"$1\"\n        [[ $1 = /* ]] && argPath=\"$1\" || argPath=\"$PWD/${1#./}\"\n        open -a \"Visual Studio Code\" \"$argPath\"\n    fi\n}\n
\n

Then from Terminal you can type:

\n

code -- opens Visual Studio Code
\ncode . -- opens current directory in Visual Studio Code
\ncode somefile -- opens somefile in Visual Studio Code

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/online-vs-retail-stores/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"bb584ed1c48ebbe9cef2b3add310561d","title":"Online vs. Retail Stores","date":"April 19, 2010","categories":["Deep Thoughts"],"permalink":"online-vs-retail-stores","content":"

Something amazing happened the other day.

\n

I wanted to purchase a copy of Splinter Cell: Convinction.  After a little bit of surfing online, I discovered that Walmart had it on sale for $50 (compared to the regular $59.99).  So I drove up to the local Walmart, and walked over to the Video Games section.  Come to discover that the game was $59.99, instead of the $50 I saw online.  Come to discover, the $50 was an “online only price”.

\n

As any good consumer would do, I pulled out my Android phone and started the Amazon app.  Splinter Cell: Conviction was available for $50, and also eligible for free shipping.  Click… click… and I was finished ordering the game… on my phone… while staring at the game in the cabinet.  So instead of giving Walmart my money, I gave it to Amazon.  I was even willing to pay tax to walk out of the store with it right then and there.

\n

There are drawbacks to online stores.  I do have to wait several days for my order, and sometimes that’s not acceptable.  However, when you run an online store along side a brick and mortar, you should be trying to compete more with other online retailers.  “Online only” prices are idiotic, and will only convince me to go to another retailer.  If you advertise a price online, I should be able to go to store and pick up the same item for the same price.

\n

Good job Walmart.  Ask Amazon how they enjoy my money.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/how-to-run-visual-studio-code-from-terminal-on-mac-osx/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"77423fbc4d75298119994fcecb3318d7","title":"How to run Visual Studio Code from Terminal on Mac OSX","date":"May 07, 2015","categories":["Development"],"permalink":"how-to-run-visual-studio-code-from-terminal-on-mac-osx","content":"

Edit 06/24/2016: You can just do this from Visual Studio Code now.

\n

Edit 12/10/2015: Thanks for commenter on letting know that latest release of Code broke original post. Updated with code from documentation.

\n

Using Visual Studio Code on your Mac, but you want to use it in Terminal?

\n

Using Zsh? Go here

\n

Currently, there isn't an automatic method for doing this, but with a little code in your ~/.bash_profile file, you can configure it.

\n
code () { VSCODE_CWD=\"$PWD\" open -n -b \"com.microsoft.VSCode\" --args $* ;}\n
\n

Then from Terminal you can type:

\n

code -- opens Visual Studio Code
\ncode . -- opens current directory in Visual Studio Code
\ncode somefile -- opens somefile in Visual Studio Code

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/preloading-multiple-audio-tags-in-internet-explorer-9/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"606735ebe5e34f268e8e8047196ef22d","title":"Preloading Multiple Audio Tags in Internet Explorer 9","date":"November 02, 2012","categories":["Development"],"permalink":"preloading-multiple-audio-tags-in-internet-explorer-9","content":"

I had a unique problem.  I have an app I'm working on where I needed to preload about 50 audio files for use during the page's lifetime.  If you're up on your HTML5-fu, this is a simple task:

\n
\n<audio id=\"myAudio\" controls preload=\"auto\">\n     <source src=\"/my-podcast.mp3\" />\n     <source src=\"/my-podcast.ogg\" />\n</audio>\n
\n

In Chrome, this works PERFECTLY (as it should).

\n

In Internet Explorer, several (if not all) files will fail to preload.  Here's how to figure it:

\n
\nvar audioElement = document.getElementById(\"myAudio\");\nconsole.log(audioElement.networkState);\n
\n

Network state can have 3 options: NETWORK_EMPTY, NETWORK_IDLE, NETWORK_LOADING, NETWORK_NO_SOURCE.

\n

You \"want\" it to be IDLE, because that means the file is loaded.  Typically, you'll get NO_SOURCE with Internet Explorer.

\n

What's a quick fix?  First, make sure there is no preload attribute, and then do this:

\n
\nvar audioElement = document.getElementById(\"myAudio\");\naudioElement.load(); // kicks off the load\n
\n

This has worked for me in 100% of the tests I've done tonight.  Feel free to comment on other solutions.  I haven't tested in IE10 yet, so I cannot be certain of how it works.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/no-matter-what-you-do-add-value/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"b9522a619013a214e32bae9c9dfcfd0f","title":"No matter what you do: add value","date":"May 14, 2015","categories":["Deep Thoughts"],"permalink":"no-matter-what-you-do-add-value","content":"

Yesterday I had the pleasure of chatting with a gentleman about a potential mentoring gig. The way I like to approach these sort of talks is to determine high level goals. In this case, the client was looking for someone to be a set of expert eyes on a codebase. He is certainly a capable developer, but he's also aware enough to know when he has hit a roadblock.

\n

We were connected by the work and training I've done with SignalR and ASP.NET, which would prove especially useful in this situation.

\n

The client discussed the issues he was running into and the thoughts he had around solutions. Normally, this is where you will have the instinct to want to hold off providing guidance. You're the expert. This what people should be paying you for!

\n
\n

Always try to add some value.

\n
\n

That's not how I reacted though. Instead, I spent 10 minute giving my potential-client two or three free tips and tricks on what he should explore. Sometimes the simplest tip is all a person needs to push forward.

\n

The underlying point is that no matter what you do, always try to add some value. If my tips bring him to an epiphany, then I have automatically reaffirmed that I am an expert. This could lead to mentoring and other potential work. It could lead to referrals.

\n

Approach all your interactions as a chance to provide value to someone. It will pay back dividends!

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/console-games-why-do-we-have-to-press-start/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"8ddf128628750a352b9b4cf1e24aff07","title":"Console Games: Why do we have to press start?","date":"January 05, 2010","categories":["Development - Game Development"],"permalink":"console-games-why-do-we-have-to-press-start","content":"

Interesting question came up on Twitter the other day:

“Press Start” screens?  Why can’t I just go straight to the main menu?

If you’re a gamer, especially on consoles, you’ve seen this screen more often than you’d care to.  It’s a little annoyance.  However, there is a very good reason for having this screen in place.

Imagine you’re running four controller on your Xbox, and all four of them are turned on.  Then you put in a single player game, and it comes up to that annoying “Press Start” screen.  Which controller do you use to press start with?  The answer is easy: any of them!

The “Press Start” screen is designed to determine which controller the game should poll for input.  During this screen, the game is polling all connected controllers for input.  If any of them register a “start” button push, the game makes that controller the “default” controller.  The use-case for this scenario is that the player should be able to use any connected controller to play the game, and not be forced to use controller #1.  This is considered a best practice.

The More You Know

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/mongodb-setting-ttl-on-documents/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"e7324cc33e76c2495d339bfba0a8efc4","title":"MongoDB: Setting TTL on Documents","date":"October 13, 2014","categories":["Development"],"permalink":"mongodb-setting-ttl-on-documents","content":"

On some recent work I was doing with Winsitter, I needed an approach that would systematically remove documents after a specified period of time within MongoDB.

\n

Previously, I would have written cron jobs or helpers to clean up the old data. No longer!

\n

Come to discover, this feature already exists inside of MongoDB. It is called setting the TTL or Time to Live of a document.

\n

The process involves creating an index on the date object you'd like to watch. In the example below, I am providing a property on my document called auditDate. I want the document associated with that property to automatically remove itself after 5 days or 432000000 miliseconds.

\n
dbConnection\n.collection(\"audit\")\n.ensureIndex({\n    \"auditDate\": 1\n}, {\n    expireAfterSeconds: 432000000 // 5 days\n}, function(indexErr) {\n    if (indexErr) {\n        console.log(\"error creating index\");\n        console.log(indexErr);\n    }\n});\n
\n

In the example, I'm using the MongoDB node.js library to ensure an index exists. If the index doesn't exist, MongoDB will create it.

\n

The expireAfterSeconds options tells MongoDB that after a specified amount of time, the document should automatically remove itself.

\n

This quick fix has saved me a ton of time, and I am hoping it saves a ton for you too!

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/review-7-recurring-revenue-recipes-for-freelancers/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"3f5d596f8a977005bb8399c4c0b8a7e9","title":"Review: 7 Recurring Revenue Recipes for Freelancers","date":"February 16, 2015","categories":["Reviews"],"permalink":"review-7-recurring-revenue-recipes-for-freelancers","content":"

During a flight from Norfok to Charlotte, I had the opportunity to read Ryan Castillo's new book 7 Recurring Revenue Recipes for Freelancers.

\n

In this book, Ryan provides seven actionable sets of guidelines that provides the reader a path way to earning $150k a year. Ryan allows the reader to take a \"choose your own adventure\" to their career and bottom line.

\n

This book provides clear ways for readers who are already experienced freelancers or consultants to move their target forward. If you're new to the consulting game, Ryan also provides some great places to get started.

\n

Ryan's recipe on developing support contracts with new and existing clients definitely struck a cord with me. This is a problem I'm running into now with multiple clients, and I'm going to be able to put Ryan's suggestions into action within the next week. This book has the potential to make me an easy $25k extra each year.

\n

Many of the recommendations Ryan makes echo throughout the communities I'm involved in daily. Every day, people are putting these recipes into action and are seeing results!

\n

Ryan is currently pre-selling his book for $12, which is a drop in the bucket compared to what you will make if you put his receipes into adction.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/swift-kick-show-unbelievable-and-complex-advancements-in-machine-learning-with-ankur-kalra/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"93f93debfccd0b2c64fb1d31e4473d52","title":"Swift Kick Show - Unbelievable and Complex Advancements in Machine Learning with Ankur Kalra","date":"March 14, 2018","categories":["Swift Kick Show"],"permalink":"swift-kick-show-unbelievable-and-complex-advancements-in-machine-learning-with-ankur-kalra","content":"

On the March 14th episode of the Swift Kick Show, I was joined by my friend Ankur Kalra. I've known Ankur for many years as a member of a private bootstrapped business Slack group. He's been doing some really interesting work with Machine Learning - and I thought he'd be a great guest to have.

\n

Watch the video below, and check out the Swift Kick YouTube channel. Like and subscribe for more great videos!

\n

Unbelievable and Complex Advancements in Machine Learning with Ankur Kalra

\n
\n

As a technologist, it's an exciting time to be alive. Recent publications have revealed truly unbelievable results in machine learning, some of which raise interesting and complex ethical questions. In this talk, Ankur will walk through some recent papers that are both technically impressive as well as ethically complex. Though this talk is geared towards people with some minimal technical background, no prior machine learning experience is necessary.

\n
\n\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/moving-on-to-greener-pastures/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"22c307960f501696dfff1d293bdd6152","title":"Moving on to Greener Pastures","date":"May 25, 2011","categories":["Deep Thoughts"],"permalink":"moving-on-to-greener-pastures","content":"

After four years with my current company, Antech Systems, it is time for me to pack up and move on to greener pastures. 

I would like to publically thank Antech for providing me with a foundation to build my career off of.  I came to Antech as a college newbie, recently laid off from Symantec, with no .NET experience of any kind.  Within weeks, I was able to grow into a position where I was not only functional, but able to provide meaningful feedback about the applications being built and the processes use to build them.  Antech was the reason I found the developer community, and was one of the leading reasons why I started the Hampton Roads .NET Users Group.  Without them, I have no idea where I would be right now.

I’m pleased to announce that on June 1st, 2011, I’ll be starting my new position with ComponentOne as a Technical Evangelist. 

In this position, I’ll be working closely with Rich Dudley to help promote ComponentOne in the developer community.  As a Technical Evangelist, it is my goal to help you all in your communities in anyway possible.  Please feel free to use me as a resource.

If you’re going to be in the Kansas City area on June 25th, come out to the Kansas City Developer Conference to see me!  I’ll be talking about MVVM!  If you’re in the area, you should definitely come out.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/calendar-roulette/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"be588341c175c5e01ba091ced8831945","title":"Managing Your User Group: Calendar Roulette","date":"March 06, 2015","categories":["Community, User Groups, and Conferences"],"permalink":"calendar-roulette","content":"

One trait of successful user groups is don't play calendar roulette. Meaning: they chose a time or day each month to hold the group meeting.

\n
\n

We meet every 2nd Tuesday.

\n
\n

or

\n
\n

We are the last Thursday of the month.

\n
\n

Why is this important?
\nYou want your members to be able to determine meeting dates based off a quick glance of a calendar.
\nConsistency is key. If your meetings are in different venues or different days of the month, you're chancing that someone will forget and not be in attendance.

\n

What's a good night for meetings?
\nWith the Hampton Roads .NET Users Group, I chose the 2nd Tuesday of the month. Why? Because I felt Tuesdays were a better for my schedule. Only once in a 5 year period did I change the meeting.

\n

My recommendation is to choose a Tuesday, Wednesday, or Thursday. Mondays are bad for folks because it's the first day back to work after a short weekend. Fridays are bad because, dude, it's the weekend. PARTY TIME.

\n

Be careful with Wednesdays as well. Many church functions occur on Wednesday nights, and that might be limiting a percentage of your population.

\n

When is it okay to move the meeting?
\nLet's imagine you have a speaker coming into town that's \"a big deal\". But they're only able to meeting on Wednesday night, and your meetings are Tuesdays. MOVE THE MEETING. Make sure the change is well communicated, and that it's temporary. You might lose attendance that month, but people are adaptable. Just don't make it a habit.

\n

Conclusion
\nKeep scheduling simple. Hampton Roads .NET members knew where to go and when to be there every month of the year. If you build a level of consistency, you're going to have people showing up out of habit, and that's a recipe for a successful group.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/the-10-rule-to-presentations/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"d38be0fb4755434f76ec5fe269e45fb8","title":"The 10% Rule to Presentations","date":"March 24, 2016","categories":["Deep Thoughts"],"permalink":"the-10-rule-to-presentations","content":"

When mentoring new technical speakers, I like to cite what I call \"the 10% rule\".

\n

Think about it like this: If you are presenting on a 100-level topics (for example, \"Intro to Angular\" or \"Building Your First App with Elixir\"), you can safely assume that your audience is one of three types people.

\n

First, they are an absolute newbie who is there because they heard about this technology but have practically no experience with it.

\n

Second, they have been to previous talks on the subject or have read a couple tutorials. They are not starting at \"ground-zero\", but they are darn close.

\n

Third, they are seasoned or beyond 100-level, and they are looking to see if you offer new perspective.

\n

The 10% rule applies to the first two groups. Your job as the presenter is to try to leave the audience with 10% of the knowledge you have on a subject.

\n

Ten percent sound like a lot, right? Doesn't have to be. For most developers, this is seeing how pieces lay together or how do you do something from scratch.

\n

Ten percent might simply be \"what problem does the thing I'm showing you solve?\"

\n

My first set of presentations were around jQuery (2007 era). My intro talks discussed manipulating the DOM and listening for events. I'd discuss the \"hard\" way, but then showed how easy jQuery made it.

\n

If you're adventuring into 200 or 300-level talks, the same 10% rule can apply. Imagine you want to do a talk on \"new C# features\". Your expectation is that the audience is familiar with C#. Your 10% is going to be a simple list of what is new, with basic explanations.

\n

If the attendee goes home and runs into a scenario where a new feature would be useful, you have provided them with the foundation to research more.

\n

The 10% rule is meant to build foundations for learning. Expose audiences to ideas and concepts, and guide them towards better self-learning.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/user-group-food/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"f384023db3b5fc8d8dbaa01f827b8eed","title":"Managing Your User Group: Food","date":"October 13, 2015","categories":["Community, User Groups, and Conferences"],"permalink":"user-group-food","content":"

Edit: Based off some comments, I've included options for non-lovers of meat. Also added other comments.

\n

For a lot of user groups, food depends highly on the sponsor for the month.

\n

Let's keep this short and sweet: Sponsors. If your instinct is to order pizza for a user group meeting, your attendees already hate you.

\n

Think about it this way. A lot of people have an opportunity to sponsor a group. You want to be memorable. Pizza is not memorable.

\n

And you know what else? Sandwiches. This is the new pizza. If you think you're being clever and different by providing Jimmy Johns instead of pizza, your attendees hate you too.

\n

What could you do instead of pizza? What food would make your company memorable? Here are some ideas:

\n

Chipotle - When I spoke at Richmond .NET in October 2015, MaconIT brought Chiptole burritos. I'm talking about a box of freakin burritos.

\n

Taco Bar - Taco bars are fun, and they allow attendees to choose their own mexican adventure.

\n

Chick-Fil-A - Nugget tray. Enough said.

\n

PF Changs - How about some asian flair? Try a mini-buffet of PF Changs favorites.

\n

BBQ Buffet - Pulled pork, beans, coleslaw. Depending on the location, you can get a BBQ buffet for the same price as pizza for a group.

\n

Veggie/Vegan Options - I know, I know. The food above is all mostly of the animal protein category. Please don't forget people that don't eat meat. Salad choices and veggies go a long way. You'd be really surprised how many card-carrying meat eaters will dive into healthy choices. Not sure what Vegan's would eat? Ask one. They'd be more than happy to give you a couple dozen options.

\n

Don't get me wrong, pizza is awesome. Pizza in EXCESS is horrible (and to be fair, if you brought Chick-Fil-A every meeting -- that would probably get old too). Be good to your groups and don't buy pizza (or sandwiches). Look for creative alternatives. Attendees will love you.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/a-diet-programmers-can-relate-to/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"583","title":"A Diet Programmers Can Relate To","date":"February 06, 2009","categories":["Health"],"permalink":"a-diet-programmers-can-relate-to","content":"

Consider this: programmers are typically overweight.  It's our nature.  Ninety-five percent of our job is sitting behind a desk and hacking at a keyboard.  The most movement we get is walking to the bathroom, and going to our car to go to the drive thru.

\n

About a month ago, I was turned onto the Weight Watchers plan, and it immediately occurred to me that this is the perfect diet plan for developers.  Here is the gist of the plan:  You're allotted x number of points a day.  Points come from the foods and drinks you put into your body.  The number of points you're allowed is based on your gender, weight, height, and activity level.

\n

The points in a piece of food is determined by the number of calories, total fat, and fiber content of the food.  Anyone that pays to join Weight Watchers is given a calculator for determining the points.  In reality, it's just an equation.  Developers like equations.  We can understand equations.  Here is the equation for Weight Watchers Points:

\n

POINTS = (Calories / 50) + (Total Fat / 12) - (MIN(Fiber, 4) / 5)

\n

Ooooh.  That could easily be plugged into a script.  How does this fit into the real world?  My number of points allotted per day is 39.  There is a formula for figuring that out, but I've been unable to find it.  If/when I do, I'll post it here.  But for the record, I'm 6'1, 259 pounds and sit at a desk all day.  If you weigh more than I do, add 1 point per 10 pound increment (260 pounds is technically 40 points).  If you weight less, subtract 1 point per 10 pound increment.  If you are taller than me, add a point or two.  If you're shorter, subtract a point or two.  You should see what I mean.

\n

Say I go to Burger King, and buy a Whopper with cheese.  That weighs in at 19 pounds (the mayo kills it).  After eating a Whopper, I've already had half my number of points for the day.  Weight Watchers says that's cool, but be careful with your other 20 points.  You still eat what you want, just eat less of it and try to find better alternatives.

\n

So now you can do the Weight Watchers plan for free.  Use the points equation to do whatever you want.  Lose weight mathematically!

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/my-attempt-at-linq-pagination/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"17f878097de702c90684b3768bab95bb","title":"My Attempt at LINQ Pagination","date":"October 16, 2009","categories":["Development - C#"],"permalink":"my-attempt-at-linq-pagination","content":"

Today I’ve been diving into an easy way to paginate record sets in my applications.  Searching around the internet yielded several good walkthroughs on how to do this.  My favorite way came from my friend, Kevin Hazzard, He discussed using the Skip() and Take() extension methods to form fit LINQ into building a SQL statement that’ll do all the heavy lifting for you.

Copying from Kevin’s example, I built the following code snippet:

int pageNumber = 1;\nint pageSize = 20;\n

using (var entity = new Entities())\n{\nvar recordSet = (from r in entity.SomeTable\norderby r.SomeID\nselect r);\nrecordSet = recordSet.Skip((pageNumber - 1) * pageSize).Take(pageSize);

\n
return recordSet;\n
\n

}

\n

What’s nice about the following code is that since LINQ is lazy loading, the SQL built doesn’t actually execute until we need it too.  The days of returning full datasets are done (yes, we’re still doing that on some projects). 

\n

I went the next step to see if I could build an extension method of my own that did all of the above for me automatically.  Here was the result I came up with:

\n
public static class ExtensionMethods\n{\n\tpublic static IQueryable Paginate(this IQueryable content, int pageNumber, int pageSize)\n        {\n            return content.Skip((pageNumber - 1)*pageSize).Take(pageSize);\n        }\n}
\n

This extension method takes the query returned from LINQ (an IQueryable), and applies the additional constraints to it.  Here is the first example using my new extension method:

\n
int pageNumber = 1;\nint pageSize = 20;\n\nusing (var entity = new Entities())\n{\n\tvar recordSet = (from r in entity.SomeTable\n\t\t\torderby r.SomeID\n\t\t\tselect r);\n\trecordSet = recordSet.Paginate(pageNumber, pageSize);\n\n\treturn recordSet;\n}
\n

 

\n

Ta da!  Hopefully that makes sense.  I’m open to other suggestions and comments.  I’m learning that if I take about my thought processes on certain problems, that I receive a ton of great feedback from those who listen.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/building-better-connectionstrings-with-connectionstringbuilder/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"f2d0856a29b1c4bf2be098251fdd08a8","title":"Building better ConnectionStrings with ConnectionStringBuilder","date":"February 14, 2011","categories":["Development - C#"],"permalink":"building-better-connectionstrings-with-connectionstringbuilder","content":"

Okay, I never admitted to being a .NET guru or anything, and that’s why I get so excited whenever I run across a gem in the framework that allows me to do something easier and with fewer issues.

\n

ConnectionStrings has always been one of those things I did the hard way.  For example, I would have a line of code that was like so:

\n
\nstring connectionString =  \"Data Source={0};Initial Catalog={1};User Id={2};Password={3};\";\nstring.Format(connectionString, serverName, databaseName, userName, password);\n
\n

This seemed like a logical way to build my connection strings.  However, it wasn’t very flexible.  That was until I discovered the suite of ConnectionStringBuilder classes.

\n

Let’s take the above OleDb connection string and use the OleDbConnectionStringBuilder to build it.

\n
\nSystem.Data.OleDb.OleDbConnectionStringBuilder oleDbConnectionStringBuilder  =\n            new OleDbConnectionStringBuilder();\noleDbConnectionStringBuilder.DataSource = \"myServer\";\noleDbConnectionStringBuilder.FileName = \"myAccessFile.mdb\";\noleDbConnectionStringBuilder.ToString();\n
\n

Look at how much cleaner that is!  Maybe you’re working with a SQL Server database:

\n
\nSystem.Data.SqlClient.SqlConnectionStringBuilder connectionStringBuilder =\n                new SqlConnectionStringBuilder();\nconnectionStringBuilder.DataSource = \"myServer\";\nconnectionStringBuilder.InitialCatalog = \"databaseName\";\nconnectionStringBuilder.UserID = \"userName\";\nconnectionStringBuilder.Password = \"password\";\nconnectionStringBuilder.ToString();\n
\n

Isn’t that awesome?!  Now, finally, let’s imagine you’re doing all this with Entity Framework:

\n
\nSystem.Data.EntityClient.EntityConnectionStringBuilder entityConnectionStringBuilder =\n                new EntityConnectionStringBuilder();\nentityConnectionStringBuilder.ProviderConnectionString = connectionStringBuilder.ToString();\nentityConnectionStringBuilder.Metadata = \"(entity framework metadata here)\";\nentityConnectionStringBuilder.ToString();\n
\n

There you go!  Instead of hand writing your connection strings, take a look to see if there is a StringBuilder class that’ll do the work for you.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/running-a-conference-like-a-startup/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"739","title":"Running a Conference Like A Startup?","date":"February 23, 2014","categories":["Community, User Groups, and Conferences"],"permalink":"running-a-conference-like-a-startup","content":"

I've worked with a lot of different events. User groups, code camps, MADExpo (I'd link to it, but sadly the site went away a couple months ago), and others.

\n

They are always the same. If you build it, they will come.

\n

I really don't want that to sound negative, because it's not meant to. The leaders in the community are amazing, and lose a lot of sleep making sure an event is a success. And if it's a free event, they do all that knowing that potentially over 30-50% of the people that promised to attend will skip.

\n

Heck, even a paid event isn't much better. When we cancelled MADExpo in 2013, I received numerous comments from people saying \"Oh, I was looking so forward to MADExpo this year!\" That's awesome! Why didn't buy a ticket?

\n

Since the cancellation of MADExpo, I've been itching to do something new in our area. However, the model of build it, and they come didn't seem like it worked anymore. At least, not for a new event.

\n

By the pressure of my partner-in-crime, Bret Fisher, I've been listening through The Lean Startup. The chapter on building a minimum viable product struct a chord with me. Build the absolute minimum to start the learning process of what people want.

\n

Over the course of two days, I built the minimum viable product for 757DevCon. It's strictly an interest site. I'm throwing out an idea, and you can register for my list if you want to hear more.

\n

Behind the scenes, I have a series of emails planned out to extract crucial information I need from my potential customers. It's not so much about what they want from a conference, but what are they willing to pay for?

\n

So what are you waiting for? Go get on the list, and I'll keep you updated!

\n

I'd love to hear your questions and thoughts. Post them in the comments below.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/swift-kick-show-nosql-shouldnt-mean-nosecurity-with-matt-groves/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"39219d53b66c7251d97291388144c0bb","title":"Swift Kick Show - NoSql Shouldn't Mean NoSecurity with Matt Groves","date":"April 24, 2018","categories":["Swift Kick Show"],"permalink":"swift-kick-show-nosql-shouldnt-mean-nosecurity-with-matt-groves","content":"

On the April 18th \"Swift Kick Show\", I had the opportunity to chat a little bit with my good friend, Matt Groves. However, due to some technical issues Matt was not able to join us live. That doesn't stop the show from going on though!

\n

Through the power of YouTube and video recording, Matt sat down and did a version of his talk for us to publish.

\n

Watch the video below, and check out the Swift Kick YouTube channel. Like and subscribe for more great videos!

\n

NoSql Shouldn't Mean NoSecurity with Matt Groves

\n
\n

As NoSQL databases increase in popularity, they also increase in popularity with hackers. NoSQL databases are vulnerable to traditional attacks like SQL injection (yes, really). Further, the rush to productivity leaves some of these databases insecure-by-design. As a result, ransom notes have plagued databases like MongoDB, ElasticSearch, Hadoop, and CouchDB. This session demonstrates security mistakes and prevention. We’ll also look at what NoSQL vendors are doing to mitigate future attacks. Both devs and devops should come to this session, because the last thing either of you want to see is “SEND 0.2 BTC TO THIS ADDRESS 1zaGVjj9NcyvDLyYpCh33Msq TO RECOVER YOUR DATABASE!”

\n
\n

About Matt Groves

\n
\n

Matthew D. Groves is a guy who loves to code. It doesn't matter if it's C#, jQuery, or PHP: he'll submit pull requests for anything. He has been coding professionally ever since he wrote a QuickBASIC point-of-sale app for his parent's pizza shop back in the 90s. He currently works as a Developer Advocate for Couchbase. His free time is spent with his family, watching the Reds, and getting involved in the developer community. He is the author of AOP in .NET (published by Manning), and is also a Microsoft MVP.

\n
\n\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/leaving-it-better-than-you-found-it/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"76c962582dbdfd6037c296a0803bafde","title":"Leaving It Better Than You Found It","date":"January 26, 2010","categories":["Deep Thoughts"],"permalink":"leaving-it-better-than-you-found-it","content":"

When my wife and I bought our house back in April, one of my pet projects has been to renovate the room over our garage.  I knew buying the house that it would be a lot of work, partly because the previous owner didn’t know what he was doing when finishing a room.  I’ve spent the last week and half sanding, mudding, and fixing all the walls in this room.  While sanding some dried mud tonight, I had a thought about how this experience was a lot like building software.

When building software, you’re not sometimes lucky enough to build a system from the ground up.  Normally, you’ll inherit code from developers who have been hacking it for years.  I related this to me working in my room.  I inherited a poorly maintained room.  The joints weren’t level with each other and the mud of the wall wasn’t smooth.  The person doing the work took no pride in the work being done.  The ceiling was also a “hacked” popcorn ceiling.  I say hacked because, instead of using a hopper, the person slung dry wall mud onto the ceiling giving the illusion of popcorn.  The illusion failed though because it looked horrible.

Fast forward to my work in the room last week.  I had to go through and scrap all the excess mud off the wall.  Each wall and joint had to be sanded, and mudded again in order to level everything.  I’ve spend hours of time trying to reverse the effects caused by performing the job incorrectly.

What does this have to do with software development?  Think about when you’re working on a bug in a piece of code, and it’s your first time looking at this code.  How the previous developer left the code is how you’re going to inherit it.  You might have to spend hours undoing the work of the previous person in order to get the code to a state it can be worked with.  Hacks might have to be removed and properly implemented.  Hours will be wasted that didn’t have to be.

When working on new code, do yourself and future developers a favor and leave the code in a state where it can be easily picked up and worked on.  If you’re working on existing code, try to leave it in a better state than it was when you found it.  In the long run, time will be saved, code will be more secure, and a developer will say fewer curse words.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/banks-atms-and-horrible-user-experiences/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"778","title":"Banks, ATMS, and Horrible User Experiences","date":"August 03, 2015","categories":["Deep Thoughts"],"permalink":"banks-atms-and-horrible-user-experiences","content":"

Note: I'm pretty much going to rant about a bank experience I had. Lessons aren't obvious, but if you're designing something that's pretty dang important... make sure you have failsafes built-in.

\n

I went to my local ATM yesterday to deposit a couple checks. I know, I know... why didn't I just use my phone? Turns out banking phone apps have limits on how much you can deposit through the app and I was well past that limit. ATM was a logical second choice if I didn't want to have to make visit to a teller.

\n

Generally, this type of visit is quick.

\n
    \n
  1. Pull up to ATM
  2. \n
  3. Insert ATM card
  4. \n
  5. Type in PIN number
  6. \n
  7. Press DEPOSIT, select account.
  8. \n
  9. Insert checks (optical reader will automatically figure out amounts)
  10. \n
  11. Receipt, and on my way!
  12. \n
\n

Problem started around step 5. I put my checks into the reader where it proceeded to give me a \"PROCESSING YOUR DEPOSIT\" screen. Normally, this process takes 10 seconds.

\n

Ten seconds pass...\nThen a minute...\nOKAY.. five minutes...

\n

I'm starting to get a bit freaked out because I put a couple good sized checks into a machine and it's not doing anything!

\n

Next step is to try to call someone. My bank provides a 1-800 number for customer service. Turns out, there is no logical path for \"OMG THE ATM STOLE MY CHECKS AND IS FROZEN\". And really, there is no path for \"I request to speak to a human who can properly direct this call.\"

\n

30 minutes into my freak. I turned two other folks away because ATM was borked. All of a sudden, the screen flashes and pretends like NOTHING HAPPENED AT ALL. \"Would you like to deposit the checks?\" I pressed the go button and the ATM spat my checks out and told me to have a nice day. Wat?

\n

I also had a decent \"check hold\" on my account, which is normal when checks are processed. The bank is still investigating what the issue might have been.

\n

I'm pretty fortunate that I decided to stick around - or else someone might have been able to swipe my checks. Why doesn't the ATM go into \"maintenance mode\" or something after five minutes of not responding? Thirty minutes is way too long to wait for any sort of respond.

\n

On another note, why is there physically no way to talk to a human on the phone? At a minimum, I wanted the bank to have an option to \"Press 0 if you just need to talk to someone.\"

\n

Blah. What horrible user experiences have you had with technology?

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/are-we-too-dependent-on-the-internet/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"647","title":"Are we too dependent on the Internet?","date":"January 19, 2010","categories":["Deep Thoughts"],"permalink":"are-we-too-dependent-on-the-internet","content":"

In my office, there lives a monster.  This monster is called “The Internet Killer,” and he likes to poke his head out every now.  When he does, our internet goes down for hours upon hours.  During this time, I still have work too do, but I often find that my production level is limited by the lack of internet.

Are we too dependent on the Internet?

I’m in that weird generation where I have had access to the Internet for most of my life, but I can still remember not having it.  I have used a card catalog.  I have used an encyclopedia.  I have had to retain knowledge for more than a few minutes.

This was also around the time I started learning how to program.  My first few BASIC applications were self taught from a help file.  I didn’t have an Internet to go to whenever I ran into a problem.  I was forced to either figure it out on my own, or travel to the library to reference whatever material (if they had any material at all).  Having to work through these issues forced me to retain knowledge for an extended period of time.  You never knew when you were going to have use what you had learned before.

Fast forward to today.  I’m working on a few features for a project, and we lose our internet.  You might be saying, “Kevin, you should be able to code just fine without the internet.”  And you are right, I should be able to.  However, if you’re venturing into territory that you’re not familiar with, your work is either going to take two or three times as long as it would had you had access to reference materials.

Have you ever heard of books?” Yes, and I have plenty of them.  Books are hard to reference.  Books are awful for troubleshooting problems.  Can you type an error string or code into a book?  How long does it take to find a book that might have the information you’re looking for?  Does it actually contain information that is useful, or just code snippets that is causing the error you have?

Google (Bing, or whatever you use) is fast, accurate (for the most part), and easily accessible.  The “whole world at your fingertips” is no joke.  Within minutes, I have access to references, books, blogs, forums, etc.  Your problem is never new, and the Internet is quick to provide answers.

Does the internet make us stronger, or is it making us weaker?  I’ll let you decide.

\n"}},"context":{}} -------------------------------------------------------------------------------- /404.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Kevin W. Griffin by Kevin Griffin 5 | 6 | 7 |

404 - not found

8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /404/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Kevin W. Griffin by Kevin Griffin 5 | 6 | 7 |

404 - not found

8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /assets/data/node-js-using-require-to-load-your-own-files/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"c2faf224dca99ad70b05169dd3590130","title":"Node.js: Using require to load your own files","date":"December 31, 2012","categories":["Development"],"permalink":"node-js-using-require-to-load-your-own-files","content":"

For a lot of JavaScript developers that are moving over from traditional \"browser\" development to node.js, they might be casually aware of the require keyword that node.js provides you.

\n

If you're wondering what I'm talking about, allow me to explain.  In node.js, you can use the node package manager (NPM) to install packages that your application can use.  Express, for example, is a great framework for serving up web applications, and you can grab it via NPM.

\n

To load Express into your application, you tell node.js that you \"require\" it be loading into memory.

\n
var express = require(\"express\");
\n

Node follows a couple rules to find modules.  First, you can ask for a module by name or by folder.  Let's look at Express more closely.  If you were to download Express via NPM, you'd find there is no express.js file in the root directly of the /node_modules/express folder.  However, there is a package.json file that defines the main executable file for express (for fun, go look it up).

\n

Now, if packages.json doesn't exist or the main executable isn't present, node will resort to looking for your filename with either a .js, .json, or .node extension (unless you've specified).

\n

Where's this going?

\nI know, I know... the point.\n

Let's say you want to abstract out a piece of your application into another file.

\n
var userRepository = function (){\n   var self = this;\n   self.addUser = function (...){\n   };\n   self.get = function (...){\n   }\n};\n\nmodule.exports = userRepository;
\n

Add this to a file called userRepository.js. The last line is VERY IMPORTANT! It tells node.js what you'd like to export from this file. This should make more since if you try to use the file.

\n

In your main.js or wherever you'd like to use userRepository:

\n
var userRepository = require(\"userRepository.js\");\n\nvar userRepositoryInstance = new userRepository();\nuserRepositoryInstance.addUser({...});\nuserRepositoryInstance.get(...);
\n

Looks simple doesn't it? Pretty much whatever you assign to module.exports will be passed into the variable that calls require().

\n

Use this to keep your code clean and uncluttered.  This is only the basics of using require for your own projects, but I think it's a great starting point for developers building their knowledge of node.js.  In the future, I'd like to expand on this topic and show you how you can take this even farther.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/the-zen-of-free-labor/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"9b154da4ba2d45f12e93b3fcdd98555b","title":"The Zen of Free Labor","date":"June 01, 2009","categories":["Deep Thoughts"],"permalink":"the-zen-of-free-labor","content":"

Lets rewind back two years ago.  I was a fresh software developer of our college.  The major problem plaguing college students is that they do not have any practical experience.  How do you obtain practical experience?  You need to work!  You need to make the mistakes you need to make to become a productive professional.

\n

Out of college, I knew exactly one programming language proficiently: C++.  Proficiently is probably a poor choice of words.  I KNEW C++, but I KNEW enough to make simple decisions and get the job done the best way I could.  My first (technically second, but we won't go into that) professional job was all C#.  I didn't know C#, but I knew enough C++ to become very comfortable with C#.  In fact, one week after starting the job, I was adding new features to the project I was assigned too.

\n

However, I knew that I needed to expose myself to a several different technologies.  My wife and I took a trip to Nashville and visited with some friends of ours. One night, I was having a discussion with my friend about his hobby, photography.  We had ended up on the topic of him putting up a web page for all of his photos to sell.  I thought it was a wonderful idea, and volunteered to build the site for him.  The caveat was that I would do the site for free, seeing as how I needed to build up my skills in ASP.NET.  He would pay for hosting, etc, and I would build the site for him.

\n

This was almost two years ago, and the site still remains undone.

\n

So what happened?  Life happened!  Paying jobs happened!  Of course its a great idea to say that you're going to do something for free to help someone else.  What happens though when you need to mow the yard?  Stay late at work?  Get sick?  Spouse gets sick?  The first thing you drop is the project you're not getting paid for.

\n

Fast forward to a year ago.  I volunteered to work on my church website.  Same scenario.  I wanted an avenue to build on top of the ASP.NET skills I had, and I figured working on my church website was the best way to do that.  The difference between this project and the first was that I needed the input of several people in order to make any progress on the site.  When you're not being paid, the people you're doing the job for aren't as quick to respond to emails as they would if you were charging per hour for their response.  This site will be done, but it's taken several months longer than it needed too.

\n

What's the moral of the story?  You need work to show off in order to get more work.  Offer to do a free project every now and then.  Use it for experimenting with new technologies.  Don't allow the project to get too complex.  You don't have time for that.  Get it done as soon as possible.  If you let it go for too much longer, you're never going to complete it.  That is, of course, you have more will power than I do.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/speaker-gifts/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"daec589c985778886379e9aa56c43e08","title":"Speaker Gifts","date":"January 13, 2015","categories":["Community, User Groups, and Conferences"],"permalink":"speaker-gifts","content":"
\n

This post is a part of a series I wanted to do on simple user group management tips.

\n
\n

When you visit a user group, the person standing at the computer is most likely not being paid. In fact, a large majority of the technical speaker circuit is filled with unpaid speakers. Not only that, the speaker might incur costs just for having come out.

\n

What costs would a speaker have?
\nGreat question!

\n\n

Organizations like INETA have programs to help offset the costs of for speakers. For example, if I were to travel over 360 miles, INETA will reimburse me $200 for the trip. That's pretty good and covers most of my costs of speaking.

\n

How can the user group help?
\nI understand that asking you to cover speaker costs is a huge thing. So I'm not going to do that. Still assume that speakers will come of their own freewill and will cover their own costs.

\n

Consider this: Your goal as a user group leader is to promote the local technology scene. You want to attract people to show up and learn, but you also want to attract great speakers!

\n

A couple months ago, our user group started a process of giving out speaker gifts. We don't promote it (\"HEY EVERYONE! LOOK AT US GIVING A SPEAKER GIFT!\"). Instead, the speaker loves the thought behind the gift and keeps us in mind for a return visit in the future.

\n

These speakers will then talk about you to their speaker friends. \"Hey, those guys at the Hampton Roads .NET group are really cool. I definitely recommend getting on their calendar.\"

\n

What kind of gift can we give?
\nWe just give a $50 Amazon gift card in one of the fancy boxes. That's pretty good, and it's a cost we subsidize with sponsor money.

\n

A couple months ago, I visited a group called GANG where they gave me a engraved metal mug. That was awesome, and it makes me definitely want to come back.

\n

Why not start simple and give the speaker a thank you card signed by all the organizers and some of the attendees? Every little bit you can do makes a difference.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/good-bye-email/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"3c6b55aca65f652c744102b55e8fd1fa","title":"I Removed Email From My Phone","date":"May 01, 2018","categories":["Deep Thoughts"],"permalink":"good-bye-email","content":"

Several years ago, I wrote about how I was taking steps to reduce my dependence on email. You should go give it a read if you haven't before.

\n

Like a good diet, I fell off that bandwagon after months and months of doing really well.

\n

Since I own my own business, I spend a lot of time in email conversing with clients, employees, contractors, and random people I'm trying to convince to give me money. I organize conferences, user groups, and a variety of other professional events. I'm active in my church, and get CCed on just about everything.

\n

I came to the realization that email itself was making me anxious.

\n

For example, I'd get up in the morning and quickly check email as a part of my morning routine. Some days were fine, but then other days I'd get an email that would totally ruin me for the entire day.

\n

Email became my fidget. If I was standing in line at the store, at a stop light, or just walking towards a building, I'd get my phone out and quickly check my email.

\n

The absolute worse time to check email is when you physically cannot respond to it. Some emails I forgot about, accidentally archived, or just said \"I'll deal with this later\".

\n

Then one day I came to a realization: the email on the phone had to go.

\n

It was so easy. Delete.

\n

Additionally, I added a message to my email signature specifically stating that I'm returning to my twice-a-day email routine, and I did not carry it on my device. Emergencies needed to move to phone calls or text messages.

\n

You'd be amazed how quickly an \"emergency\" dies down when someone has to pick up a phone.

\n

As of this writing, I've been without email on my device for two weeks. My level of anxiety is pretty much gone. Email takes all of 5-15 minutes depending on what I need to respond to. And best of all, email can only happen when I'm at my laptop - and that is a controlled situation.

\n

I encourage everyone to take a break from email. Even if it removing notifications or reducing your time to twice daily -- it is amazing how liberating it can be to not need to check email constantly.

\n

We cannot forget that email is asynchronous. In the same way we'd have to wait for snail mail or carrier pigeon, and email doesn't need to be received or answered immediately. There is no difference between a 2 minute response time and a 12 hour response time.

\n

I'd love to hear your thoughts about email. Does it rule your life or have you figure out how to tame it for the best? Leave a comment below!

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/maintaining-signalr-connectionids-across-page-instances/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"97367a18a22d8e5645994a746ca6dbbb","title":"Maintaining SignalR ConnectionId’s Across Page Instances","date":"February 15, 2012","categories":["Development"],"permalink":"maintaining-signalr-connectionids-across-page-instances","content":"

 2/28/2013 - With the 1.0 release of SignalR, I can't guarantee the solution below will work the same.  The big problem with this solution is that ConnectionIds are reused across tabs and browser windows since it's cookie based.  You might not have the results you're expecting.  The SignalR team doesn't recommend this action, and I can agree.  I didn't see it when I wrote the post.  This is a decent guide for overriding the connection id factory, so I'll leave it up for archival purposes.

\n

I’m a huge fan of SignalR, and today I was looking at a particular problem.  I would think it’s more of a feature, but in certain use cases it can be considered a bug.

\n

When you start a connection to SignalR for the first time, you are assigned a ConnectionId.  SignalR uses this to determine what messages should go to you, and allows the server to direct messaging at a particular user.

\n

If you were to refresh the page, SignalR will assign you a NEW ConnectionId.  This could be good or bad… but if you’re trying to maintain some sense of state between your clients and the hub, it’s bad.

\n

So I looked into how to make SignalR reuse ConnectionIds in the case of a page refresh.  There are really two steps involved.

\n

1) Set a cookie on the client

\nWhen you start() a new connection, SignalR will return a ConnectionId.  You’ll want to set a cookie with that ConnectionId in it.\n
    $.connection.hub.start().done(function () {\n        alert(\"Connected!\");\n        var myClientId = $.connection.hub.id;\n        setCookie(\"srconnectionid\", myClientId);\n    });\n
function setCookie(cName, value, exdays) {\n    var exdate = new Date();\n    exdate.setDate(exdate.getDate() + exdays);\n    var c_value = escape(value) + ((exdays == null) ? \"\" : \"; expires=\" + exdate.toUTCString());\n    document.cookie = cName + \"=\" + c_value;\n}</pre>\n
\n

As you can see, this gets the ConnectionId from the hub connection and stores it in a cookie.

\n

2) Use your own IConnectionIdFactory

\n

This might be scary territory for you, but it’s actually pretty simple.  We want to create our own version of the IConnectionIdFactory interface for SignalR to use.

\n
    public class MyConnectionFactory : IConnectionIdFactory\n    {\n        public string CreateConnectionId(IRequest request)\n        {\n            if (request.Cookies[\"srconnectionid\"] != null)\n            {\n                return request.Cookies[\"srconnectionid\"];\n            }\n\n            return Guid.NewGuid().ToString();\n        }\n    }
\n

This does two things.  First, it’ll check your cookie for a ConnectionId it should use.  If it exists, we’ll simply return that ConnectionId and all will be good in the world.

\n

If the cookie does NOT exist, we need to generate one.  By default, SignalR uses a GUID, so we’ll just repeat that functionality.  You can use any value you want, but make sure it’s unique.

\n

Don’t forget to wire it up!  Add this to you Global.asax file under Application_Start().

\n
AspNetHost.DependencyResolver.Register(typeof(IConnectionIdFactory), () => new MyConnectionFactory());
\n

And you’re all set!  SignalR will now use your new ConnectionIdFactory to generate or reuse ConnectionIds.

\n

Enjoy!

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/book-review-financially-stupid-people-are-everywhere/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"0900dbe7888cfa9c8f8a0c80d3ee7b4d","title":"Book Review: Financially Stupid People Are Everywhere","date":"August 03, 2018","categories":["Reviews"],"permalink":"book-review-financially-stupid-people-are-everywhere","content":"

For this review, I purchased my own copy of the book on Audible. If you buy your own copy, I would love it if you used one of my links.

\n

\"\"

\n

I recently wrapped up reading Financially Stupid People Are Everywhere: Don't Be One Of Them by Jason Kelly. It was recommended by one of our guests on 2 Frugal Dudes and I'm a sucker for books that are recommended to me.

\n

I decided to consume this book through Audible, because I was close to my credit limit and I wasn't sure when I'd have time to read the book physically. This goes against my ideals that non-fiction should be consumed through phyiscal print and fiction is best enjoyed through Audible.

\n

FSPAE (yup - abbreviating) gives a pretty opinioned history of why the finanical system is in the current state it is.

\n

Naturally, I waited too long to write the review after consuming the material - so I'm going to recap the best I can.

\n

The financial system is poop, and that's caused by normal people who can't do math OR people who can do math but refuse to live below their means due to entitlement.

\n

That sentence seems pretty harsh - but that's exactly what lead up to the financial crisis in 2008. The icing on the cake is that it's not enough that people were buying into things that they couldn't afford. The problem was companies were actively trying to promote packages to take advantage of people who couldn't do simple math.

\n

The first third of the people is a lot of berating to bring home the fact the book is called \"Financially Stupid People...\".

\n

The rest of the book goes pretty deep into financial influence into government, almost to the point of conspiracy theory. We can go back through several Presidential administrations and see that key members have lineages that tie back to powerful banks and financial institutions.

\n

Overall, FSPAE is an quick read but not actionable in any way. I don't believe that actionable advice was the target of the book though. If you're looking for a quick listen or would like a little more history on how we got into the financial mess we're in, give Financially Stupid People Are Everywhere: Don't Be One Of Them a read.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/open-source-mentality-of-choosing-your-tech-stack/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"10f071904c72744a2b9a72f44815a5fc","title":"Open Source Mentality of Choosing Your Tech Stack","date":"July 04, 2016","categories":["Deep Thoughts"],"permalink":"open-source-mentality-of-choosing-your-tech-stack","content":"

When I initially wrote Non-Tech Factors to Consider When Choosing Your Tech Stack, I left out one important conversation point: Open Source.

\n

Steve and Carol got me in the comments.

\n

###How should Open Source affect your decision to choose a tech stack?

\n

In a previous life, I used to work for a component vendor. Our company built, sold, and supported a variety of components that saved developers time. I had the opportunity to meet thousands of awesome developers who do the hard work every day in the trenches.

\n

I always questioned why people bought our stuff. The internet at the time was already full of dozens of comparable or better components which were open sourced. Buying our components seemed like an extreme waste of resources.

\n

That was until I understood the value-cost of SUPPORT. One of our customer was a large financial firm who bought hundreds of developer licenses to a library. This library wasn't anything special - but any of those developers could instantly request technical support from the project manager for the library. (Normal people would have to go through traditional support means, but still had good service.)

\n

Imagine same company, same team - they decide to use a popular component that is 100% open source. Same team runs into a technical hurdle: either a flaw in the component, or a flaw in the developer's understanding of the component.

\n

Where does a developer go in this case? Google? Stack-overflow? Github issues?

\n

A common phrase amongst open source maintainers is \"we accept pull requests\". I used to believe this was mean-spirited, but you have to understand that folks that manage an open source project have lives and other concerns then your bug. Roll up your sleeves and dive in.

\n

###You didn't answer the question: How should Open Source affect your decision to choose a tech stack?

\n

In the soft-factors article, I discussed that some developer-types just are not suited to work with new technology. Same goes for open source.

\n

If a developer or team is not comfortable getting their hands dirty in public code, there is NO WAY they should integrate open source software. Don't expect a maintainer to bend over backwards to solve your problem or push you in the right direction. Some do -- but many don't have the bandwidth for that.

\n

There are some exceptions to this though. Consider massive open source projects such as jQuery, Angular, React, and the .NET Framework. These products are open source and accept pull requests, but they are backed by large organizations who have a vested interest in keeping the projects up and running. You cannot pick up a phone and dial support, but you can file an issue and a team of developers will take you seriously.

\n

###You are not alone\nThe general developer community is amazing. There are thousands and thousands of developers out there that will at least attempt to push you in the right direction if you hit a snag in an open source project.

\n

I love open source software, and I greatly take for granted the hard work many people have put into my favorite projects.

\n

Open Source software isn't going away either. The movement is going to grow larger than it is today, and if you are not on the bandwagon as at least an observer, it is going to leave you behind.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/beating-email-addiction/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"c94aa3ac05258649ce61d790e971a7cc","title":"How I'm Beating Email Addiction","date":"May 21, 2015","categories":["Deep Thoughts"],"permalink":"beating-email-addiction","content":"

Today, I really want to talk about email, because I see people everywhere having the same issue with email that I had. I used to be REALLY addicted to email. When I use to wake up in the morning, first thing I would do is check my email on the phone. After sitting at my desk, I would open my email tab and leave it up all day. At night, I would habitually pull out my phone to see if a new email came in.

\n

It was like I was a drug addict always needing a fix. I couldn't do it anymore.

\n

One day, I was watching a video and the gent talking said something that kicked off my intervention.

\n
\n

Your email is someone elses TODO list for you.

\n
\n

Holy crap. That hits home. But think about it! Our email serves a couple purposes:

\n

Informational. Reservations reminders, events coming up, someone's address or phone number. These emails have a purpose, but it's not necessary that you act on them immediately. This email totally falls into that category. Gmail categories these under Social, Forums, and Updates.

\n

Request followup. Let's say you ask someone to provide some information. \"Hey Kevin, here is the powerpoint you asked for.\" Remember, if you sent the request for something, you've injected a TODO into someone's list.

\n

Promotional. People try to sell you stuff, but legitimate. Amazon does this a lot. \"Hey Kevin, noticed you were looking at chainsaws. Here's a great list of popular ones online.\"

\n

Spam. It's meat, in a can.

\n

Email is also asynchronous. That means when I send an email, it can get a response within five minutes or 5 months. It's safe to send some emails and close the tab! It's also a false expectation of others to think you're going to respond to an email within a few minutes.

\n

I want to share a couple tips for how I broke my email addiction:

\n

##I turned off email notifications on my phone\nThis is groundbreaking! I was so programmed to look at my phone whenever it beeeped, it was maddening. The phone could even be on the other side of the house, and that beep would cause me to stop what I was doing and hike to get it. For what? A statement from the cell phone company. Not worth it.

\n

This also had the side effect of increasing battery life of my phone. Since it wasn't consistently checking for email, I was getting more battery life. Did you know if don't touch a phone all day, it'll only use like 5% of it's battery?

\n

##I limited email time to twice a day\nIn the morning, I put together a todo list for the day. Part of that is checking email. Since email is a todo list from others, it makes sense for me to look at my email, determine what needs to be responded to, and add it to my list. Some email will be immediate responses. Why add them to the list if all I need to respond with \"yes\" or \"no\"?

\n

Next, I'll check email towards the end of the day. Any email I sent in the AM might be responded too, unless they read this. It also gives me a chance to look at my todo list, and send emails that needed to be sent. It also prevents me from doing off the cuff emails that I would later not have sent.

\n

##Inbox zero should be a goal, not a requirement\nA lot of folks talk about empty inboxes, and I agree to a point. I believe all emails that you need to follow up with some be archived off and added to your TODO list. My Todo program Todoist has an add-on that allows me to add emails to my todo list.

\n

Sometimes you might just want to keep an email front and center. That's okay! But anything that isn't important should hit the trash or the archive.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/definition-of-a-computer-scientist/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"b8257a376e74923d21700fc2a503087b","title":"Definition of a Computer Scientist","date":"March 04, 2009","categories":["Deep Thoughts"],"permalink":"definition-of-a-computer-scientist","content":"

What is a computer scientist?  Google gives the definition: a scientist who specializes in the theory of computation and the design of computers.  In most of our minds, a computer scientist is a person that builds computer systems.  More recognizable names (at least in terms of what a person with a computer science degree would be hired for) for a computer scientist would be developer, coder, software engineer, or software architect.  A lot of people will argue with me that computer scientist is more than just a coder, and I would fully agree.  Although, when a person wants to be a software developer, they are forced most of the time into a computer science program, as it's the best way for they to obtain the skills required to build large software systems.

\n

But the definition is besides the point.  The real point of this post is to comment on a conversation retold to me by a colleague who's taking a senior-level college course.  To put the conversation into perspective, I need to describe the course (and for the record, I have taken this course myself several years ago).  This course is a project management course for wannabe computer scientists.  In the first semester of the class, students are required to come up with \"problems\" and probable solutions to them.  The problem and solution are then pitched to a panel of industry professionals.  The solution is actually implemented within the second semester.  As you might think, developing a problem from within thin air is quite daunting.  Eventually though, students discover a problem that obtains approval from the professor.

\n

This conversation spawned due to my colleague's group not being able to find a problem.  As far as I was told, several problems were proposed and spot down.  When a particular idea was shot down, the professor said, \"Your job as computer scientists is to  innovate.\"

\n

This statement is just wrong.  Your job as a computer scientist is not to innovate!  Your job as a computer scientist is to SOLVE PROBLEMS.  Now, it is possible for a problem to be solved in an innovative manner, but you should never innovate for the sake of innovation.  In the real world (definition: the world outside of academia), you will be given problems to solve, and you will be expected to solve them.  Furthermore, you will be given your problems, not expected to discover them on your own.  Creating your own problems to solve would make you an entrepreneur, not a computer scientist (which you would be when you actually solved the problem).

\n

For example, let's say I have a glass window and at 5:00 everyday the sun shines through, displaying a terrible glare on my computer screen.  An innovative solution to the problem would be to design a microfilm composite that reduced the glare depending on the amount of sunlight shining through.  Another solution would be to buy a set of blinds.  Not \"innovative\" by any means, but it solved the problem.

\n

What advice do I have for the group of computer science student trying to get through this project?  Don't try to come up with a brand new problem.  That's impractical, or the solution to the problem is to high of a level for you to understand as an undergraduate.  Instead, try to take an existing problem with bad solution.  I guess you could say you should take a bad solution and innovate?  Ideally, you just want to get through the semester.  When you enter the \"real world\", the problems will come to you.  At least these problems will be paid, and you won't have to worry while worrying about an English midterm, linear algebra homework, and your seventeenth algorithms assignment.

\n

Finally, take everything your professor says with a grain of salt.  They probably haven't seen the real world in a long time.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/user-group-sponsor-relationship/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"6b786f2a45fd3e047d3f60b12de2ac18","title":"Managing Your User Group: Sponsor Relationships","date":"January 26, 2015","categories":["Community, User Groups, and Conferences"],"permalink":"user-group-sponsor-relationship","content":"

As a user group leader, you might have this feeling that you need to get sponsors for your user group. This is a common feeling!

\n

In fact, it's one of the most common questions I get as the Director of Membership for INETA. I've seen groups that bend over backwards for sponsors, such as providing attendee lists (with contact information) or letting them do 15 minute sponsors presentations. Over marketing is a huge turn off for attendees, and has potential to limit the growth of your group.

\n
\n

For purposes of this discussion, a sponsor is a recruiter, headhunter, placement firm, etc. Pretty much anyone that wants to hire your talent pool.

\n

Yes, venues are sponsors. Vendors are sponsors. But that's a different dynamic. The majority of user group \"sponsors\" are going to be companies looking to place workers.

\n
\n

I want to offer you a different perspective before you go out and solicit for user group sponsors:

\n

What do you offer?
\n1. Access to a community of professionals interested and dedicated to a particular technology.\n2. An environment specialized for engagement and learning.\n3. Mailing lists (maybe)\n4. Discussion boards (maybe)

\n

Over all, you have a supply of talent. Nevermind the skill ranges, but you have a group of folks who are 10% higher than anyone else on the market. Why? Because they're showing up. That's worth gold and more to the right employer.

\n

What do they offer?
\n1. Pizza money\n2. Access to a hidden community of professionals they've placed in positions across the region.

\n

I'm going to call #2 a farce and this is totally based on my experience. I've had many sponsors (recruiters) say \"We'll send the word out to our people and see if we can get out to the group.\" But the people don't come.

\n

So that leaves #1. Food. Drinks. Substance of some kind.

\n

How does this empower you?
\nTHEY need you more than YOU need them. Let's look at a worse case scenario: you have no sponsors for food.

\n

Oh well.

\n

When I started my first user group back in 2009, I was scared silly that people wouldn't show up because there was no free food. Put it this way: if someone is coming only for free food, you don't want them at your group anyway.

\n

I begged for sponsors. \"Please please please bring us free food.\"

\n

Later, I started getting competition for sponsorships. These companies know what you have, and they WANT to be involved. Use this to your advantage. For us, it meant paying for the right to sponsor a meeting. Twelve meetings per year, that's something worth monetizing.

\n

Take that last paragraph with a grain of salt. It's a real first world problem. Smaller groups might not want to pull that card, and that's okay. But don't bend over backwards for sponsors.

\n
\n

THEY need you more than YOU need them.

\n
\n

How can I supplement not having a sponsor?
\nDonations? A lot of smaller groups throw out a hat for pizza money, and people put money into it!

\n

Try a shorter meeting without food?

\n

Create a post-meeting outing that everyone is invited to. At our group, we started a tradition of going to a local diner for pie. Get creative!

\n

Wrapping up
\nRunning a user group is hard. Your thoughts on priorities might be out of line with what they really should be. Some of the best user groups I've been to have started in IHOPs or as meetings at a Starbucks.

\n

You don't need sponsors. You want sponsors. And you hold the high card in this game.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/colossal-failures/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"f2d8051d9dce68bb38ff5caf80b737bf","title":"Colossal Failures","date":"March 02, 2010","categories":["Deep Thoughts"],"permalink":"colossal-failures","content":"

One of my favorite television shows is Mythbusters.  It’s not that I’m enthralled with the myths themselves, but the engineering required prove the myths correct or incorrect (“Confirmed” or \"Busted!”).

\n

Recently, I ran across a session by Adam Savage talking about Colossal Failures.  Here is the video if you have an hour to kill (really the first 30 minutes is all you need to listen to), or just skip ahead.

\n

\n

(If you can't see the video above, please view in your browser and not in an RSS reader)

\n

This video is inspiring for me.  Adam talks about two instances where he took on a task where he bit off more than he could chew.  First, he talked about having to build a baseball throwing machine for department store display.  The store was under tight restrictions, and gave Adam less than a week to design, build, and implement this system.  Adam didn’t succeed due to dozens of unforeseen issues.

\n

Second, Adam talked about having to build a set complete with a talking ATM.  He ran into tons of issues, and didn’t have anything done for the first day of filming.  He was asked to go home, and then several days later was asked to come back to get a verbal flogging from the crew.

\n

What does this mean to us?

\n

Failing is a method of learning.  Failing is a bit of a subjective term.  If you've made a mistake, you’ve failed.  Some failures are easier to rebound from than others.  However, failures are worth it if you learn something from them.

\n

Adam learned that while he does good work by himself, the common trait of both his examples was that he didn’t ask for help.  Some jobs are too large for a single person to take on by themselves.  Keep a good network around you of people you trust and respect.  These people can be lifelines in the most frustrating times of a project.  Don’t have a network?  Look for a community event in your area.

\n

How have I failed?

\n

I’ve walked into several situations where I had no idea what I was doing.  Being a younger developer, I don’t have the experience as someone with 10 or 15 years experience.  In my current shop, most projects are on the shoulders of one or two developers.  With any project that has come across my path, I’ve picked them up and ran with them the best I could.  As Adam said, I was “making it up as I went.”  I made several poor decisions that seemed good at the time.  When I discovered they were bad decisions, I took immediate steps to fix them.  Never leave a bad decision for someone else to clean up.  Step up and accept them, and then proceed to make it right.  Adam talked about providing money back to his customers.  He accepted his failures, and wanted to take steps to make it right (even if it meant giving up part of his pay).

\n

Preventing Failures

\n

Keep a support structure.  Join a user group or visit a code camp.  Keep learning.  Surround yourself with people smarter than you.  Listen to their advice (but take all advice with a grain of salt).  One person will sometimes succeed, while a team will never fail.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/about-blog-posts/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"81203528c53656866f5a3fdac512a39a","title":"About Blog Posts","date":"May 03, 2017","categories":["Deep Thoughts"],"permalink":"about-blog-posts","content":"

After overhauling my personal site, I learned that I dislike the term blog. Instead, I want to be more professional by writing articles.

\n \n

I just recently spent a couple days overhauling my personal site - or as I used to call it, my blog.

\n

That term blog...

\n

I've been blogging for about ten years, and I made several observations about what I actually put into my blog.

\n
\n

It's all basically BS, sprinkled with content of value.

\n
\n

And I see this on a lot of blogs. The content is very \"point in time\" - meaning that it is only relevent within a couple days of the post going out.

\n

For me, these posts included things like \"I'm speaking at XYZ conference\" or \"Here are my slides for ABC event\".

\n

What is a better term?

\n

Articles.

\n

I trimmed a lot of fat from my blog. And instead of calling the posts that got to stay blog posts, I'm adapting the term article.

\n

This approach is designed to fix several issues with my site.

\n

First, the content needs to be evergreen-ish. My post about speaking at a code camp in 2010 isn't evergreen. Heck, it wasn't green at all. A hundred people might have read that post and never looked back. Why even publish it?

\n

Where is a better place for that type of \"in the moment\" posts? Twitter! Facebook! LinkedIn! Social media (or micro-blogging as it used to be call) is perfect for these types of posts.

\n

Second, the content needs to be more commanding. As a professional, it is more meaningful for me to say \"I wrote an article about this topic, go give it a read.\" instead of \"oh, I blogged about that a couple months ago\".

\n

Folks are more likely to share a great article they read versus a blog post they came upon.

\n

Third, there is no need to be a \"regular\" blogger. The articles I publish have dates on them (see the bottom of this page), but you don't really have any idea what the latest post is.

\n

By the way, I am looking at adding a \"recent articles\" section to the sidebar. So I'll probably invalidate my previous statement.

\n

Where do the \"micro\" posts go?

\n

This is a good point to talk about? Where should the \"micro\" posts go? Obviously, it's a good idea for me to continue promoting activities I'm involved in. But if the content doesn't fit into the category of \"article\", where does it go?

\n

I've set up a separate area of the site for speaking engagement, past and future. This is great for an at-a-glance view of what I'm up to, and also allow people to gauge whether I'm worth inviting to their own events. (Psss, I'd love to speak at your event. Just ask!)

\n

But this is a good place for social media. Twitter, mostly. But Facebook and LinkedIn are good locales as well. These places are meant to be short lived. Nobody actively goes back through your timeline looking for what you said three years ago (unless you're Donald Trump).

\n

Conclusions

\n

I don't want to knock anyone that maintains a blog. I'm not that type of person, so it's not something I want to do.

\n

I want my content to be more focused and helpful. I feel really guilty when I don't post on a regular basis. Blogs give that illusion. It's \"dead\" if you're not posting every week. With my new format of \"articles\", I don't have that guilt.

\n

What are your thoughts? Am I overthinking it? Am I right on point? I'd LOVE to hear your thoughts in the comments below.

\n"}},"context":{}} -------------------------------------------------------------------------------- /assets/data/i-suck-at-writing-unit-tests/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"f98b2b4474a1fabeb0f1911a01953659","title":"I suck at writing unit tests, but I'm trying to change","date":"February 26, 2015","categories":["Deep Thoughts"],"permalink":"i-suck-at-writing-unit-tests","content":"

65 tests

\n

I have just hit a personal record when it comes to writing unit tests. A measly 65 unit tests. I've always noticed that there are three types of developers: those that never test, those that are pragmatic about testing, and then those that say TEST ALL THE THINGS.

\n

Most of my career has been in the first camp. I never tested my code. That's what QA departments were for. The team would write a feature, and ship it off for testing. Most of the times it would get a thumbs up, or it would get rejected because if you held the 'T' key while jumping up and down and patting your head, the computer would explode.

\n
\n

... those who are out there doing \"Unit Testing 101\" talks really suck at them.

\n
\n

68 tests

\n

Within the past five years, I've grown to really appreciate the WHY you should unit test - but the HOW had left me in stitches. And let's be honest about it: those who are out there doing \"Unit Testing 101\" talks really suck at them. Not that the material is bad, but the concepts are too simplified.

\n

Today, we're going to create unit tests for our calculator service. If I Add 5 and 5, I should get 10. Yay green!

\n

Today, we're going to create unit tests for our bowling score tracker. If I bowl a strike, but then a 7, I should get a 17 in the first frame.

\n

No no no. I live in a world where I talk to external dependencies like databases, web services, etc. In .NET land, that's why you start learning about great things like Dependency Injection. \"Oh Kevin, your tests shouldn't talk to a database. Instead, you should have an interface for talking to a datasource and then write a mock implementation of that.\" But.. but.. my applications talks to a database.

\n

I worked on a small project where I wrote a bunch of tests based around mocks only to determine that I wasn't testing any of the freakin' code. My fake code was tested fabulously!

\n

72 tests

\n

Seeing the light
\nI had this amazing revelation during a 7 hour car ride with my friend, Kendall Miller. In a nutshell, he said, \"We just stand up the database.\" Mind. Blown. Imagine this concept: being able to stage your entire application in a couple seconds. Not only are you testing that you're able to insert or update records, but you're continuously testing if your database creation scripts are up to date.

\n

It's all baby steps
\nFor a new client, I have pushed myself really hard to make sure that most aspects of the business and data layers have testing around them. All new features get a series of tests. This is well before I start implementation in the UI. As a result, I'm gradually ensuring that my application works the way that I expect it too.

\n

A lot of code is written to support the tests. For example, between each test I want to wipe the database clean and start with good data. I am testing a \"unit\", aren't I? No two tests are dependent on each other.

\n

Keep on moving
\nI feel really good about this code. There isn't anymore of this ridiculous writing of fake implementations. I'm finding that with every test I write, I'm learning something new. If you find yourself in a similar place as me: wanting to write tests, but it has always seemed too impractical or too complex, I want to offer you some advice.

\n

Just do it. Write one test. Is the code you want to test too complicated or too involved? That is a great excuse to break it up and refactor. Find someone who really knows or really enjoys writing tests and ASK them for feedback and guidance. They might hurt your feelings, but that's okay. Don't forget why you're doing this! Your code will get better. Your code will stay better. Practice makes perfect!

\n

Now get out there and write some tests!

\n"}},"context":{}} -------------------------------------------------------------------------------- /asp-net-40-to-asp-net-core/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Upgrading Your ASP.NET 4.0+ Skills to ASP.NET Core by Kevin Griffin 5 | 6 | 7 |

Upgrading Your ASP.NET 4.0+ Skills to ASP.NET Core

April 12, 2019

Have you recently attended one of my talks on "Upgrading Your ASP.NET 4.0+ Skills to ASP.NET Core"?

8 |

I hope you enjoyed it! I would love to chat more about any questions you have!

9 |

CodeStock 2019 Slides

10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /one-simple-rule-for-successful-consulting/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | One Simple Rule for Successful Consulting by Kevin Griffin 5 | 6 | 7 |

One Simple Rule for Successful Consulting

September 03, 2014

When you're suggesting business decisions for a client, think about it this way:

8 |
9 |

If you were to flip the roles, would you take the advice you are offering?

10 |
11 |

Simply put: when I recommend tools, technologies, and other solutions to my clients, I want to always make sure that the suggestion I am providing is something I would do for my own business.

12 |

Do that, and the clients will always keep coming back.

13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /fix-my-computer/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Fix My Computer by Kevin Griffin 5 | 6 | 7 |

Fix My Computer

May 02, 2017

I get a lot of requests for companies in the Norfolk and Virginia Beach area that fix personal computers. Here are a couple references that I think are looking at.

8 |
9 |

These references come from friends of mine in the industry. I have not vetted any of these companies. Your milage might vary.

10 |
11 |

P&P PC 12 | 2468 East Little Creek Road, Norfolk VA 23518 13 | (757)-531-3196 14 | http://www.pandppc.com

15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /enhancing-your-applications-for-windows-7/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Enhancing Your Applications For Windows 7 by Kevin Griffin 5 | 6 | 7 |

Enhancing Your Applications For Windows 7

November 17, 2009

I invite you to head over to Developer Fusion, and read my article on "Enhancing Your Applications For Windows 7”.  If you haven’t played with the Windows 7 API Code Pack yet, I definitely recommend it.

http://www.developerfusion.com/article/70531/enhancing-your-applications-for-windows-7/

8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /simple-html-formatting-in-sublime-text/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Simple HTML Formatting in Sublime Text by Kevin Griffin 5 | 6 | 7 |

Simple HTML Formatting in Sublime Text

February 27, 2013

One common questions I've asked and seen asked quite a bit about Sublime Text is how to quickly and easily format HTML while editing.  There isn't a default key binding for this, but if you select all text and then go to:

8 |
Edit -> Lines -> Reindent
9 |

Want to create your own keybinding?  Go to Preferences, Key Bindings - User and add this line:

10 |
{ "keys": ["ctrl+shift+r"], "command": "reindent" , "args": {"single_line": false}}
11 |

Enjoy!

12 |
13 | 14 | 15 | 16 | -------------------------------------------------------------------------------- /signalr-logging/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Enable SignalR Logging with One Simple Line by Kevin Griffin 5 | 6 | 7 |

Enable SignalR Logging with One Simple Line

August 28, 2015

It is easy to think that SignalR works within a black box, but if you are deploying JavaScript clients, here is an EASY trick to learning what is happening underneath the scenes.

8 |

Before you start your connection, add this ONE line of code:

9 |
$.connection.hub.logging = true;
10 | $.connection.hub.start();
11 | 
12 |

Tada! You have logging in your browser console:

13 |

14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /wildcard-search-with-linq/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Wildcard search with LINQ by Kevin Griffin 5 | 6 | 7 |

Wildcard search with LINQ

April 21, 2009

I just a situation where I needed to perform a wildcard search on a table in my database.  When I used to do ADO.NET, I would simply write my SELECT statements with LIKE keywords to do wildcard searches.

8 |

However, in this project, I'm using LINQ to Entities and the solution didn't work the same way as it did back in SQL land.  My alternative was to use the .Contains() method.

9 |

For example:

10 |
var userList = from u in entity.Users
11 | where u.FirstName.Contains(searchParameter) ||
12 | u.LastName.Contains(searchParameter)
13 | select u;
14 |

Hope this helps if you ever run into this problem.

15 |
16 | 17 | 18 | 19 | -------------------------------------------------------------------------------- /learn-about-windows-7-task-dialogs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Learn about Windows 7 Task Dialogs by Kevin Griffin 5 | 6 | 7 |

Learn about Windows 7 Task Dialogs

December 01, 2009

Please take a few minutes and travel over to DeveloperFusion where my latest article on Windows 7 Task Dialogs has been published.  If you’ve never used a task dialog before, I would definitely recommend them.  I consider them “Message Box 2.0”.

http://www.developerfusion.com/article/71793/smarten-up-your-ui-with-task-dialogs-the-message-box-20/

Let me know what you think!

8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /50-ways-to-avoid-find-and-fix-asp-net-performance-issues/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 50 Ways to Avoid, Find and Fix ASP.NET Performance Issues by Kevin Griffin 5 | 6 | 7 |

50 Ways to Avoid, Find and Fix ASP.NET Performance Issues

January 25, 2013

A couple weeks ago there was a public request on Twitter from the great folks at RedGate to provide tips and tricks for performance in ASP.NET applications.  Come to find out, they selected one of my tips and published it in their ebook "50 Ways to Avoid, Find and Fix ASP.NET Performance Issues".

8 |

It's a free download: http://www.red-gate.com/products/dotnet-development/ants-performance-profiler/entrypage/avoid-find-fix-asp-problems

9 |

Go grab it today!

10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /interview-with-michael-rollins-for-hrdevfest-2016/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Interview with Michael Rollins for HRDevFest 2016 by Kevin Griffin 5 | 6 | 7 |

Interview with Michael Rollins for HRDevFest 2016

September 01, 2016

Recently, I had the opportunity to sit down with my friend Michael Rollins to talk about life as a mobile SDK developer, drones, and his upcoming HRDevFest keynote on growth through suffering.

8 |

Watch the interview for yourself! Get your tickets for HRDevfest at http://hrdevfest.org!

9 | 10 |
11 | 12 | 13 | 14 | -------------------------------------------------------------------------------- /powershell-how-to-recursively-delete-files-based-of-file-extension/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Powershell: How to recursively delete files based of file extension? by Kevin Griffin 5 | 6 | 7 |

Powershell: How to recursively delete files based of file extension?

July 15, 2016

File this under "took me WAY too long to figure out how to do".

8 |

I just finished doing a Git merge, and ran into an issue where my working folder was polluted with .orig files.

9 |

I wanted to recursively delete all the .orig files. That is apparently harder than it sounds, because it took me 15 minutes to figure out the correct command line.

10 |

So you don't go fumbling like I did:

11 |
Get-ChildItem . -recurse -include *.orig | remove-item
12 | 
13 |

Replace . and *.orig accordingly. Have fun!

14 |
15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /assets/data/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"allArticle":{"edges":[{"node":{"id":"6df6717ba25e2bbd30775394f5c94a54","title":"Upgrading Your ASP.NET 4.0+ Skills to ASP.NET Core","date":"April 12, 2019","categories":["ASP.NET Core"],"permalink":"asp-net-40-to-asp-net-core"}},{"node":{"id":"91032bf743ce5914242d95755a42b38d","title":"Enhancing Your Career with a Mastermind Group","date":"February 08, 2019","categories":["Business"],"permalink":""}},{"node":{"id":"86656586be640a54d6709456394b3a31","title":"Quick Introduction to SignalR Streaming","date":"December 13, 2018","categories":["ASP.NET Core"],"permalink":"quick-introduction-to-signalr-streaming"}},{"node":{"id":"0900dbe7888cfa9c8f8a0c80d3ee7b4d","title":"Book Review: Financially Stupid People Are Everywhere","date":"August 03, 2018","categories":["Reviews"],"permalink":"book-review-financially-stupid-people-are-everywhere"}},{"node":{"id":"3c6b55aca65f652c744102b55e8fd1fa","title":"I Removed Email From My Phone","date":"May 01, 2018","categories":["Deep Thoughts"],"permalink":"good-bye-email"}},{"node":{"id":"39219d53b66c7251d97291388144c0bb","title":"Swift Kick Show - NoSql Shouldn't Mean NoSecurity with Matt Groves","date":"April 24, 2018","categories":["Swift Kick Show"],"permalink":"swift-kick-show-nosql-shouldnt-mean-nosecurity-with-matt-groves"}},{"node":{"id":"93f93debfccd0b2c64fb1d31e4473d52","title":"Swift Kick Show - Unbelievable and Complex Advancements in Machine Learning with Ankur Kalra","date":"March 14, 2018","categories":["Swift Kick Show"],"permalink":"swift-kick-show-unbelievable-and-complex-advancements-in-machine-learning-with-ankur-kalra"}},{"node":{"id":"0bd065d1e52f35caf481f8f245d0481b","title":"Shedquarters","date":"May 26, 2017","categories":["Business"],"permalink":"shedquarters"}},{"node":{"id":"81203528c53656866f5a3fdac512a39a","title":"About Blog Posts","date":"May 03, 2017","categories":["Deep Thoughts"],"permalink":"about-blog-posts"}},{"node":{"id":"86cc49c6fca10bb607b5ecb667fcfe1d","title":"Fix My Computer","date":"May 02, 2017","categories":[],"permalink":"fix-my-computer"}},{"node":{"id":"6ddfe1c4d4751c7574f3ae2a243288cd","title":"Books I Read in 2016","date":"December 30, 2016","categories":["Reflection"],"permalink":"books-i-read-in-2016"}},{"node":{"id":"37e68e98e8c0f867d2dd9d83f025b71a","title":"Exploring C# 7.0: Out Variables","date":"November 08, 2016","categories":["Development - C#"],"permalink":"exploring-csharp70-out-variables"}},{"node":{"id":"ba4f6877090896a3798ca6356dd14ec9","title":"Interview with Michael Rollins for HRDevFest 2016","date":"September 01, 2016","categories":["Community, User Groups, and Conferences"],"permalink":"interview-with-michael-rollins-for-hrdevfest-2016"}},{"node":{"id":"791","title":"Review: NCache by Alachisoft","date":"August 22, 2016","categories":["Reviews"],"permalink":"review-ncache"}},{"node":{"id":"789","title":"Powershell: How to recursively delete files based of file extension?","date":"July 15, 2016","categories":["Development"],"permalink":"powershell-how-to-recursively-delete-files-based-of-file-extension"}},{"node":{"id":"10f071904c72744a2b9a72f44815a5fc","title":"Open Source Mentality of Choosing Your Tech Stack","date":"July 04, 2016","categories":["Deep Thoughts"],"permalink":"open-source-mentality-of-choosing-your-tech-stack"}},{"node":{"id":"6113c58125fc8d5bc31d98104dbc089f","title":"Non-Tech Factors to Consider When Choosing Your Tech Stack","date":"May 10, 2016","categories":["Deep Thoughts"],"permalink":"non-tech-factors-to-consider-when-choosing-your-tech-stack"}},{"node":{"id":"d38be0fb4755434f76ec5fe269e45fb8","title":"The 10% Rule to Presentations","date":"March 24, 2016","categories":["Deep Thoughts"],"permalink":"the-10-rule-to-presentations"}},{"node":{"id":"f384023db3b5fc8d8dbaa01f827b8eed","title":"Managing Your User Group: Food","date":"October 13, 2015","categories":["Community, User Groups, and Conferences"],"permalink":"user-group-food"}},{"node":{"id":"4d72e21480ae1e68d6c9295e2cdfbf84","title":"Enable SignalR Logging with One Simple Line","date":"August 28, 2015","categories":["Development - ASP.NET"],"permalink":"signalr-logging"}},{"node":{"id":"2e11ee70106b710eed384e31d4fd9c12","title":"SignalR Transports Explained","date":"August 17, 2015","categories":["Development - ASP.NET"],"permalink":"signalr-transports-explained"}},{"node":{"id":"778","title":"Banks, ATMS, and Horrible User Experiences","date":"August 03, 2015","categories":["Deep Thoughts"],"permalink":"banks-atms-and-horrible-user-experiences"}},{"node":{"id":"9ad967037ff7ce4bc728f64823006f8c","title":"Paying Attention","date":"July 23, 2015","categories":["Deep Thoughts"],"permalink":"paying-attention"}},{"node":{"id":"a8c7f9f11a00c7082fa214a0a954b8af","title":"Managing Your User Group: Locations","date":"July 02, 2015","categories":["Community, User Groups, and Conferences"],"permalink":"user-group-locations"}},{"node":{"id":"c94aa3ac05258649ce61d790e971a7cc","title":"How I'm Beating Email Addiction","date":"May 21, 2015","categories":["Deep Thoughts"],"permalink":"beating-email-addiction"}}]}},"context":{}} -------------------------------------------------------------------------------- /assets/data/using-unity-for-dependency-injection-with-signalr/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"2de519b93eefb07cdbbfa81389f9b993","title":"Using Unity for Dependency Injection with SignalR","date":"January 08, 2013","categories":["Development - ASP.NET"],"permalink":"using-unity-for-dependency-injection-with-signalr","content":"

I've had bit of a day, and a large part of it was learning how to wrangle SignalR into using my dependency injection provider (in this case, being Unity).  There are a couple thoughts, that I'd like to communicate to you all in case you're looking to do the same thing.  Also, if you have suggestions on what I could do differently, I'm more than open to hearing.  This is solution that worked for me, and I'm hoping it'll work for you.

\n

NOTE: This is built using SignalR v1.0-RC, which is a Prerelease NuGet package.  I'll try to update if this changes after release.

\n

First, what do we want to do?

\n
public class MyHub : Hub\n{\n   public MyHub(ISomeInterface interface)\n   {\n      // handle constructor injection here\n   }\n}
\n

There's a hub, but it doesn't have a default constructor.  I'd like to be able to have SignalR automatically INJECT the constructor requirements when we load a new instance of the Hub.

\n

There are TWO things we need to do.  First, we need to build our container (with Unity) and tell SignalR to use it.

\n
        public static void Initialise() // this isn't my misspelling, it's in the Unity.MVC NuGet package.\n        {\n            var container = BuildUnityContainer();\n\n            var unityDependencyResolver = new UnityDependencyResolver(container);\n\n            // used for MVC\n            DependencyResolver.SetResolver(unityDependencyResolver);\n            // used for WebAPI\n            GlobalConfiguration.Configuration.DependencyResolver = new Unity.WebApi.UnityDependencyResolver(container);\n            // used for SignalR\n            GlobalHost.DependencyResolver = new SignalRUnityDependencyResolver(container);\n        }\n\n        private static IUnityContainer BuildUnityContainer()\n        {\n            var container = new UnityContainer();\n\n            // register all your dependencies here.\n            container.RegisterType<ISomeInterface, SomeInterface>();\n\n            return container;\n        }
\n

Simple enough. You might want to know what SignalRUnityDependencyResolver looks like:

\n
public class SignalRUnityDependencyResolver : DefaultDependencyResolver\n    {\n        private IUnityContainer _container;\n\n        public SignalRUnityDependencyResolver(IUnityContainer container)\n        {\n            _container = container;\n        }\n\n        public override object GetService(Type serviceType)\n        {\n            if (_container.IsRegistered(serviceType)) return _container.Resolve(serviceType);\n            else return base.GetService(serviceType);\n        }\n\n        public override IEnumerable<object> GetServices(Type serviceType)\n        {\n            if (_container.IsRegistered(serviceType)) return _container.ResolveAll(serviceType);\n            else return base.GetServices(serviceType);\n        }\n\n    }
\n

What's going on here? We're creating a new SignalR dependency resolver, and inheriting from the default dependency resolver that SignalR uses. When SignalR goes to resolve a dependency, we're first going to ask Unity if it has an existing implementation. If it does not, we pass the request on to SignalR to get its default (if one is available).

\n

Why do we have do this? First, you can just replace the IoC container altogether, but I have had no luck registering all the various types that SignalR uses. This was by far an easier approach.

\n

You'd like to think everything will just work now, right? Wrong. The dependencies in your hub still will not injected. My understanding is that this is by design, so here's how to work with it.

\n
private static IUnityContainer BuildUnityContainer()\n        {\n            var container = new UnityContainer();\n\n            container.RegisterType<ISomeInterface, SomeInterface>();\n            container.RegisterType<MyHub>(new InjectionFactory(CreateMyHub));\n\n            return container;\n        }\n\n        private static object CreateMyHub(IUnityContainer p)\n        {\n            var myHub= new MyHub(p.Resolve<ISomeInterface>());\n\n            return myHub;\n        }
\n

This should be simple to follow. I'm registering a new type: MyHub, and telling Unity how to create a new instance of it. Creating it involves resolving the interface myself, and creating the new instance. This instance gets routed through SignalR and eventually executed.

\n

I'm also a user of StructureMap and Ninject, and I need to sit down to figure out this same process with those frameworks (if I even need to).  If you already have experience with them, let me know what you did.

\n"}},"context":{}} -------------------------------------------------------------------------------- /specifying-visual-studio-version-in-npm-installs/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Specifying Visual Studio Version in NPM Installs by Kevin Griffin 5 | 6 | 7 |

Specifying Visual Studio Version in NPM Installs

May 14, 2013

Sometimes when you install a NPM package, you'll run into an issue like this:

8 |
C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V110\Microsoft.Cpp.Platform.targets(35,5): error MSB8020: The builds tools for Visual Studio 2010 (Platform Toolset = 'v100') cannot be found. To build using the v100 build tools, either click the Project menu or right-click the solution, and then select "Update VC++ Projects...". Install Visual Studio 2010 to build using the Visual Studio 2010 build tools.
9 | Normally you'll get this if you're only running VS2012 and it wants VS2010/VS2008.  You can ask NPM to use Visual Studio 2012 instead by using with "--msvs_version=2012" command. 10 |

Example:

11 |
npm install socket.io --msvs_version=2012
12 | Tada.  This should work almost every time. 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /if-you-reach-just-one-person/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | If You Reach Just One Person by Kevin Griffin 5 | 6 | 7 |

If You Reach Just One Person

March 29, 2010

After giving a talk, it’s really difficult to judge if you reached any of the attendee’s.  Normally, you get the occasional “good job” or “thanks, that was a big help.”  Today I got a small mention by Johnathan Bracken, who was sitting in my jQuery From The Ground Up talk at Roanoke Code Camp.  This means a lot, because it shows that my talk stayed in Johnathan’s head past the end of the talk. 

He just started blogging, and mentioned me in his entry I Will Not Run from JavaScript No More. This is very cool to see.  I wish Johnathan the best of luck in his jQuery adventures!  And I expect him to give a jQuery talk at next year’s code camp.

8 |
9 | 10 | 11 | 12 | -------------------------------------------------------------------------------- /assets/data/what-makes-a-good-bug-report/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"618","title":"What Makes A Good Bug Report?","date":"September 23, 2009","categories":["Development"],"permalink":"what-makes-a-good-bug-report","content":"

As developers, we understand one fundamental truth: our software is going to break.  It's not a matter of if, it's a matter of when.  Hopefully on your team, you have a dedicated testing staff.  Other teams are not quite as lucky.  Their testers might be the project manager, or a single person who's responsible for testing all software produced by your company.

\n

Developers are terrible at testing their own software.  I'm my own worst tester, and that's because I have a large understanding of how it works.  Without trying, I can make the software work flawlessly each and every time.  On my teams, I state that I want others using my code as much as possible.  But what happens if something breaks?

\n

Hopefully your company employs a bug track of some sort.  For example, my company uses FogBugz for all of our bug tracking.  However, not many people in my company understand how to write a useful bug report.  My goal is to outline some of the minor things that can be done to make a bug report more helpful to the developer who's going to be using it.

\n

1. Use descriptive titles

\nWhenever I see a bug with a title like \"Got an error in (name a section of the app)\", I die a little inside.  I also see bug titles every day where it's just the name of the section of the app, for example \"Order Screen\" or \"Customer Profile\".  Imagine you're a developer who's going through a bug list.  I tend to put these bugs off until later because in order to figure out what I need to do, I have to open the bug.\n

Instead, let's try for bug titles like this: \"Error 'unable to save user information' when on the user profile screen\".  I know what the error is, and where it is.  That's helpful!  Or \"Order Confirmation: Clicking OK doesn't respond\".  Again, very helpful.  As the developer, I don't have to guess what the problem is.

\n

2. Steps to reproduce

\nFor the past few weeks, we've had this intermittent problem when saving a user's profile.  Every single time it's occurred, I'm nowhere near the tester.  I've been unable to reproduce it.  Every time it happens, I ask \"what was the input?\" and I'm constantly answered with \"I don't know\".  Without a details list of steps for reproducing the bug, I cannot guarantee that I'll be able to fix the bug.  When using guideline #3, you can save a lot of time.\n

3. Screen shots, screen shots, screen shots

\nA picture is worth a 1,000 words.  If you're having trouble verbalizing what the problem is, take a screen shot.  Please make sure that a screen shot is worthwhile though.  If you're working on a web application, and it renders correctly in Firefox, but not in IE, take a screen shot!  If you've filled out a 15 field form, and it errors out, take a screen shot!  When used in combination with guideline #2, you don't have to write out all the information typed into the form.\n

4. Prioritize correctly

\nWhen you're adding a bug to the system, take into consideration how important fixing the bug is to the current or next release.  If there is a misspelled word, I wouldn't classify it as a \"MUST FIX!\".  Instead, you should be giving it a lower priority, such as a \"Medium\" or \"When there is time\".  If the system is unable to process customer orders, which is the sole reason for using the system, then you might want to mark that as a \"MUST FIX!\".\n

This guideline is subjective though.  The person in charge of the next release, a project manager or lead developer, should have final say over what priority a bug is.

\n

5. Expectations

\nIf the system did something you didn't quite expect to happen, let the developer know.  In many cases, whatever happened was the product working as designed.  This is a perfect opportunity to discuss flow of application.  One person's design might not make sense to someone else.\n

For example, if the app allows you to hand type in dates, but only in the DD/MM/YYYY format and you typed in MM/DD/YYYY format, the system will fail.  That's not exactly a bug, because the system is set up to only accept dates in a certain format, but it is a bug in terms that the system didn't do what you expected.

\n

6. One Issue Per Bug Report

\nI can understand how tedious it must be to create a bug report.  Seriously, what is it?  Two, maybe three clicks?  When creating a bug report, make sure you're only referencing one issue.  That way individual issues can be prioritized and worked on solely by themselves.  Verification can be done on a single issue, and not a group.  When you list multiple items in a bug, you're risking that one item might be missed.  Additionally, if I'm the developer on the bug, I can't close it out until all items in the bug have been satisfied.  I might be able to fix all but one item, and the bug will remain in the tracker until I have time or resources to fix it.  If the bugs were individual, I could close out all the fixed issues and they could be evaluated again.\n
When writing your next bug report, please take these guidelines into account and make it easier on your developers.\n

I welcome any question or comments!  What do you think?  Anything you would add to the list?  Remove?  Let me know in the comments!

\n"}},"context":{}} -------------------------------------------------------------------------------- /base-gitignore/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | My Defacto .gitignore file by Kevin Griffin 5 | 6 | 7 |

My Defacto .gitignore file

November 12, 2012

Every time I create a new Git repo, I always have to go look for a previous copy of my .gitignore file.  I thought it would be a great idea to just post it up for all to find, in case they were looking for it.  This particular file is built around Visual Studio projects.

8 |
# Ignore file for Visual Studio
 9 | 
10 | # use glob syntax
11 | syntax: glob
12 | 
13 | # Ignore Config files with keys and passwords
14 | #ServiceConfiguration*.cscfg
15 | #Web*.config
16 | #App*.config
17 | 
18 | # Ignore Visual Studio files
19 | *.obj
20 | #*.exe
21 | #*.pdb
22 | *.user
23 | *.aps
24 | *.pch
25 | *.vspscc
26 | *.vshost.*
27 | *_i.c
28 | *_p.c
29 | *.ncb
30 | *.suo
31 | *.tlb
32 | *.tlh
33 | *.bak
34 | *.cache
35 | *.ilk
36 | *.log
37 | *.lib
38 | *.sbr
39 | *.scc
40 | *.orig
41 | UpgradeLog*.*
42 | UpgradeReport*.*
43 | [Bb]in
44 | [Dd]ebug*/
45 | obj/
46 | [Rr]elease*/
47 | _ReSharper*/
48 | [Tt]est[Rr]esult*
49 | [Bb]uild[Ll]og.*
50 | *.[Pp]ublish.xml
51 | glob:*.vs10x
52 | *.ReSharper
53 | [Pp]ublish
54 | [Rr]eleaseFiles
55 | [Cc]sx/
56 | [Bb]ackup1/
57 | [Pp]ackages/
58 | 
59 | # Mac Files
60 | .DS_Store
61 | *.DS_Store
62 | ._*
63 |
64 | 65 | 66 | 67 | -------------------------------------------------------------------------------- /exploring-csharp70-out-variables/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Exploring C# 7.0: Out Variables by Kevin Griffin 5 | 6 | 7 |

Exploring C# 7.0: Out Variables

November 08, 2016

In this series, I want to explore a couple of the new C# 7.0 features coming down the pipeline. As with most things, I am working with preview bits, so these features are not guaranteed to work the same way in production.

8 |

Using the out keyword within C# is nothing new. If you declare a variable within a method called with out, you are instructing the compile that you are expecting the method to set the values of those at runtime.

9 | 10 |

Commonly the problem is that you have to declare the variable before the method call using out. In C# 7.0, there is the concept of out variables, which will save you a couple keystrokes by allowing you to declare the variable inline.

11 |

The above example can be quickly refactored:

12 | 13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /quick-introduction-to-signalr-streaming/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Quick Introduction to SignalR Streaming by Kevin Griffin 5 | 6 | 7 |

Quick Introduction to SignalR Streaming

December 13, 2018

For my entry this year for C# Advent, I wanted to do something a little bit different.

8 |

As of late, I've been wanting to start doing several tidbits around cool things that I see in .NET Core and ASP.NET Core. And by the recommendation of my friend, Brady Gaster, I took a look at the new Streaming APIs built into SignalR (for ASP.NET Core).

9 |

And WOW! I'm super impressed with that I saw.

10 |

Check out my video introduction below, and lemme know what you think in the comments!

11 | 12 |

Source code for this project is available at on GitHub.

13 |
14 | 15 | 16 | 17 | -------------------------------------------------------------------------------- /assets/data/signalr-transports-explained/index.json: -------------------------------------------------------------------------------- 1 | {"hash":"782414107f461c86c0093807ec9a7009f522142f","data":{"article":{"id":"2e11ee70106b710eed384e31d4fd9c12","title":"SignalR Transports Explained","date":"August 17, 2015","categories":["Development - ASP.NET"],"permalink":"signalr-transports-explained","content":"

When I sit down to talk to people about SignalR, a common discussion we have is around transports and what the difference between them are. While SignalR gives you the flexibility to choose your own transport, it is often a better bet to simply allow the library to choose for you.

\n

How does SignalR determine which transport to use?

\n

There are two pieces of the puzzle that need to be evaluated before a transport is chosen. The client and the server. Keep in mind, a SignalR client can be something other than JavaScript.. and the server can be something not running on IIS.

\n

If you head over to SignalR documentation, they provide a really great overview on how SignalR chooses a transport.

\n

A simple way to explain the process is this:

\n
    \n
  1. If you're using legacy browser (IE8 or later.. cough)... use Long Polling.
  2. \n
  3. Do you need JSONP support? Yes? Long polling, for you.
  4. \n
  5. \n

    Okay okay. Let's try Websockets! This works well IF:

    \n
      \n
    • You're not doing JSONP
    • \n
    • You're not going cross-domain
    • \n
    • You ARE going cross-domain AND client supports CORS (Cross-Origin Resource Sharing).
    • \n
    • Client supports WebSockets (IE10+, Chrome, Firefox, Safari, etc)
    • \n
    • Server supports WebSockets (IIS 8.0+ or self-hosted SignalR)
    • \n
    \n
  6. \n
  7. No WebSockets? Sorry. Give Server Sent Events a try (most likely on non-IE browsers).
  8. \n
  9. No SSE? Try Forever Frame (IE browsers).
  10. \n
  11. No FF? MORE LONG POLLING!
  12. \n
\n

What are the pros and cons of each transport type?

\n

Excellent question! Let's walk through the list worse-case to best-case.

\n

Long Polling

\n

Long polling is a game of hurry up and wait. During this process, you are opening up a pipe (AJAX call) for the server to use for possible future communication. Anytime the server needs to send a message, the existing connection can be used.

\n

However, when a connection is used, the connection is closed. In order to continue communicating with the server, a client will need to reestablish the connection. In a best case scenario, the server is continuously sending data, so a connection is always reestablishing. Worse case, the connection stands open for up to two minutes (default timeout on most browsers). The process of continuously opening and closing connections can be a bit of a strain on the server.

\n

Long polling works well on old browsers, including some browsers which should have died ten years ago. This is the final fallback position if no other acceptable transport can be used.

\n

Forever Frame

\n

Warning: Forever Frame (FF) is Internet Explorer only, but it's really interesting how this process works. When a connection is established with FF, a hidden Iframe is created on the page. However, the page loaded into the Iframe is special. The connection will never closed.

\n

Since the connection remains open forever, the server can use it to continuously send new script. These scripts are loaded and executed on the parent page.

\n

Any client to server communication needs to be done the traditional way, via AJAX calls.

\n

Server Sent Events

\n

Some technologies stand the test of time, and Server Sent Events (SSE) is a great example. SSE is a server to client communication protocol developed in the Netscape days. It creates an object called an EventSource, which is a pipe from the server to the client. Anytime the server needs to send data, the EventSource pipe can be used.

\n

SSE is supported on all browsers, except Internet Explorer (sorry, but you have Forever Frame). Just as Forever Frame, if the client needs to communicate back with the server, a traditional AJAX call will need to be made.

\n

WebSockets

\n

Holy. Grail. Seriously. There is nothing better than WebSockets. When a WebSocket connection is made, there is a one-to-one connection between the client and server. Both are capable of communicating on the existing pipe.

\n

Of course, you are technically limited by the browser and server being used for a connection. Internet Explorer 9 and older need not apply (IE10+ are the only versions with WebSockets support). Firefox, Chrome, and Safari generally have no problems.

\n

For .NET folks deploying to IIS, you better be sure you are using IIS version 8 (or greater). IIS7 did not have support for WebSockets.

\n

Pulling It All Together

\n

As you look at the various transports available, you should start to appreciate what SignalR is doing for you underneath the scenes. What would happen if you had to implement all these different scenarios yourself?

\n"}},"context":{}} --------------------------------------------------------------------------------