{"@attributes":{"version":"2.0"},"channel":{"title":"Arana Software","description":"Arana Software is a software consulting agency developing quality, high-performing custom applications that are tailored to your unique needs.","link":"https:\/\/www.aranasoft.com","pubDate":"Fri, 08 May 2026 05:02:42 +0000","lastBuildDate":"Fri, 08 May 2026 05:02:42 +0000","item":[{"title":"Jay Harris to Appear on Panel at Microsoft Build","description":"\n\n<p>The session, titled \u201cConnect with Microsoft U.S. and Your Local\nDev Community,\u201d will begin at 1:00 PM PDT and run until 3:00 PM PDT.\nOther speakers appearing during the session include Matthew Calder (Microsoft),\nMary-Jo Diepeveen (Microsoft), Scott Emigh (Microsoft), Jeff Fattic (Microsoft), Nills\nFranssens (Microsoft), Ryan Heerwagen (Capital One), Karen Juhl (Microsoft), Crystal Kelch\n(Microsoft), Molly McCarthy, Ed Mullin, Nitya Narasimhan, Andres Padilla (Microsoft),\nJared Rhodes (QiMata Technologies LLC), Francois Smith (Microsoft), Nina Sui, and\nPatrick Thomas (Microsoft).<\/p>\n\n<p>Microsoft\u2019s Build Conference is being held Tuesday, May 19th through Wednesday, May 20th\nwith CEO Satya Nadella delivering the keynote address on Tuesday. The conference is being\nstreamed on Microsoft\u2019s website and is free to attend. People can register at\n<a href=\"https:\/\/register.build.microsoft.com\">https:\/\/register.build.microsoft.com<\/a>.<\/p>\n\n","pubDate":"Wed, 20 May 2020 00:00:00 -0700","link":"https:\/\/www.aranasoft.com\/blog\/jay-harris-to-appear-on-panel-at-msbuild\/","guid":"https:\/\/www.aranasoft.com\/blog\/jay-harris-to-appear-on-panel-at-msbuild\/","category":["News","Press Release","Conferences","Community","Press Release"]},{"title":"Arana Software to Sponsor Dev Around the Sun","description":"\n\n<p><img style=\"margin: 0px 0px 5px 15px; display: inline; border: 0px; max-width: 50%;\" border=\"0\" align=\"right\" src=\"\/posts\/2020-05-07-arana-software-to-sponsor-dev-aound-the-sun\/dev-around-the-sun-logo.png\" title=\"Dev Around the Sun Logo\" alt=\"Dev Around the Sun Logo\"><\/p>\n\n<p>Arana Software is heavily involved in the global technology community, including participation in the Microsoft Most Valuable Professional and Microsoft Regional Director programs, stewardship for Give Camp, and organization for local and virtual Meetups. Jay Harris, president of Arana Software, said, <em>\u201cAs developers, we are problem solvers, but many developers are feeling helpless to solve the problem of the current global pandemic. Dev Around the Sun is an opportunity to unite the global developer community, regardless of our technologies and backgrounds, to help raise funds toward finding a solution.\u201c<\/em><\/p>\n\n<p>Dev Around The Sun is a 24-hour, telethon-style, multi-platform fundraiser hosted by the .NET Foundation to raise money for Direct Relief\u2019s coronavirus emergency fund. Technology speakers from around the world will present a wide range of topics. The fundraiser will feature high-level talks on technology and human skills from a diverse group of renowned speakers who will educate, entertain, and inspire an international audience in the comfort of their own homes. Streaming will begin on Twitch and Youtube beginning on May 12, 2020 at 12:00 UTC, 5:00 AM US Pacific Time.<\/p>\n\n<p>Access to Dev Around The Sun\u2019s 24-hour event is public and open to everyone. The public may sign up at <a href=\"https:\/\/DevAroundTheSun.org\">DevAroundTheSun.org<\/a><\/p>\n\n<p>To sponsor or to make a matching contribution to Dev Around The Sun, contributors should visit <a href=\"https:\/\/devaroundthesun.org\">DevAroundTheSun.org<\/a>. Individual supporters of the event may donate to Direct Relief\u2019s Coronavirus Fund at <a href=\"https:\/\/bit.ly\/DATS2020\">https:\/\/bit.ly\/DATS2020<\/a>.<\/p>\n\n<hr>\n\n<h2 id=\"about-arana-software\">About Arana Software<\/h2>\n<p>Arana Software is a software consulting agency that provides a mindful blend of business and marketing implemented through the effective creation of software. Our focus is on collaborating the human element of building the right thing with the technical element of building the thing right, marketing ideas and bringing ideas to market.<\/p>\n\n<h2 id=\"about-dev-around-the-sun\">About Dev Around The Sun<\/h2>\n<p>Dev Around the Sun is a group of technologists, from all backgrounds, from around the globe, with two important goals in mind: to raise awareness and provide financial support for the many people fighting the current coronavirus and COVID-19 pandemic, while also delivering hope and reconnecting those in the global developer community.<\/p>\n\n<h2 id=\"contact\">Contact<\/h2>\n<p>For further inquiries, contact <a href=\"mailto:christina@aranasoft.com\">Christina Aldan<\/a>.<\/p>\n\n","pubDate":"Thu, 07 May 2020 00:00:00 -0700","link":"https:\/\/www.aranasoft.com\/blog\/arana-software-to-sponsor-dev-aound-the-sun\/","guid":"https:\/\/www.aranasoft.com\/blog\/arana-software-to-sponsor-dev-aound-the-sun\/","category":["News","Press Release","Conferences","Community","Press Release"]},{"title":"Code Camp Vegas selects Jay Harris to Keynote","description":"\n\n<p><img style=\"margin: 0px 0px 5px 15px; display: inline; border: 0px\" border=\"0\" align=\"right\" src=\"\/posts\/2018-08-07-code-camp-vegas-selects-jay-harris-to-keynote\/code-camp-vegas-logo.png\" title=\"Code Camp Vegas logo\" alt=\"Code Camp Vegas logo\"><\/p>\n\n<blockquote>\n  <p><em>\u201cAs citizens of the world, many of us watched the 2018 Olympic Winter\nGames in PyeongChang,\u201d<\/em> said Jay Harris. <em>\u201cWe celebrated the accomplishments of every\nOlympian, regardless of if they were awarded a medal. However, we can\ncertainly understand Olympians doubting their own skill based on their\nsuccess against other Olympians, despite achieving the greatest\nathletic stage in the history of the world. This self-doubt\u2014this imposter\nsyndrome\u2014isn\u2019t unique to Olympians; it affects software developers,\ngraphic designers, and all of humanity.\u201d<\/em><\/p>\n<\/blockquote>\n\n<p>Code Camp Vegas will be held on Saturday, October 20, 2018, at Work In\nProgress in downtown Las Vegas, Nevada. The one-day conference will host two\nparallel sessions throughout the day focusing on exciting topics in\nsoftware development. The schedule boasts thirteen speakers from Las\nVegas and throughout the United States, including Jay, a Las Vegas\nlocal.<\/p>\n\n<p>The event is designed for collaboration, networking, and learning to\nstrengthen the Las Vegas software development community. Tickets are\navailable on <a href=\"https:\/\/www.eventbrite.com\/e\/code-camp-vegas-tickets-50281030917\" title=\"Buy tickets to Code Camp Vegas on Eventbrite\">Eventbrite<\/a>\nfor $25.00. A 20% discount is available during purchase with the\ndiscount code <em>VegasTech<\/em>.<\/p>\n\n<p>Learn more at <a href=\"https:\/\/codecamp.vegas\/\">codecamp.vegas<\/a> and by following\n<a href=\"https:\/\/twitter.com\/codecampvegas\" title=\"Follow Code Camp Vegas on Twitter\">@CodeCampVegas<\/a>\non Twitter.<\/p>\n\n","pubDate":"Tue, 07 Aug 2018 00:00:00 -0700","link":"https:\/\/www.aranasoft.com\/blog\/code-camp-vegas-selects-jay-harris-to-keynote\/","guid":"https:\/\/www.aranasoft.com\/blog\/code-camp-vegas-selects-jay-harris-to-keynote\/","category":["News","Press Release","Conferences","Speaking","Arana Team","Community","Press Release"]},{"title":"Jeff Strauss joins Kansas City Developer Conference","description":"\n\n<p>After spending the prior seven years serving on the board of the St.\nLouis Days of .NET (now called Dev Up Conference), Jeff is excited for\nthe new opportunity to work on a dynamic, cross-platform event.<\/p>\n\n<blockquote>\n  <p><em>\u201cKCDC has so much exciting growth potential,\u201d<\/em> said Jeff, <em>\u201cI have\nparticipated here as a speaker for the last six years and seen its\nupward trajectory. It is truly becoming an international event. We\nare welcoming presenters to the regional community this year from\nseven countries across four continents. Beyond development\ntechnologies, I am just as proud of the new partner events for 2017\nthat will enhance the experience for all of our attendees, sponsors,\nand other community members.\u201d<\/em><\/p>\n<\/blockquote>\n\n<p>This year, KCDC has added the Kansas City Kids Conference. Hosted as\na free half-day event on Saturday, August 5, this special new\nopportunity will welcome children and families of all ages to learn\nnot only about software development, but also a variety of STEM topics\nacross the educational spectrum. Additionally, KCDC is partnering this\nyear with Todd Gardner\u2019s PubConf, a raw, uncensored, and often\nsatirical after-dark event featuring some of the industry\u2019s top\nspeakers. While based in Minnesota, PubConf is typically reserved for\nmajor international conferences abroad.<\/p>\n\n<p>The Kansas City Developer Conference originated out of the Microsoft\n.NET community in Overland Park, Kansas. For the first several years,\nit was hosted on different community college campuses around the\nKansas City bi-state metropolitan area. Upon experiencing substantial\ngrowth, the conference moved downtown in 2012 and continues to seek\nnew and innovative ways to engage the community.<\/p>\n\n<p>Tickets for this year\u2019s event are available now online at\n<a href=\"https:\/\/www.eventbrite.sg\/e\/2017-kansas-city-developer-conference-tickets-32717946258\" title=\"Buy\ntickets to KCDC on Eventbrite\">Eventbrite<\/a>.<\/p>\n\n<p>You can learn more about the Kansas City Developer Conference at\n<a href=\"http:\/\/www.kcdc.info\">kcdc.info<\/a> and by <a href=\"https:\/\/twitter.com\/kc_dc\" title=\"Follow KCDC on Twitter\">following\nKCDC<\/a> on Twitter.<\/p>\n","pubDate":"Sat, 15 Jul 2017 00:00:00 -0700","link":"https:\/\/www.aranasoft.com\/blog\/kansas-city-developer-conference-gains-new-board-member\/","guid":"https:\/\/www.aranasoft.com\/blog\/kansas-city-developer-conference-gains-new-board-member\/","category":["News","Press Release","Conferences","Arana Team","Community","Press Release"]},{"title":"Jay Harris Appointed to Microsoft Regional Director Program","description":"\n\n<p>As a member of the Regional Director program, Microsoft will look to Jay as a\nleader and visionary in both the business world and the developer community.\nIn their capacity as non-paid advisors to Microsoft, Regional Directors provide\nregular feedback to the company\u2019s senior leadership and executive teams.<\/p>\n\n<p>Uniquely, Regional Directors are renowned for their expertise beyond Microsoft\nplatforms alone. Instead, they are valued by Microsoft and industry leaders\nprecisely because of their knowledge across a variety of platforms, frameworks,\nand architectures. Drawing on their experience, Regional Directors are better\nequipped to understand Microsoft customers\u2019 needs and concerns while reporting\nback to Microsoft product teams to ensure an ever-improving customer experience.<\/p>\n\n<p>While Jay also continues to be a Microsoft Most Valuable Professional (MVP), the\ntwo programs are notably different concerning their underlying purpose. While\nthe MVP award focuses on in-depth technical knowledge, Regional Directors focus\non business consultation and the organizational \u201cbig picture\u201d within the\ntechnical landscape.<\/p>\n\n<p>All Regional Directors serve for renewable two-year terms. Jay\u2019s participation\nin the program began effective April 1, 2017.<\/p>\n","pubDate":"Thu, 01 Jun 2017 00:00:00 -0700","link":"https:\/\/www.aranasoft.com\/blog\/jay-harris-appointed-microsoft-regional-director\/","guid":"https:\/\/www.aranasoft.com\/blog\/jay-harris-appointed-microsoft-regional-director\/","category":["News","Press Release","Community","Awards","Arana Team","Community","Press Release"]},{"title":"Jay Harris to Deliver Keynote at Code PaLOUsa","description":"\n\n<p><img style=\"margin: 0px 0px 5px 15px; display: inline; border: 0px\" border=\"0\" align=\"right\" src=\"\/posts\/2017-01-19-jay-harris-keynoting-codepalousa\/codepalousa-logo.png\" title=\"Code PaLOUsa Logo\" alt=\"Code PaLOUsa Logo\"><\/p>\n\n<p>Entering into its seventh year, the annual Code PaLOUsa conference is\ndesigned to educate software development professionals on current and\nemerging technologies at an affordable cost. The event, which has been\nchaired by <a href=\"https:\/\/twitter.com\/chadgreen\" title=\"Follow ChadGreen\non Twitter\">Chad Green<\/a> since its 2011 inception, is run as a non-profit organized\nand staffed entirely by volunteers. In recent years, it has welcomed as\nmany as 750 attendees to the Louisville metropolitan area.<\/p>\n\n<blockquote>\n  <p><em>\u201cI am very excited about the opportunity to keynote at Code PaLOUsa\nthis year,\u201d<\/em> said Harris. <em>\u201cI have known Chad and his team of\norganizers for a long time, having presented sessions for the event\nnearly every year since it started. Louisville is a great city and Code\nPaLOUsa is an incredible conference.\u201d<\/em><\/p>\n<\/blockquote>\n\n<p>While the specific details of the talk remain to be finalized, Jay\nplans to cover themes of collaboration, empathy, and teamwork in the\nworkplace. \u201cToo often,\u201d he says, \u201cteams focus on speed over\nquality. Mistakes are punished and the offenders are ostracized. The end\nresult is rarely good.\u201d Jay preaches a professional culture of support,\nencouragement, and growth. The initial investment in all members of the\nteam and in fostering the proper environment, he advises, will almost\nalways pay dividends down the road.<\/p>\n\n<p>Code PaLOUsa 2017 will take place June 7\u20139, 2017, at the Ramada Plaza\nLouisville Hotel and Conference Center.\nTickets\nwill go on sale on at 10:00am EST on January 30. You can learn more\nabout the event and keep up with current news at\n<a href=\"http:\/\/www.codepalousa.com\">www.codepalousa.com<\/a> and by <a href=\"https:\/\/twitter.com\/CodePaLOUsa\" title=\"Follow Code PaLOUsa on\nTwitter\">following\nCode PaLOUsa<\/a> on Twitter.<\/p>\n","pubDate":"Thu, 19 Jan 2017 00:00:00 -0800","link":"https:\/\/www.aranasoft.com\/blog\/jay-harris-keynoting-codepalousa\/","guid":"https:\/\/www.aranasoft.com\/blog\/jay-harris-keynoting-codepalousa\/","category":["News","Press Release","Conferences","Speaking","Arana Team","Community","Press Release"]},{"title":"Thinking About Open Source, Part Two","description":"\n\n<blockquote>\n  <h3 id=\"open-source-series\">OPEN SOURCE SERIES<\/h3>\n  <p>Part 1: <a href=\"\/blog\/thinking-about-open-source-part-1\/\" title=\"Jeff Strauss |Thinking About Open Source, Part 1\">The Open Source Definition<\/a><br>\nPart 2: Copyleft vs. Permissive Licenses<\/p>\n<\/blockquote>\n\n<h2 id=\"copyleft--copyright\">Copyleft &amp; Copyright<\/h2>\n\n<p>Many people learning about open source ideas are probably hearing the term\n\u201ccopyleft\u201d for the first time. Shortly after thinking, \u201cThat\u2019s a\nfunny-sounding term,\u201d their next thought is usually an assumption that\nit represents the opposite of a copyright.<\/p>\n\n<p>The two terms are somewhat related. Certainly copyleft, as a concept,\narose from the principles of copyright and intellectual property.\nHowever, I would not necessarily say that they are opposites. In a\nfuture post, I will talk more about copyright, trademarks, and patents.\nFor now, simply be aware that a copyright is an assertion of ownership\nover authorship of works. When you hold the copyright over some\nintellectual property\u2014a novel, a painting, or your code\u2014you own the\nauthorship rights. Nobody else can legally use or reproduce the work\nwithout your express permission.<\/p>\n\n<p>Hence the purpose of Open Source licenses in the first\nplace. They are <em>copyright licenses<\/em>, granting the recipient permission\nto use, modify, and reproduce the code produced by the original author.\nWithout that license, even if you have the copyrighted code in hand, you\nhave no right to use or distribute it, any more than you can\nrebroadcast, reproduce, or use the pictures or accounts of a baseball\ngame without the express written consent of Major League Baseball.<\/p>\n\n<h3 id=\"copyleft-as-a-condition-of-use\">Copyleft as a Condition of Use<\/h3>\n\n<p>Open Source licenses generally provide a good deal of latitude to the\ndownstream user of code, but they rarely provide carte blanche\npermission for you to do whatsoever you please. Some (<em>e.g.<\/em>, the MIT\nlicense) come close. Most, however, place conditions or requirements on\nthe user of the software to satisfy the terms of the license.<\/p>\n\n<p><img style=\"float:left; margin-right: 20px; margin-bottom: 20px;\" alt=\"GPLv3 General Public License\" src=\"\/posts\/2016-09-17-thinking-about-open-source-part-2\/gpl-v3-logo.png\"><\/p>\n\n<p>The so-called copyleft provisions constitute one such set of conditions.\nThe most prominent of the copyleft licenses is the <a href=\"https:\/\/www.gnu.org\/licenses\/\" title=\"GNU Project Licenses\">GNU General Public\nLicense (GPL)<\/a>, along\nwith all of its associated colors, flavors, and versions. They are still\nOpen Source under the OSI\u2019s definition. You may take GPL-licensed\nsoftware and incorporate, link, modify, and redistribute it with your\nown projects.<\/p>\n\n<p>But there is a catch. Any redistribution of the GPL-covered code, in its\noriginal form or as part of a derivative work, <strong>must be released under\nthe same license, or a compatible open license<\/strong>. In other words, among\nother things, you cannot take GPL-licensed code and roll it into a\nclosed-code, proprietary solution.<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight plaintext\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre>Except from the GNU General Public License, Version 3  \nCopyright \u00a9 2007 Free Software Foundation, Inc.\n\nSection 5. Conveying Modified Source Versions.\n\nYou may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code...provided that\nyou also meet all of these conditions:  \n...  \nc) You must license the entire work, as a whole, under this\nLicense to anyone who comes into a possession of a copy.\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<p><strong>That is copyleft.<\/strong><\/p>\n\n<p>Inherently, this is neither a good nor a bad thing. It is simply a\nquality of the category of Open Source license. These are licenses where\nthe driving purpose is to ensure that the software remains open and free\n(<a href=\"\/blog\/thinking-about-open-source-part-1\/\">Speech, not Beer<\/a>). In\nthe right scenarios, this is quite valuable. In others (<em>e.g.<\/em>, use for\ncommercial products in the enterprise setting), it can be extremely\nproblematic.<\/p>\n\n<p>Even among the different versions of copyleft licenses, there are subtle\nvariances. Some are less draconian than others. However, across the\nboard, the same general principles hold.<\/p>\n\n<h2 id=\"permissive--copyleft\">Permissive == !Copyleft<\/h2>\n\n<p>Effectively, a permissive license is any license that <em>does not contain\nthe copyleft restrictions<\/em> seen in licenses such as the GPL. There are\nmany examples, which contain a wide array of provisions. Among these are\nthe MIT, BSD, and Apache licenses.<\/p>\n\n<p>At their simplest, a permissive copyright license may grant nearly\nuniversal and unrestricted rights for a downstream user to use, modify,\nredistribte, and otherwise consume the covered code as the downstream\nuser sees fit. Take, for example, the \"Expat\" version of the\n<a href=\"https:\/\/opensource.org\/licenses\/MIT\" title=\"The MIT License\">MIT License<\/a>\u2014currently\nthe most popular software license in common circulation\u2014which reads:<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight plaintext\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre>Copyright (c) &lt;year&gt; &lt;copyright holders&gt;\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and\/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<p>That\u2019s it. There are no express attribution or advertising requirements.\nThere is nothing covering patents or other (non-copyright) forms of\nintellectual property. Effectively, this license grants the consumer\nbroad rights to incorporate, improve, and distribute the licensed\nsoftware freely.<\/p>\n\n<p>And, importantly, there is <strong>no requirement to redistribute under the\nsame license, or even to keep it open<\/strong> in downstream use. This is what\ndistinguishes a traditional permissive license from a copyleft.<\/p>\n\n<p>Permissive licenses need not be as simple and all-encompassing as the\nMIT License. Others, such as the\n<a href=\"https:\/\/www.apache.org\/licenses\/LICENSE-2.0\" title=\"Apache 2.0\">Apache License, Version 2.0<\/a>\nor the <a href=\"https:\/\/www.mozilla.org\/en-US\/MPL\/\" title=\"MPL\n2.0\">Mozilla Public License<\/a>, contain much more \"legalese,\" warranting closer review. These two, in particular,\nprovide a license not only for copyright material, but also for patents\nor patentable content. (<strong>NB:<\/strong> the patent protection comes with\nstrings attached; more on that in a future post!)<\/p>\n\n<h2 id=\"so-what-does-this-mean-for-me\">So What Does This Mean for Me?<\/h2>\n\n<p>The impact of open source software on your own development projects\ndepends upon the nature of what you are doing. And it depends upon your\ngoals.<\/p>\n\n<p>For authors looking to release their own free or open software, a major\nconsideration are your hopes and dreams for the future of the project.\nDo you want to ensure that, no matter what, your software remains free\nand subject to copyleft-like restrictions? If so, the GPL (or one of its\nvariants) may be for you. Prefer to offer maximum flexibility and,\npotentially, encourage a higher rate of community contribution to the\nproject? Then some kind of permissive license might be more appropriate.<\/p>\n\n<p>Many organizations <em>dual-license<\/em> their software. Consumers may use the\nsoftware under a no-cost open license, which is subject to copyleft\nrestritions. Alternatively, those same consumers may pay a fee for a\ncommercial license, allowing the licensee to incorporate and\nrelease proprietary (<em>i.e.<\/em>, closed) software derived from the open\nsource component. This approach has gained in popularity as a means of\nsupporting free software models within a business or commercial\nenvironment.<\/p>\n\n<p>If you are working in an enterprise environment, or if you are hoping to\nimplement proprietary software, then you absolutely <em>must<\/em> be aware of\nthe copyleft distinction. It doesn\u2019t matter whether you are cloning an\nopen component from its git repository, grabbing a package from npm, or\n\"checking the box\" in a package manager like nuget. The key is\nalways to <em>check the license<\/em> and make <em>educated decisions<\/em> about\nwhether a given piece of software can be incorporated in your project without\ncompromising your goals.<\/p>\n\n<p>In a future post in this series, I will give my basic suggestions for\nhow development teams\u2014particularly in the enterprise\u2014can\nimplement sensible policies to manage the incorporation of open source\nto minimize risk. Don\u2019t forget to\n<a href=\"mailto:jeff@aranasoft.com\">write me<\/a> if there is a\nspecific topic you want to see covered.<\/p>\n\n<blockquote class=\"disclaimer\">\n  <h2 id=\"disclaimer\">Disclaimer<\/h2>\n  <p>If you have seen my talks in the past, you will have heard me say this\ncountless times. But as always, remember, \u201cI may be a lawyer, but I am\n<em>not your lawyer<\/em>.\u201d Arana Software LLC is not a law firm and does not\nengage, in any context or jurisdiction, in the practice of law. These\nblog posts are for infomational purposes only and should never be\nconstrued as legal advice. If you think you, your company, or your\nwork requires specific advice with respect to any particular issue or\nproblem, you should contact (or retain) an attorney who represents you\nand understands your needs. My ramblings on this blog are nothing more\nthan a guide for some things you may wish to discuss with your own\ncounsel.<\/p>\n<\/blockquote>\n","pubDate":"Sat, 17 Sep 2016 00:00:00 -0700","link":"https:\/\/www.aranasoft.com\/blog\/thinking-about-open-source-part-2\/","guid":"https:\/\/www.aranasoft.com\/blog\/thinking-about-open-source-part-2\/","category":["Open Source","Licenses","Community","Business","Open Source"]},{"title":"Thinking About Open Source, Part One","description":"\n\n<blockquote>\n  <h3 id=\"open-source-series\">OPEN SOURCE SERIES<\/h3>\n  <p>Part 1: The Open Source Definition<br>\nPart 2: <a href=\"\/blog\/thinking-about-open-source-part-2\/\" title=\"Jeff Strauss | Thinking About Open Source, Part 2\">Copyleft vs. Permissive Licenses<\/a><\/p>\n<\/blockquote>\n\n<h2 id=\"what-is-open-source\">What is Open Source?<\/h2>\n\n<p>The abstract for my popular talk, <em>The Impact of Leveraging Open\nSource<\/em>, reads in part:<\/p>\n\n<blockquote>\n  <p><em>Open source tools. We all use them. But what does \u201copen source\u201d\ntruly mean? What are our rights and limitations as open source\nconsumers to use, modify, and redistribute these tools?<\/em><\/p>\n<\/blockquote>\n\n<p>I think that there is a great deal of misconception about the core\ndefinition of Open Source software. Many young, new developers\u2014and\nperhaps experienced devs, as well\u2014associate the term \u201copen\u201d with the\nidea of \u201cfree\u201d stuff. If you are just getting started, or trying to\nbuild your own side project, or just are strapped for cash generally\n(and who isn\u2019t), then \u201cfree\u201d sure sounds exciting!<\/p>\n\n<p>On the other end of the spectrum, developer leads and project\nmanagers in big business settings have, historically, largely run away from Open\nSource, screaming. At one time or another, they heard horror stories\nabout a project that completely fell apart because it\nincorporated an open library and either failed to comply with the\nlicensing terms, or else triggered an obligation on the part of the\nbusiness to open source their proprietary end-product. Bosses screaming;\njobs lost; fire and brimstone; the works.<\/p>\n\n<blockquote>\n  <p><em>Both of these perceptions may be true\u2014some of the time.<\/em><br>\n<em>Neither has anything to do with the\ndefinition of a piece of software as being open source.<\/em><\/p>\n<\/blockquote>\n\n<p>It so happens that many different distributions of Linux are readily\navailable for download, free of cost. Red Hat also offers <a href=\"https:\/\/www.redhat.com\/en\/technologies\/linux-platforms\/enterprise-linux\" title=\"Red\nHat Enterprise Linux\">Red Hat\nEnterprise Linux<\/a>, at a fairly hefty annual sum, and plenty of\nbusinesses happily pay for it. Both are \u201copen source,\u201d but one comes\npackaged with automatic updates and other helpful support services.<\/p>\n\n<p>If your commercial enterprise is trying to release a\nproprietary, closed-source image editor, you probably should not fork it\nfrom <a href=\"https:\/\/www.gimp.org\" title=\"GIMP: GNU Image Maniuplation Tool\">GIMP<\/a>. On\nthe other hand, back in November 2014, Microsoft\n<a href=\"https:\/\/github.com\/dotnet\/core\" title=\".NET Core Home Repository\non GitHub\">open-sourced<\/a> the .NET Core Framework and Runtime under the <a href=\"https:\/\/opensource.org\/licenses\/MIT\" title=\"Open Source Initiative:\nThe MIT License\">MIT\nLicense<\/a> <em>(more on that in a future post)<\/em>, and countless companies release closed-source products\nbased upon .NET every single day.<\/p>\n\n<p>As with so many things in life, one size does not fit all situations.\nSo\u2026 what are the core factors that define a piece of software\nas open source?<\/p>\n\n<h2 id=\"the-open-source-initiative-and-licensing\">The Open Source Initiative and Licensing<\/h2>\n\n<p><a href=\"https:\/\/www.opensource.org\/\" title=\"Open Source Initiative\">\n<img style=\"float:left; margin-right: 20px; margin-bottom: 20px;\" alt=\"Open Source Initiative Logo\" src=\"\/posts\/2016-01-11-thinking-about-open-source-part-1\/open-source-initiative-logo.png\">\n<\/a><\/p>\n\n<p>When it comes to defining open source software, the standard-bearer for\nnearly twenty years has been the <a href=\"https:\/\/opensource.org\" title=\"Open Source Initiative Home\">Open Source\nInitiative<\/a>. This\nnon-profit organization declares themselves (rightfully) to be the\n\u201cstewards of the Open Source Definition.\u201d<\/p>\n\n<p>Okay, sounds fancy. What that really means to me and you is that\nOSI reviews and certifies whether a given license, through that\nlicense\u2019s standard text, comforms to the requirements for Open Source\nsoftware. When we say that a piece of software is \u201cOpen Source\u201d with a\ncapital O.S., we mean that its source code is made available for\nconsumption under a license approved by OSI.<\/p>\n\n<p>Approved Open Source licenses vary greatly in their scope, length, and\ncontent, but at a minimum, they should all comply with the following\nrequirements.<\/p>\n\n<h3 id=\"free-distribution\">Free Distribution<\/h3>\n\n<p>Here is the \u201cFREE\u201d that we discussed before. \u201cA-ha!\u201d you say, \u201cBut you\nsaid that open source software did not have to be free.\u201d People often\nconflate two separate meanings of the term. As I often say in my talks\non this subject:<\/p>\n\n<blockquote>\n  <p><em>With Open Source, we mean \u201cfree\u201d as in Free Speech, not Free Beer<\/em><\/p>\n<\/blockquote>\n\n<p>Everyone loves cost-free beer, and who doesn\u2019t love cost-free software?\nBut that\u2019s not what we mean when we talk about Free Software. Rather,\nthe intent is that Open Source is just as it sounds. The underlying\nsource code is freely available. Moreover, the license must not restrict\nthe consumer from giving the source code to others and cannot demand\nroyalties from downstream consumers for future use. This leads to\nanother important requirement.<\/p>\n\n<h3 id=\"source-code-inclusion\">Source Code Inclusion<\/h3>\n\n<p>It probably goes without saying, but Open Source software licenses\nrequire that distribution includes source code. For that matter, it is\nimportant to realize that <em>compiled, binary software cannot, by\ndefinition be Open Source<\/em>. It is the underlying source, through its\ndistribution, that is licensed under an OSI-approved license. The code\nmust be easy to obtain, at little to no cost, without obfuscation.<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre><span class=\"c1\">\/\/ NOT OPEN SOURCE (from angular.min.js)<\/span>\n<span class=\"kd\">var<\/span> <span class=\"nx\">b<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">length<\/span><span class=\"dl\">\"<\/span><span class=\"k\">in<\/span> <span class=\"nb\">Object<\/span><span class=\"p\">(<\/span><span class=\"nx\">a<\/span><span class=\"p\">)<\/span><span class=\"o\">&amp;&amp;<\/span><span class=\"nx\">a<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">;<\/span><span class=\"k\">return<\/span> <span class=\"nx\">Q<\/span><span class=\"p\">(<\/span><span class=\"nx\">b<\/span><span class=\"p\">)<\/span><span class=\"o\">&amp;&amp;<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"o\">&lt;=<\/span><span class=\"nx\">b<\/span><span class=\"o\">&amp;&amp;<\/span><span class=\"p\">(<\/span><span class=\"nx\">b<\/span><span class=\"o\">-<\/span><span class=\"mi\">1<\/span> <span class=\"k\">in<\/span> <span class=\"nx\">a<\/span><span class=\"o\">||<\/span><span class=\"nx\">a<\/span> <span class=\"k\">instanceof<\/span> <span class=\"nb\">Array<\/span><span class=\"p\">)<\/span><span class=\"o\">||<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">function<\/span><span class=\"dl\">\"<\/span><span class=\"o\">==<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">a<\/span><span class=\"p\">.<\/span><span class=\"nx\">item<\/span><span class=\"p\">)}<\/span><span class=\"kd\">function<\/span> <span class=\"nx\">n<\/span><span class=\"p\">(<\/span><span class=\"nx\">a<\/span><span class=\"p\">,<\/span><span class=\"nx\">b<\/span><span class=\"p\">,<\/span><span class=\"nx\">d<\/span><span class=\"p\">){<\/span><span class=\"kd\">var<\/span> <span class=\"nx\">c<\/span><span class=\"p\">,<\/span><span class=\"nx\">e<\/span><span class=\"p\">;<\/span><span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">a<\/span><span class=\"p\">)<\/span><span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">B<\/span><span class=\"p\">(<\/span><span class=\"nx\">a<\/span><span class=\"p\">))<\/span><span class=\"k\">for<\/span><span class=\"p\">(<\/span><span class=\"nx\">c<\/span> <span class=\"k\">in<\/span> <span class=\"nx\">a<\/span><span class=\"p\">)<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">prototype<\/span><span class=\"dl\">\"<\/span><span class=\"o\">==<\/span><span class=\"nx\">c<\/span><span class=\"o\">||<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">length<\/span><span class=\"dl\">\"<\/span><span class=\"o\">==<\/span><span class=\"nx\">c<\/span><span class=\"o\">||<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">name<\/span><span class=\"dl\">\"<\/span><span class=\"o\">==<\/span><span class=\"nx\">c<\/span><span class=\"o\">||<\/span><span class=\"nx\">a<\/span><span class=\"p\">.<\/span><span class=\"nx\">hasOwnProperty<\/span><span class=\"o\">&amp;&amp;!<\/span><span class=\"nx\">a<\/span><span class=\"p\">.<\/span><span class=\"nx\">hasOwnProperty<\/span><span class=\"p\">(<\/span><span class=\"nx\">c<\/span><span class=\"p\">)<\/span><span class=\"o\">||<\/span><span class=\"nx\">b<\/span><span class=\"p\">.<\/span><span class=\"nx\">call<\/span><span class=\"p\">(<\/span><span class=\"nx\">d<\/span><span class=\"p\">,<\/span><span class=\"nx\">a<\/span><span class=\"p\">[<\/span><span class=\"nx\">c<\/span><span class=\"p\">],<\/span><span class=\"nx\">c<\/span><span class=\"p\">,<\/span><span class=\"nx\">a<\/span><span class=\"p\">);<\/span><span class=\"k\">else<\/span> <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">E<\/span><span class=\"p\">(<\/span><span class=\"nx\">a<\/span><span class=\"p\">)<\/span><span class=\"o\">||<\/span><span class=\"nx\">Aa<\/span><span class=\"p\">(<\/span><span class=\"nx\">a<\/span><span class=\"p\">)){<\/span><span class=\"kd\">var<\/span> <span class=\"nx\">f<\/span><span class=\"o\">=<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">object<\/span><span class=\"dl\">\"<\/span><span class=\"o\">!==<\/span><span class=\"k\">typeof<\/span> <span class=\"nx\">a<\/span><span class=\"p\">;<\/span><span class=\"nx\">c<\/span><span class=\"o\">=<\/span><span class=\"mi\">0<\/span><span class=\"p\">;<\/span><span class=\"k\">for<\/span><span class=\"p\">(<\/span><span class=\"nx\">e<\/span><span class=\"o\">=<\/span><span class=\"nx\">a<\/span><span class=\"p\">.<\/span><span class=\"nx\">length<\/span><span class=\"p\">;<\/span><span class=\"nx\">c<\/span><span class=\"p\">,<\/span><span class=\"nx\">e<\/span><span class=\"p\">;<\/span><span class=\"nx\">c<\/span><span class=\"o\">++<\/span><span class=\"p\">)(<\/span><span class=\"nx\">f<\/span><span class=\"o\">||<\/span><span class=\"nx\">c<\/span> <span class=\"k\">in<\/span> <span class=\"nx\">a<\/span><span class=\"p\">)<\/span><span class=\"o\">&amp;&amp;<\/span><span class=\"nx\">b<\/span><span class=\"p\">.<\/span><span class=\"nx\">call<\/span><span class=\"p\">(<\/span><span class=\"nx\">d<\/span><span class=\"p\">,<\/span><span class=\"nx\">a<\/span><span class=\"p\">[<\/span><span class=\"nx\">c<\/span><span class=\"p\">],<\/span><span class=\"nx\">c<\/span><span class=\"p\">,<\/span><span class=\"nx\">a<\/span><span class=\"p\">)}<\/span><span class=\"k\">else<\/span> <span class=\"k\">if<\/span><span class=\"p\">(<\/span><span class=\"nx\">a<\/span><span class=\"p\">.<\/span><span class=\"nx\">forEach<\/span><span class=\"o\">&amp;&amp;<\/span><span class=\"nx\">a<\/span><span class=\"p\">.<\/span><span class=\"nx\">forEach<\/span><span class=\"o\">!==<\/span><span class=\"nx\">n<\/span><span class=\"p\">)<\/span><span class=\"nx\">a<\/span><span class=\"p\">.<\/span><span class=\"nx\">forEach<\/span><span class=\"p\">(<\/span><span class=\"nx\">b<\/span><span class=\"p\">,<\/span><span class=\"nx\">d<\/span><span class=\"p\">,<\/span><span class=\"nx\">a<\/span><span class=\"p\">)<\/span><span class=\"o\">&amp;&amp;<\/span>\n\n<span class=\"c1\">\/\/ OPEN SOURCE (from angular.js v1.4.9)<\/span>\n<span class=\"kd\">var<\/span> <span class=\"nx\">manualLowercase<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">s<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"cm\">\/* jshint bitwise: false *\/<\/span>\n  <span class=\"k\">return<\/span> <span class=\"nx\">isString<\/span><span class=\"p\">(<\/span><span class=\"nx\">s<\/span><span class=\"p\">)<\/span>\n      <span class=\"p\">?<\/span> <span class=\"nx\">s<\/span><span class=\"p\">.<\/span><span class=\"nx\">replace<\/span><span class=\"p\">(<\/span><span class=\"sr\">\/<\/span><span class=\"se\">[<\/span><span class=\"sr\">A-Z<\/span><span class=\"se\">]<\/span><span class=\"sr\">\/g<\/span><span class=\"p\">,<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">ch<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span><span class=\"k\">return<\/span> <span class=\"nb\">String<\/span><span class=\"p\">.<\/span><span class=\"nx\">fromCharCode<\/span><span class=\"p\">(<\/span><span class=\"nx\">ch<\/span><span class=\"p\">.<\/span><span class=\"nx\">charCodeAt<\/span><span class=\"p\">(<\/span><span class=\"mi\">0<\/span><span class=\"p\">)<\/span> <span class=\"o\">|<\/span> <span class=\"mi\">32<\/span><span class=\"p\">);})<\/span>\n      <span class=\"p\">:<\/span> <span class=\"nx\">s<\/span><span class=\"p\">;<\/span>\n<span class=\"p\">};<\/span>\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<h3 id=\"derived-works\">Derived Works<\/h3>\n\n<p>Open Source licenses will never prohibit the modification of the source\ncode, nor the distribution of any derived works arising from those\nmodifications. There are actually a couple loaded terms in that last\nsentence: \u201cdistribution\u201d and \u201cderived works\u201d both can mean slightly\ndifferent things depending upon the context.<\/p>\n\n<p>In future posts, I will look at both of these concepts in more detail.\nBut for now, it will suffice to say that any Open Source license will\npermit you to modify its covered code and redistribute the results. The\n<em>extent<\/em> of your own code that is deemed part of the \u201cderived work,\u201d and\nthe means through which you may be required to license those\nderivatives, is at the heart of what differentiates many OSI-approved\nlicense from one another.<\/p>\n\n<h3 id=\"techhnology-and-software-restrictions\">Techhnology and Software Restrictions<\/h3>\n\n<p>One requirement for Open Source that is less obvious is that a license\nmay not restrict consumers\u2019 rights based upon the presence of (or\nuse with) any particular technology. That means the Open Source license\ndistributed with the software <em>cannot<\/em> be conditioned upon:<\/p>\n\n<ul>\n  <li>Use alongside any other specific software or environment;<\/li>\n  <li>Distribution on a specific medium; or<\/li>\n  <li>Reuse in connection with any specific platform or technology.<\/li>\n<\/ul>\n\n<p>The purpose of these requirements, generally, is to ensure that\nconsumers and distributors of software remain free to make the choices\nabout their software and systems that best suit their needs.<\/p>\n\n<h3 id=\"anti-discrimination\">Anti-Discrimination<\/h3>\n\n<p>Properly licensed Open Source cannot discriminate against any group of\npeople or purpose. Stated another way, there can be no restrictions that\nexclude anybody from using and benefitting from the software; and there\ncan be no limits that prevent the software from being used in the\npursuit of any given endeavor\u2014whether or not the original author\napproves of that endeavor.<\/p>\n\n<div style=\"float: right; margin-left: 20px; margin-bottom: 20px;\">\n<img alt=\"Harry Potter and Voldemort\" src=\"\/posts\/2016-01-11-thinking-about-open-source-part-1\/harry-potter-and-voldemort.png\"><br>\n<small>Harry Potter and the Deathly Hallows, Part 2<\/small><br>\n<small>Copyright \u00a9 2011 Warner Bros. Pictures<\/small>\n<\/div>\n\n<p>The <a href=\"https:\/\/opensource.org\/faq\" title=\"Open Source Frequently Asked\nQuestions\">FAQ page<\/a> on the OSI site actually poses the question of whether \u201cevil\npeople\u201d can be prevented from using open software. The answer, of\ncourse, is no. The purpose of preventing <em>any kind<\/em> of discrimination is\nto ensure the maximum amount of participation in the open source\ncommunity. Ideas are meant to be shared, no matter what those ideas may\nbe.<\/p>\n\n<p>In an old slide deck, I used to show a picture of Voldemort grabbing Harry\nPotter. It was good for a quick laugh. But the point was to illustarte\nthat even if somebody as evil as Voledmort wanted to use open source software\nto produce registry to systematically eliminate all Muggles, nothing in the\nOpen Source license can disallow this.<\/p>\n\n<blockquote>\n  <p><strong>Important Caveat:<\/strong> <em>Just because the license is silent on issues\nof purpose\u2014evil or otherwise\u2014this does not excuse you or anyone else\nfrom abiding by all of the laws where you live. Unlawful activities\nare still going to get you into trouble. Here, we are simply discussing\nthe terms and conditions of use under the Open Soure license.\nNothing more; nothing less.<\/em><\/p>\n<\/blockquote>\n\n<h2 id=\"whats-next\">What\u2019s Next?<\/h2>\n\n<p>Now we at least have a better idea of what it means to be \u201cOpen Source\u201d\nsoftware.<\/p>\n\n<p>In future posts in this series, I intend to contrast so-called \u201c<em>copyleft<\/em>\u201d\nlicenses from the other \u201c<em>permissive<\/em>\u201d licenses under the Open Source\numbrella. I will post a discussion of what constitutes distribution of software\nin the first place, as well as a review of the differences\nbetween <em>copyright, trademark, and patent<\/em>. And, of course, I also plan\nto discuss some details of various popular licenses. <a href=\"mailto:jeff@aranasoft.com\">Write\nme<\/a> if there are any\nyou\u2019ve come across that you\u2019d like to hear more about.<\/p>\n\n<blockquote class=\"disclaimer\">\n  <h2 id=\"disclaimer\">Disclaimer<\/h2>\n  <p>If you have seen my talks in the past, you will have heard me say this\ncountless times. But as always, remember, \u201cI may be a lawyer, but I am\n<em>not your lawyer<\/em>.\u201d Arana Software LLC is not a law firm and does not\nengage, in any context or jurisdiction, in the practice of law. These\nblog posts are for infomational purposes only and should never be\nconstrued as legal advice. If you think you, your company, or your\nwork requires specific advice with respect to any particular issue or\nproblem, you should contact (or retain) an attorney who represents you\nand understands your needs. My ramblings on this blog are nothing more\nthan a guide for some things you may wish to discuss with your own\ncounsel.<\/p>\n<\/blockquote>\n","pubDate":"Mon, 11 Jan 2016 00:00:00 -0800","link":"https:\/\/www.aranasoft.com\/blog\/thinking-about-open-source-part-1\/","guid":"https:\/\/www.aranasoft.com\/blog\/thinking-about-open-source-part-1\/","category":["Open Source","Licenses","Enterprise","Community","Business","Business","Open Source"]},{"title":"Arana Software Welcomes Jeff Strauss as Co-Owner","description":"\n\n<p><img style=\"border-right-width: 0px; margin: 0px 0px 5px 15px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px\" title=\"Jeff Strauss\" border=\"0\" alt=\"Jeff Strauss\" align=\"right\" src=\"\/posts\/2015-11-02-arana-software-welcomes-jeff-strauss\/jeff-strauss-portrait-photo.png\"><\/p>\n\n<p>Jeff\u2014a developer, attorney, and software consultant\u2014is a native and resident of St. Louis, Missouri,\nwhere he has served the last five years as vice president of successful software consulting practice\nArchitectNow. His combined experience in business, law, and technology offer his clients a unique\nperspective as a trusted advisor, and his talents have been recognized by industry peers, naming him\nto the ASPInsiders in 2014.<\/p>\n\n<blockquote>\n  <p><em>\u201cWe are eager to have Jeff join the team,\u201d<\/em> says Jay Harris. <em>\u201cHis passion and conviction will\n  be a tremendous asset to the ongoing success of the Arana family, including staff, clients,\n  partners, and the technology community at large.\u201d<\/em><\/p>\n<\/blockquote>\n\n<p>Jeff earned his undergraduate degree from Duke University and his Juris Doctor from Washington\nUniversity School of Law. Jeff began his professional career as an associate attorney at Rosenblum\nGoldenhersh, P.C., however his lifelong passion for technology drew him back towards his\nchildhood dreams; after five years in the legal field, he left the practice to pursue an interest\nin software development.<\/p>\n\n<blockquote>\n  <p><em>\u201cI am beyond excited to join the team at Arana. I have known Jay Harris for a number of\n  years and have a deep respect for the quality he always brings to the table,\u201d<\/em> says Jeff.\n  <em>\u201cWorking together, the sky will be the limit for the solutions we can deliver to our clients,\n  now and in the future.\u201d<\/em><\/p>\n<\/blockquote>\n\n<p>In addition to delivering solutions to his clients, Jeff is regularly speaking on business\nand technology to developer audiences throughout the United States. Within his local community,\nJeff is serving on the board of directors for both the <a href=\"http:\/\/www.stldodn.com\">St. Louis Days of .NET<\/a> technical\nconference and the <a href=\"http:\/\/www.stlnet.org\">St. Louis .NET User Group<\/a>.<\/p>\n","pubDate":"Mon, 02 Nov 2015 00:00:00 -0800","link":"https:\/\/www.aranasoft.com\/blog\/arana-software-welcomes-jeff-strauss\/","guid":"https:\/\/www.aranasoft.com\/blog\/arana-software-welcomes-jeff-strauss\/","category":["News","Press Release","Software Development","Business","Arana Team","Business","Press Release"]},{"title":"Git and Grunt Deploy to Windows Azure","description":"\n\n<h2 id=\"incorporating-grunt\">Incorporating Grunt<\/h2>\n\n<p><a href=\"https:\/\/gruntjs.com\">Grunt<\/a> is a JavaScript-based task runner for your\ndevelopment projects to help you with those repetitive, menial, and mundane tasks\nthat are necessary for production readiness. This could be running unit tests, compiling\ncode, image processing, bundling and minification, and more. For our production deployments,\nwe commonly use Grunt to compile LESS into CSS, CoffeeScript into JavaScript, and\nJade into HTML, taking the code we write and preparing it for browser consumption.\nWe also use Grunt to optimize these various files for speed through bundling and minification.\nThe output of this work is done at deployment rather than development, with only the\nsource code committed into Git and never its optimized output.<\/p>\n\n<h2 id=\"git-deploy-and-kudu\">Git Deploy and Kudu<\/h2>\n\n<p>Continuous deployment will automatically update your site with the latest source code\nwhenever modifications are made to the source repository. This will also work with\nMercurial. There is plenty of existing documentation on\n<a href=\"https:\/\/www.windowsazure.com\/en-us\/develop\/nodejs\/common-tasks\/publishing-with-git\/\">setting up Git Deploy in Azure<\/a>,\nso consider that a prerequisite for this article. However,\nGit Deploy, alone, will only take the files as they are in source, and directly deploy\nthem to your site. If you need to run additional tasks, such as compiling your .NET\nsource or running Grunt, that is where Kudu comes into play.<\/p>\n\n<p>Kudu is the engine that drives Git deployments in Windows Azure. Untouched, it will\nsimply synchronize files from Git to your <em>\/wwwroot<\/em>, but it can be easily reconfigured\nto execute a deployment command, such as a Windows Command file, a Shell Script, or\na Node.js script. This is enabled through a standardized file named <code>.deployment<\/code>.\nFor Grunt deployment, we are going to execute a Shell Script that will perform npm,\nBower, and Grunt commands in an effort to make our code production-ready. For other\noptions on <code>.deployment<\/code>, check out the <a href=\"https:\/\/github.com\/projectkudu\/kudu\/wiki\">Kudu project wiki<\/a>.<\/p>\n\n<p>Kudu is also available locally for testing, and to help build out your deployment\nscripts. The engine is available as a part of the cross-platform Windows Azure Command\nLine Tools, available through npm.<\/p>\n\n<h3 id=\"installing-the-azure-cli\">Installing the Azure CLI<\/h3>\n\n<div class=\"highlight\"><pre class=\"highlight shell\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre><span class=\"nv\">$ <\/span>npm <span class=\"nb\">install <\/span>azure-cli <span class=\"nt\">--global<\/span>\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<p>We can also use the Azure CLI to generate default Kudu scripts for our Node.js project.\nThough we will need to make a few modifications to make the scripts work with Grunt,\nit will give us a good start.<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight shell\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre><span class=\"nv\">$ <\/span>azure site deploymentscript <span class=\"nt\">--node<\/span>\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<p>This command will generate both our <code>.deployment<\/code> and the default <code>deploy.sh<\/code>.<\/p>\n\n<h3 id=\"our-deployment-file\">Our .deployment file<\/h3>\n\n<div class=\"highlight\"><pre class=\"highlight ini\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n2\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre><span class=\"nn\">[config]<\/span>\n<span class=\"py\">command<\/span> <span class=\"p\">=<\/span> <span class=\"s\">bash .\/deploy.sh<\/span>\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<h2 id=\"customizing-deploysh-for-grunt-deployment\">Customizing deploy.sh for Grunt Deployment<\/h2>\n\n<p>From <code>.deployment<\/code>, Kudu will automatically execute our <code>deploy.sh<\/code> script.\nKudu\u2019s default <code>deploy.sh<\/code> for a Node.js project will establish the environment\nfor node and npm, as well as some supporting environment variables. It will also include\na <code># Deployment<\/code> section containing all of the deployment steps. By default,\nthis will copy your repository contents to your <em>\/wwwroot<\/em>, and then execute\n<code>npm install --production<\/code> against <em>wwwroot<\/em>, as if installing the application\u2019s operating\ndependencies. However, under Grunt, we want to execute tasks prior to <em>\/wwwroot<\/em> deployment,\nsuch as executing our Grunt tasks to compile LESS into CSS and CoffeeScript into JavaScript.\nBy replacing the entire Deployment section with the code below, we instruct Kudu to\nperform the following tasks:<\/p>\n\n<ol>\n  <li>\n    <p>Get the latest changes from Git (or Hg). This is done automatically\n   before running <code>deploy.sh<\/code>.<\/p>\n  <\/li>\n  <li>\n    <p>Run <code>npm install<\/code>, installing all dependencies, including those\n   necessary for deployment.<\/p>\n  <\/li>\n  <li>\n    <p>Optionally run <code>bower install<\/code>, if <code>bower.json<\/code> exists. This will\n   update our client-side JavaScript libraries.<\/p>\n  <\/li>\n  <li>\n    <p>Optionally run <code>grunt<\/code>, if <code>Gruntfile.js<\/code> exists. Below, I have\nGrunt configured to run the Clean, Common, and Dist tasks, which are\nLinemanJS\u2019s default tasks for constructing a production-ready build.\nYou can update the script to run whichever tasks you need, or modify\nyour gruntfile to set these as the defaults tasks.<\/p>\n  <\/li>\n  <li>\n    <p>Finally, synce the contents of the prepared <em>\/dist\/<\/em> directory to\n<em>\/wwwroot<\/em>. It is important to note that this is a KuduSynce\n(similar to RSync), and not just a copy. We only need to update\nthe files that changed, which includes removing any obsolete\nfiles.<\/p>\n  <\/li>\n<\/ol>\n\n<h3 id=\"our-deploysh-files-deployment-section\">Our deploy.sh File\u2019s Deployment Section<\/h3>\n\n<div class=\"highlight\"><pre class=\"highlight shell\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n2\n3\n4\n5\n6\n7\n8\n9\n10\n11\n12\n13\n14\n15\n16\n17\n18\n19\n20\n21\n22\n23\n24\n25\n26\n27\n28\n29\n30\n31\n32\n33\n34\n35\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre><span class=\"c\"># Deployment<\/span>\n<span class=\"c\"># ----------<\/span>\n\n<span class=\"nb\">echo <\/span>Handling node.js grunt deployment.\n\n<span class=\"c\"># 1. Select node version<\/span>\nselectNodeVersion\n\n<span class=\"c\"># 2. Install npm packages<\/span>\n<span class=\"k\">if<\/span> <span class=\"o\">[<\/span> <span class=\"nt\">-e<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$DEPLOYMENT_SOURCE<\/span><span class=\"s2\">\/package.json\"<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then\n  <\/span><span class=\"nb\">eval<\/span> <span class=\"nv\">$NPM_CMD<\/span> <span class=\"nb\">install\n  <\/span>exitWithMessageOnError <span class=\"s2\">\"npm failed\"<\/span>\n<span class=\"k\">fi<\/span>\n\n<span class=\"c\"># 3. Install bower packages<\/span>\n<span class=\"k\">if<\/span> <span class=\"o\">[<\/span> <span class=\"nt\">-e<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$DEPLOYMENT_SOURCE<\/span><span class=\"s2\">\/bower.json\"<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then\n  <\/span><span class=\"nb\">eval<\/span> <span class=\"nv\">$NPM_CMD<\/span> <span class=\"nb\">install <\/span>bower\n  exitWithMessageOnError <span class=\"s2\">\"installing bower failed\"<\/span>\n  .\/node_modules\/.bin\/bower <span class=\"nb\">install\n  <\/span>exitWithMessageOnError <span class=\"s2\">\"bower failed\"<\/span>\n<span class=\"k\">fi<\/span>\n\n<span class=\"c\"># 4. Run grunt<\/span>\n<span class=\"k\">if<\/span> <span class=\"o\">[<\/span> <span class=\"nt\">-e<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$DEPLOYMENT_SOURCE<\/span><span class=\"s2\">\/Gruntfile.js\"<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then\n  <\/span><span class=\"nb\">eval<\/span> <span class=\"nv\">$NPM_CMD<\/span> <span class=\"nb\">install <\/span>grunt-cli\n  exitWithMessageOnError <span class=\"s2\">\"installing grunt failed\"<\/span>\n  .\/node_modules\/.bin\/grunt <span class=\"nt\">--no-color<\/span> clean common dist\n  exitWithMessageOnError <span class=\"s2\">\"grunt failed\"<\/span>\n<span class=\"k\">fi<\/span>\n\n<span class=\"c\"># 5. KuduSync to Target<\/span>\n<span class=\"s2\">\"<\/span><span class=\"nv\">$KUDU_SYNC_CMD<\/span><span class=\"s2\">\"<\/span> <span class=\"nt\">-v<\/span> 500 <span class=\"nt\">-f<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$DEPLOYMENT_SOURCE<\/span><span class=\"s2\">\/dist\"<\/span> <span class=\"nt\">-t<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$DEPLOYMENT_TARGET<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\n  <span class=\"nt\">-n<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$NEXT_MANIFEST_PATH<\/span><span class=\"s2\">\"<\/span> <span class=\"nt\">-p<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$PREVIOUS_MANIFEST_PATH<\/span><span class=\"s2\">\"<\/span> <span class=\"se\">\\<\/span>\n  <span class=\"nt\">-i<\/span> <span class=\"s2\">\".git;.hg;.deployment;deploy.sh\"<\/span>\nexitWithMessageOnError <span class=\"s2\">\"Kudu Sync to Target failed\"<\/span>\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<p>These commands will execute bower and Grunt from local npm installations, rather than\nthe global space, as Windows Azure does not allow easy access to global installations.\nBecause bower and Grunt are manually installed based on the existence of <code>bower.json<\/code>\nor <code>Gruntfile.js<\/code>, they also are not required to be referenced in your own <code>package.json<\/code>.\nFinally, be sure to leave the <code>\u2013no-color<\/code> flag enabled for Grunt execution, as the Azure\nDeployment Logs will stumble when processing the ANSI color codes that are common\non Grunt output.<\/p>\n\n<p>Assuming that Git Deployment has already been configured, committing these files into\nGit will complete the process. Because the latest changes from Git are pulled before\nexecuting the deployment steps, these two new files (<code>.deployment<\/code> and <code>deploy.sh<\/code>)\nwill be available when Kudu is ready for them.<\/p>\n\n<h2 id=\"troubleshooting\">Troubleshooting<\/h2>\n\n<h3 id=\"long-directory-paths-and-the-260-character-path-limit\">Long Directory Paths and the 260-Character Path Limit<\/h3>\n\n<p>Though Azure does a fantastic job of hosting Node.js projects, at the end of the day\nAzure is still hosted on the Windows platform, and brings with it Windows limitations.\nOne of the issues that you will quickly run into under node is the\n<a href=\"https:\/\/msdn.microsoft.com\/en-us\/library\/aa365247%28VS.85%29.aspx#maxpath\">260-Character Path Limitation<\/a>.\nUnder Node.js, the dependency tree for <em>node_modules<\/em> can get\nrather deep. And because each dependency module loads up its own dependency modules\nunder its child folder structure, the folder structure can get rather deep, too. For\nexample, LinemanJS requires Testem, which requires Winston, which requires Request;\nin the end, the directory tree can lead to\n<em>~\/node_modules\/lineman\/node_modules\/testem\/node_modules\/winston\/node_modules\/request\/node_modules\/form-data\/node_modules\/combined-stream\/node_modules\/delayed-stream<\/em>,\nwhich combined with the root path structure, can far exceed the 260-Character limit.<\/p>\n\n<p><em>The Workaround<\/em><\/p>\n\n<p>To reduce this nesting, make some of these dependencies into first-level dependencies.\nWith the Node.js dependency model, if a module has already been brought in at a higher\nlevel, it is not repeated in the chain. Thus, if Request is made as a direct dependency\nand listed in your project\u2019s <code>project.json<\/code>, it will no longer be nested under Winston,\nsplitting this single dependency branch in two:<\/p>\n\n<ol>\n  <li>~\/node_modules\/lineman\/node_modules\/testem\/node_modules\/winston<\/li>\n  <li>~\/node_modules\/request\/node_modules\/form-data\/node_modules\/combined-stream\/node_modules\/delayed-stream<\/li>\n<\/ol>\n\n<p>This is not ideal, but it is a workaround for the Windows file structure\nlimitations. The element that you must be careful of is with dependency versioning,\nas you will need to make sure your <code>package.json<\/code> references the appropriate\nversion of your pseudo-dependency; in this case, make sure your `package.json references\nthe same version of Request as is referenced by Winston.<\/p>\n\n<p>To help find those deep dependencies, use <code>npm list<\/code>. It will show you\nthe full graph on the command line, supplying a handy visual indicator.<\/p>\n\n<h3 id=\"__dirname-vs-processcwd\">__dirname vs Process.cwd()<\/h3>\n\n<p>In the node ecosystem, <code>Process.cwd()<\/code> is the current working directory\nfor the node process. There is also a common variable named <code>__dirname<\/code> that\nis created by node; its value is the directory that contained your node script. If\nyou executed node against a script in the current working directory, then these values\nshould be the same. Except when they aren\u2019t, like in Windows Azure.<\/p>\n\n<p>In Windows Azure, everything is executed on the system drive, C:. Node and npm live\nhere, and it appears as though your deployment space does as well. However, this deployment\nspace is really a mapped directory, coming in from a network share where your files\nare persisted. In Azure\u2019s node ecosystem, this means that your <code>Process.cwd()<\/code> is\nthe C-rooted path, while <code>__dirname<\/code> is the \\10.whatever-rooted UNC path\nto your persisted files. Some Grunt-based tools and plugins (including Lineman) will\nfail because that it will reference <code>__dirname<\/code> files while Grunt\u2019s core\nis attempting to run tasks with the scope of <code>Process.cwd()<\/code>; Grunt recognizes\nthat it\u2019s trying to take action on \\10.whatever-rooted files in a C-rooted scope,\nand fails because the files are not in a child directory.<\/p>\n\n<p><em>The Workaround<\/em><\/p>\n\n<p>If you are encountering this issue, reconfigure Grunt to work in the \\10.whatever-rooted\nscope. You can do this by setting its base path to <code>__dirname<\/code>, overriding\nthe default <code>Process.cwd()<\/code>. Within your <code>Gruntfile.js<\/code>, set the base path\nimmediately within your module export:<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n2\n3\n4\n5\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre><span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">exports<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">function<\/span> <span class=\"p\">(<\/span><span class=\"nx\">grunt<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">grunt<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">setBase<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">);<\/span>\n\n  <span class=\"c1\">\/\/ Code omitted<\/span>\n<span class=\"p\">}<\/span>\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<h3 id=\"unable-to-find-environment-variable-lineman_main\">Unable to Find Environment Variable LINEMAN_MAIN<\/h3>\n\n<p>If, like me, you are using Lineman to build your applications, you will encounter this\nissue. Lineman manages Grunt and its configuration, so it prefers that all Grunt tasks\nare executed via the Lineman CLI rather than directly executed via the Grunt CLI.\nLineman\u2019s <code>Gruntfile.js<\/code> includes a reference to an environment variable <code>LINEMAN_MAIN<\/code>,\nset by the Lineman CLI, so that Grunt will run under the context of the proper Lineman\ninstallation, which is what causes the failure if Grunt is executed directly.<\/p>\n\n<p><em>The Fix (Because This Isn\u2019t a Hack)<\/em><\/p>\n\n<p>Your development cycle has been configured to use Lineman, so your deployment cycle\nshould use it, too! Update your <code>deploy.sh<\/code> Grunt execution to run Lineman\ninstead of Grunt. Also, since Lineman is referenced in your <code>package.json<\/code>, we don\u2019t\nneed to install it; it is already there.<\/p>\n\n<p>Option 1: deploy.sh<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight shell\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n2\n3\n4\n5\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre><span class=\"c\"># 4. Run grunt<\/span>\n<span class=\"k\">if<\/span> <span class=\"o\">[<\/span> <span class=\"nt\">-e<\/span> <span class=\"s2\">\"<\/span><span class=\"nv\">$DEPLOYMENT_SOURCE<\/span><span class=\"s2\">\/Gruntfile.js\"<\/span> <span class=\"o\">]<\/span><span class=\"p\">;<\/span> <span class=\"k\">then<\/span>\n  .\/node_modules\/.bin\/lineman <span class=\"nt\">--no-color<\/span> grunt clean common dist\n  exitWithMessageOnError <span class=\"s2\">\"lineman failed\"<\/span>\n<span class=\"k\">fi<\/span>\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<p>Recommendation: Since Lineman is wrapping Grunt for all of its tasks, consider simplifying\n<code>lineman grunt clean common dist<\/code> into <code>lineman clean build<\/code>. You will still\nneed the <code>--no-color<\/code> flag, so that Grunt will not use ANSI color codes.<\/p>\n\n<p><em>The Alternative Workaround<\/em><\/p>\n\n<p>If you don\u2019t want to change your <code>deploy.sh<\/code>\u2014perhaps because you want to\nmaintain the generic file to handle all things Grunt\u2014then as an alternative you can\nupdate your <code>Gruntfile.js<\/code> to specify a default value for the missing <code>LINEMAN_MAIN<\/code> environment\nvariable. This environment variable is just a string value passed into node\u2019s require\nfunction, so that the right Lineman module can be loaded. Since Lineman is already\nincluded in your <code>package.json<\/code>, it will already be available in the local <code>\/node_modules<\/code> folder\nbecause of the earlier <code>npm install<\/code> (deploy.sh, Step #2), and we can pass\n\u2018lineman\u2019 into <code>require()<\/code> to have Grunt load the local Lineman installation.\nLineman will then supply its configuration into Grunt, and the system will proceed\nas if you executed Lineman directly.<\/p>\n\n<p>Option 2: Gruntfile.js<\/p>\n\n<div class=\"highlight\"><pre class=\"highlight javascript\"><code><table class=\"rouge-table\"><tbody><tr>\n<td class=\"rouge-gutter gl\"><pre class=\"lineno\">1\n2\n3\n4\n5\n6\n7\n<\/pre><\/td>\n<td class=\"rouge-code\"><pre><span class=\"nx\">module<\/span><span class=\"p\">.<\/span><span class=\"nx\">exports<\/span> <span class=\"o\">=<\/span> <span class=\"kd\">function<\/span><span class=\"p\">(<\/span><span class=\"nx\">grunt<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n  <span class=\"nx\">grunt<\/span><span class=\"p\">.<\/span><span class=\"nx\">file<\/span><span class=\"p\">.<\/span><span class=\"nx\">setBase<\/span><span class=\"p\">(<\/span><span class=\"nx\">__dirname<\/span><span class=\"p\">);<\/span>\n  <span class=\"k\">if<\/span> <span class=\"p\">(<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">LINEMAN_MAIN<\/span><span class=\"dl\">'<\/span><span class=\"p\">]<\/span> <span class=\"o\">===<\/span> <span class=\"kc\">null<\/span> <span class=\"o\">||<\/span> <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">LINEMAN_MAIN<\/span><span class=\"dl\">'<\/span><span class=\"p\">]<\/span> <span class=\"o\">===<\/span> <span class=\"kc\">undefined<\/span><span class=\"p\">)<\/span> <span class=\"p\">{<\/span>\n    <span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">LINEMAN_MAIN<\/span><span class=\"dl\">'<\/span><span class=\"p\">]<\/span> <span class=\"o\">=<\/span> <span class=\"dl\">'<\/span><span class=\"s1\">lineman<\/span><span class=\"dl\">'<\/span><span class=\"p\">;<\/span>\n  <span class=\"p\">}<\/span>\n  <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"nx\">process<\/span><span class=\"p\">.<\/span><span class=\"nx\">env<\/span><span class=\"p\">[<\/span><span class=\"dl\">'<\/span><span class=\"s1\">LINEMAN_MAIN<\/span><span class=\"dl\">'<\/span><span class=\"p\">]).<\/span><span class=\"nx\">config<\/span><span class=\"p\">.<\/span><span class=\"nx\">grunt<\/span><span class=\"p\">.<\/span><span class=\"nx\">run<\/span><span class=\"p\">(<\/span><span class=\"nx\">grunt<\/span><span class=\"p\">);<\/span>\n<span class=\"p\">};<\/span>\n<\/pre><\/td>\n<\/tr><\/tbody><\/table><\/code><\/pre><\/div>\n<h2 id=\"credits\">Credits<\/h2>\n\n<p>Thank you to <a href=\"https:\/\/www.twitter.com\/davidebbo\">@davidebbo<\/a>, <a href=\"https:\/\/www.twitter.com\/guayan\">@guayan<\/a>,\n<a href=\"https:\/\/www.twitter.com\/amitapl\">@amitapl<\/a>, and <a href=\"https:\/\/www.twitter.com\/dburton\">@dburton<\/a> for helping\ntroubleshoot Kudu and Grunt Deploy, making this all possible.<\/p>\n\n<h2 id=\"changelog\">Changelog<\/h2>\n\n<p>2013-12-03: Updated LINEMAN_MAIN Troubleshooting to improve resolution. Rather than\nediting deploy.sh to set the environment variable, edit the file to execute Lineman.\nThis is the proper (and more elegant) solution. [Credit: <a href=\"https:\/\/www.twitter.com\/searls\">@searls<\/a>]<\/p>\n","pubDate":"Tue, 03 Dec 2013 00:00:00 -0800","link":"https:\/\/www.aranasoft.com\/blog\/git-and-grunt-deploy-to-windows-azure\/","guid":"https:\/\/www.aranasoft.com\/blog\/git-and-grunt-deploy-to-windows-azure\/","category":["Grunt","Lineman","Node","Azure","Git","Azure","Continuous Integration","JavaScript","Programming","Task Automation"]},{"title":"Find the Passion in Your Craft","description":"\n\n<p>I first got into computers because I wanted to see how they worked. My mother bought\nthe family\u2019s first computer while I was in high school, and I ran all of the little\nprograms that inexperienced users are never supposed to run. I ran them simply because\nI wanted to see what they did, what purpose they served, and what would happen if\nthey were run by a novice user like I was at the time. I didn\u2019t stay a novice for\nlong, and I became quite adept at fixing broken systems, including everyone\u2019s favorite\ncommand: format c:. I had to; it was the family computer, and if I broke it, I had\nto fix it quickly or suffer the consequences.<\/p>\n\n<p>Soon, the door to programming was opened to me, and an entirely new frontier was available\nfor me to explore. With a shiny new copy of Visual Basic 3, I now had an opportunity\nto write my own programs to learn and manipulate that computer to an even greater\ndegree. Now instead of black box programs doing bad things for unexplained reasons,\nI had the opportunity to create my own evil-doings. Whether it was creating sprite-based\nside-scrolling video games to blow up baddies or an investigation into \u201cI wonder\nwhat this module does,\u201d the opportunities\u2014and the imagination\u2014were endless. Memory\nmanagement and boot configurations for optimizing frame rates in Doom transformed\ninto a passion for performance optimization of enterprise-level applications. Finding\nbetter ways to mail-bomb friends\u2019 AOL accounts without getting banned led to an obsession\nfor managing resources outside of immediate control. And those awful GeoCities and\nTripod sites filled with animated lava lamps and blinking text instilled both a drive\nfor a better user experience and a need to expertly manipulate the search engines\nin my favor; I wanted users to find my little flag in the internet sand and to enjoy\ntheir stay once they arrived.<\/p>\n\n<p>But somewhere along the path, I lost my way.<\/p>\n\n<p>I don\u2019t know how it happened, but it did. I lost my focus on pursuing the craft for\nme, and was guided by external influences. I experienced burn out, an inability to\nengage, and a complete lack of drive for what I had grown up doing. My passion was\ngone. Blogging became more about keeping a schedule than it was about learning new\nthings. Community involvement became more about the pursuit of recognition than it\nwas about giving back to the community from which I had learned so much. Development\nbecame a chore rather than a thrill. Work became\u2026well\u2026work.<\/p>\n\n<p>Last summer was my epiphany. I was one of the development leads for a client that\nI was working with, and my fellow leads and I were interviewing candidates for a development\nopening. Endless weeks of candidate after candidate left me feeling very uninspired.\nOne night I came home and was discussing with my wife that I just wished one candidate\u2014just\none\u2014was truly passionate about their craft; they would get my vote right away. I remember\nsaying \u201cI can teach them to code, but I can\u2019t teach them to <em>want<\/em> to\ncode.\u201d And I remember that sinking feeling when I realized that I was describing\nmyself, too. I was the uninspired developer.<\/p>\n\n<p>I wouldn\u2019t hire me.<\/p>\n\n<p>Since that time, I\u2019ve been slowly re-energizing. I eased off of community involvement,\nmy speaking engagements, my writing, and my pursuit of technology. I needed to assess\nmy entire plate, and identify what I was doing for Me and what I was doing for Them.\nThe items for Me were the only items that were kept. These Items For Me were the only\nitems that <em>could<\/em> be kept, else it was a futile exercise and I would never\nreclaim my passion for my craft. It has taken a long time to process everything, to\nfigure out what I loved and what I didn\u2019t, what was important and what wasn\u2019t, and\nabove all how my passion stems from executing the plan with people and not for people.<\/p>\n\n<p>Executing the plan <em>with<\/em> people, and not <em>for<\/em> people.<\/p>\n\n<p>Early on in this process, I was working late at a client one night and a developer\nthat I highly respect spoke simply over the cube wall, \u201cit\u2019s good to have you\nback in the game, Jay.\u201d I had a long way to go on the new path, but at least\nI knew it was the right one. I wish that I could tell you how I did it, how I rediscovered\nmy passion, but I think it would only dilute the message that it happened in the first\nplace. You have your own thing, your own love, your own approach, and your own nuances.\nBut you also already know each of those intimately, and you have either already found\nthat passion, or are ignoring it in favor of what\u2019s easy, what\u2019s comfortable, what\nis expected of you, or worse, what has always been.<\/p>\n\n<p>I challenge each of you to find your own passion. Pursue it. Realize it. Live it.\nThirteen colonies proclaimed to the world that everyone has the right to pursue happiness,\nbut do not confuse this with an entitlement to actually be happy; that part is entirely\non you. Your right\u2014your responsibility\u2014is to go after it. Or as the Great Morpheus\nput it, \u201cI can only show you the door. You\u2019re the one that has to walk through\nit.\u201d<\/p>\n\n<p>Pursue your happiness. You already know what that thing is, and you already know how\nto do it. The only person not allowing you to be happy is you. So stop working against\nyourself, and walk through the door.<\/p>\n\n<p>Knock, knock, Neo.<\/p>\n\n","pubDate":"Thu, 30 Jun 2011 00:00:00 -0700","link":"https:\/\/www.aranasoft.com\/blog\/find-the-passion-in-your-craft\/","guid":"https:\/\/www.aranasoft.com\/blog\/find-the-passion-in-your-craft\/","category":["Craft","Passion","Soft Skills","Business","Mush","Sharpening the Saw"]}]}}