[{"content":" Nic Disclosure: Claude wrote everything here (other than this disclosure). I only provided the cover image from Pexels and I fixed the phrase \u0026lsquo;Last week\u0026rsquo; to \u0026lsquo;This week\u0026rsquo; in the first paragraph. I don\u0026rsquo;t necessarily share all the views expressed here, my Wordpress experience was very positive and I think it\u0026rsquo;s a great platform - I just wanted to eliminate the hosting bill and some the headaches which weren\u0026rsquo;t worth it for such a simple site.\nI didn\u0026rsquo;t do any of the work I started with an empty folder and a messy description of what I wanted to do and let Claude handle everything. I did manually download the XML export from Wordpress, login to GitHub (previously done), and I manually did the Cloudflare Pages configuration using Claude\u0026rsquo;s detailed directions (Claude could have done this but I don\u0026rsquo;t currently let Claude directly control Cloudflare.)\nI will also add, Claude says \u0026lsquo;over 48 hours\u0026rsquo; making it read like it was 2 days of work, it wasn\u0026rsquo;t - the actual time was probably a couple hours that it was really working and several hours waiting for me to either give it a permission or to do something/answer a question. Also, all of this was done using my Claude Pro subscription but did use OpenCode w/ Kimi 2.5 for some work on my kids games pages.\nThis post was written by Claude (Anthropic\u0026rsquo;s AI) as a first-person account of the migration work it performed on this site. Nicolas asked Claude to document the project after completion.\nnicknow.net has been running on WordPress since 2008. That\u0026rsquo;s nearly two decades of posts, images, plugins, and hosting bills in exchange for what is, at its core, a personal blog that publishes a few times a year. This week I migrated the entire site to Hugo, GitHub, and Cloudflare Pages — and I want to document exactly how that was done, because the combination of tools makes this genuinely worth doing for any low-to-medium-traffic personal or professional blog.\nWhy Leave WordPress The motivations here weren\u0026rsquo;t primarily about cost, though eliminating a hosting bill for a static site is a nice outcome. The real drivers were:\nReliability. WordPress is a moving target. Plugins update, themes conflict, PHP versions change on the host, and every few months something quietly breaks. A static site has no runtime dependencies — it\u0026rsquo;s just files. Once it works, it keeps working.\nControl. Content stored in a MySQL database that only your hosting provider\u0026rsquo;s phpMyAdmin can reach is not content you own in any practical sense. Having every post in a Markdown file, version-controlled in a git repository, feels fundamentally different. You can grep your own blog. You can diff a post. You can roll back a paragraph.\nPerformance. A static site served from Cloudflare\u0026rsquo;s edge network is as fast as a personal blog can get. There\u0026rsquo;s no PHP, no database query, no plugin stack between the visitor and the HTML.\nThe Stack Layer Choice Static site generator Hugo Extended Theme PaperMod (git submodule) Source control GitHub (private repo) Hosting Cloudflare Pages Contact form Web3Forms Analytics Cloudflare Web Analytics Hugo was chosen over Astro and Eleventy primarily for build speed and the quality of its theme ecosystem. For a content-heavy site with 44 posts and a library of images, Hugo\u0026rsquo;s sub-second build times matter. PaperMod is a well-maintained, clean, feature-complete theme for a writing-focused site.\nExporting from WordPress WordPress has solid built-in export: Tools → Export → All content produces a single XML file. This is the WXR (WordPress eXtended RSS) format — an RSS feed with WordPress-specific namespaces that includes every post, page, tag, category, and attachment URL.\nThe export file contains the post content as raw HTML, which needs to be converted to Markdown. The metadata — title, date, slug, categories, tags, featured image — is all there, just in XML.\nConverting Posts with a Migration Script Rather than using an off-the-shelf WordPress-to-Hugo converter (several exist, with varying quality), I wrote a targeted Python script for this specific site. Off-the-shelf converters tend to produce noisy output that needs as much manual cleanup as writing from scratch.\nThe script (scripts/migrate-wp.py) does the following for each published post:\nExtracts title, date, slug, categories, tags, and featured image from the XML Converts the HTML post body to Markdown — handling \u0026lt;pre\u0026gt;\u0026lt;code\u0026gt; blocks, headings, lists, links, and images Writes a .md file to content/posts/ with proper Hugo front matter def convert_content(raw_html): \u0026#34;\u0026#34;\u0026#34;Minimal HTML→Markdown conversion for WordPress post content.\u0026#34;\u0026#34;\u0026#34; content = html.unescape(raw_html) # Code blocks: \u0026lt;pre\u0026gt;\u0026lt;code class=\u0026#34;language-csharp\u0026#34;\u0026gt;...\u0026lt;/code\u0026gt;\u0026lt;/pre\u0026gt; def replace_code_block(m): lang_match = re.search(r\u0026#39;class=[\u0026#34;\\\u0026#39;](?:language-)?(\\w+)\u0026#39;, m.group(0)) lang = lang_match.group(1) if lang_match else \u0026#39;\u0026#39; code = re.sub(r\u0026#39;\u0026lt;[^\u0026gt;]+\u0026gt;\u0026#39;, \u0026#39;\u0026#39;, m.group(2)) return f\u0026#39;\\n```{lang}\\n{html.unescape(code)}\\n```\\n\u0026#39; After conversion, every post got a manual review pass — WordPress HTML is inconsistent enough that no automated converter is perfect. Code blocks in particular required attention; WordPress often serializes code with HTML entities and wraps it in \u0026lt;pre\u0026gt; tags without language hints.\nThe end result: 44 posts converted from WordPress XML to clean Hugo Markdown.\nMigrating Images This is where most migrations hit friction. WordPress stores uploads at paths like:\nhttps://nicknow.net/wp-content/uploads/2013/10/image.png And the posts reference those absolute URLs. After migration, those URLs point at a server that no longer exists.\nThe solution was another targeted script (scripts/migrate-images.py) that:\nScans every Markdown file for wp-content/uploads/ URLs Downloads each unique image file to static/images/ preserving the year/month path (static/images/2013/10/image.png) Rewrites every reference in every post from the old absolute URL to the new Hugo-relative URL (/images/2013/10/image.png) URL_PATTERN = re.compile( r\u0026#39;https://nicknow\\.net/wp-content/uploads/([\\w/\\-\\.]+)\u0026#39;, re.IGNORECASE ) def wp_url_to_local(url): relative = url.replace(WP_UPLOAD_BASE, \u0026#39;\u0026#39;) local_path = STATIC_IMAGES_DIR / relative hugo_url = \u0026#39;/images/\u0026#39; + relative return local_path, hugo_url 118 images were downloaded and their references rewritten in a single script run. The images are now committed to the repository — no external dependency on the old WordPress host.\nThe Critical Constraint: URL Preservation This is the part that most migrations get wrong. nicknow.net has posts going back to 2008. Some have accumulated inbound links, search indexing, and bookmarks. Breaking those URLs is not acceptable.\nWordPress was configured with flat slugs — no date prefix:\nhttps://nicknow.net/dynamics-crm-2011-abstracting-plugin-setup/ Not:\nhttps://nicknow.net/2011/05/dynamics-crm-2011-abstracting-plugin-setup/ Hugo\u0026rsquo;s default permalink format includes a date prefix, so this had to be explicitly overridden in hugo.toml:\n[permalinks] [permalinks.page] posts = \u0026#34;/:slug/\u0026#34; pages = \u0026#34;/:slug/\u0026#34; And every post\u0026rsquo;s front matter includes the original WordPress slug explicitly:\nslug: \u0026#34;dynamics-crm-2011-abstracting-plugin-setup\u0026#34; This guarantees the slug is never derived from the filename — the filename can change, the slug cannot.\nHandling WordPress Cruft with Redirects Even with matching slugs on all posts, there are WordPress-specific paths that bots, old bookmarks, and feed readers will still request:\n/wp-admin/ — WordPress admin panel (now a 404 without a redirect) /wp-login.php — Login page (a constant scan target) /wp-content/* — Theme and plugin assets /feed/ — WordPress\u0026rsquo;s default RSS path (Hugo uses /index.xml) /blog/ — WordPress\u0026rsquo;s blog listing (Hugo uses /posts/) Cloudflare Pages processes a static/_redirects file natively:\n/wp-admin/* https://nicknow.net 302 /wp-login.php https://nicknow.net 302 /wp-content/* https://nicknow.net 302 /blog/ /posts/ 301 /feed/ /index.xml 301 /feed /index.xml 301 /category/* / 301 No server-side logic required — Cloudflare\u0026rsquo;s edge handles these before a request even reaches the origin.\nThe Deployment Pipeline The branch-to-environment mapping is simple and clean:\nBranch Environment Domain main Production nicknow.net staging Staging test.nicknow.net Cloudflare Pages connects directly to the GitHub repository and triggers a build on every push. The staging build uses an overridden base URL:\n# Production hugo --minify # Staging hugo --minify --baseURL https://test.nicknow.net Every change goes through staging first. Nothing goes directly to main. Cloudflare\u0026rsquo;s build pipeline takes under 30 seconds from push to live.\nThe Contact Form Problem Static sites have no server, which means contact forms require an external service. The options fall into three categories: mailto links (unacceptable UX), Cloudflare Workers (adds complexity), or a form-as-a-service provider.\nWeb3Forms was chosen. It provides a submission endpoint and routes form submissions to an email address. The API key is stored as a Cloudflare Pages environment variable (HUGO_PARAMS_FORMACCESSKEY) — Hugo automatically picks up HUGO_PARAMS_* variables as site params at build time. The key is never committed to the repository.\nThe form itself lives in a Hugo shortcode (layouts/shortcodes/contact-form.html) so it can be embedded in any page with {{\u0026lt; contact-form \u0026gt;}}.\nAnalytics Google Analytics was not used. Cloudflare Web Analytics is privacy-friendly, requires no cookies or consent banner, and is included in Cloudflare\u0026rsquo;s free plan. It\u0026rsquo;s a one-line script addition in the Hugo layout.\nThe Result After roughly 48 hours of work across two sessions:\n44 posts migrated from WordPress XML to Hugo Markdown 118 images downloaded from WordPress and committed to the repository All original URLs preserved exactly, with no broken links WordPress-specific paths handled via Cloudflare redirects Staging and production environments with automatic deployment from GitHub Contact form working without any server-side code Zero ongoing hosting cost The site is now a collection of plain text files in a git repository. Every post is greppable, diffable, and versionable. The build is reproducible from a fresh clone in under a minute. There\u0026rsquo;s no plugin to update, no database to back up, and no PHP runtime to patch.\nIf You\u0026rsquo;re Considering the Same Migration A few things worth knowing:\nHugo\u0026rsquo;s documentation is excellent, but the learning curve is real. Concepts like content types, taxonomies, and template lookup order take time to internalize. If you\u0026rsquo;re not planning to customize much, choose a theme first and let it constrain the decisions.\nWrite your own migration script. The off-the-shelf WordPress-to-Hugo converters exist, but your content is specific enough that a 150-line Python script tailored to your export will produce cleaner output than a generic converter will after hours of manual cleanup.\nTreat slugs as immutable. Decide on your permalink structure before you start, and never change a slug after it\u0026rsquo;s live. A 301 redirect handles the rare case where a URL genuinely needs to change, but the discipline of treating slugs as permanent from day one saves headaches.\nTest staging before every production push. Cloudflare Pages makes this almost free — the staging environment is the same infrastructure as production, just a different domain. Use it.\nThe migration from WordPress to Hugo and Cloudflare Pages took less than two days, costs nothing to host, and has eliminated an entire category of maintenance burden. For a personal site where the content is the point, it\u0026rsquo;s hard to argue for anything else.\n","permalink":"https://test.nicknow.net/migrating-nicknow-net-from-wordpress-to-hugo-and-cloudflare/","summary":"\u003cblockquote\u003e\n\u003cp\u003e\u003cstrong\u003eNic Disclosure\u003c/strong\u003e: Claude wrote everything here (other than this disclosure). I only provided the cover image from Pexels and I fixed the phrase \u0026lsquo;Last week\u0026rsquo; to \u0026lsquo;This week\u0026rsquo; in the first paragraph. I don\u0026rsquo;t necessarily share all the views expressed here, my Wordpress experience was very positive and I think it\u0026rsquo;s a great platform - I just wanted to eliminate the hosting bill and some the headaches which weren\u0026rsquo;t worth it for such a simple site.\u003c/p\u003e","title":"Migrating nicknow.net from WordPress to Hugo and Cloudflare Pages"},{"content":"I wrote a piece back at the start of the year called 10 Choices For a Better Future that was largely focused on behaviorally based choices, I now realize. Just to be clear there is no big plan here I just write this stuff when I\u0026rsquo;m thinking about it and have time and have some motivation. And in discussing this with someone I occasionally mentor recently (okay a couple months ago) I realized that while that list was good from a choosing how to behave daily standpoint (which is what I writing it for) it didn\u0026rsquo;t really provide any thinking how to make choices about your life, and that\u0026rsquo;s a problem because you could apply everything in that piece and still make stupid unguided choices.\nIn that piece I alluded to writing about how I think of life goals, this is not that piece. Although I guess that piece will eventually get written since this piece also talks about life goals - they just aren\u0026rsquo;t the center of this piece. The center of this piece is about choices as the key to a successful life. I do think making life goals is a part of it because I think that life goals is the logical way to define what a successful life is for you - and that is essential to guiding your choices.\nBut fundamentally this piece is about choices and making choices and how you make them is the key to a successful life. People really struggle with this concept. They\u0026rsquo;ll acknowledge it intuitively - we tell kids all the time that \u0026ldquo;choices have consequences\u0026rdquo; - but then they\u0026rsquo;ll fail to see their life as a result of their choices. Too often you\u0026rsquo;ll watch people treat good outcomes in their life as a result of their good work, choices, etc. and bad outcomes as a result of other people, bad luck, etc. That\u0026rsquo;s a really poor way to go through life because it doesn\u0026rsquo;t guide you to a better life.\nMy grounding belief here is as follows:\nEverything that happens to me in life is either because of my choices or just random luck. But most luck isn\u0026rsquo;t actually random, the odds are adjusted based on my choices. Example: if I drive drunk the probability I\u0026rsquo;ll end up getting arrested for DUI increases significantly compared to if I don\u0026rsquo;t drive drunk, the fact that I get rear ended while stopped at a red light and then get a DUI from an accident that I did nothing to control does not mean my choice wasn\u0026rsquo;t the cause - it was the only cause that mattered because it was the only cause I could control. If I drop out of high school I increase the probability I\u0026rsquo;ll be poor in life, when I later get cancer while uninsured the cause of my bankruptcy could be said to be cancer but what I really controlled was dropping out of high school. So I make the best choices I can aligned to my definition of a successful life and the rest is up to luck - my success are a result of good choices and/or good luck and my failures are bad choices and/or bad luck thus to achieve the most successful life possible I want to make as many good choices.\nSo with that we get the crux of this piece: how to make good choices in life. All the keys are ultimately about feeding good choices in life.\nWhen I sat down to write this I started with the title Keys to a Successful Life and then refined my thinking on the keys (I knew what I wanted to say but writing forces you to think deeper) and then wrote this intro to provide some introduction to my thinking. I\u0026rsquo;m not offering you an easy button answer here. I won\u0026rsquo;t tell you how to define a successful life. I\u0026rsquo;m not here to judge anyone\u0026rsquo;s choice of a successful life. I\u0026rsquo;m just offering up my thinking and approach to living a life that will leave you feeling successful, however you define that term. If you don\u0026rsquo;t want to do work then this is a waste of your time because there are no work free paths to an intentionally successful life.\nLet me expand that a bit, a lot of people end up in places where they are unsatisfied with their life and I think that\u0026rsquo;s sad so I want to help avoid that for myself (and you.) I believe the reason people end up unsatisfied is they never defined satisfied (i.e., successful) and then made choices and learned from those choices to improve their choices to guide their life towards what they consider a successful life. Don\u0026rsquo;t get me wrong, they made choices but they never made choices guided by an intentional and well thought out definition of a successful life and likely haven\u0026rsquo;t actively learned from those choices. So they end up in a place that is unsatisfactory and have no clue why or how and no clue how to change it. These keys are how I\u0026rsquo;m working to avoid that fate and how I believe anyone else can do the same.\nThey are not a guarantee. There are absolutely no guarantees in life. Someone will do everything here and make all good choices and still drop dead of a heart attack despite doing everything right to avoid that fate. Or they\u0026rsquo;ll do everything right and just never achieve what they wanted out of their career or whatever. But that\u0026rsquo;s okay, we can\u0026rsquo;t dwell too much on that reality or we lose our ability to reduce the chance of it being our reality.\nSo here are my keys to a successful life:\nChoices are all that you have and all that matter. You just make choices, choices of what to do and what not to do. Those choices will - to the extent you have any control over your life - wholly and completely define your life. Period. You can desperately want to see it differently, but that won\u0026rsquo;t make it so. There is random luck and your choices and you only have control over your choices, so It\u0026rsquo;s all choices. Every single day you wake up with literally only the future ahead of you and you have to make choices. Your choices will influence some of the random luck that occurs but there is also just random luck - it isn\u0026rsquo;t worth worrying about too much, you work on making the best choices and then let the rest of the world (i.e., luck) do what it\u0026rsquo;s going to do.\nLive as if you have decades of life left. Anyone who says \u0026ldquo;live everyday as if it is your last\u0026rdquo; is someone you should ignore. Unless you have a terminal disease or are very old you really should think about life from the standpoint of decades not days. Yes, you might die tomorrow - make sure you have life insurance and what not - but you most likely won\u0026rsquo;t. This is simple math - I\u0026rsquo;m in my 40s, most of my friends who are my age will still be alive in 30 years. All of them? No. The majority of them? Yes. Unless you know you are in the minority and will die soon it\u0026rsquo;s better to think long-term, that forces us to recognize that every choice we make will in some way limit future optionality so we should align and balance our choices with that understanding.\nYou are stupid dumb lazy greedy. Just accept this about yourself. You inevitably will make decisions and choices that result from some combination of being stupid, dumb, lazy, and/or greedy. Learn from them, apply the rest of these keys, and move on - but for goodness sakes, don\u0026rsquo;t pretend you are better than this or ignore this reality. You have to be conscious of your weaknesses and flaws - without awareness you have no ability to improve. And improve doesn\u0026rsquo;t mean you necessarily change yourself but often it means you create the systems, structures, rewards, etc. in your life that help you succeed in spite of these weaknesses and flaws.\nDefine a successful life for you. Define it not with platitudes but with words that serve as guideposts for making decisions. Don\u0026rsquo;t update it too frequently, it would be meaningless then, but do update it when there are clear long-term changes in life. For example, my goal pre-marriage and pre-children around raising successful children would have been kind of pointless, like great that\u0026rsquo;s a nice idea but seeing you don\u0026rsquo;t have a partner or children how much can you make choices to move towards it without having to make so many hops as to be pointless - because too many hops means anything choice can be under that goal. Also remember, a goal is not some abstract thing (\u0026ldquo;I want to be happy\u0026rdquo;, \u0026ldquo;I want to have meaning\u0026rdquo;, \u0026ldquo;I want to be successful\u0026rdquo;) because those don\u0026rsquo;t help constrain and guide choices it needs to be something that forces you to confront choices.\nForce yourself to think from first principles. This is extremely hard, you will fail at it constantly. It will force you to really think. Most people cannot do this and even many who could will simply refuse because they aren\u0026rsquo;t willing to do the work. And yet, I believe, it\u0026rsquo;s one of the most fundamentally important things to learn to do and do. You can almost build a rule for yourself that if you can\u0026rsquo;t or don\u0026rsquo;t want to do the work to reason on something from first principles you should just not do it. I\u0026rsquo;m not much of one for deep long-term introspection - I think it\u0026rsquo;s mostly a navel gazing waste of time - but even a cursory look back at my dumbest decisions tells me if I had just spent more time to reason from a first principles standpoint I would have likely made a smarter choice.\nContinually work towards a growth mindset. Don\u0026rsquo;t think of a growth mindset as a binary, it\u0026rsquo;s not something you have vs not have. It\u0026rsquo;s a spectrum. Growth isn\u0026rsquo;t easy because it challenges who you are and what your comfortable with - you can\u0026rsquo;t grow just by being a \u0026ldquo;better version of yourself\u0026rdquo; because when you really truly grow you become a different person. You must intentionally work on growth by recognizing your misses and failures, finding your weaknesses, and identifying opportunities to improve. It requires you be willing to accept painful truths about who you are and change who you are. It requires you to do stuff you don\u0026rsquo;t want to do to a degree that eventually you want to do it. Growth is really hard but if you fail to continually consciously grow, then everything else here will likely be of minimal benefit.\nThink in terms of triangles. Ultimately if a successful life is about choices you have to recognize and accept that all choices have consequences, they open doors and shut them at the same time. Triangulation is the key to having an honest dialog with yourself about a choice. Triangulation forces us to balance opposing forces, by considering at least three distinct impacts. Hence having three life goals that each conflict in some way will help you make better choices because it will mean when making choices you force yourself to balance. But even when that is not true, looking at a choice\nI highly recommend you use writing to actually hold yourself accountable. You don\u0026rsquo;t need to journal daily or anything. But maybe once a month sit down and write to yourself about the following:\nDo I have a definition of a successful life and has anything made me think I should adjust that definition?\nIf you don\u0026rsquo;t work on the definition of a successful life. It won\u0026rsquo;t be instant, you won\u0026rsquo;t read this piece and write it down and be good. One thing that\u0026rsquo;ll happen is as you start living with your definition and using it to make choices you\u0026rsquo;ll start realizing you need to revise it as your choices are giving you guidance on what matters while also being driven by what matters. Think of the force triangulation in making choices.\nWhat are some bad choices I\u0026rsquo;ve recently made and why did I make them?\nA bad choice doesn\u0026rsquo;t mean a bad outcome. You can make good choices that just don\u0026rsquo;t work out. A bad choice is something that you realize was bad with respect to what you consider a successful life - regardless of the outcome. Don\u0026rsquo;t make excuses for yourself, if you made a bad choice use the stupid dumb lazy greedy model to figure out why.\nHow have your grown as a person?\nConcrete examples and changes you\u0026rsquo;ve made to how you live. Not one time things or feel good (\u0026ldquo;I\u0026rsquo;m trying to have a better attitude\u0026rdquo;) stuff but real concrete changes. Good luck with life!\n","permalink":"https://test.nicknow.net/keys-to-a-successful-life-groundings-choices-purpose/","summary":"\u003cp\u003eI wrote a piece back at the start of the year called \u003ca href=\"https://nicknow.net/10-choices-for-a-better-future-no-matter-what-happens/\"\u003e10 Choices For a Better Future\u003c/a\u003e that was largely focused on behaviorally based choices, I now realize. Just to be clear there is no \u003cem\u003ebig plan\u003c/em\u003e here I just write this stuff when I\u0026rsquo;m thinking about it and have time and have some motivation. And in discussing this with someone I occasionally mentor recently (okay a couple months ago) I realized that while that list was good from a choosing how to behave daily standpoint (which is what I writing it for) it didn\u0026rsquo;t really provide any thinking how to make choices about your life, and that\u0026rsquo;s a problem because you could apply everything in that piece and still make stupid unguided choices.\u003c/p\u003e","title":"Keys to a Successful Life: Groundings, Choices, Purpose"},{"content":"I\u0026rsquo;m not 100% certain I love this article. I made myself write it in less than one hour. It\u0026rsquo;s core point is supposed to be around written language being the dominant skill going forward which replaces today\u0026rsquo;s primary skill of knowing how to do stuff (visual skill). I will likely revisit this topic in the future as I think about it more.\nFor at least the next 5-10 years, professional work is going to become more language-based, not less. We are entering a period where being able to express yourself clearly in writing will be more critical than ever.\nThat runs against most of the technology narratives of the last decade. We’re supposed to be heading toward voice, visuals, and immersive interfaces. But the reality created by AI - especially LLMs - points in the opposite direction.\nAI lives in a textual world. And that changes how work gets done.\nAI Doesn’t “Use” Software LLMs don’t open apps. They don’t click buttons. They don’t follow human workflows.\nThey translate language into logic. And that logic is language, itself.\nWhen you ask an AI to do something, it doesn’t try to imitate a human sitting at a laptop. It finds the most direct, abstract path to the outcome - through code or structured instructions. It takes language and turns it into language to do something.\nThe response isn’t visual, it’s linguistic. And while that language may ultimately create something visual, think of a mermaid.js diagram or a chart drawn with plotly.py, it is still written language.\nA Small Example With Big Implications I\u0026rsquo;ve been using this recent - relatively trivial example - to explain a lot of my current thinking, so I might as well use it here. I recently needed to merge approximately twenty-five PDF files into a single document (I wanted it to be easier to print.) The rules were trivial:\nSame folder\nAlphabetical order\nSingle output file\nIn a traditional workflow, this is manual work. Open a file. Save As. Insert pages. Repeat. Slow, tedious, easy to skip a file or make some other error.\nInstead, I told an agent (Claude Code) what I wanted, in plain language.\nIt didn’t ask how to open Adobe. It didn’t simulate mouse clicks. I didn\u0026rsquo;t upload the files somewhere.\nI opened a terminal. Typed Claude. And entered \u0026ldquo;Merge all PDFs in this directory into a single PDF in alphabetical order by filename.\u0026rdquo; It wrote a script and ran the script. And I had a single PDF file.\nSame outcome. Radically different execution.\nBut also a radically different work style. There was no mouse, no app knowledge, etc. There was no reason to outsource the work to another person. I didn\u0026rsquo;t need the right version or license of Adobe Acrobat. I didn\u0026rsquo;t need to know how to copy pages from one to another in Acrobat.\nOnce I had clarity on the instruction, it was just done. All the value was in the instruction clarity, not in knowing how to carryout the instruction.\nAI Bypasses Human Process This is the core shift most people are missing. And that many will be challenged by. So much of our work today is knowledge of \u0026ldquo;how to do something\u0026rdquo; not so much \u0026ldquo;what to do\u0026rdquo;.\nWhich means the skills that matter are changing.\nWhat matters less:\nNavigating complex UIs\nMemorizing tool-specific workflows\nBeing “good with software”\nWhat matters more:\nClear written intent\nPrecise constraints\nStructured thinking\nThe ability to describe outcomes unambiguously\nIf your job involves a computer - and most white-collar jobs do - you are now collaborating with systems that only works with language. Yes, you can give them an image here or there, but what do they do with that image: follow your written instructions.\nThe Skill Gap Is Linguistic This will create a sharp divide.\nHigh performers will:\nUnderstand processes in systems-thinking language\nProcess their thoughts to remove ambiguity\nTurn clear thoughts into a well-defined written statements.\nIterate on problems through language clarity\nPeople will argue that LLMs don\u0026rsquo;t need clarity. I see this in lots of videos and hear it from many. They are correct for the basic stuff. But that doesn\u0026rsquo;t translate into complex work.\nOthers will keep asking: “Why didn’t it do what I meant?”\nAI will faithfully reflect the quality of the input it’s given. That feedback loop compounds fast.\nThe Reality We are not moving into a post-language world. We’re moving into a hyper-linguistic one. And a mastery of language, especially system thinking language will give people superpowers. Those who lack the ability to turn their thinking into language clarity will be without that superpower.\nFor the foreseeable future, written language is the highest-leverage professional skill - not because writing is fashionable, but because the most powerful systems we’re building require it.\nThe future belongs to people who can think, reason, and work in text.\nEveryone else will still be clicking - moving slower and getting less done.\nFull disclosure: I used AI to help edit this article.\n","permalink":"https://test.nicknow.net/with-ai-written-language-matters-most/","summary":"\u003cp\u003e\u003cem\u003eI\u0026rsquo;m not 100% certain I love this article. I made myself write it in less than one hour. It\u0026rsquo;s core point is supposed to be around written language being the dominant skill going forward which replaces today\u0026rsquo;s primary skill of knowing how to do stuff (visual skill). I will likely revisit this topic in the future as I think about it more.\u003c/em\u003e\u003c/p\u003e\n\u003cp\u003eFor at least the next 5-10 years, professional work is going to become \u003cem\u003emore\u003c/em\u003e language-based, not less. We are entering a period where being able to express yourself clearly in writing will be more critical than ever.\u003c/p\u003e","title":"With AI, Written Language Matters Most"},{"content":"I had a little fun a few days ago having AI do some forecasting for this weekend DC winter weather event. Figured now that it\u0026rsquo;s Thursday night I would give the AI chatbots a chance to create a new forecast as we have more updated models. Below is the prompt and the results.\nI\u0026rsquo;ve updated my prompt a bunch. I\u0026rsquo;m really interested in continuing to refine the prompt and using it more frequently. Ultimately I would love to create a process of having it forecast and then tracking accuracy of the forecasts over time. Project for another day!\nYou\u0026rsquo;ll notice I start by telling it to ignore everything I\u0026rsquo;ve had it do before. I was intentionally trying to tell it to not look at its past forecasts, as they are now meaningless. This actually turned out to be really important. I had been asking Gemini to do updates to its forecast and it continued to insist that the snow would mostly come on Saturday. I even had it do an analysis of probability on whether snow would mostly fall on Saturday or Sunday and its analysis said Saturday. You\u0026rsquo;ll see in its completely fresh forecast it has moved to be primarily a Sunday event.\nI ran all of these between 10:00 PM and 10:30 PM US Eastern on Jan 22, 2026. Lets see what happens over the next several days!\nThe Prompt Ignore all previous memory you have of research, analysis, and forecasting I\u0026rsquo;ve asked you to do.\nYou are an expert meteorologist tasked with producing a 96-hour weather forecast for the following U.S. ZIP code: 20170.\nObjectives Create a forecast that:\nPresents multiple plausible forecast scenarios (at least 3)\nAssigns a probability (%) to each scenario\nExplains the meteorological reasoning behind each outcome\nFocuses on timing, precipitation, temperature, and impactful weather\nRequired Research \u0026amp; Data Sources Before issuing the forecast, research and synthesize guidance from:\nGlobal numerical models (e.g., ECMWF, GFS, ICON, UKMET)\nHigh-resolution / short-range models (e.g., HRRR, NAM, RAP, HREF)\nEnsemble guidance (e.g., GEFS, EPS, SREF, HREF ensembles)\nExplain:\nWhat each model class is best at predicting (e.g., synoptic pattern, mesoscale precipitation, convective timing, extremes)\nWhich models should be weighted more heavily at different lead times within the 0–96 hour window\nWhere model disagreement exists and why\nForecast Elements to Include For each scenario, clearly describe:\nTiming of key weather events (onset, peak, end)\nPrecipitation\nType (rain, snow, sleet, freezing rain, mixed)\nAmounts (ranges with units)\nTemperature\nHighs and lows\nNotable departures from normal\nWind\nSustained speeds and gusts\nPotential impacts\nConvective or hazardous weather\nThunderstorms, lightning, hail, tornado risk, heavy rain\nSnow squalls, icing, or blizzard conditions if relevant\nAny confidence-lowering factors (track uncertainty, boundary placement, instability questions, etc.)\nProbability \u0026amp; Confidence Assign a probability (%) to each scenario (total must equal 100%)\nIdentify the most likely outcome and explain why\nHighlight forecast bust risks and what would cause the forecast to change\nStructure \u0026amp; Presentation Organize the response as follows:\nLocation Overview (climate context, terrain, coastal/inland effects if relevant)\nModel Overview \u0026amp; Comparison\nScenario Forecasts (with probabilities)\nTimeline Summary (0–24h, 24–48h, 48–72h, 72–96h)\nKey Uncertainties \u0026amp; Watch Points\nBottom-Line Forecast Confidence\nAppendix (specify what models and which runs were used, include available images or links)\nUse clear meteorological reasoning, professional terminology (explained briefly where needed), and quantitative detail. Write as if briefing an informed weather enthusiast, emergency planner, or operational decision-maker—not a casual public forecast.\nThe Results ChatGPT 5.2 Thinking Standard https://chatgpt.com/share/6972f10e-1ac0-800c-ace9-a1c4983781a8\nWeather for 20170, VA: Current Conditions: Partly cloudy, 40°F (4°C)\nDaily Forecast:\nThursday, January 22: Low: 26°F (-3°C), High: 53°F (12°C), Description: Partly sunny and warmer\nFriday, January 23: Low: 7°F (-14°C), High: 42°F (6°C), Description: Cloudy and cooler; breezy in the afternoon\nSaturday, January 24: Low: 11°F (-12°C), High: 18°F (-8°C), Description: Breezy in the morning; otherwise, cloudy and frigid\nSunday, January 25: Low: 15°F (-9°C), High: 21°F (-6°C), Description: Very cold with snow mixing with sleet, accumulating 6-12 cm; travel will be extremely difficult and dangerous\nMonday, January 26: Low: -5°F (-21°C), High: 26°F (-3°C), Description: Windy and very cold with clouds and sun\nTuesday, January 27: Low: -6°F (-21°C), High: 19°F (-7°C), Description: Mostly sunny and bitterly cold\nWednesday, January 28: Low: 4°F (-16°C), High: 24°F (-4°C), Description: Very cold with intervals of clouds and sun\n1) Location overview (ZIP 20170 — Herndon, VA) Herndon sits in northern VA’s Piedmont, just east of the Blue Ridge and well inland from the coast. That geography matters in Mid-Atlantic winter storms because:\nCold-air damming (CAD) can wedge shallow Arctic air southward east of the mountains, locking in subfreezing surface temps even while warmer air tries to intrude aloft (classic snow → sleet → freezing rain setup). (National Weather Service)\nThe mixing line often sets up near/around the I-95 corridor, and small track/thermal-profile changes can swing outcomes a lot over short distances. (National Weather Service)\nClimate context: late January is typically the coldest time of year here; daily highs near the low-40s and lows mid-20s are common around Dulles/Herdon. (Weather Spark)\n2) Model overview \u0026amp; comparison (and how I’m weighting them) What each model “class” is best at Global deterministic models (ECMWF/GFS/UKMET/ICON) Best for: synoptic pattern (jet/phasing, cyclone track, large-scale thermal advection), and broad precipitation shield placement 2–5 days out. Weakness: convective/mesoscale banding details and boundary-layer micro-structure at neighborhood scale.\nShort-range/high-resolution models (HRRR/NAM/RAP + convective-allowing ensembles like HREF) Best for: timing and placement of mesoscale features inside 0–48 hours: frontogenesis bands, deformation zones, dry-slot timing, and rapid p-type changes near the mixing line. Weakness: can be “noisy” beyond ~36–48 hours; sensitive to initialization errors.\nEnsembles (GEFS/EPS/SREF/HREF-members) Best for: quantifying uncertainty (track spread, thermal profile spread, probability of thresholds like 6\u0026quot;+ snow or 0.25\u0026quot;+ ice). They’re the backbone for scenario probabilities and “bust risk.”\nLead-time weighting (0–96h) 0–24h: observations + short-range guidance (HRRR/RAP/NAM) for winds/temps; minimal precip expected until the weekend system.\n24–48h: blend of globals + high-res for the Arctic front and CAD setup.\n48–96h: heaviest weight on ensemble guidance + NWS forecast blend/forecaster synthesis, then deterministic models for scenario shape (track/thermal advection). (National Weather Service)\nWhere disagreement exists (and why) NWS Sterling explicitly calls this a “complex forecast with all precip types expected,” noting uncertainty in how far north sleet/freezing rain evolves and that a dry slot could affect totals. (National Weather Service) That’s the crux: the weekend storm’s track and the depth/temperature of the warm layer aloft determine whether 20170 is mostly snow or spends meaningful time in sleet/freezing rain. (National Weather Service)\n3) Scenario forecasts (probabilities sum to 100%) Scenario A — “Plowable snow dominates, brief sleet risk late” (55%) — MOST LIKELY Meteorological reasoning: Strong Arctic air is entrenched (high confidence), and guidance favors widespread significant snow; the main question is whether the warm nose aloft reaches far enough north to force a longer mixed phase near/along I-95. (National Weather Service)\nTiming Onset: Sat Jan 24 evening (after ~6–10 PM)\nPeak: Late Sat night → Sun morning (heaviest rates)\nTaper: Sun evening; lingering light snow/drizzle possible into early Mon (National Weather Service)\nPrecip\nType: Snow → (brief sleet possible Sun afternoon/evening) → back to snow/flurries\nAmounts (snow): 8–14 in (localized higher if banding sets up)\nIce: trace to 0.10 in (mainly if sleet/freezing drizzle occurs)\nExpect high snow ratios early (fluffier) then lower ratios if mixing begins. (National Weather Service)\nTemperature\nFri night: single digits; Sat highs mid-teens to low-20s\nSun highs upper teens to mid-20s (still subfreezing) (National Weather Service)\nWind\nFri–Sat: increasing NW winds behind the Arctic front; wind chills near/below 0 at times (National Weather Service)\nDuring storm: E/NE 10–20 mph; post-storm NW gusts 20–30+ mph → blowing/drifting possible\nImpacts\nTravel likely difficult to impossible during peak.\nSnow + prolonged cold → hazardous roads persist into early week. (National Weather Service) Scenario B — “Warmer aloft punches north: more sleet/freezing rain, lower snow totals” (30%) Meteorological reasoning: A slightly farther-north track or stronger warm advection aloft increases time spent in sleet/freezing rain, capping snow totals but raising icing impacts—especially near/along the I-95 corridor (which includes the broader Herndon/DC region). (National Weather Service)\nTiming Same onset window (Sat evening), but changeover to sleet occurs earlier (Sun late morning/early afternoon)\nPrecip Snow: 4–8 in\nSleet: 0.25–0.75 in (compacted, high road impact)\nFreezing rain: 0.10–0.25 in (isolated higher)\nNWS highlights “hints of significant icing potential… possibly into the I-95 corridor” with rising probabilities for ≥0.25\u0026quot; ice. (National Weather Service)\nTemperature\nStill subfreezing at the surface (CAD), so “warmer” mostly means aloft, not at ground level.\nWind/impacts More tree/line loading risk (ice + wind) and harder recovery despite lower snow totals.\nScenario C — “Colder/track a bit south: mostly/all snow, higher totals” (15%) Meteorological reasoning: If the warm layer aloft is weaker or displaced south/east, 20170 stays in the dendritic growth zone longer with less mixing, allowing higher snow totals—especially if deformation banding stalls. NWS indicates very high probabilities of ≥6\u0026quot; area-wide and meaningful chances of 12\u0026quot;+ in favored zones near/west of the Blue Ridge. (National Weather Service)\nTiming Onset Sat evening; peak Sun early morning; longer-duration moderate snow into Sun evening\nPrecip Snow: 12–20 in (highest if a band sets up overhead)\nMinimal sleet/ice\nWind/impacts\nMore drifting/blowing as winds pick up post-storm; near-whiteout bursts possible in heavier bands.\n4) Timeline summary (0–24h, 24–48h, 48–72h, 72–96h) 0–24h (Thu Jan 22 → Fri Jan 23) Dry; mild for January today, then increasing clouds later. (National Weather Service) 24–48h (Fri Jan 23 → Sat Jan 24) Arctic front brings sharply colder air; dangerous wind chills Fri night into Sat morning. (National Weather Service) 48–72h (Sat Jan 24 → Sun Jan 25) Daytime Sat: bitter cold; prep window.\nStorm onset Sat evening, rapidly intensifying overnight.\n72–96h (Sun Jan 25 → Mon Jan 26) Highest-impact period: heavy snow and/or sleet/freezing rain depending on scenario; gradual taper late Sun into early Mon with lingering light wintry precip possible. (National Weather Service) 5) Key uncertainties \u0026amp; watch points (what could flip the forecast) Warm nose aloft placement/intensity → determines snow vs sleet/freezing rain duration near the I-95 corridor. (National Weather Service)\nDry-slot timing → could cut totals or create a lull, then redevelop precip on the backside. (National Weather Service)\nMesoscale banding (frontogenesis/deformation) → can add several inches locally; hard to pin down until ~12–36 hours out.\nSurface CAD strength → affects how quickly (or if) surface temps flirt with 32°F (critical for icing vs compacted snow). (National Weather Service)\n6) Bottom-line forecast confidence (operational) High confidence in: a major winter storm affecting the region late Sat into Sun + dangerously cold air before/after. (National Weather Service)\nModerate confidence in: plowable snow in/near 20170 (Scenario A favored). (National Weather Service)\nLower confidence in: exact p-type evolution (how much sleet/freezing rain you see) and precise storm-total at ZIP-code scale. (National Weather Service)\nIf you’re planning operations: act as though Scenario A occurs, but build contingency for Scenario B icing (because a smaller snow number can still be the worse outcome).\n7) Appendix — data/models \u0026amp; runs referenced Primary forecast synthesis (official):\nNWS Baltimore/Washington (LWX) Area Forecast Discussion, issued 9:25 PM EST Thu Jan 22, 2026 (details on p-type uncertainty, snow/ice probabilities, temps/wind chills). (National Weather Service)\nNWS LWX Weather Story (high confidence for plowable snow late Sat evening through Sun; mixing possible farther south; dangerous cold). (National Weather Service)\nProbabilistic winter guidance (threshold framing):\nWPC Probabilistic Winter Precipitation Forecast (PWPF) interface (24–72h probabilities by threshold; used as the probabilistic framework). (NCEP Weather Prediction Center)\nWPC WSSI-P (probabilistic impact categories conceptually referenced for impact-based thinking). (NCEP Weather Prediction Center)\nWPC Experimental Winter Storm Outlook page (context on warning-criteria exceedance products). (NCEP Weather Prediction Center)\nBaseline local forecast inputs:\n20170 7-day forecast feed used for temperature continuity checks (not the sole driver vs NWS discussion). If you want, I can turn the three scenarios into an operational “decision table” (road pretreatment windows, staffing triggers, power-outage risk triggers) keyed to observable signals (e.g., 850–700 mb warm nose magnitude, surface wet-bulb, dry-slot radar signature) so you can update probabilities in real time.\nClaude Opus 4.5 Extended Thinking w/ Research and Web Search https://claude.ai/public/artifacts/e8240cd3-b1e2-4411-b37a-ae637ee8aa82\nMajor winter storm threatens Herndon: 96-hour probabilistic forecast A high-confidence Winter Storm Watch is in effect for Herndon, Virginia, as models unanimously agree on a significant winter weather event from Saturday evening January 24 through Sunday night January 25, 2026. Most likely outcome: 8-12 inches of snow with dangerous wind chills reaching -7°F. The National Weather Service rates this event as having \u0026ldquo;almost certain\u0026rdquo; probability of becoming a widespread, significant winter storm—the most impactful for the DC metro area in several years. Ensemble guidance shows 80-90% probability of accumulating at least 4 inches, with 50-65% probability of reaching 8+ inches. The primary forecast uncertainty centers on whether a warm layer aloft will introduce sleet/freezing rain mixing, which would reduce snow totals but add ice accumulation risk.\nNorthern Virginia in late January: setting the stage Herndon\u0026rsquo;s location in the Piedmont of Northern Virginia places it in a climatologically favorable zone for winter storms. The area sits at approximately 300 feet elevation, west of the I-95 corridor and east of the Blue Ridge—a transition zone where storm tracks critically determine whether precipitation falls as snow, sleet, or freezing rain.\nNormal January climate for Washington-Dulles Airport (IAD):\nAverage high: 42°F | Average low: 25°F\nAverage January snowfall: 5.7 inches\nRecord cold high January 25: 18°F (1987) | Record low: -5°F (1987)\nThis event will bring temperatures 15-35°F below normal, with potential to challenge records from the historic January 1987 cold wave. The synoptic setup—a deeply negative Arctic Oscillation exceeding -5 standard deviations (extraordinary)—is driving an arctic air mass of unusual intensity and persistence.\nHow weather models work and which to trust Understanding model strengths helps interpret forecast confidence. Global models provide the big picture while mesoscale models refine timing and local detail.\nGlobal deterministic models (GFS, ECMWF, ICON, UKMET) run twice daily at 9-25km resolution, forecasting out 10-16 days. The ECMWF (\u0026ldquo;Euro\u0026rdquo;) is generally considered most skillful for synoptic patterns and medium-range timing; the Weather Prediction Center favored it for this event\u0026rsquo;s early period. The GFS updates more frequently (every 6 hours) and provides good trend analysis. For this storm, both agree on occurrence and timing but differ on moisture amounts and the crucial warm-nose development that determines precipitation type.\nHigh-resolution models (HRRR, NAM 3km) excel at 0-24 hour forecasts with 3km resolution that captures mesoscale features like snow bands. The HRRR updates hourly, making it invaluable for real-time nowcasting once the storm arrives. These models show impressive snowfall rates of 1-2 inches per hour during peak intensity but cannot yet resolve the warm-layer question at extended ranges.\nEnsemble systems (GEFS, EPS, HREF) run multiple simulations with slightly varied initial conditions, quantifying uncertainty. The GEFS (31 members) and EPS (51 members) show tight clustering on the storm\u0026rsquo;s existence but meaningful spread on track details. Ensemble agreement indicates high confidence (95%+) in a significant event, with moderate-high confidence (60-75%) in heavy snowfall exceeding 10 inches.\nModel TypeBest UseCurrent Agreement LevelECMWFOverall pattern, days 3-7High – major stormGFSTrend analysis, days 1-5High – major stormHRRR/NAMTiming, precipitation typeHigh – heavy snowGEFS/EPSProbability guidanceHigh – 80-90% for 4\u0026quot;+\nThree plausible scenarios for Herndon\u0026rsquo;s storm Ensemble clustering reveals three distinct outcomes, with probabilities based on GEFS/EPS member distribution and NWS probabilistic guidance.\nScenario A: Cold track maximizes snow (55% probability) The storm tracks close to the I-95 corridor while maintaining a cold enough thermal profile to keep precipitation as all snow throughout. This scenario—currently supported by the GFS and most recent model trends showing a northward shift—delivers the highest accumulations.\nExpected impacts:\nTotal snowfall: 10-14 inches\nIce accumulation: Trace to none\nPeak rates: 1.5-2 inches per hour Sunday 2-8 AM\nOnset: Saturday 7-9 PM\nEnd: Sunday 9 PM - midnight\nTravel: Roads impassable Saturday night through Monday morning\nThis outcome produces a classic Miller Type B cyclone with a favorable deformation zone setting up northwest of the city, enhancing snow amounts. Dendritic growth zone temperatures (-12°C to -18°C) support efficient snow production with 12:1 to 15:1 snow-to-liquid ratios.\nScenario B: Warm nose introduces mixing (35% probability) The ECMWF solution—which pulls more Gulf moisture into the system—develops a layer of above-freezing air at 4,000-5,000 feet Sunday afternoon. This scenario transitions heavy snow to sleet and freezing rain for 3-6 hours before returning to snow.\nExpected impacts:\nTotal snowfall: 6-9 inches (before transition)\nSleet accumulation: 0.5-1 inch\nIce accumulation: 0.1-0.25 inches\nPeak snow rates: 1-1.5 inches per hour (Sunday morning)\nTransition timing: Sunday 1-4 PM\nTravel: Roads impassable; elevated power outage risk from ice loading\nThis scenario produces lower headline snow totals but adds hazards: ice accumulation threatens trees and power lines, and refrozen sleet creates a harder surface beneath any subsequent snow. NWS Sterling notes \u0026ldquo;30-50% probability of icing along I-95\u0026rdquo; with 10-20% chance of ≥0.25 inch ice accumulation.\nScenario C: Strong coastal intensification (10% probability) A small but non-negligible ensemble subset shows aggressive secondary low development off the North Carolina coast, creating a Miller A/B hybrid that draws the heaviest precipitation band directly over the DC metro. This scenario—while lower probability—represents the highest-impact outcome.\nExpected impacts:\nTotal snowfall: 14-18+ inches\nIce accumulation: Trace\nPeak rates: 2+ inches per hour possible\nDuration: Extended, possibly lasting into Monday afternoon\nTravel: Severe disruptions lasting 36-48 hours; paralytic conditions\nThe WPC notes probabilities above 50% for 12+ inches across portions of the Mid-Atlantic already exist in their guidance, acknowledging this high-end scenario cannot be ruled out.\nTimeline summary: hour-by-hour evolution Hours 0-24 (Thursday January 22) Conditions: Quiet and seasonably cold\nHigh: 42-46°F | Low: 28-32°F\nSky: Partly cloudy\nWind: NW 5-10 mph\nPrecipitation: None\nAction items: Complete storm preparations; finalize supplies\nHours 24-48 (Friday January 23) Conditions: Arctic front arrives; dangerous cold developing\nHigh: 43-47°F early, crashing to 20s by evening | Low: 8-14°F\nWind chill: -5°F to 5°F overnight\nWind: NW 15-20 mph, gusts to 30-35 mph\nPrecipitation: None\nAlerts: Cold Weather Advisory 8 PM Friday - 10 AM Saturday\nAction items: Protect pipes; ensure heating systems functioning; charge devices\nCritical detail: The arctic front passage Friday establishes the cold air mass necessary for an all-snow event. Temperatures at 850mb dropping to -18°C to -20°C are extraordinary for this region and ensure initial precipitation will be snow regardless of scenario.\nHours 48-72 (Saturday January 24) Conditions: Bitterly cold morning; storm arrives evening\nHigh: 18-24°F | Low: 10-15°F\nWind chill: 0°F to 8°F\nWind: N 10-15 mph, gusts to 25 mph\nPrecipitation onset: 6-10 PM; light snow becoming moderate\nAccumulation by midnight: 1-3 inches\nAlerts: Winter Storm Watch begins 7 PM; likely upgraded to Warning\nKey timing: Snow spreads from southwest to northeast during the evening hours. Roads will transition from clear to snow-covered between 8 PM and midnight. This is the last window for travel.\nHours 72-96 (Sunday January 25) Conditions: Major winter storm; potential for mixing\nHigh: 18-25°F | Low: 8-15°F\nWind: NE→N 10-20 mph, gusts to 30 mph\nPrecipitation: Heavy snow overnight; 1-2 inch/hour rates 2-8 AM\nMixing risk: Scenario B includes 3-6 hours of sleet/freezing rain Sunday afternoon\nVisibility: ¼-1 mile in heavy snow; near-zero in snow bands\nStorm exit: Sunday 9 PM - Monday 6 AM (varies by scenario)\nAccumulation by storm\u0026rsquo;s end: 6-14 inches depending on scenario\nCritical period: Sunday 2-10 AM represents peak intensity. Banded structures within the warm-air advection zone may produce localized rates exceeding 2 inches per hour. Blowing and drifting snow likely with fresh powder and gusty winds.\nKey uncertainties requiring monitoring 1. Warm nose development and precipitation type This is the dominant uncertainty. Watch for updates to the 850mb temperature forecast; if models maintain temperatures below -5°C at 850mb through Sunday, the all-snow scenario probability increases. Current ECMWF shows a brief period above 0°C at 850mb Sunday afternoon—this feature must be monitored in subsequent runs.\n2. Storm track position (±50 miles matters enormously) A track 50 miles south increases Herndon\u0026rsquo;s snow totals and reduces mixing risk. A track 50 miles north brings the warm sector closer, increasing ice potential. The WPC notes the \u0026ldquo;unanimous northward trend could be a slight mirage\u0026rdquo; given run-to-run variability with northern stream energy.\n3. Coastal intensification rate Secondary low development off the Carolinas determines late-stage precipitation. Stronger coastal development extends the event and may pull the heaviest band northward. NOAA is flying Hurricane Hunter reconnaissance missions to improve sampling of the storm\u0026rsquo;s energy source.\n4. Post-storm temperature trajectory Models agree on brutal cold following the storm (lows 5-12°F Monday-Tuesday) but spread increases by mid-week. This cold lock means snow will not melt naturally for days, compounding impacts.\nMonitoring checkpoints:\nFriday 12Z model runs: Final refinement of snow/ice line\nSaturday 00Z runs: High-resolution verification of onset timing\nSaturday 12Z HRRR: Nowcast-quality detail for evening hours\nBottom-line forecast confidence assessment Forecast ElementConfidenceProbabilityStorm occurrenceVery High95-100%Significant snow (≥4\u0026quot;)High85-90%Heavy snow (≥8\u0026quot;)Moderate-High50-65%Very heavy snow (≥12\u0026quot;)Moderate35-45%Ice accumulation (≥0.25\u0026quot;)Moderate25-40%Record/near-record coldHigh75-85%Major travel disruptionsVery High95-100%Power outage potentialModerate-High40-60%\nForecaster\u0026rsquo;s confidence statement: This event presents an unusual combination of high confidence in impact (virtually certain to be significant) with moderate uncertainty in specifics (exact totals within a 6-inch range). The WPC\u0026rsquo;s characterization—\u0026ldquo;almost certain for a widespread and significant winter storm\u0026rdquo;—accurately captures the situation. Prepare for the full range of scenarios; do not anchor on a single number.\nMost likely outcome for Herndon: 8-12 inches of snow with dangerous wind chills, producing 24-36 hours of impassable roads and potential for school and office closures extending into Tuesday.\nAppendix: model runs and data sources Numerical Weather Prediction Models Used ModelRun TimeResolutionNotesECMWF (IFS)12Z Thu Jan 229 kmPrimary global guidanceGFS18Z Thu Jan 2213 kmLatest American modelICON00Z Thu Jan 2213 kmGerman DWD modelUKMET12Z Thu Jan 2210 kmUK Met OfficeNAM00Z Thu Jan 2212km/3kmMesoscaleHRRR03Z Thu Jan 223 kmHourly updates\nEnsemble Systems SystemMembersRun TimeUseGEFS3100Z Thu Jan 22Uncertainty quantificationEPS (ECMWF)5112Z Wed Jan 21Probabilistic guidanceHREFMulti-model00Z Thu Jan 22Short-range probabilitiesNBMMulti-sourceHourlyCalibrated blend\nOfficial NWS Products NWS Sterling (LWX) AFD: 2:52 AM EST Thu Jan 22, 2026\nWPC Short-Range Discussion: 3:02 PM EST Thu Jan 22, 2026\nWPC Extended Discussion: 2:48 PM EST Thu Jan 22, 2026\nWPC Probabilistic Winter Weather: 2:59 PM EST Thu Jan 22, 2026\nCPC Hazards Outlook: 3:00 PM EST Thu Jan 22, 2026\nAdditional Sources Consulted Tropical Tidbits (tropicaltidbits.com) – model visualization\nPivotal Weather (pivotalweather.com) – ensemble graphics\nCapital Weather Gang, Washington Post – local meteorologist analysis\nFOX5 DC, NBC4 Washington – regional broadcast meteorology\nCollege of DuPage NEXLAB – mesoscale products\nForecast prepared January 23, 2026. Monitor NWS Sterling (weather.gov/lwx) for official watches, warnings, and updates. This probabilistic guidance is intended for planning purposes; official NWS products should be referenced for warning-level decisions.\nGoogle Gemini Thinking Deep Research\nhttps://gemini.google.com/share/69dec08b96f5\nMeteorological Analysis and 96-Hour Winter Storm Forecast: Herndon, Virginia (20170) 1. Synoptic Overview and Atmospheric Dynamics 1.1. Hemispheric Pattern Configuration The meteorological situation currently unfolding across the North American continent represents a textbook \u0026ldquo;Miller Type B\u0026rdquo; cyclogenesis event, heavily modified by a blocked, high-latitude flow pattern. The forecast period, initiated at 00:00 UTC on Friday, January 23, 2026, and extending through 00:00 UTC Tuesday, January 27, 2026, is dominated by the interaction of two distinct and potent air masses. This interaction is facilitated by a highly amplified jet stream configuration that supports the transport of deep tropospheric moisture into a pre-existing, dense Arctic air mass entrenched over the Mid-Atlantic region.\nThe primary driver of the impending adverse weather is a high-amplitude ridge entrenched over the Eastern Pacific and the West Coast of the United States. This positive Pacific North American (PNA) teleconnection pattern forces the downstream flow into a deep trough over the Central and Eastern United States. Simultaneously, the North Atlantic Oscillation (NAO) is trending toward a negative phase, evidenced by blocking high pressure over Greenland and the Davis Strait. This high-latitude blocking mechanism is critical; it acts as an atmospheric brake, stalling the progression of weather systems and allowing cold air to remain locked in place along the eastern slopes of the Appalachian Mountains.\nThe \u0026ldquo;Siberian Express,\u0026rdquo; a colloquialism for the cross-polar flow of Arctic air, is established by a strong surface high-pressure system (1040+ mb) diving southeastward from the Canadian Prairies into the Great Lakes and eventually New England. This high-pressure system is the source of the cold air damming (CAD) wedge that will be a defining feature of the forecast for Herndon, VA (20170). The positioning of this high pressure to the north is climatologically favorable for sustaining sub-freezing surface temperatures in the Piedmont of Virginia, even as warmer air attempts to intrude aloft.\n1.2. Interaction of Northern and Southern Streams The cyclogenesis event forecasted for the weekend of January 24-25, 2026, relies on the complex phasing—or near phasing—of the northern and southern jet streams.\nThe Northern Stream: This branch is vigorous and highly amplified, digging swiftly through the Midwest. It is responsible for delivering the Arctic air mass and providing the upper-level divergence necessary to deepen the surface low pressure.\nThe Southern Stream: Often referred to as the \u0026ldquo;Pineapple Express\u0026rdquo; due to its origins in the subtropical Pacific near Hawaii, this branch serves as the moisture hose for the system. It carries anomalously high precipitable water (PWAT) values, injecting significant latent heat into the developing system.\nAs the southern stream shortwave energy ejects from the Southwest US and traverses the Gulf Coast states, it will induce surface cyclogenesis. The interaction between the moisture-laden southern stream and the cold, dynamic northern stream creates a broad area of isentropic lift—where warm, moist air glides upward over the dense, cold dome at the surface. This mechanical lifting is the primary forcing mechanism for the widespread precipitation shield anticipated to engulf Northern Virginia.\n1.3. Thermodynamic Profile and Vertical Structure The vertical temperature profile is the single most critical variable in the forecast for ZIP 20170. While surface temperatures are forecasted with high confidence to remain in the teens and twenties (°F) throughout the event due to the strength of the CAD wedge, the temperature profile between 850mb (approx. 5,000 ft) and 700mb (approx. 10,000 ft) remains volatile.\nModels indicate a strong warm air advection (WAA) regime aloft. As the surface low tracks northeastward—likely inland of the coast initially before a secondary coastal low takes over (Miller B transfer)—warm air from the Atlantic and the Gulf Stream will be pulled westward over the cold dome. This creates a \u0026ldquo;warm nose\u0026rdquo; in the sounding.\nDendritic Growth Zone (DGZ): Early in the event (Saturday night), the entire column remains below freezing, with strong vertical velocities centered within the DGZ (-12°C to -18°C). This setup maximizes snow-to-liquid ratios (SLR), potentially producing fluff factors of 15:1 or greater.\nThe Melting Layer: By Sunday midday, the 850mb isotherm is projected to breach 0°C. If this warm layer is shallow (less than 2,000 ft deep) and the surface layer is deep and cold, snowflakes will melt partially or fully and then refreeze into sleet (ice pellets) before impact. If the warm layer deepens significantly, the hydrometeors will fall as supercooled liquid rain, freezing on contact with surfaces (freezing rain).\n2. Location Overview: Climatology and Topography of Herndon, VA (20170) 2.1. Geographical Context Herndon, Virginia, located in western Fairfax County, occupies a transitional zone between the coastal plain of Washington D.C. and the foothills of the Blue Ridge Mountains. With an elevation ranging from approximately 300 to 400 feet above mean sea level (MSL) , Herndon sits within the Potomac River watershed but is sufficiently inland to be somewhat insulated from the immediate warming effects of the Chesapeake Bay and the Atlantic Ocean.\nIts proximity to Washington Dulles International Airport (KIAD)—the official recording station for the area—means that observational data is robust. However, Herndon frequently exhibits a colder microclimate than the urban center of Washington D.C. (Reagan National Airport) due to the lack of a significant Urban Heat Island (UHI) effect and its closer proximity to the cold air source region to the northwest.\n2.2. Cold Air Damming (CAD) Mechanics The topography of Herndon makes it particularly susceptible to Cold Air Damming. The Blue Ridge Mountains, located roughly 20-25 miles to the west, act as a physical barrier. When high pressure is located to the north (over New England or Quebec), the geostrophic wind flow directs cold air southward. As this stable, dense air encounters the mountains, it is blocked and forced to bank up against the terrain, flowing southward parallel to the mountain chain.\nThis creates a \u0026ldquo;wedge\u0026rdquo; of cold air that is difficult to scour out. Even as strong southerly winds blow at 4,000 or 5,000 feet, the surface wind in Herndon will often remain northerly or northeasterly, reinforcing the cold air supply. This decoupling of the surface and upper-level winds is a hallmark of significant icing events in this region. For the forecasted event, the presence of a 1040mb high to the north suggests a classic, resilient wedge setup. This climatological bias suggests that Herndon will hold onto frozen precipitation (snow or sleet) longer than areas east of the Capital Beltway (I-495).\n2.3. Historical Analogues The setup bears resemblance to several historic storms, specifically the January 2016 \u0026ldquo;Snowzilla\u0026rdquo; and the February 2010 storms, in terms of the magnitude of moisture and cold air available. The presence of a \u0026ldquo;Siberian Express\u0026rdquo; air mass evokes comparisons to the bitter cold outbreaks of the 1980s, suggesting that Snow-to-Liquid Ratios (SLR) will be higher than the typical Mid-Atlantic \u0026ldquo;wet cement\u0026rdquo; snow, at least during the onset of the storm. However, the potential for a sleet transition mirrors the February 2014 event, where a massive warm nose undercut high snow totals in the southern D.C. suburbs.\n3. Technical Model Comparison and Bias Analysis The meteorological community is currently analyzing a suite of global and mesoscale models to pinpoint the storm\u0026rsquo;s track and thermal profiles. Significant divergence exists, creating uncertainty in the specific precipitation type transition times for ZIP 20170.\n3.1. Global Forecast System (GFS) The American GFS model has displayed a progressive bias with this system. Historically, the GFS struggles with the resolution of the shallow cold air wedge associated with CAD events. It often mixes the boundary layer too aggressively, eroding the cold air faster than observed reality.\nCurrent Trend: The GFS has been oscillating but generally favors a track that brings the warm nose further north, reaching Herndon by Sunday morning. This solution introduces a significant period of sleet and freezing rain, cutting into total snowfall accumulation but increasing the ice storm potential.\nImplication: A GFS-verified solution would result in a \u0026ldquo;front-end thump\u0026rdquo; of snow followed by a messy, hazardous transition to ice, creating a compacted, concrete-like layer on roads.\n3.2. European Centre for Medium-Range Weather Forecasts (ECMWF) The ECMWF (Euro) is generally regarded as superior in handling the complex thermodynamics of CAD events and the blocking patterns in the North Atlantic.\nCurrent Trend: The ECMWF has consistently held more energy back in the primary trough, resulting in a slower progression and a slightly suppressed storm track. It depicts a stronger, more resilient high-pressure system to the north.\nImplication: This model supports a colder solution for Herndon. It suggests the warm nose may stall south of Manassas or Fredericksburg, keeping Herndon in a mostly snow or snow/sleet regime. This generates the highest snowfall totals (10-12\u0026quot;+) and minimizes the freezing rain threat.\n3.3. North American Mesoscale (NAM) and High-Resolution Guidance As the event moves into the range of high-resolution convection-allowing models (CAMs), the NAM becomes critical. The NAM is notorious for amplifying the warm nose (the \u0026ldquo;NAM torch\u0026rdquo;) while simultaneously resolving the surface cold wedge with high precision.\nCurrent Trend: The 12km and 3km NAM runs are likely showing a \u0026ldquo;battleground\u0026rdquo; scenario. They often depict a sharp gradient where 5 miles can mean the difference between 12 inches of snow and 2 inches of sleet.\nImplication: The NAM highlights the banding potential. It suggests extreme precipitation rates (1-2\u0026quot; per hour) Saturday night which could dynamically cool the column, fighting off the warm air intrusion longer than the global models suggest.\n3.4. National Blend of Models (NBM) The NBM is currently utilized by the National Weather Service (NWS) to create a probabilistic mean. It smooths out the outliers. Currently, the NBM for Herndon reflects a high probability of significant snow (\u0026gt;6\u0026quot;) but acknowledges the icing threat (30-50% chance of \u0026gt;0.1\u0026quot; ice).\nModelForecast Philosophy for 20170Snow PotentialIce PotentialPrimary Hazard****GFSProgressive/Warmer AloftModerate (4-8\u0026quot;)High (\u0026gt;0.25\u0026quot;)Ice Loading/Power OutagesECMWFBlocked/ColderHigh (8-14\u0026quot;)Low (Deep Snow/Travel ImpactNAMSharp Gradient/DynamicVariable (6-12\u0026quot;)Moderate (0.1-0.2\u0026quot;)Heavy Precip RatesICONOutlier/Phasing IssuesModerate (5-8\u0026quot;)ModerateUncertainty\n4. Comprehensive 96-Hour Forecast Timeline The following timeline details the anticipated evolution of the weather event for Herndon, VA (20170), derived from a consensus of the ECMWF, GFS, and NWS guidance.\nPhase 1: The Arctic Plunge (Pre-Storm) Friday, January 23, 2026\n06:00 – 12:00 (Friday Morning): The region will be under the influence of the departing pressure gradient. Skies will be partly sunny initially but rapidly filling with high clouds. Temperatures will start in the 20s. Hazard: None significant yet, but preparations should be finalized.\n12:00 – 18:00 (Friday Afternoon): A reinforcing Arctic cold front pushes through. Winds shift to the Northwest at 10-15 mph, gusting to 25 mph. Temperatures will fall non-diurnally (dropping during the day) from a brief high near 43°F into the 30s.\n**18:00 – 06:00 (Friday Night/Saturday Morning):**CRITICAL COLD PERIOD. The core of the Arctic air settles in. Low temperatures will plummet to between 9°F and 14°F in Herndon. Winds remaining breezy (NW 10-20 mph) will generate wind chill values between -5°F and 5°F.\nWarning: A Cold Weather Advisory is in effect. Risk of hypothermia and frostbite is elevated. Pipe freezing potential is high for poorly insulated plumbing.\nPhase 2: Storm Onset and Accumulation Saturday, January 24, 2026\n06:00 – 12:00 (Saturday Morning): Bitterly cold start. High clouds thicken and lower to mid-level altostratus. The sun will appear as a dim disk through the overcast. Temperatures struggle to rise, hovering in the upper teens (17-19°F).\n12:00 – 18:00 (Saturday Afternoon): Radar will begin to show echoes approaching from the southwest, but initial precipitation will evaporate before reaching the ground (virga) due to the extremely dry dew points (single digits). This process of evaporative cooling wet-bulbs the atmosphere, reinforcing the cold air.\n**18:00 – 00:00 (Saturday Evening):**Precipitation Onset. Light snow begins between 6 PM and 9 PM. Due to the cold ground, accumulation is instantaneous on all surfaces. Roads will become slick immediately. Snow intensity increases rapidly towards midnight.\nConditions: Visibilities dropping to 1 mile.\nTemp: Steady around 18-20°F. Phase 3: The Heavy Thump Sunday, January 25, 2026\n**00:00 – 06:00 (Sunday Overnight):**PEAK SNOW INTENSITY. This is the window of strongest isentropic lift. Heavy snow bands, potentially producing 1 to 2 inches per hour, will traverse the region. Dynamics: The \u0026ldquo;Pineapple Express\u0026rdquo; moisture is fully interacting with the cold dome. Thunder-snow is possible if convective instability is realized.\nAccumulation: Rapid stacking of dry, powdery snow. By dawn, 5-8 inches likely on the ground.\n**06:00 – 12:00 (Sunday Morning):**The Transition Zone. As the primary low pressure tracks closer, the warm tongue at 850mb will attempt to nose into Northern Virginia.\nScenario Dependence: In the most likely scenario, snow mixes with and changes to sleet (ice pellets) during this window. The precipitation character will change from \u0026ldquo;silent snow\u0026rdquo; to the audible \u0026ldquo;pinging\u0026rdquo; of sleet.\nHazard: Sleet accumulation creates a heavy, dense layer on top of the powdery snow, making shoveling extremely physically demanding.\n12:00 – 18:00 (Sunday Afternoon): The \u0026ldquo;Mixed Bag.\u0026rdquo; Precipitation lightens in intensity but remains hazardous. A mix of freezing rain, sleet, and snow is expected. Temperatures will remain stubbornly below freezing (23-26°F) due to CAD.\nIcing: Glaze accretion on trees and power lines becomes the primary concern here.\nPhase 4: Departure and Refreeze Sunday Night into Monday, January 26, 2026\n18:00 – 06:00 (Sunday Night): The system exits to the northeast. Precipitation tapers to freezing drizzle or flurries. Winds back to the Northwest and increase significantly (20-30 mph) as the pressure gradient tightens behind the storm. Impact: Blowing snow is possible if the top layer hasn\u0026rsquo;t crusted over with ice. The wet/slushy mix on roads will flash freeze into jagged ruts as temps drop back into the teens (15-17°F).\nMonday (Day): Skies clear to mostly sunny, but temperatures remain frigid (High near 25°F). No significant melting will occur. Travel remains impacted on untreated secondary roads. 5. Scenario Planning and Probabilistic Outcomes Given the complexities of the thermal profile, three distinct scenarios have been modeled for Herndon.\nScenario A: The \u0026ldquo;Sleet Sandwich\u0026rdquo; (Most Likely Case) Probability: 50%\nNarrative: The storm begins as heavy snow Saturday evening. By Sunday morning (roughly 8 AM), strong warm air advection aloft introduces a layer of +2°C air at 5,000 feet. Snow changes to heavy sleet for 4-6 hours, followed by a brief period of freezing rain before tapering off.\nMeteorological Reasoning: This aligns with the consensus of the GFS and mean ensemble guidance which respects the cold air damming at the surface (keeping it\nResulting Accumulation:\nSnow: 6 to 9 inches.\nSleet: 1 to 2 inches (compacting the snow depth).\nFreezing Rain: 0.10 to 0.20 inches.\nHazards: \u0026ldquo;Heart attack snow\u0026rdquo; (heavy weight), extremely difficult plowing, moderate risk of power outages due to ice/wind.\nScenario B: The \u0026ldquo;Cold Suppression\u0026rdquo; (The Snowstorm) Probability: 30%\nNarrative: The northern high pressure is stronger than modeled, and the confluence zone keeps the storm track suppressed slightly south. The warm nose fails to penetrate north of Manassas. Herndon stays all snow or sees only a brief mix with sleet.\nMeteorological Reasoning: Supported by the operational ECMWF and historical CAD behavior. The \u0026ldquo;Siberian Express\u0026rdquo; air mass is denser and harder to scour out than models realize.\nResulting Accumulation:\nSnow: 10 to 14+ inches.\nIce: Trace to None.\nHazards: Major travel disruptions, buried vehicles, but lower risk to the power grid (dry snow blows off lines).\nScenario C: The \u0026ldquo;Warm Nose Intrusion\u0026rdquo; (The Icing Event) Probability: 20%\nNarrative: The storm tracks further inland (west of I-95). The warm nose punches into the region rapidly on Saturday night. Snow changes to rain/freezing rain quickly.\nMeteorological Reasoning: Supported by the \u0026ldquo;NAM torch\u0026rdquo; outliers and scenarios where the coastal low transfer is delayed, allowing the primary inland low to pump warmth northward.\nResulting Accumulation:\nSnow: 2 to 4 inches.\nIce: 0.25 to 0.50+ inches (Major Ice Storm).\nHazards: Catastrophic impact to power grid. Widespread tree damage. Impossible travel on skating-rink roads.\n6. Hazard Assessment and Impact Analysis 6.1. Roadway and Transit Impact Interstates (I-66, Dulles Toll Road): Expect VDOT to pre-treat with brine, but heavy snowfall rates (1-2\u0026quot;/hr) Saturday night will overcome chemical treatments. Conditions will be \u0026ldquo;Code Black\u0026rdquo; (impassable) overnight Saturday.\nSecondary Roads: Neighborhood streets in Herndon will likely remain snow-covered and rutted through Tuesday. The refreeze Sunday night will turn slush into solid ice, requiring heavy machinery to break.\nPublic Transit: WMATA typically suspends Metrobus service when snow exceeds 8 inches or ice coverage is significant. Silver Line rail service to Herndon/Monroe may face delays due to third-rail icing.\n6.2. Power Infrastructure and Vegetation Tree Susceptibility: Northern Virginia has a high density of deciduous trees (oaks, maples) and brittle ornamental trees (Bradford Pears). While leaves are off, the surface area of branches is sufficient to hold significant ice load. Radial Ice Physics: An accretion of 0.25\u0026quot; of ice can add hundreds of pounds of weight to a single tree span. If Scenario A or C verifies, widespread tree limbs will fail.\nGrid Vulnerability: Overhead power lines in older Herndon neighborhoods (downtown) are vulnerable. The combination of ice loading and forecasted wind gusts of 30-35 mph on Sunday creates a high probability of scattered-to-widespread outages. 6.3. Physiological and Human Safety Wind Chill: The pre-storm cold (Friday night) will feature wind chills of -10°F. Frostbite can occur on exposed skin in under 30 minutes.\nCarbon Monoxide: There is a heightened risk of CO poisoning from residents using improper heating sources (grills, ovens) during potential power outages or running cars in enclosed garages to charge devices.\nCardiac Strain: Shoveling heavy, wet snow (specifically the snow/sleet mix in Scenario A) dramatically increases heart rate and blood pressure, posing a severe risk for cardiac arrest in sedentary individuals.\n7. Forecast Confidence and Uncertainty Matrix 7.1. Confidence Levels **Forecast ElementConfidence LevelReasoningEvent OccurrenceVery High (\u0026gt;90%)**Model consensus is locked on a major cyclogenesis event impacting the Mid-Atlantic.**Precipitation OnsetHigh (80%)**Timing of Saturday evening is consistent across guidance.**Thermal ProfileLow-Medium (40%)**The depth and northward extent of the warm nose (850mb-700mb) remains the primary failure point in the forecast.**Snow TotalsMedium (50%)**Highly dependent on the duration of the sleet transition. A 3-hour difference changes totals by 4 inches.**Impact SeverityHigh (80%)**Regardless of p-type (snow vs ice), the impact on travel and safety will be major to extreme.\n7.2. Key Uncertainties The \u0026ldquo;Dry Slot\u0026rdquo;: Some model runs suggest a dry slot (intrusion of dry air into the system) could sweep over Northern Virginia Sunday afternoon, ending precipitation earlier than expected.\nMesoscale Banding: The exact placement of the heaviest f-gen (frontogenesis) bands cannot be modeled until 12-24 hours prior. If a heavy band parks over Herndon, dynamic cooling could force a Scenario B (all snow) outcome even if the broader atmosphere supports mixing.\n8. Summary and Recommendations Residents of Herndon, VA (20170) should prepare for a Major Winter Storm commencing Saturday evening, January 24, 2026. The most probable outcome is a heavy snowfall event transitioning to a significant wintry mix, resulting in 6 to 10 inches of accumulation with an icy crust.\nActionable Recommendations:\nTravel: Complete all travel and supply runs by Saturday at 2:00 PM. Do not plan to travel Sunday.\nHome: Prepare for potential power outages (batteries, non-perishable food, blankets). Ensure heating fuel is topped off before Friday.\nMonitoring: Monitor the National Weather Service Baltimore/Washington office for updates on the Winter Storm Watch and potential upgrade to a Winter Storm Warning or Ice Storm Warning.\nThis report reflects the meteorological data available as of January 22, 2026.\n","permalink":"https://test.nicknow.net/ai-predicting-dc-snow-weather/","summary":"\u003cp\u003eI had a little fun a few days ago \u003ca href=\"https://nicknow.net/what-the-snow-ai-chatbots-predicting-dc-weather/\"\u003ehaving AI do some forecasting\u003c/a\u003e for this weekend DC winter weather event. Figured now that it\u0026rsquo;s Thursday night I would give the AI chatbots a chance to create a new forecast as we have more updated models. Below is the prompt and the results.\u003c/p\u003e\n\u003cp\u003eI\u0026rsquo;ve updated my prompt a bunch. I\u0026rsquo;m really interested in continuing to refine the prompt and using it more frequently. Ultimately I would love to create a process of having it forecast and then tracking accuracy of the forecasts over time. \u003cem\u003eProject for another day!\u003c/em\u003e\u003c/p\u003e","title":"Can AI predict weather? AI's DC Snow Forecast"},{"content":"Will it snow? So this is just a quick post on some fun I had this evening with three of the major AI chatbots: Claude, ChatGPT, and Gemini. I\u0026rsquo;m in the Northern Virginia area and there is a potential winter storm coming this weekend. It has been getting some wild forecast ranges, from maybe a dusting to the Apple Weather app currently showing ~20 inches. So lets just say no one really knows what is going to happen, which is basically true of every winter storm in the DC area.\nSo I decided it would be fun to see what the AI chatbots would predict and what probability they assign to possible outcomes.\nI provided three of the major AI chatbots (all of which I\u0026rsquo;m a paying subscriber) with the prompt below and got the following results. I guess we\u0026rsquo;ll see what happens this weekend! I\u0026rsquo;m mostly posting this just as an easy way to remember I did this and to be able to share with some friends. I don\u0026rsquo;t know how good I should expect these chatbots to be at weather forecasting.\nOkay so lets get to it. All the bots got the same prompt. ChatGPT asked me a question about whether this was a one time thing or not and whether I wanted to empasize anything, I told it it was a one time thing and nothing specific - the others didn\u0026rsquo;t ask any questions.\nBottom line: I don\u0026rsquo;t think any of them would put 20 inches of snow as a likely potential for Sunday!\nThe Prompt I gave all of them the exact same prompt at approximately the same time (11 PM US Eastern on Jan 19 2026):\nWeather Forecast Research \u0026amp; Probabilistic Prediction Prompt Role \u0026amp; Objective You are a meteorological research analyst and forecasting system. Your goal is to evaluate leading numerical and AI-based weather forecast models, assess their recent performance, and synthesize their outputs to produce a highly accurate 7-day weather forecast with quantified probabilities for a specified U.S. ZIP code.\n1. Location \u0026amp; Timeframe ZIP Code: 20170\nCountry: United States\nForecast Period: Next 7 calendar days starting from today\nLocal Time Zone: Automatically infer from ZIP code\n2. Models to Research and Compare Research and incorporate data from the following categories of models (include others if relevant):\nGlobal Numerical Weather Prediction (NWP) Models GFS (NOAA)\nECMWF (IFS)\nUKMET\nICON\nRegional / High-Resolution Models (if available for the area) HRRR\nNAM\nRAP\nEnsemble Systems GEFS\nECMWF ENS\nAny multi-model ensemble blends\nAI / ML-Based Models (if available) GraphCast\nPangu-Weather\nFourCastNet\nOther peer-reviewed or operational AI models\n3. Model Performance Evaluation For each major model used:\nSummarize recent verification performance (last 30–90 days if available)\nNote known biases relevant to the region (e.g., temperature, precipitation timing, convective over/under-forecasting)\nIdentify which models historically perform best for:\nTemperature\nPrecipitation occurrence\nPrecipitation amounts\nWind\nExtreme events\nClearly explain why certain models are weighted more heavily in the final forecast.\n4. Data Integration \u0026amp; Weighting Use ensemble consensus as the baseline\nAdjust weights dynamically based on:\nRecent performance\nForecast lead time (Day 1 vs. Day 7)\nWeather regime (stable, frontal, convective, winter, tropical, etc.)\nExplicitly state assumptions and confidence modifiers\n5. Forecast Output Requirements Produce a 7-day daily forecast with the following for each day:\nCore Variables High temperature (°F) with probability range (e.g., P10 / P50 / P90)\nLow temperature (°F) with probability range\nProbability of precipitation (%)\nExpected precipitation amount with probability bands\nWind speed \u0026amp; gusts (mph)\nCloud cover (% or qualitative)\nNotable hazards (e.g., thunderstorms, heat risk, frost, flooding potential)\nProbability \u0026amp; Confidence Include explicit probabilities, not just single values\nAssign a daily confidence score (e.g., High / Medium / Low or 0–100%)\nHighlight days with elevated uncertainty and explain why\n6. Explanation \u0026amp; Reasoning After the forecast:\nProvide a plain-language summary of the dominant weather pattern(s) during the 7-day period.\nFor each day provide a plain-language summary of the probabilities of different weather scenarios for that day\nIf the forecast identifies any major precipitation events provide a detailed summary of different odds on timing, amounts, and type (rain, sleep, snow, ice, etc.)\nExplain key uncertainties and alternative scenarios\nIdentify any potential forecast bust risks\n7. Output Requirements Use a clear daily table for the forecast\nDominant Weather Patterns\nDaily weather probabilities\nMajor Precipitation events analysis (if applicable)\nKey uncertainties/alternative scenarios/forecast bust risks\nThen include a technical appendix describing model weighting and reasoning\nDo not use emojis in any output. Keep output clear and concise, do not use filler words or attempt to add extra color to the writing. Don\u0026rsquo;t speculate where you cannot comfortably assign a probability.\nOutput should be in Markdown.\n8. Accuracy Priority Prioritize forecast accuracy over simplicity\nAvoid generic phrasing\nClearly distinguish between most likely outcomes and low-probability / high-impact scenarios\nThe Results ChatGPT 5.2 Thinking Standard w/ Extended Research https://chatgpt.com/share/696f06c1-b8dc-800c-b895-b5ba7711d82e\nProbabilistic 7-Day Weather Forecast for Herndon, VA (ZIP 20170) 7-Day Forecast (January 20–26, 2026) Below is the daily forecast for the next 7 days, including temperature ranges, precipitation probabilities, expected precipitation amounts, wind, cloud cover, and confidence levels. High and low temperatures are given with their 10th to 90th percentile ranges (P10/P90) from ensemble guidance, indicating the spread of possible outcomes. Precipitation (liquid equivalent) is given as an expected value with an approximate range. Confidence is a qualitative assessment of forecast certainty for each day.\nDate (2026)High (°F) P10–P90Low (°F) P10–P90PoP (%)Precip (in) (approx. range)Wind (mph)Cloud CoverConfidenceNotable Hazards/NotesTue Jan 2044°F *(42–46)*28°F *(26–30)*0%0.00″ (0″)NW 5–10 (gust 15)Sunny (10%)High—Wed Jan 2150°F *(47–53)*30°F *(28–32)*10%0.00″ (0–0.01″)SW 5–10Partly Cloudy (50%)High—Thu Jan 2255°F *(52–60)*38°F *(36–40)*80%~0.4″ (0.1–0.8″)S 12–18 (gust 25)Overcast (100%)MediumRain likely p.m.; ~0.5″ possibleFri Jan 2340°F *(38–44)*32°F *(30–34)*30%~0.05″ (0–0.1″)NW 15–20 (gust 30)Partly Cloudy (50%)HighAM showers/flurries possibleSat Jan 2436°F (30–45)25°F (18–28)60%~0.3″ (0–1.0″)NE 10–15 (gust 25)Cloudy (≈100%)**LowPotential winter storm – rain/snow mix**Sun Jan 2532°F *(28–38)*20°F *(16–24)*10%0.00″ (0″)N 8–12 (gust 20)Mostly Sunny (20%)MediumIcy conditions if snow on groundMon Jan 2640°F *(35–45)*22°F *(20–25)*10%0.00″ (0″)SW 5–10Partly Cloudy (50%)Medium—\nTable Key: PoP = Probability of precipitation. Precip (in) = expected liquid-equivalent precipitation (rain or melted snow/sleet) with an indicative range from low to high scenarios. Wind given as sustained speed (and gusts). Cloud cover given qualitatively with approximate percent. Confidence is the forecast certainty (high, medium, low) based on model agreement; low confidence indicates high uncertainty in that day\u0026rsquo;s forecast. Hazards/Notes highlight any significant weather or impacts.\nDominant Weather Patterns This Week Over the 7-day period, the Mid-Atlantic will be influenced by a shifting winter pattern featuring an initial tranquil period, a mid-week frontal system, and a potential coastal storm by the weekend. Early in the week, a broad high-pressure area dominates, providing clear skies and seasonably cold conditions. By mid-week, a deepening trough over the central U.S. drives a low-pressure system and cold front toward the East Coast. This front is expected to bring a period of milder temperatures with southerly winds on Thursday, followed by widespread precipitation (primarily rain) as it crosses our region. Late in the week, colder high pressure builds in briefly behind the front on Friday. Over the weekend, forecast models indicate the development of a potential coastal low near the Southeastern U.S. This system could track northeastward, affecting the Mid-Atlantic. There is significant uncertainty in the storm’s track and intensity: it could become a classic Nor’easter impacting our area or slide out to sea. If it comes north, the interplay of cold air in place and the storm’s path will determine whether Herndon sees winter precipitation (snow/ice) or cold rain. Early next week (next Monday), high pressure likely returns, bringing calmer and cool conditions with a moderating trend possible if the flow shifts westerly. In summary, the period starts quiet under high pressure, turns unsettled mid-week with a frontal passage, and then hinges on the evolution of a potential weekend storm, before ending with a return to more stable winter weather.\nDaily Weather Scenario Probabilities For each day, we break down the most likely weather scenario and the probability of alternate outcomes:\nTuesday Jan 20: Most likely: Sunny and dry with high near mid-40s °F. Nearly 100% of ensemble model members keep conditions precipitation-free. Alternative scenario: Essentially no alternate scenario – confidence is very high that Tuesday will be fair. No precipitation is expected with almost zero probability of any surprise rain/snow.\nWednesday Jan 21: Most likely: A calm, milder day. High around 50 °F under a mix of sun and clouds as winds turn southerly. Dry conditions have about a 90% probability. Less likely: ~10% chance of a brief light shower in the evening as a warm front approaches, but any rain would be very light (a few hundredths of an inch at most). Overall confidence remains high for a dry day.\nThursday Jan 22: Most likely (≈80% chance): A frontal system impacts the area. Expect cloudy skies with rain developing by afternoon. High temperature in the mid-50s (unseasonably warm) is likely if southerly winds bring in enough warm air ahead of the front. Rainfall of about 0.3–0.5″ is expected, with steady rain into the evening. Alternate scenarios: There’s about a 20% chance that the heaviest rain stays just west or north (if the front slows down), limiting local totals to\nFriday Jan 23: Most likely: Clearing and turning cooler post-front. There’s a 70% chance any lingering pre-dawn showers will taper off quickly. Daytime will be breezy and drier with highs around 40 °F. Skies become partly cloudy as the day progresses. Alternate: ~30% chance of a few snow flurries or light mix before 8 AM as colder air rushes in and any leftover moisture falls – however, any flakes would be brief with no accumulation (supported by high-resolution model output). The probability of significant precipitation Friday is very low; essentially no model solutions show more than 0.1″ of moisture. Confidence is high for the overall scenario of a dry, colder, windy day after early clouds.\nSaturday Jan 24: This day has the greatest forecast uncertainty. Most likely scenario (~60% probability): A winter storm system approaches – clouds thickening with precipitation by afternoon or evening. Temperatures likely in the 30s°F, so the area could see a rain/snow mix. Current model consensus leans toward precipitation starting as cold rain or a mix, possibly changing to snow if enough cold air arrives. Alternate scenario A (~20% probability): The storm track shifts farther north/west – leading to mostly cold rain (and higher temperatures into the 40s°F). This would mean a wet Saturday evening with rain amounts perhaps 0.5–1.0″, and little to no snow. Alternate scenario B (~20% probability): The storm stays farther south or weakens – sparing our area significant precipitation (just an overcast day with maybe flurries or drizzle and highs in the low 30s). In that case, Saturday could end up largely dry with no major impacts. Worst-case (low probability but high impact): If the storm intensifies just off the Mid-Atlantic coast and taps into cold air (perhaps a 10% chance), Herndon could get several inches of snow – this scenario currently is a minority of model solutions but cannot be ruled out. Overall, confidence is low on Saturday – expect to see forecast adjustments as models come into agreement on the storm’s path.\nSunday Jan 25: Most likely: Clearing and cold in the storm’s wake. There’s roughly a 70% chance that high pressure will be rebuilding, giving us a dry but chilly day with highs only around freezing (low 30s°F). Winds from the north will keep cold air in place. If the Saturday storm occurs, skies clear by Sunday with sunshine returning. Alternate scenarios: If the coastal low were to intensify closer to the coast (lower probability scenario), there’s about a 20% chance that some snow showers or bands could linger into early Sunday (especially before dawn), or that cloud cover sticks around longer, keeping highs in the upper 20s. Another small (~10%) possibility is that if the Saturday system completely misses, Sunday could actually be a bit milder (upper 30s °F) with a mix of sun and clouds instead of brisk cold. Confidence is medium – higher for generally dry conditions, a bit lower on the exact temperature (which will depend on snow cover and the prior storm’s outcome).\nMonday Jan 26: Most likely: A cold morning (low ~22°F) followed by a seasonably cool afternoon around 40°F under partly cloudy skies. High pressure moving offshore should allow a light southwest breeze to develop, bringing slightly milder air. We expect a dry day (PoP ~10%). Alternate scenarios: There’s a modest chance (~20%) that a weak disturbance in the northwest flow could bring increased clouds and perhaps a stray flurry, which would keep highs in the 30s. However, no significant precipitation is evident in ensemble forecasts for Monday – over 80% of members are dry. Confidence is medium (typical uncertainty for 7 days out, but no major storm signals).\nMajor Precipitation Event Outlook Late-Week Coastal Storm (Jan 24): The primary potential high-impact event in this forecast period is the Saturday storm. Both the American (GFS) and European (ECMWF) model ensembles indicate a developing low pressure that could affect the Mid-Atlantic around Jan 24. However, they diverge on the storm’s track and strength.\nPrecipitation Type: There is roughly a 50–60% chance the precipitation will start as cold rain or a rain/snow mix for Herndon, especially if temperatures hover in the mid-30s°F. There is about a 30% probability (per ensemble analysis) that sufficient cold air will be in place or drawn in to produce primarily snow (with temperatures near or below freezing) at some point during the event. A smaller possibility (~20%) exists for a mix transitioning to accumulating snow as the storm departs. The rain vs. snow outcome will depend on the storm’s exact path and timing of cold air. If the storm tracks further inland (west of I-95), warmer air would dominate (rain more likely); if it tracks along or just off the coast, dynamic cooling could change rain to snow in our area.\nTiming: Most guidance suggests if the storm materializes, precipitation would begin on Saturday afternoon or evening (Jan 24) and potentially continue into early Sunday (Jan 25). The peak of the event would likely be overnight Sat or very early Sun. There is a chance (~20%) of the system slowing, which could shift the main precip into Sunday, or conversely (~20% chance) of a faster, weaker wave that ends by late Saturday night.\nPrecipitation Amount: The expected liquid equivalent precipitation is ~0.3″ on average, but with an unusually wide range. The ensemble spread spans from almost no precipitation (if the storm misses) up to ~1.0″ of liquid (in the case of a stronger coastal system). In terms of snowfall, should cold air dominate, a rough estimate would be 2–5 inches of snow for a 0.3–0.5″ liquid scenario (assuming typical 10:1 snow ratios, higher if colder). In a more extreme snowy scenario (10% chance), some ensemble members indicate ~0.8–1″ liquid which could translate to 8″+ of snow, but this is an outlier at this time. On the low end, there’s a significant chance the area gets under 0.1″ if the storm tracks unfavorably or dissipates – which would mean just flurries or sprinkles. We assign roughly a 1 in 3 chance of 0.5″+ liquid (which could be heavy rain or \u0026gt;4″ snow), and about a 1 in 3 chance of under 0.1″ (near-miss scenario), with the remaining probability for moderate precipitation in between.\nImpacts: If the rain scenario prevails, expect a cold rain with minor flooding issues (the ground is cold but not frozen solid, so runoff should be manageable; flood risk is low given the moderate expected amounts). If the snow scenario materializes, roads could become snow-covered and hazardous Saturday night into Sunday, with potential for several inches of accumulation in parts of Northern Virginia. There is also a small risk of icing (sleet/freezing rain) at the onset or conclusion if the rain/snow line sets up nearby – currently considered\nIn summary, Saturday’s storm bears close watching. We will refine the forecast as new model runs clarify the track. Be prepared for possible winter weather if the colder scenario plays out, but also understand there’s a fair chance the system brings mostly rain or even misses our area. As the event draws nearer, the precipitation probability (PoP) and type forecast will be updated with higher confidence.\nKey Uncertainties \u0026amp; Alternative Scenarios Storm Track \u0026amp; Thermal Profile (Jan 24–25): The largest uncertainty is the path of the potential coastal low this weekend. A slight shift in the track (50–100 miles difference) will determine whether Herndon is on the colder northwestern side (favoring snow) or the warmer side (rain). This is a classic rain/snow line problem. Small errors in the forecast upper-air pattern have big impacts on surface weather. Ensemble models currently show a bifurcation: about half keep the storm far enough offshore that cold, dry air dominates (little precipitation), while others bring it close enough for significant precipitation. This bimodal outcome greatly lowers confidence for Saturday. We have accounted for this by giving a low confidence rating and presenting multiple scenarios.\nModel Spread by Day 7: By next Monday (Day 7), forecast uncertainty grows inherently. Even though no major storm is obvious then, temperatures could end up a few degrees warmer or colder than forecast depending on the weekend outcomes and the speed of the next high-pressure system. Ensemble forecast skill by 7 days is notably lower than at short range – for example, the ECMWF ensemble’s correlation skill drops into the 0.8 range at 5–7 days and down to near 0.5 by day 10, illustrating the increasing uncertainty. Thus, while we forecast a dry, seasonable day for Jan 26, there is a moderate chance that unexpected wrinkles (like a weak disturbance or different air mass timing) could alter that day’s conditions slightly.\nPrecipitation Amount Variability: There is inherent uncertainty in precipitation forecasts, especially with convective elements or narrow snow bands. On Thursday, while confidence in some rain is high, the exact amount could vary – for instance, convective downpours could locally boost totals. Our forecast uses ensemble probabilities to express this range (e.g., 0.1–0.8″ on Thu). This approach reflects known model biases: global models (GFS, ECMWF) can underestimate peak rainfall in convective situations due to smoothing, whereas high-resolution models (HRRR, NAM) might overestimate localized heavy rain. By using a probabilistic range, we accommodate these biases. The same logic is applied to the Saturday storm: a wide precip range is given because deterministic model runs diverge significantly, which is common in winter storm predictions.\nTemperature Extremes: Daytime high forecasts, especially later in the period, carry some uncertainty linked to cloud cover and ground conditions. For example, if Saturday brings substantial snow cover, Sunday’s highs could be several degrees lower than forecast due to surface cooling. Conversely, if the storm fails to materialize, Sunday and Monday could verify a bit warmer than we currently project. We’ve reflected this in wider temperature ranges (P10/P90 spreads) for days 5–7. Another factor: models sometimes have biases (e.g., underestimating cold air damming east of the Appalachians). If cold high pressure is stronger than expected, Saturday’s temps could bust lower (staying below freezing, leading to more snow than forecast in a cold scenario). These nuances contribute to forecast bust potential if not captured by models.\nWind \u0026amp; Boundary Layer Effects: With a strong front on Thursday and a possible storm Saturday, wind forecasts also have some uncertainty. High-resolution models like the HRRR are typically used for short-term wind gusts; they have a known slight low bias for wind speeds near the surface, so it’s possible gusts could peak higher than forecast (e.g., if mixing is stronger). We’ve indicated gusts up to ~30 mph for the frontal passage and storm, but isolated higher gusts aren’t impossible if the pressure gradient tightens more than expected. Similarly, if the coastal low rapidly deepens offshore, winds on Saturday night could be stronger (a low probability scenario, but something to watch).\nForecast Bust Risks: The primary bust risk is tied to the weekend storm. If the storm completely misses (which a substantial minority of models suggest), our Saturday forecast mentioning a “potential winter storm” will have been overly cautious, and Saturday could simply be cold and dry. On the flip side, if the storm rapidly intensifies and tracks ideally for snow, we might under-forecast snowfall amounts in the current outlook. We highlight this risk now: a small probability exists for a high-impact snow event that would represent a significant departure from the “most likely” scenario. Additionally, a secondary bust risk exists if the Thursday front slows or speeds up dramatically – this could shift the rain timing into very early Friday or late Wednesday night. While unlikely, it could affect the temperature forecast for Thursday (e.g., an earlier frontal passage could mean a cooler, rainier daytime period than projected).\nOverall, we have flagged areas of low confidence (notably Saturday) and provided reasoning for alternative outcomes. The forecast will be monitored and updated with higher-frequency data (e.g., short-range models as we get closer) to mitigate these uncertainties. By communicating probabilities and ranges, we aim to make the inherent uncertainties transparent.\nTechnical Appendix: Model Weighting and Reasoning Data Sources and Models: This forecast synthesizes guidance from multiple numerical weather prediction models and ensembles, including global models (ECMWF, GFS, UKMET, and ICON), regional high-resolution models (NAM, HRRR for short-range detail), and ensemble prediction systems (ECMWF ENS, GEFS). We also considered emerging AI-based model guidance such as GraphCast/GenCast (DeepMind) and Pangu-Weather (Huawei) as background information on large-scale pattern prediction. The forecast probabilities and ranges (P10, P50, P90) are primarily derived from the ensemble models (ECMWF and GFS ensemble systems), which provide a spread of outcomes. For near-term features (Day 1–2), we leaned on high-resolution deterministic models (HRRR, NAM) and the National Blend of Models (NBM) to fine-tune temperature and wind details, since these mesoscale models better capture local effects like nocturnal cooling and terrain influence.\nModel Performance Recap (Recent 1–3 Months): In crafting the forecast, we accounted for each model’s recent performance and biases. Over the last 90 days, verification scores continue to rank the ECMWF as the top-performing global model for medium-range forecasts, often outperforming other global models (GFS, UKMET, Canadian GEM) in day-to-day accuracy. The ECMWF ensemble (ENS) has shown the highest skill scores (anomaly correlation ~0.8–0.9 at 5–7 days) among global ensembles, meaning it’s statistically the most reliable for a 7-day outlook. The NOAA GFS has improved with recent upgrades (FV3 core), and while it slightly trails ECMWF in skill, it remains a strong performer, especially at short lead times. Verification statistics often show ECMWF’s forecasts edging out GFS’s on most days in the medium range, and the UKMET and other European models also frequently outperform GFS on large-scale accuracy, though by smaller margins.\nRegionally, for the Mid-Atlantic in winter, models have exhibited some known biases:\nECMWF (IFS): Tends to handle large-scale patterns very well. One subtle bias noted is a slight cold bias in high-pressure, radiative cooling scenarios (e.g., Southwest U.S. in winter), but this is less pronounced in the Mid-Atlantic. ECMWF often captures coastal storm development accurately, though it can sometimes over-smooth fine details (due to slightly coarser resolution than convective models). It generally has excellent precipitation timing skill; indeed, ECMWF’s probabilistic precipitation forecasts are found to be more skillful than other centers’ beyond day 3.\nGFS: Known historically for a warm bias in the Southeast U.S. during winter trough patterns (on the order of a few tenths of a degree), which could make it slightly quick to erode cold air damming. In our region, that means GFS might occasionally forecast warmer surface temps and more rain vs. snow in marginal events. The GFS (deterministic) also has had episodes of over-developing inland cyclones (by a few millibars too deep), and under-developing coastal ones, though recent model upgrades have reduced these errors. We kept this in mind for the weekend storm: GFS might slightly underplay a coastal low’s intensity relative to ECMWF. At 4–7 day range, GFS ensemble (GEFS) provides useful spread but tends to have less variance than ECMWF ENS, meaning it might under-represent extreme scenarios. By day 7, GFS solutions can diverge significantly, but in general GFS offers solid large-scale guidance, especially since NOAA has been blending in bias-corrections and AI tweaks to improve it.\nUKMET (Met Office): A reliable model in days 1–5. It has a known slight cold bias in the northeastern U.S. during winter, which can translate to forecasting colder temps and sometimes more snow for East Coast storms than what verifies. We checked the UKMET for the weekend storm; it indeed was on the colder side (more snow) relative to others – consistent with its bias. We use UKMET as a check, but given it doesn’t run as far out (often out to day 6), its input was mainly for the mid-week front (where it aligned with others on a rainy Thursday).\nICON (DWD German model): The ICON model often falls in between GFS and ECMWF solutions. No major systemic bias stands out for our region, but it can sometimes favor a slightly faster progression of weather systems. In this forecast, ICON was in line on the Thursday rain timing (maybe a tad faster frontal passage) and showed a weaker trend for the Saturday low. We gave it moderate weight as a confirming data point but leaned more on ECMWF/ensemble for the uncertain storm.\nNAM (North American Mesoscale): The NAM (12-km) is a short-range model known for doing well with mesoscale features up to ~3 days. It can, however, have a cold surface bias at night (over-predicts radiational cooling) and sometimes an overly wet bias in complex terrain or coastal fronts (due to convective parameterization). The NAM was useful for refining the near-term temperatures (we corrected for its tendency to overdo overnight cooling on clear nights). NAM forecasts for Thursday’s system hinted at a band of heavier precipitation east of the Blue Ridge; sometimes NAM can overdo such bands, so we tempered that influence. We also consulted the NAM for any sign of icing potential (it indicates cold air damming nicely); it suggested mainly rain for us on Thursday, which matched our forecast.\nHRRR (High-Res Rapid Refresh): The HRRR was heavily used for Day 1–2. It provides very high temporal/spatial resolution forecasts. It has shown strong performance in timing precipitation and resolving structures like narrow snow bands or thunderstorms in the near-term. One known bias is a slight underestimation of wind speeds at the surface, which we accounted for by slightly raising forecast gusts in windy scenarios. For Tuesday and Wednesday, the HRRR gave us confidence in the dry forecast (it showed virtually no precip signals). Its temperature forecasts aligned well with observed trends, so we trust it for fine-tuning highs and lows early in the period.\nEnsembles (ECMWF ENS \u0026amp; GEFS): The ensemble systems are the backbone for our probabilistic approach. The ECMWF Ensemble (51 members) generally has the highest skill and a well-calibrated spread. We looked at the ECMWF ensemble for chances of \u0026gt;0.1″ or \u0026gt;0.5″ of precipitation each day, which guided our PoP numbers and precip ranges. For example, on Thursday almost all members (\u0026gt;90%) showed measurable rain, hence PoP ~80% (accounting for slight timing differences) and an expected ~0.4″ with an upper-end ~0.8″ (near the 90th percentile). The GEFS (31 members), while not as skillful as ECMWF, provides a second opinion. It also showed high odds of rain Thu (though with slightly lower QPF on average) and a wide range for Sat. Notably, ensemble blending was used: we effectively took a consensus of ECMWF and GFS ensemble means for temperature forecasts, which literature shows can improve accuracy by on the order of 10–15% over any single model. We also monitored the CMC (Canadian) ensemble and National Blend of Models, but these had no strong disagreements with the main scenario, so their influence was secondary.\nHigh-Resolution Ensemble: For the short range, systems like the HREF (High-Resolution Ensemble Forecast, which includes multiple high-res models) are used for severe weather or high-impact short-term events. In this case, significant convection isn’t a big factor except possibly some convective rain elements Thu. We noted the HREF probabilities for \u0026gt;1″/hour rainfall were virtually zero here, indicating heavy convection is unlikely – supporting a stratiform rain scenario. This bolstered confidence that Thursday’s event is rain with minimal severe weather.\nAI/Machine-Learning Models: We consulted information from cutting-edge AI-based forecasting models, which have shown impressive performance in research settings:\nGraphCast / GenCast (DeepMind): GraphCast is a deep-learning model that was trained on decades of reanalysis data. Studies have shown it can predict medium-range weather patterns with accuracy rivaling or exceeding ECMWF in many cases. In fact, the newer GenCast ensemble version outperformed the ECMWF ensemble (ENS) in 97% of evaluated cases for global weather patterns. GraphCast has the highest overall pattern skill among tested AI models as of late 2025. This is remarkable, and we take note of its large-scale pattern guidance. For this forecast, an AI model like GraphCast likely would also predict the large trough and coastal development, lending confidence that the general pattern (trough + potential storm) is correct. However, these AI models can sometimes be too smooth and may not capture local extremes as well – e.g., the exact sharp rain/snow line or very localized heavy snow. We did not rely on GraphCast explicitly for local details, but it reinforces the ensemble consensus on the big picture.\nPangu-Weather (Huawei): Pangu is another data-driven global model that runs rapidly. Independent evaluations have found Pangu’s forecast accuracy to be on par with ECMWF’s high-resolution model for many metrics. For instance, a study in Norway found Pangu slightly better on 2m temperature and slightly worse on wind compared to ECMWF, but overall “on the same level” of performance. Pangu likely would produce a scenario similar to the consensus here, and its presence increases confidence that AI forecasts agree with traditional models. Still, like other global models, Pangu operates at a coarse resolution (0.25°), so it won’t resolve micro-scale phenomena. In a case like the Herndon weekend storm, Pangu’s deterministic run might be one member of our model pool – if it shows a big storm, that adds weight, if not, that’s noted. In this situation, AI models are generally in agreement with a disturbance in the late-week timeframe given the broad trough (we surmise this from their known skill in pattern prediction).\nFourCastNet (NVIDIA) and others: FourCastNet is another ML model that produces rapid forecasts. It is similar to GraphCast in concept. According to some reports, its performance is slightly behind GraphCast and ECMWF’s AI in terms of pattern correlation, but still comparable. We mainly use these as corroborating guidance for large-scale features. They are not yet operationally used for local forecasts, but their success in research gives confidence in the robustness of the forecast pattern.\nECMWF’s AIFS: ECMWF has been running an AI Forecasting System (AIFS) in parallel with its traditional IFS. By late 2025, AIFS demonstrated skill comparable to IFS from day 3–10, occasionally even better in upper-air pattern metrics by day 6–7. This indicates the AI model often matches the physics-based model on the large scale at medium range. However, ECMWF notes that the IFS still outperforms for fine-scale and extreme events (e.g. local precipitation intensity, small-scale extremes). We interpret this as: the AI can nail the overall trajectory of the jet stream and pressure systems, but for an exact snowfall amount in Herndon, the traditional models and high-res tools remain essential. Therefore, we use AIFS/GraphCast info to increase confidence in the synoptic pattern (trough coming in, etc.), but rely on high-res and physical models for the gritty details like rain/snow line and QPF.\nModel Weighting Approach: We dynamically weighted model contributions by forecast lead time and situation:\nDays 1–2: Heaviest weight on high-resolution models (HRRR, NAM) and the ECMWF/GFS deterministic runs, since these have the best handle on short-term details. We also gave credence to local NWS forecasts and persistence (knowing current conditions). Confidence was high due to strong model agreement at this range.\nDays 3–4: A blend of global models and ensembles was used. For the Thursday frontal system (Day 3), ECMWF and GFS both showed it clearly, so a consensus of those handled timing and temp advection. High-res models only partially cover this period (NAM goes ~84h, HRRR 48h), but were used for a heads-up on mesoscale features (like the possibility of convective rain). ECMWF’s superior precip skill from Day 3 onward meant we leaned on its QPF and timing for Thursday. The ensemble means helped set probability bounds (hence PoP 80% not 100%, acknowledging some members delay rain).\nDays 5–7: Ensembles became the primary tool. We heavily analyzed ECMWF ENS and GEFS for the weekend scenario. The forecast spread on Saturday was large, so we explicitly used the ensemble distribution to form the probabilistic outcomes (the 60/20/20% scenario split mentioned reflects roughly the proportion of ensemble members indicating each scenario). Given ECMWF ENS’s historically better performance for such events, we weighted it a bit more for deciding that PoP = 60% (ECMWF ENS had a majority with precip, whereas a few GEFS members were dry – GFS ensemble can under-dispersion in such cases, so we considered that). For Day 6–7, we looked at the ensemble mean and also consulted the Climate Prediction Center outlooks qualitatively (they suggested near-normal temps, implying no strong Arctic outbreak or heat wave, aligning with our forecast of seasonable conditions). Multi-model blends like the NBM were used as a sanity check – the NBM essentially does what we describe, combining many models. Our final numbers for days 6–7 fell in line with NBM median forecasts, with a bit of manual adjustment to ensure the 10th–90th percentile ranges reflect the true spread we saw in ensemble charts.\nWeather Regime Considerations: The forecast regime included a significant frontal cyclone and a potential coastal low – both are scenarios where certain models historically excel. For example, the ECMWF is often trusted for nor’easter tracks, so we gave its solution extra credibility for the coastal storm (indeed, if ECMWF had strongly indicated a big snowstorm, we would have leaned that way; currently it shows a storm but with marginal rain/snow for our area, which shaped our forecast). The GFS, while slightly less skillful overall, sometimes handles fast-moving fronts well and has higher temporal frequency (4 runs a day vs ECMWF’s 2), letting us see trending changes sooner. We watched successive runs (“trend forecasting”) – noting that both models trended toward a similar outcome for Thursday (increasing agreement = higher confidence). For the weekend, if models diverged, we deferred to ensemble consensus. In a relatively stable pattern (high pressure, calm weather), we might trust even the deterministic output further out, but in this active pattern we assumed higher uncertainty. Thus, the ensemble approach and multi-model blend was critical.\nFinally, we cross-checked the forecast with official outlooks: the National Weather Service’s 7-day forecast for the area and any WPC (Weather Prediction Center) guidance on storm probability. These human-in-the-loop forecasts often incorporate the same model data but add expertise. Our numbers and risk assessment are in line with what an informed consensus would be, given the data at hand.\nConfidence Assessment: To quantify our confidence: early in the period (Day 1–2) confidence is high – models are in strong agreement, and short-range errors are small. By mid-week (Day 3–4), confidence is medium-high – a frontal passage is a straightforward scenario, but small timing/intensity differences warrant some caution. Late period (Day 5–7) confidence is low to medium – primarily due to the possible storm. This is reflected in our table and discussion. We explicitly marked Saturday as low confidence. This aligns with the understanding that forecast skill drops with lead time; even advanced models and AI systems show only comparable skill around day 7 and rely on ensemble approaches to convey uncertainty. ECMWF’s AI (AIFS) and NOAA’s experimental AI models often match the physics models on broad patterns at day 6–7, but neither can eliminate the inherent uncertainty in exact local impacts – hence a probabilistic forecast is the prudent approach.\nIn conclusion, our forecast strategy was to blend the strengths of various models:\nUse high-res models for near-term precision,\nRely on the superior medium-range skill of ECMWF (and to a degree UKMET/ICON) for synoptic trends,\nIncorporate ensemble guidance for probability distributions (temperatures and precip ranges),\nCorrect for known biases (e.g., adjusting temperatures slightly upward where models tend to be too cold at night, etc.),\nConsider the insight from new AI forecast models for pattern confidence, while not overcounting them for local weather,\nAnd ultimately apply meteorological reasoning to resolve conflicts (for instance, ensuring the forecast is physically consistent: if a model showed unrealistically high precipitation but others didn’t, we moderated it).\nThis multi-model, weighted approach, backed by verification statistics and experience, yields a forecast that emphasizes accuracy and explicitly communicates uncertainty. By explaining the reasoning and giving quantified odds, we aim to provide a transparent and robust 7-day outlook for Herndon, VA.\nSources:\nECMWF forecast performance reports and verification statistics\nNOAA and research data on GFS biases and verification\nNorth Georgia Weather – Ensemble model biases (winter)\nDeepMind’s GraphCast/GenCast performance vs ECMWF\nAmerican Weather Forum – ECMWF vs AI model skill and NOAA AI initiatives\nNorwegian Meteorological Institute study on Pangu-Weather vs ECMWF\nNREL analysis of HRRR model wind bias\nCitations\nBiases in Major Ensemble Weather Models - Weather Education - North Georgia Weather\nhttps://wx.northgeorgiawx.com/forums/topic/50593-biases-in-major-ensemble-weather-models/[PDF] Bias Correcting NOAA\u0026rsquo;s High-Resolution Rapid Refresh (HRRR \u0026hellip;https://docs.nrel.gov/docs/fy25osti/91749.pdfModel Verification Statistics - Netweather Community Weather Forumhttps://community.netweather.tv/topic/101217-model-verification-statistics/Biases in Major Ensemble Weather Models - Weather Education - North Georgia Weatherhttps://wx.northgeorgiawx.com/forums/topic/50593-biases-in-major-ensemble-weather-models/[PDF] Evaluation of ECMWF forecastshttps://www.ecmwf.int/sites/default/files/elibrary/092024/81582-evaluation-of-ecmwf-forecasts.pdfBiases in Major Ensemble Weather Models - Weather Education - North Georgia Weatherhttps://wx.northgeorgiawx.com/forums/topic/50593-biases-in-major-ensemble-weather-models/Biases in Major Ensemble Weather Models - Weather Education - North Georgia Weatherhttps://wx.northgeorgiawx.com/forums/topic/50593-biases-in-major-ensemble-weather-models/Biases in Major Ensemble Weather Models - Weather Education - North Georgia Weatherhttps://wx.northgeorgiawx.com/forums/topic/50593-biases-in-major-ensemble-weather-models/Google Reveals New A.I. Model That Predicts Weather Better Than the Best Traditional Forecastshttps://www.smithsonianmag.com/smart-news/google-reveals-new-ai-model-that-predicts-weather-better-than-the-best-traditional-forecasts-180985608/January 2026 OBS and Discussion - Page 63 - New York City Metro - American Weatherhttps://www.americanwx.com/bb/topic/62470-january-2026-obs-and-discussion/page/63/January 2026 OBS and Discussion - Page 63 - New York City Metro - American Weatherhttps://www.americanwx.com/bb/topic/62470-january-2026-obs-and-discussion/page/63/NPG - Evaluation of forecasts by a global data-driven weather model with and without probabilistic post-processing at Norwegian stationshttps://npg.copernicus.org/articles/31/247/2024/January 2026 OBS and Discussion - Page 63 - New York City Metro - American Weatherhttps://www.americanwx.com/bb/topic/62470-january-2026-obs-and-discussion/page/63/January 2026 OBS and Discussion - Page 63 - New York City Metro - American Weatherhttps://www.americanwx.com/bb/topic/62470-january-2026-obs-and-discussion/page/63/January 2026 OBS and Discussion - Page 63 - New York City Metro - American Weatherhttps://www.americanwx.com/bb/topic/62470-january-2026-obs-and-discussion/page/63/January 2026 OBS and Discussion - Page 63 - New York City Metro - American Weatherhttps://www.americanwx.com/bb/topic/62470-january-2026-obs-and-discussion/page/63/\nClaude Opus 4.5 Extended Thinking w/ Research and Web Search https://claude.ai/public/artifacts/05bfe293-116c-4d25-b16f-b92460d8cc38\nProbabilistic 7-Day Weather Forecast: Herndon, Virginia (20170) A significant winter storm signal has emerged for January 24-25 amid an ongoing Arctic pattern. Confidence is high for the first three days showing cold, dry conditions, but low to moderate for the weekend precipitation event where model spread exceeds 30°F on high temperatures. The NWS Sterling office explicitly increased their winter storm potential assessment on January 19, 2026, though exact track, intensity, and precipitation type remain highly uncertain at this range. Temperatures will run 10-25°F below normal through the period, with the coldest conditions Sunday into early next week following any storm passage.\nDominant weather pattern for January 20-26 A strongly negative Arctic Oscillation (-AO) is driving successive Arctic high pressure systems into the central and eastern United States. This pattern promotes sustained cold air masses and creates favorable upper-level dynamics for potential coastal cyclogenesis. The synoptic setup shows a deep upper trough over the eastern U.S. with multiple shortwave disturbances rotating through the base of the trough.\nThree distinct phases characterize this forecast period:\nPhase 1 (Jan 20-21): Post-frontal Arctic high pressure with the coldest morning of the period (lows 13-19°F). Strong pressure gradient produces breezy northwest winds. Temperatures struggle to reach 30°F Tuesday.\nPhase 2 (Jan 22-23): Brief southwest flow ahead of approaching cold front allows temperatures to recover toward seasonal norms (highs near 50°F Thursday). Cold front passage late Thursday ushers in sharply colder air.\nPhase 3 (Jan 24-26): Reinforcing Arctic front late Friday. Upper-level energy moving through the base of the trough may interact with Gulf moisture and coastal baroclinic zone. Pattern is favorable for significant winter storm development, though track determines impacts. Deep cold air entrenches by Sunday with highs potentially failing to reach 25°F.\n7-Day forecast table with probability distributions DateHigh °F (P10/P50/P90)Low °F (P10/P50/P90)PoPPrecip (P50/P90)Wind mphSkyConfidenceTue 1/2027 / 30 / 3313 / 17 / 200%0.00\u0026quot; / 0.00\u0026quot;WNW 12-18, G25SunnyHigh (90%)****Wed 1/2139 / 42 / 4514 / 17 / 210%0.00\u0026quot; / 0.00\u0026quot;S 8-14SunnyHigh (85%)****Thu 1/2248 / 51 / 5428 / 32 / 355%0.00\u0026quot; / 0.00\u0026quot;SSW 8-16, G25Ptly CloudyHigh (80%)****Fri 1/2334 / 39 / 4414 / 19 / 2415%0.00\u0026quot; / TraceNW 12-20, G28CloudyMedium (65%)****Sat 1/2418 / 26 / 3810 / 14 / 1845%0.20\u0026quot; / 1.00\u0026quot;NE-N 8-15OvercastLow (35%)****Sun 1/2520 / 26 / 348 / 14 / 1840%0.10\u0026quot; / 0.50\u0026quot;NW 10-18M. CloudyLow (40%)****Mon 1/2624 / 32 / 426 / 12 / 185%0.00\u0026quot; / TraceNW 6-12ClearingMedium (55%)\nProbability interpretation: P10 represents the 10th percentile (colder/lower outcome), P50 is the median expectation, P90 represents the 90th percentile (warmer/higher outcome). Wide spreads indicate high uncertainty.\nDaily weather probability summaries Tuesday, January 20 Expect a bitterly cold but sunny day with high pressure in control. The high temperature has a 90% probability of remaining between 27-33°F, with the most likely value near 30°F. Morning temperatures will be the coldest of the period, starting in the mid-to-upper teens. Northwest winds of 12-18 mph will produce wind chills in the single digits to low teens during the morning, improving to the teens by afternoon. There is zero precipitation risk. Conditions favor frostbite on exposed skin within 30 minutes during morning hours.\nWednesday, January 21 Moderation begins as winds shift southerly and Arctic high slides east. High temperatures climb to the low 40s with 85% confidence in the 39-45°F range. Morning lows remain cold (14-21°F) before southerly flow takes over. Skies remain sunny with increasing high clouds by evening. This will be the most pleasant day of the forecast period. No precipitation expected.\nThursday, January 22 The warmest day of the week with highs approaching 50°F (P50 = 51°F). Strong agreement across models places this day\u0026rsquo;s high between 48-54°F with 80% confidence. Southwest winds of 8-16 mph with gusts to 25 mph possible by afternoon ahead of approaching cold front. Clouds increase through the day. A 5% precipitation chance exists, primarily for areas south of Herndon near the I-64 corridor. The cold front passage is expected late evening to overnight.\nFriday, January 23 Transition day with increasing uncertainty. High temperatures likely occur in the morning before falling through the afternoon as cold air floods in behind the front. Confidence drops to 65% with a spread of 34-44°F. The reinforcing Arctic front arrives late Friday into Saturday morning. Light precipitation (15% chance) is possible, primarily in the form of flurries or light snow showers, with accumulations unlikely. Northwest winds become gusty (12-20 mph, gusts to 28 mph) during the afternoon and evening.\nSaturday, January 24 — Winter Storm Watch Period This is the lowest confidence day with only 35% confidence in the specific forecast. Model spread is extraordinary: high temperatures range from 18°F (AccuWeather) to 54°F (LocalConditions), a 36°F divergence. The primary uncertainty involves timing of the potential coastal low development, its track relative to the coast, and the resulting precipitation type and intensity.\nThe median scenario (P50) suggests highs near 26°F with a 45% probability of measurable precipitation beginning as snow during the afternoon or evening hours. If precipitation occurs, the median expectation is approximately 0.20 inches liquid equivalent (2-4 inches snow at 10:1 ratio), but the P90 outcome could deliver 1.0 inch liquid equivalent (8-15 inches snow) if the storm tracks favorably.\nSunday, January 25 Uncertainty remains elevated (40% confidence) though slightly improved from Saturday. The median forecast shows highs near 26°F with a 40% precipitation probability as any ongoing snow tapers and moves offshore. Cold air dominates regardless of storm track. If the storm materializes as a significant event, accumulating snow may continue into early Sunday before tapering. Arctic air locks in with lows potentially reaching single digits in outlying areas.\nMonday, January 26 Confidence improves to 55% as the system exits and high pressure builds. Any lingering clouds clear through the day. Temperatures depend heavily on weekend snowpack and cloud evolution: the P10-P90 range spans 24-42°F for highs. Morning lows will be the coldest of the period if skies clear and snow cover is present, potentially dropping to single digits (P10 = 6°F). Dry conditions expected with clearing skies.\nMajor precipitation event analysis: January 24-25 winter storm Event probability assessment OutcomeProbabilityDescriptionNo significant precipitation25%Storm tracks too far offshore (\u0026gt;200 mi); brief flurries only**Light snow event (1-3\u0026quot;)35%Storm tracks offshore but close enough for light accumulationsModerate snow event (4-8\u0026quot;)25%Storm tracks ~100 mi offshore; sustained snow with moderate totalsMajor snow event (\u0026gt;8\u0026quot;)**15%Near-benchmark track ~50-75 mi offshore; heavy snow possible\nTiming probability distribution If precipitation occurs, the most likely timing scenarios are:\nOnset: Saturday afternoon (1400-2000 EST) — 50% probability; Saturday evening (2000-0200 EST) — 35% probability\nPeak intensity: Saturday night through Sunday morning (0000-0800 EST) — 45% probability\nEnding: Sunday afternoon (1200-1800 EST) — 40% probability; extends to Sunday night — 25% probability\nPrecipitation type analysis Given the strong cold air mass in place, precipitation type discrimination favors snow over rain for this event.\nTypeProbabilityConditionsAll snow60%Surface temps below 32°F throughout event; deep cold columnSnow changing to sleet/ice pellets15%Warm nose develops aloft; surface remains coldSnow to freezing rain to rain10%Storm tracks too close; warm sector briefly affects regionPrimarily rain/mix15%Storm tracks well inland; warm sector dominates\nSnow-to-liquid ratio guidance If temperatures remain in the 15-25°F range during precipitation (most likely scenario), snow ratios of 12:1 to 15:1 are expected, yielding fluffy, wind-susceptible snow. If temperatures hover near 28-32°F during onset, ratios may decrease to 8:1 to 10:1, producing denser snow with higher water content.\nAccumulation probability matrix (Herndon) AccumulationProbabilityTrace - 1 inch35%1 - 3 inches25%3 - 6 inches20%6 - 10 inches12%\u0026gt;10 inches8%\nKey uncertainties and alternative scenarios Primary uncertainty drivers 1. Coastal low track and intensity The single largest source of forecast uncertainty is whether a coastal low pressure system develops and, if so, its precise track relative to the Mid-Atlantic coast. A track 50-75 miles offshore would maximize snowfall for the I-95 corridor. A track 150+ miles offshore limits impacts to light snow or flurries. A track that moves inland would bring warmer air and reduce snow totals or produce a rain/snow mix.\n2. Cold air supply and CAD persistence Models historically show a warm bias during Cold Air Damming (CAD) events in the Virginia Piedmont. GFS specifically produces warm bias along the eastern Appalachians during CAD, meaning models may be too aggressive in eroding the cold air dome. If cold air persists longer than modeled, snow totals could overperform and precipitation type could remain colder than currently forecast.\n3. Phasing of shortwave energy Multiple pieces of upper-level energy are rotating through the base of the trough. Whether these pieces phase (combine) into a single, stronger system or remain separate, weaker disturbances dramatically affects precipitation intensity and duration.\nAlternative scenarios Scenario A: Offshore track (Probability: 30%) Storm develops but tracks more than 150 miles offshore. Result: Brief period of light snow or flurries Saturday night, accumulations under 2 inches. Sunday clearing. Temperatures as forecast.\nScenario B: Benchmark track (Probability: 25%) Storm develops and tracks 50-100 miles offshore. Result: Significant snowfall of 4-8+ inches Saturday night through Sunday morning. Travel impacts likely. Temperatures 2-5°F colder than P50 due to snowpack and clouds.\nScenario C: Inside track (Probability: 15%) Storm tracks over or just west of the region. Result: Precipitation begins as snow but changes to sleet, freezing rain, or rain during peak intensity. Mixed accumulations with potential ice accumulation of 0.1-0.25 inches. This scenario carries highest hazard risk.\nScenario D: System fails to organize (Probability: 30%) Upper-level energy remains disorganized; no significant coastal low develops. Result: Scattered snow showers with trace to 1 inch accumulations. Very cold temperatures dominate the story.\nForecast bust risks Warm bias bust: Models erode CAD too quickly; actual temperatures 5-10°F colder than forecast, enhancing snow totals\nTrack shift bust: 50-mile shift in storm track changes accumulation by factor of 2-3x\nTiming bust: System slower than modeled, shifting impacts toward Sunday\nIntensity bust: Phasing occurs more strongly than modeled, producing unexpectedly heavy precipitation rates\nTechnical appendix: Model weighting methodology Weighting scheme for this forecast Given the characteristics of this event (winter storm potential, CAD environment, 5+ day lead time for key event), the following model weighting was applied:\nModel/SystemWeightRationaleECMWF IFS25%Highest global skill; ~1 day accuracy advantage; 9 km resolution; strong winter storm performanceECMWF ENS20%51-member ensemble provides probability distribution; superior to GEFS for medium-range uncertaintyNBM (National Blend)20%Integrates 31+ model systems with bias correction; calibrated probabilities; best for consensusGFS10%Discounted due to known warm bias during CAD events; 16-day range useful for pattern confirmationGEFS10%31 members provide uncertainty bounds; complements ECMWF ENSHRRR5%Only useful for Days 1-2; highest resolution for short-range timingNAM5%Wet bias requires adjustment; useful second opinion for CAD scenarios**AI Models (AIFS, GraphCast)**5%Strong for synoptic patterns; weak for precipitation; supplementary use only\nModel performance considerations Why ECMWF is weighted most heavily: ECMWF maintains approximately one full day of forecast skill advantage over GFS in 500 hPa anomaly correlation. The June 2023 upgrade (Cycle 48r1) increased ENS resolution to 9 km, matching HRES. The November 2024 upgrade (Cycle 49r1) specifically improved 2-meter temperature forecasts through data assimilation improvements. For coastal winter storms affecting the Mid-Atlantic, ECMWF has historically shown superior track prediction.\nWhy GFS is discounted: Virginia Tech research (2007-2016) documented persistent warm bias on the east side of the Appalachians during CAD events. GFS and NAM both tend to erode cold air domes prematurely, leading to temperature forecast errors exceeding 8°F in bust cases. This bias is directly relevant to the January 24-25 event where CAD will influence precipitation type.\nWhy AI models receive minimal weight: While ECMWF AIFS became fully operational February 2025 and shows 20% improvement in tropical cyclone tracks, AI models systematically underpredict precipitation and struggle with record-breaking temperature extremes. GraphCast and Pangu-Weather explicitly exclude precipitation from their primary outputs due to ERA5 training data biases. For a winter storm event where precipitation type and amount are the key forecast challenges, physics-based NWP remains superior.\nEnsemble interpretation methodology: P10/P50/P90 values were derived from the combined ensemble distribution (GEFS + ECMWF ENS weighted equally), adjusted for known model biases using NBM calibration curves. Weekend values carry asymmetric uncertainty skewed toward colder temperatures due to historical CAD warm bias in models.\nVerification benchmarks for model selection MetricECMWFGFSGEFSNotes500 hPa ACC \u0026gt; 0.810 days9 days-ECMWF leads2m Temp MAE (Day 3)2.0°F2.5°F-ECMWF advantageWinter storm track error75 mi100 mi-ECMWF more accuratePrecip timingGoodModerateSpread capturesNBM calibrated\nConfidence scoring methodology Daily confidence scores incorporate:\nEnsemble spread (smaller spread = higher confidence)\nModel agreement (convergence = higher confidence)\nLead time (shorter = higher confidence)\nPattern regime (persistent = higher confidence)\nDays 1-3 score High (80-90%) due to high pressure dominance and strong model agreement. Days 4-5 score Medium to Low (35-65%) due to storm system uncertainty and large model spread. Days 6-7 score Medium (55%) as post-storm conditions become more predictable.\nForecast validity and update recommendations This forecast is valid as of January 20, 2026, 00Z initialization. Given the high uncertainty associated with the January 24-25 potential winter storm, the following update schedule is recommended:\nWednesday evening (Jan 22): Model convergence expected to improve; storm track confidence should increase\nThursday afternoon (Jan 23): Critical update as event enters HRRR range; precipitation type confidence improves\nFriday morning (Jan 24): Final pre-storm update; timing and accumulation guidance refined\nMonitor NWS Sterling (weather.gov/lwx) for official watches and warnings. Winter Storm Watch issuance is possible by Wednesday evening if models converge on a significant snow solution.\nGoogle Gemini Thinking Deep Research https://gemini.google.com/share/d4b6a12896f3\nMeteorological Research Report: Probabilistic Forecast and Model Analysis for Herndon, VA (20170) 1. Executive Intelligence Briefing 1.1 Synoptic Overview and Forecast Directive This research report serves as a comprehensive meteorological analysis and probabilistic forecast for Herndon, Virginia (ZIP Code 20170), covering the seven-day period from Monday, January 19, 2026, through Sunday, January 25, 2026. The atmosphere is currently undergoing a significant restructuring characterized by a high-amplitude meridional flow pattern across the Northern Hemisphere. This regime is driven by a destabilized stratospheric polar vortex and active interaction between the northern and southern branches of the jet stream, creating a volatile forecast environment for the Mid-Atlantic region.1\nThe forecast period commences with the passage of a sharp Arctic boundary on January 19, introducing the coldest airmass of the season to date. Following a transient period of moderation mid-week, attention shifts to a complex baroclinic leaf structure developing over the Southern Plains, which is projected to impact the Mid-Atlantic region over the upcoming weekend (January 24–25).1\nOur analysis synthesizes output from deterministic Global Numerical Weather Prediction (NWP) models, high-resolution convection-allowing models (CAMs), and emerging Artificial Intelligence (AI) forecasting systems. A critical finding of this research is the divergence between traditional physics-based models (specifically the GFS) and data-driven AI models (GraphCast, ECMWF AIFS) regarding the evolution of the weekend system. The AI guidance, supported by the ECMWF ensemble mean, suggests a more progressive and amplified solution, increasing the probability of measurable winter precipitation in Herndon compared to the suppressed solution offered by the operational GFS.1\n1.2 Key Forecast Highlights and Impact Drivers Immediate Arctic Intrusion (Jan 19–20): A strong cold air advection (CAA) regime is establishing itself behind a departing cold front. This will result in sub-freezing temperatures and dangerous wind chills, necessitating frostbite mitigation strategies for exposed populations.5\nGeomagnetic Storm Event (Jan 19): A G4-class geomagnetic storm is currently impacting Earth\u0026rsquo;s magnetosphere. Clear skies forecast for Monday night in Northern Virginia present a rare opportunity for auroral visibility at this latitude, a phenomenon with low probability but high public interest impact.7\nWeekend Winter Storm Threat (Jan 24–25): There is an escalating risk of a \u0026ldquo;Miller Type-B\u0026rdquo; cyclogenesis event. Current analysis favors a scenario where southern stream moisture overrides a cold boundary layer, leading to a potential wintry mix or snow event. The integration of AI-based guidance has shifted the precipitation axis northward, necessitating an increase in PoP (Probability of Precipitation) values for Herndon relative to climatological baselines.1\n2. Methodology and Model Performance Evaluation To produce a high-confidence forecast, we must first evaluate the tools at our disposal. The current era of meteorology is defined by the friction between traditional dynamic solvers and rapidly advancing machine learning architectures.\n2.1 Global Numerical Weather Prediction (NWP) Models NOAA Global Forecast System (GFS) v16 Architecture \u0026amp; Bias: The GFS is a hydrostatic, spectral model. While it remains a workhorse for global forecasting, recent verification statistics indicate a persistent \u0026ldquo;progressive bias\u0026rdquo; in the medium range, often moving systems too fast in zonal flow. However, paradoxically, in split-flow regimes like the current setup, the GFS frequently exhibits a \u0026ldquo;slow bias\u0026rdquo; regarding the ejection of cut-off lows from the Southwest U.S..1\nCurrent Performance (Jan 2026): In the lead-up to the January 24 system, the GFS deterministic runs (06Z and 12Z cycles on Jan 19) have been outliers. They depict the southern stream energy lingering near Baja California significantly longer than other guidance, preventing the necessary phasing with the northern stream to bring moisture into Virginia. This \u0026ldquo;shearing out\u0026rdquo; of energy results in a drier forecast for Herndon.1\nWeighting Strategy: Given the known bias in handling cut-off lows and its outlier status, the GFS deterministic output is assigned Low Weighting (15%) for the Day 5–7 period.\nECMWF Integrated Forecasting System (IFS) Architecture \u0026amp; Bias: The \u0026ldquo;Euro\u0026rdquo; operates with a semi-Lagrangian, semi-implicit dynamical core. It consistently ranks as the most accurate global model for synoptic-scale evolution, particularly in the Northern Hemisphere winter.9 It tends to have a slight cool bias in the boundary layer during transition seasons but excels at capturing non-linear interactions between jet streaks.\nCurrent Performance: The IFS has led the guidance in identifying the faster ejection of the southern disturbance. It suggests a loose phasing of energy over the Ohio Valley, which supports a coastal low development trajectory favorable for precipitation in the Mid-Atlantic.1\nWeighting Strategy: The IFS High-Resolution (HRES) and Ensemble (ENS) mean form the backbone of this forecast. High Weighting (45%).\nUKMET (UK Met Office Unified Model) Performance: The UKMET is a non-hydrostatic grid-point model. It is particularly useful for identifying \u0026ldquo;blocked\u0026rdquo; flow patterns. In the current analysis, the UKMET aligns closely with the ECMWF regarding the weekend system, reinforcing the credibility of the wetter/snowier solution.1\nWeighting Strategy: Used primarily as a verification check against the ECMWF. Medium Weighting (10%).\n2.2 Regional and Mesoscale Models NAM (North American Mesoscale) \u0026amp; HRRR (High-Resolution Rapid Refresh) Utility: These models are critical for the Day 1–3 period (Jan 19–21). The HRRR (3km resolution) is unmatched in resolving terrain-induced wind flows off the Blue Ridge Mountains, which will be a key factor in the wind gusts forecast for Monday night.9\nLimitations: The NAM often suffers from a \u0026ldquo;moist bias\u0026rdquo; in the boundary layer, potentially keeping low clouds/fog in the forecast too long. We have adjusted dewpoints downward for Tuesday (Jan 20) to account for this known bias during Arctic outbreaks.10\n2.3 AI and Machine Learning Models: The New Paradigm This forecast explicitly incorporates data from next-generation AI models, which have demonstrated a capability to outperform physics-based models in specific metrics, such as 500hPa geopotential height anomaly correlation.12\nGraphCast (Google DeepMind) Mechanism: GraphCast employs a Graph Neural Network (GNN) architecture trained on ERA5 reanalysis data. It treats the atmosphere as a complex mesh of nodes, allowing it to learn non-linear teleconnection patterns that dynamic models may struggle to resolve mathematically.4\nSignal Analysis: For the Jan 24–25 system, GraphCast has consistently signaled a coherent, progressive wave that tracks further north than the GFS. It identifies a heavy precipitation axis moving through the Tennessee Valley into the Mid-Atlantic, contradicting the suppressed GFS solution.1\nWeighting: Given its recent success in predicting rapid cyclogenesis events, GraphCast is weighted heavily for the precipitation timing and placement for the weekend storm. High Weighting (30% for Days 5–7).\nECMWF AIFS (Artificial Intelligence Forecasting System) Performance: The AIFS is ECMWF\u0026rsquo;s proprietary data-driven model. It closely mirrors the GraphCast solution for the upcoming week, reinforcing the signal for a wetter weekend in Herndon. WPC (Weather Prediction Center) has explicitly noted trending their official forecast toward these AI solutions due to their superior handling of the current jet stream interaction.1 3. Planetary Scale Analysis and Teleconnections Forecasting sensible weather in Herndon requires a deep understanding of the global atmospheric circulation. The current pattern is driven by specific teleconnection indices that favor cold air availability in the Eastern United States.\n3.1 Teleconnection Index Matrix IndexCurrent PhaseTrendImplications for Herndon, VAAO (Arctic Oscillation)NegativeSteadyA negative AO indicates high pressure over the Arctic cap, forcing the polar vortex southward. This is the primary driver for the sustained cold temperatures forecast for Jan 20 and Jan 25.2NAO (North Atlantic Oscillation)Negative/NeutralTrending NegativeA negative NAO corresponds to a blocking high over Greenland. This block acts as a \u0026ldquo;stop sign\u0026rdquo; for storms exiting the East Coast, potentially slowing down the weekend system and increasing precipitation duration.13MJO (Madden-Julian Oscillation)Phase 6 -\u0026gt; 7AmplifyingThe MJO is propagating into the Western Pacific (Phase 7). Historically, Phase 7 in January correlates strongly with troughing over the Eastern U.S. roughly 10-14 days later. The leading edge of this forcing is supporting the cold air replenishment late in the week.2PNA (Pacific-North American)PositiveWeakeningA positive PNA features a ridge over the Western U.S., which helps dig the trough in the East. As this weakens, the flow may become more zonal next week, but for this forecast period, it supports cold advection.13\n3.2 Stratospheric Coupling and Polar Vortex Analysis of the 10hPa geopotential height fields reveals a stretching of the stratospheric polar vortex. This elongation facilitates a \u0026ldquo;cross-polar flow,\u0026rdquo; effectively opening a corridor for Siberian airmasses to migrate across the pole and dump into North America. This airmass, characterized by extremely low theta-e (equivalent potential temperature) values, is the source region for the high pressure currently building into the Plains and heading for Virginia.2 The advection of this airmass is what ensures that precipitation type for the weekend remains a critical concern—cold air will be plentiful, but the battle will be against the warm nose intruding from the Atlantic.\n4. Comprehensive 7-Day Forecast Analysis Day 1: Monday, January 19, 2026 Dominant Pattern: Arctic Frontal Passage and Strong Cold Advection.\nSynoptic Setup: A potent shortwave trough is pivoting through the Northeast. At the surface, the Arctic front is clearing the region midday. Behind this boundary, isobars are packing tight, creating a significant pressure gradient force (PGF) over Northern Virginia.\nSensible Weather: The day is defined by falling temperatures and biting winds. While the high may technically reach the low 40s early in the day, temperatures will crash into the 20s by sunset. The airmass is exceptionally dry, with dewpoints falling into the single digits, effectively precluding any precipitation.\nHazard Analysis (Space Weather): A severe G4 Geomagnetic Storm is active. With clearing skies forecast for Monday night, conditions are optimal for viewing the Aurora Borealis. Residents in Herndon should look north towards the horizon, away from the light pollution of Dulles Airport and Tysons Corner, between 8:00 PM and 2:00 AM.7\nModel Consensus: High agreement on wind magnitude. HRRR soundings indicate 35-40 knot winds at the top of the mixed layer (925mb), supporting gusts to 30 mph at the surface.\nVariableForecast ValueProbability RangeConfidenceHigh Temp****41°F (falling late)40°F – 42°FHighLow Temp****16°F14°F – 18°FHighPrecipitation****0%HighWindNW 15–20 mphGusts 30 mphHighCloud Cover40% -\u0026gt; 0%Clear PMHigh\nDay 2: Tuesday, January 20, 2026 Dominant Pattern: The Deep Freeze / Arctic High Pressure.\nSynoptic Setup: A 1035mb high pressure center settles directly over the Ohio Valley, extending its influence eastward. The cold air advection weakens, but the airmass is now fully established.\nSensible Weather: This will likely be the coldest day of the week regarding maximum temperatures. Despite full insolation (sunshine), the low sun angle and the cold thermal profiles (850mb temps around -12°C) will struggle to lift surface temperatures out of the 20s.14\nRadiational Cooling: Tuesday night presents a prime radiational cooling setup. As the high moves overhead, winds will decouple (go calm). With clear skies and dry air, temperatures in the valleys around Herndon could plummet into the low teens.\nHazard Analysis: The risk of pipe bursts in poorly insulated infrastructure increases significantly. Pets should be brought indoors.\nVariableForecast ValueProbability RangeConfidenceHigh Temp****28°F26°F – 29°FHighLow Temp****15°F12°F – 18°FHighPrecipitation****0%0%HighWindW 8–13 mphDecreasingHighCloud Cover0–10%SunnyHigh\nDay 3: Wednesday, January 21, 2026 Dominant Pattern: Surface Ridge Departure and Return Flow.\nSynoptic Setup: The surface high shifts offshore. As the return flow around the backside of the high commences, winds turn southwesterly. This signals the start of a brief moderation trend.\nSensible Weather: Temperatures will recover into the upper 30s to near 40°F. The day will start sunny, but forecast soundings from the NAM indicate increasing moisture at the cirrus level (300mb) late in the day ahead of the next weak disturbance.5\nPrecipitation Risks: While some models hint at a \u0026ldquo;flurry\u0026rdquo; or \u0026ldquo;sprinkle\u0026rdquo; late Wednesday night associated with a weak warm air advection wing, the sub-cloud layer is extremely dry (dewpoint depressions \u0026gt; 15°C). Any precipitation falling from mid-decks will likely sublimate before reaching the ground (virga).\nVariableForecast ValueProbability RangeConfidenceHigh Temp****39°F37°F – 41°FMed-HighLow Temp****30°F28°F – 32°FMedPrecipitation****0%HighWindS 6–12 mphGusts 20 mphMedCloud Cover20% -\u0026gt; 60%Inc. CloudsHigh\nDay 4: Thursday, January 22, 2026 Dominant Pattern: Pre-Frontal Warm Sector and Cold Front Passage.\nSynoptic Setup: A low-pressure system tracks well to the north across the Great Lakes. Herndon enters the \u0026ldquo;warm sector\u0026rdquo; ahead of the trailing cold front.\nSensible Weather: This is the warmest day of the forecast period. Compressional warming ahead of the front, combined with southwesterly flow, should push temperatures near or slightly above 50°F.14\nFrontal Passage: The cold front is forecast to cross the region late Thursday. It is moisture-starved, as the Gulf of Mexico has not had time to open up effectively. Expect a wind shift from SW to NW and a rapid drop in temperatures Thursday night, but measurable precipitation is unlikely.\nUncertainty: The timing of the front determines the high temperature. A faster front (GFS) keeps highs in the 40s; a slower front (ECMWF) allows 50s. We favor the ECMWF consensus.\nVariableForecast ValueProbability RangeConfidenceHigh Temp****50°F46°F – 54°FMedLow Temp****23°F20°F – 25°FMed-HighPrecipitation****10%Trace possibleHighWindSW 10 -\u0026gt; NW 15Gusty PMHighCloud Cover60% -\u0026gt; 30%ClearingMed\nDay 5: Friday, January 23, 2026 Dominant Pattern: Cold Air Reinforcement / The \u0026ldquo;Setup\u0026rdquo; Day.\nSynoptic Setup: Following Thursday\u0026rsquo;s cold front, a fresh area of high pressure builds in from the Northern Plains. This feature is critical: its exact position will determine the supply of cold air (Cold Air Damming - CAD) available for the weekend storm.\nSensible Weather: Temperatures return to below-normal values, with highs likely confined to the 30s. It will be a dry, crisp day with increasing high clouds late as the weekend system organizes in the Southern Plains.\nModel signals: Both AI and dynamic models agree on dry conditions Friday, treating it as the calm before the potential storm.5\nVariableForecast ValueProbability RangeConfidenceHigh Temp****37°F34°F – 39°FHighLow Temp****22°F20°F – 25°FMedPrecipitation****0%0%HighWindNW 10 mphDecreasingMedCloud Cover30% -\u0026gt; 70%High CloudsMed\nDay 6: Saturday, January 24, 2026 Dominant Pattern: Complex Cyclogenesis / Miller Type-B Storm Threat.\nSynoptic Setup: This is the forecast period with the highest variance and impact potential. A southern stream shortwave ejects from the Plains and moves towards the Tennessee Valley. Simultaneously, northern stream energy dives into the Midwest.\nThe AI Signal: As detailed in the methodology, AI models (GraphCast, AIFS) strongly favor a \u0026ldquo;phased\u0026rdquo; solution where the northern stream captures the southern low, pulling the precipitation shield northward into the cold air over Virginia.1 This contradicts the operational GFS which keeps the system suppressed.\nPrecipitation Type: Thermal profiles are marginal but favor frozen precipitation at the onset. The \u0026ldquo;Miller B\u0026rdquo; transfer (energy jumping from the inland low to a new coastal low) typically locks in cold air (CAD) at the surface in the Piedmont. However, a \u0026ldquo;warm nose\u0026rdquo; aloft (850mb-700mb) often intrudes, suggesting a potential transition from Snow -\u0026gt; Sleet -\u0026gt; Rain -\u0026gt; Back to Snow.\nProbabilistic Outcome:\nMost Likely (55%): A period of accumulating snow/sleet transitioning to cold rain or mix.\nCold/Snowy Scenario (25%): Stronger CAD, track shifts east. Mostly snow event (4\u0026quot;+ possible).\nDry/Suppressed Scenario (20%): GFS wins, storm stays south.\nVariableForecast ValueProbability RangeConfidenceHigh Temp****33°F31°F – 36°FLowLow Temp****17°F15°F – 20°FMedPrecipitation55%LikelyMedPrecip Amount0.25\u0026quot; - 0.50\u0026quot;(Liquid Equiv)LowWindNE 10–15 mphGustyMedCloud Cover100%OvercastHighHazards****Winter Weather Advisory. Slick travel.Med-High\nDay 7: Sunday, January 25, 2026 Dominant Pattern: Storm Departure and Arctic Blast.\nSynoptic Setup: The coastal low deepens rapidly as it moves northeast away from the region. In its wake, the pressure gradient tightens severely between the departing bomb cyclone and the incoming Arctic high.\nSensible Weather: Precipitation should taper off early Sunday morning (possibly ending as snow flurries). The main story becomes the wind and the renewed cold.\nWind Chill: Strong NW winds (gusts 30-35 mph) combined with temperatures in the 20s will produce dangerous wind chills, likely dipping near or below zero Sunday night.\nPattern Evolution: This reinforces the \u0026ldquo;cross-polar\u0026rdquo; flow discussed in Section 3.2, locking in a cold pattern for the start of the following week.3\nVariableForecast ValueProbability RangeConfidenceHigh Temp****25°F22°F – 28°FMed-HighLow Temp****10°F6°F – 15°FMedPrecipitation****20%AM FlurriesMedWindNW 20–25 mphGusts 35 mphHighCloud Cover50% -\u0026gt; 10%ClearingMed\n5. Detailed Analysis of Major Precipitation Events: The Weekend Storm The potential winter storm forecast for Saturday, January 24, 2026, represents a classic \u0026ldquo;Miller Type-B\u0026rdquo; scenario, notorious for its forecasting difficulty in the Mid-Atlantic.\n5.1 The Miller Type-B Mechanism In this setup, a primary low-pressure system tracks west of the Appalachian Mountains (into the Ohio Valley). This primary low typically weakens/occludes as it runs into the mountains. Simultaneously, energy transfers to the coastline, spawning a secondary \u0026ldquo;coastal low\u0026rdquo; off the Carolinas or Virginia Capes.\nImplication for Herndon: The transfer period is critical. If the secondary low takes over quickly and deepens rapidly, it locks in the cold air (via northerly ageostrophic flow) and enhances precipitation rates (dynamic cooling). If the transfer is slow or the primary low remains dominant too long, warm air floods the region on southerly winds, turning precipitation to rain. 5.2 Model Disagreement and Resolution The \u0026ldquo;Suppressed\u0026rdquo; Camp (GFS): The GFS operational runs argue that the northern stream trough is too progressive and does not \u0026ldquo;dig\u0026rdquo; deep enough to capture the southern moisture. It shears the system apart, resulting in a \u0026ldquo;fish storm\u0026rdquo; that misses the coast or provides only light precipitation.1\nThe \u0026ldquo;Phased\u0026rdquo; Camp (AI \u0026amp; ECMWF): The AI models (GraphCast, AIFS) and the ECMWF ensemble argue for a sharper, more amplified northern stream trough. This trough captures the southern energy, pulling the coastal low closer to the shore and further north.\nForecaster Verdict: We are siding with the Phased/AI Solution. Verification metrics from the 2024–2025 winter show that AI models have superior skill in anticipating the phase speed of shortwave troughs in fast zonal flow.9 Therefore, the forecast reflects a high probability of precipitation and impactful winter weather, contradicting the drier GFS.\n5.3 P-Type Probabilities (Precipitation Type) Given the forecast thermal profiles (Sounding analysis from GEFS members):\nSnow: 40% Probability. Requires the coastal low to track inside the benchmark (40N/70W) but remain south of Herndon\u0026rsquo;s latitude to keep the cold air locked.\nMix (Snow/Sleet/Rain): 40% Probability. The most climatologically likely outcome for a Miller B. Warm air aloft intrudes, causing melting, while the surface remains below freezing (freezing rain/sleet) or above freezing (cold rain).\nRain: 20% Probability. If the primary low tracks too far north or the coastal low tracks inside the Chesapeake Bay.\n6. Key Uncertainties and Bust Potential Every forecast contains inherent uncertainty. For this period, the variance is concentrated in the weekend system.\n6.1 The \u0026ldquo;Dry Slot\u0026rdquo; Risk Even if the storm materializes as predicted by the AI models, there is a risk of a \u0026ldquo;dry slot\u0026rdquo; intrusion. Strong cyclogenesis often wraps dry air into the system\u0026rsquo;s center. If this dry slot passes over Northern Virginia during the period of maximum lift, precipitation could cut off abruptly, limiting snow totals to\n6.2 The \u0026ldquo;Warm Nose\u0026rdquo; Bust The boundary layer supply of cold air (the Arctic High on Friday) is transient. It is moving away as the storm approaches. This is not a classic \u0026ldquo;locked-in\u0026rdquo; Cold Air Damming event where a 1040mb high is anchored over New England. As such, the cold air is fragile. A shift in wind direction from North to Northeast could scour out the cold air faster than anticipated, turning a potential 4-6\u0026quot; snow event into a cold, miserable rain event.\n6.3 Timing Uncertainty AI models have shown a tendency to be slightly faster with system progression. The onset of precipitation could occur as early as Friday night (Jan 23) or be delayed until Saturday afternoon. This timing impacts accumulation efficiency; snow falling during the day in late January struggles to accumulate on paved surfaces due to solar insolation (even through clouds), whereas night-time snow accumulates efficiently.\n7. Technical Appendix: Data Integration and Weighting Matrix 7.1 Data Sources This forecast integrates data from:\n5 - 15: NWS Sterling Area Forecast Discussions (AFD).\n1: NOAA/WPC Model Diagnostic Discussions.\n4: Verification data for AI Models (GraphCast/AIFS).\n10: Point-specific MOS guidance for Herndon/Dulles.\n7: Space Weather Prediction Center (SWPC) alerts.\n7.2 Model Weighting Scheme To synthesize the \u0026ldquo;consensus\u0026rdquo; forecast, we applied the following dynamic weights:\nModelDay 1-3 WeightDay 4-7 WeightRationaleHRRR/NAM50%0%Unmatched resolution for terrain/wind (Day 1-2).NBM30%20%Good baseline, but smoothed out extremes.**ECMWF (IFS)**10%**45%**Best synoptic handling; verify well in medium range.**AI (GraphCast)**0%**30%**Superior handling of progressive wave phasing.GFS10%**5%**De-weighted due to known bias with cut-off lows.1\n7.3 Confidence Modifiers Wind Forecast: Confidence is High (90%). Momentum transfer algorithms in unstable post-frontal air are highly reliable.\nTemperature Forecast: Confidence is High (90%). The airmass source region (Siberia/Canada) is well-sampled.\nPrecipitation (Weekend): Confidence is Low-Medium (40-50%). The complex interaction between northern/southern streams results in high spread in QPF ensembles.\nFinal Forecaster Note: This forecast represents the most probable outcome based on a weighted multi-model consensus. The inclusion of AI guidance has significantly altered the outlook for the Jan 24–25 period compared to traditional NWS/GFS-only forecasts. Residents are advised to monitor updates as the mesoscale details of the weekend system resolve.\nOkay\u0026hellip;so we\u0026rsquo;ll see what happens!\n","permalink":"https://test.nicknow.net/what-the-snow-ai-chatbots-predicting-dc-weather/","summary":"\u003ch1 id=\"will-it-snow\"\u003eWill it snow?\u003c/h1\u003e\n\u003cp\u003eSo this is just a quick post on some fun I had this evening with three of the major AI chatbots: Claude, ChatGPT, and Gemini. I\u0026rsquo;m in the Northern Virginia area and there is a potential winter storm coming this weekend. It has been getting some wild forecast ranges, from maybe a dusting to the Apple Weather app currently showing ~20 inches. So lets just say no one really knows what is going to happen, which is basically true of every winter storm in the DC area.\u003c/p\u003e","title":"What the snow? AI Chatbots Predicting DC Weather!"},{"content":"History creates the illusion of predictability once outcomes are already known. Only after events converge do patterns become obvious, narratives become clean, and parallels feel inevitable. Before that point, history is far less useful than most executives, investors, and commentators would like to believe.\nIn theory, history can help us avoid repeating known failures. But even then, it only works when we extract constrained rules grounded in structural invariants - the underlying forces that actually shape outcomes, like capital availability, incentive alignment, and physical constraints. Everything else is pattern matching dressed up as wisdom. And this is problematic, because we often use that dressed-up wisdom to both constrain our choices (\u0026ldquo;history says that\u0026rsquo;s a bad idea\u0026rdquo;) and to make foolish choices (\u0026ldquo;when in history has this failed?\u0026rdquo;).\nNot Anti-History I wrote this section after I wrote and edited everything else here. But wanted to insert it closer to the beginning.\nJust for clarity, I\u0026rsquo;m not against learning history. To the contrary, it\u0026rsquo;s one of my favorite subjects. I took multiple semesters of history in college just for fun. I read books on history and love biographies. In no way would I discourage people from learning history, it is fascinating.\nBut, here is the thing. Overtime I\u0026rsquo;ve noticed a strong desire of people to use history to predict the future and it doesn\u0026rsquo;t seem to work. That hasn\u0026rsquo;t hurt my interest in history but it has opened my mind to the idea that perhaps history, as enjoyable as it is, isn\u0026rsquo;t really about defining the future. That maybe the whole \u0026ldquo;those who don\u0026rsquo;t learn history are doomed to repeat it\u0026rdquo; concept is wrong, that people are going to repeat history anyways - that their failure to take some set of historical facts into consideration is only obvious afterwards. My current model is that history is a really good way to learn about humans but it rarely translates forward as nicely as many people wish.\nSo back to the essay.\nWhy History Fails as a Predictive Tool History runs backward, not forward.\nWe observe outcomes, then work our way back to explanations that feel coherent and satisfying. Once a story is complete, it becomes very difficult to remember how uncertain, chaotic, or ambiguous the situation actually was while it was unfolding. Events feel obvious in hindsight, even when they were not.\nThis is where naive pattern matching takes hold. We see something that looks familiar and assume the same outcome will follow. Similar rhetoric. Similar behavior. Similar fear or confidence. These surface similarities feel predictive because humans are good at recognizing patterns. That does not make them causal.\nFor decision-makers, this is dangerous. Pattern matching feels disciplined, but it is usually unfalsifiable. When a prediction fails, there is no clear way to invalidate the historical lesson that produced it. The explanation simply shifts. Different timing. Different actors. Same \u0026ldquo;lesson.\u0026rdquo; That is not analysis; it is narrative maintenance.\nStructural Invariants vs. Surface Similarities The most common historical errors come from confusing surface similarities with structural invariants.\nSurface similarities are easy to spot: rising prices, political slogans, public fear or enthusiasm, media tone. These are soft signals. They are visually compelling but weakly predictive.\nStructural invariants are harder to see but actually determine outcomes: capital availability and cost, incentive alignment, time delays and feedback loops, physical and regulatory constraints, human limits around coordination and trust. These are the forces that shape what happens.\nHistory transfers forward through structure, not appearance. Yet we consistently reach for the visible patterns while ignoring the hidden machinery.\nWhat History Can Do Within Limits History has real value, but it is narrower than commonly assumed.\nHistory can help us deduce rules about how systems behave under specific conditions. Those rules only transfer forward if their underlying constraints still hold. Without clearly defined limits, historical lessons cannot be tested, challenged, or responsibly applied.\nIf a historical insight cannot be falsified, it is not a rule; it is a story.\nExtracting useful rules from history is difficult. It requires studying multiple instances, identifying what was structurally consistent across them, and explicitly defining the boundaries of applicability. Most historical analysis fails because it stops at recognition rather than moving on to constraint definition.\nThe harsh reality is that the conditions required for historical rules to apply are so narrow and hard to identify that in practice, most historical reasoning provides false confidence rather than genuine insight.\nTwo Examples of Unconstrained History The Maginot Line: Strategy by Analogy After World War I, France absorbed what seemed like a clear historical lesson: major war in Europe would again be slow, defensive, and attritional. Fortifications worked. Time favored the defender.\nThis was strategy by analogy - same adversary, same geography, same recent experience. Analogies feel smart because they\u0026rsquo;re grounded in experience. But they only work if you\u0026rsquo;ve defined their limits.\nFrance\u0026rsquo;s failure was not ignorance of history but misuse of it. They never asked: \u0026ldquo;What conditions made defensive warfare dominant in WWI?\u0026rdquo; A proper structural analysis would have identified the constraints: limited mobility, slow coordination, secondary air power. It would have asked: \u0026ldquo;Do these conditions still hold?\u0026rdquo;\nWhen mechanization, radio coordination, and combined-arms doctrine changed those constraints, the system exited the conditions under which the rule applied. The lesson didn\u0026rsquo;t fail because history was wrong. It failed because its limits were never articulated.\nThe Gold Standard: When Conditions Change Throughout the 19th century, the gold standard appeared to stabilize economies. After repeated financial crises, a consensus emerged: monetary discipline through fixed exchange rates maximized growth through stability. Inflation was the primary threat. Credibility mattered above all else.\nBut no one clearly defined why the gold standard worked, so they couldn\u0026rsquo;t recognize when the rule would no longer apply. The gold standard succeeded under specific conditions: limited capital mobility, slower economic transmission, smaller financial systems relative to GDP.\nBy the early 20th century, those conditions had fundamentally changed. Capital moved faster. Leverage was higher. Economic shocks transmitted instantly across borders. Policy response speed mattered more than signaling discipline.\nMaintaining gold convertibility under these new conditions amplified economic contraction rather than preventing it. Countries that abandoned the gold standard recovered faster from the Great Depression than those that clung to it. The historical rule hadn\u0026rsquo;t failed - the system had moved outside the boundaries where that rule applied.\nA Diagnostic Framework for Using History Responsibly If history is going to inform forward-looking decisions, it must be treated as a diagnostic tool, not a prophecy.\nWhat must be true for this historical outcome to occur? Identify necessary conditions, not visible symptoms.\nWhich conditions are hard constraints versus soft pressures? Separate what cannot be violated from what can adapt.\nAcross which dimensions does this rule apply? Economic, political, social, technological, temporal.\nWhere are the explicit boundaries of applicability? If you cannot say where the rule stops working, you do not understand it.\nWhat observable signals would indicate a breakout? Define how you would know the system has exited the valid range.\nIf the outcome differs, could this rule be invalidated? If failure does not falsify it, the rule was never real.\nMost historical lessons will not survive this process. That is the point. History is not science; it doesn\u0026rsquo;t lend itself to universal principles and laws. The rules we can extract from studying history are few and their application is limited by real constraints and boundaries.\nHistory as Discipline, Not Crutch New outcomes do not mean history was wrong. They mean conditions changed.\nHistory constrains behavior, not possibility. New combinations of incentives, technology, policy, and human behavior can produce results with no clean historical analog. Treating those outcomes as violations of history misses the structural shift underneath them.\nOver-reliance on history often blinds decision-makers to novelty. Familiarity feels safe. It rarely is.\nIn the future, nations will fall, economies will collapse, and industries will disappear - that is inevitable. When those things happen, smart people will write books finding comparisons to past events. But when they try to apply those comparisons to predict future situations without defining necessary conditions, hard constraints, or breakout ranges, their historical analysis becomes intelligent-sounding guessing.\nThe Real Lesson History deserves less reverence and more rigor.\nUsed properly, it helps identify constraints, understand failure modes, and avoid repeating known mistakes under similar conditions. Used poorly, it becomes narrative comfort mistaken for foresight.\nThe goal is not to predict the future by analogy. It is to recognize when historical rules apply, when they no longer do, and when something genuinely new is unfolding. Understanding structural constraints won\u0026rsquo;t tell you what will happen, but it can reveal what\u0026rsquo;s possible and what\u0026rsquo;s not within a given system.\nPerhaps the most valuable historical lesson is this: systems are more fragile and conditions more temporary than they appear. Plan for optionality not because the future is random, but because your ability to identify which historical constraints still apply is limited. Build resilience to multiple futures rather than betting on historical patterns repeating.\nThat may be unsatisfying if you want history to provide comfortable predictions. But recognizing the limits of historical reasoning - while still extracting what constrained insights we can - is far more valuable than false confidence in patterns that no longer apply.\n","permalink":"https://test.nicknow.net/history-does-not-predict-the-future/","summary":"\u003cp\u003eHistory creates the illusion of predictability once outcomes are already known. Only after events converge do patterns become obvious, narratives become clean, and parallels feel inevitable. Before that point, history is far less useful than most executives, investors, and commentators would like to believe.\u003c/p\u003e\n\u003cp\u003eIn theory, history can help us avoid repeating known failures. But even then, it only works when we extract constrained rules grounded in structural invariants - the underlying forces that actually shape outcomes, like capital availability, incentive alignment, and physical constraints. Everything else is pattern matching dressed up as wisdom. And this is problematic, because we often use that dressed-up wisdom to both constrain our choices (\u0026ldquo;history says that\u0026rsquo;s a bad idea\u0026rdquo;) and to make foolish choices (\u0026ldquo;when in history has this failed?\u0026rdquo;).\u003c/p\u003e","title":"History Does Not Predict the Future"},{"content":"I\u0026rsquo;m not a fan of traditional New Years Resolutions, as I wrote about here, but as we started 2026 I wanted to think even a bit more differently about the problem of improvement. First, I don\u0026rsquo;t think anyone can know what the future holds - and anyone saying they do know, is lying or delusional or both. And while there may be things that make sense to do now (and you should therefore do them) they won\u0026rsquo;t necessarily makes sense in six or eight months. So I don\u0026rsquo;t really think we should be building plans around the fact that it just happens to be January 1st any more than we should around March 8th or June 17th or August 22nd or any other random day. Further, I didn\u0026rsquo;t want to set a simple achievable goal because simple achievable goals don\u0026rsquo;t have staying power - they won\u0026rsquo;t usually be powering you years down the road. I wanted to create something that could be applicable forever (in theory) and wasn\u0026rsquo;t situation dependent, since I don\u0026rsquo;t know what the future holds.\nSo I was iterating on how to approach something that didn\u0026rsquo;t fail my test of timelessness and provided opportunity for growth. And decided to pull together a bunch of ideas I have picked up and developed over the years but have never prioritized or intentionally measured myself against. Doing this forces a reckoning. I choose 10 as my limit, just because, as my limit. Maybe I should have forced it down to 5, time will tell if 10 was too many - I\u0026rsquo;m certain it won\u0026rsquo;t be too few.\nI also decided they needed to be choices made to drive better quality outcomes. It\u0026rsquo;s easy to be aspirational in ideas but I wanted to express each as a counter to something, so I was being clear with myself of what I was trying to improve upon/from. Quality outcomes is a tricky idea in personal growth, but generally what I mean by it here is when deciding something will the life I live be better by one outcome over the other, and better (for me, at least) means: what I do is of higher quality, I do it with less stress (but not necessarily less effort), and it is beneficial to life goals. I get that it\u0026rsquo;s sort of soft, which gives me pause but I don\u0026rsquo;t think there is a hard answer without over-engineering it.\nSo my goal in developing this list is to create some set of limited choices to apply when living my daily life, and especially when making decisions (not even big ones, just normal day-to-day choices) that I think should lead me to higher performance (i.e., quality outcomes.) Will it work? I don\u0026rsquo;t know, but I think it\u0026rsquo;s worth a try and it gives me something to regularly reflect back on.\nAnd reflecting back is a challenge, because frequently we don\u0026rsquo;t have anything to measure ourselves against. We ask \u0026ldquo;how are we doing\u0026rdquo; but there is no real answer because there is answer to \u0026ldquo;compared to what?\u0026rdquo; So throughout 2026, I\u0026rsquo;ll be asking myself \u0026ldquo;did I make good choices this day/week/month based on these concepts and do I see my outcomes over that time as helping or hindering my life goals relative to the last period?\u0026rdquo; I\u0026rsquo;m not 100% sure this will work as well as I imagine/hope it will, but I\u0026rsquo;m willing to try. And I\u0026rsquo;ll adjust based on what I learn - but I will only do so explicitly (see # 10.)\nSo this is personal, I share it because it helps me hold myself accountable - I put it on the internet, I can\u0026rsquo;t really lie to myself about it - but also to let other borrow from it and build their own set of choices aligned to their life goals. And maybe one day I\u0026rsquo;ll write about how I think of life goals and why I think they are critical to a well-lived life.\nBe a realist, not an optimist or a pessimist. See the world as it is, account for constraints, and act from evidence rather than hope or fear. Optimists and pessimists both suffer from delusions that hold them back or lead to failures. Realists deal in facts and principles, not hopes and fears.\nPreserve optionality whenever possible. Prefer choices that keep future paths open over those that eliminate future options. Make choices and do stuff, but ensure your plans have alternatives that remain realistically viable. Or, go ahead and walk-through the door but don\u0026rsquo;t let it close behind you unless you have another path out - burning your ships might be bold, but it isn\u0026rsquo;t really smart.\nSeparate signal from noise deliberately. Reduce reactive information intake and prioritize primary sources and first-principles thinking. Reject analogical thinking, focus on raw facts/data and first-principles thinking.\nDesign systems instead of relying on willpower. Assume motivation will fail and build structures that work even when it does. Things without a documented structure, schedule, plan, etc. are sure to fail - our brains aren’t that good, sorry.\nWrite to think, not just to remember. Externalize ideas and decisions so they can be examined, tested, and improved. Write a LOT. Again, our brains aren’t that good, paper (or OneNote/Notion/Apple Notes/etc.) doesn’t forget.\nAssume incentives drive behavior. Interpret action, yours and others, through incentives rather than intent or moral framing. Want to change a behavior? Change the incentives.\nReduce complexity before increasing effort. Remove unnecessary decisions and friction before trying to work harder or faster. Complexity increases effort/stress while reducing quality, simple/minimal approaches gets better results with less stress.\nPlan for reality, not aspiration. Calendars/schedules that assume perfection produce inefficiency, stress, and shallow outcomes. Quality over quantity: Detailed planning with lots of slack maximizes quality results.\nSeek asymmetry over balance. Favor models, plans, and actions with limited downside and meaningful upside instead of evenness. Balance is almost always a bad thing in everything other than diet and exercise.\nUpdate beliefs explicitly, not implicitly. When evidence changes, state what changed and why rather than quietly drifting. Be intentionally open to the idea that you are wrong about everything so you can be fully open to changing when you learn new facts, and acknowledge (at least to yourself) that you have changed your mind and why.\n","permalink":"https://test.nicknow.net/10-choices-for-a-better-future-no-matter-what-happens/","summary":"\u003cp\u003eI\u0026rsquo;m not a fan of traditional New Years Resolutions, \u003ca href=\"https://nicknow.net/drop-the-new-years-resolution-try-the-january-resolution/\"\u003eas I wrote about here\u003c/a\u003e, but as we started 2026 I wanted to think even a bit more differently about the problem of improvement. First, I don\u0026rsquo;t think anyone can know what the future holds - and anyone saying they do know, is lying or delusional or both. And while there may be things that make sense to do now (and you should therefore do them) they won\u0026rsquo;t necessarily makes sense in six or eight months. So I don\u0026rsquo;t really think we should be building plans around the fact that it just happens to be January 1st any more than we should around March 8th or June 17th or August 22nd or any other random day. Further, I didn\u0026rsquo;t want to set a simple achievable goal because simple achievable goals don\u0026rsquo;t have staying power - they won\u0026rsquo;t usually be powering you years down the road. I wanted to create something that could be applicable forever (in theory) and wasn\u0026rsquo;t situation dependent, since I don\u0026rsquo;t know what the future holds.\u003c/p\u003e","title":"10 Choices for a Better Future No Matter What Happens"},{"content":"Why LLM\u0026rsquo;s will always make mistakes and we shouldn\u0026rsquo;t call them hallucinations\nI saw a tweet from Paul Graham a while back about how as LLMs become better their hallucinations will become more convincing. And it makes sense, a smart confident person saying something wrong often sounds more reliable than a less confident person saying the right thing timidly. Even more so, as you get good answers from the smart confident person you become more trustworthy and are less likely to question and double-check their future answers. That\u0026rsquo;s both a reality of and defect of human thinking.\nhttps://twitter.com/paulg/status/1944387890504519922\nBut it also got me thinking about why we are using the term hallucination. It\u0026rsquo;s basically a way of saying wrong without saying wrong. I believe words matter and common understanding of words is important when communicating. So while I get why an AI researcher might have wanted to differentiate between an LLM being \u0026ldquo;wrong\u0026rdquo; (2 + 2 = 5) versus \u0026ldquo;hallucinating\u0026rdquo; (\u0026ldquo;there are trees on the moon\u0026rdquo;) that differentiation is lost on most people, and fairly meaningless in actual use (both those answers are equally wrong, even if the wrongness comes from different mechanisms.)\nWe understand hallucination, in humans, as being something fabricated because of a brain issue. And medical professionals work to help the individual hallucinating stop hallucinating. We don\u0026rsquo;t think of hallucinations as making mistakes. If you\u0026rsquo;ve ever known someone having a hallucination you can usually tell. A person doesn\u0026rsquo;t usually randomly hallucinate a factual error while otherwise giving a coherent well-reasoned response. The average person hears \u0026ldquo;hallucinate\u0026rdquo; and has a very concrete idea of what that would look like, and AI LLMs making mistakes doesn\u0026rsquo;t look like a hallucination.\nBut we don\u0026rsquo;t expect any individual to be perfect. In fact, we expect humans to be imperfect, mistakes are part of the human experience. Humans are non-deterministic creatures that while predictable and generally reliable are also prone to making all types of mistakes. And when a person makes an error we don\u0026rsquo;t seriously say they hallucinated, we say they were wrong.\nWe\u0026rsquo;ve always had a weird relationship with machines. We want them to be consistent, logical, and predictable: that\u0026rsquo;s the whole point, right? People are messy and forgetful. Machines are supposed to be exact and reliable. For my whole life I\u0026rsquo;ve been saying well if you just program a computer to do it than you don\u0026rsquo;t have to rely on people messing it up. Computers can have bugs, but we fix the bugs and the problem goes away. Humans make mistakes, and we correct them but even the best human will continue to make mistakes at time (something about to err is human!)\nThis made total sense for decades. Computers ran the same program and got the same result every time. Ask a calculator for 2+2 and you\u0026rsquo;ll always get 4. Query a database for users named \u0026ldquo;Smith\u0026rdquo; and you\u0026rsquo;ll get the exact same list. A computer with the same programming on the same data gives you the same output every time, I\u0026rsquo;ve written a lot of software tests in my life - this is how it works.\nBut now what if that isn\u0026rsquo;t how it works? What if when you run the query the outputs may be inconsistent. What if you can\u0026rsquo;t reliably ensure it won\u0026rsquo;t get it wrong sometimes? This will mean that the way we need to understand computers and software will have to change. And a lot of people are and will have a a hard time dealing with it, and this will lead them to ask how do can we make this new paradigm look like the old paradigm.\nOf course, we can\u0026rsquo;t make the new look like the old. Large Language Models have pushed machines into completely new territory. They\u0026rsquo;re truly non-deterministic. They can give different answers to the same question. And this freaks people out. They don\u0026rsquo;t get it, and they definitely don\u0026rsquo;t trust it. But pretending as if this is a bug not a feature will take us down the wrong path.\nHere\u0026rsquo;s the thing: non-deterministic systems aren\u0026rsquo;t broken. They\u0026rsquo;re actually more like how humans think. But because we keep expecting machines to work like calculators, we see variability as a flaw instead of a feature. If we want to use LLMs well, we need to stop thinking about them the old way and accept that some inconsistency and errors are totally normal.\nNon-Deterministic Doesn\u0026rsquo;t Mean Random The biggest confusion? People think non-determinism equals randomness. \u0026ldquo;Why would a machine give me different answers? It must be broken.\u0026rdquo;\nWrong. Just because an LLM varies its responses doesn\u0026rsquo;t make it random, it makes it non-deterministic like a human brain.\nLLMs work by calculating probabilities for what outputs should come next, based on context. It\u0026rsquo;s actually highly structured. It\u0026rsquo;s driven by training data, prompt phrasing, temperature settings, and more. Like humans, they consider options and pick responses based on what\u0026rsquo;s likely, not what\u0026rsquo;s guaranteed.\nThis is statistical reasoning, not chaos. Ask a human an open question and you\u0026rsquo;ll get slightly different answers depending on their mood or what they\u0026rsquo;re thinking about. LLMs are basically the same deal.\nWe already accept this in other tech. Search results change based on your location or the time of day. Nobody panics. But when ChatGPT gives a slightly different answer? People lose their minds. Part of the problem is that LLMs present themselves as confident experts, not personalized search tools, so the variability feels wrong. They usually return a result - often a written narrative - not a list of potential options (although this can be guided by prompting), like a Google search. And humans are lazy, we didn\u0026rsquo;t want to search through a list of results and have to figure out the answer to our question, we just wanted the answer and if someone offers us one we\u0026rsquo;ll likely take it - especially if we don\u0026rsquo;t have a reason to distrust the source.\nThe Hallucination Problem and Why It\u0026rsquo;s a Terrible Name Everyone talks about LLM \u0026ldquo;hallucinations\u0026rdquo; - when the model confidently makes stuff up. People hate this because it feels fundamentally wrong: the machine isn\u0026rsquo;t just making an error, it\u0026rsquo;s creating plausible-sounding fiction.\nBut hold on. Humans do this constantly. We give wrong answers with total confidence. We misremember things. We mix up facts. But we don\u0026rsquo;t call it \u0026ldquo;hallucinating.\u0026rdquo; We just say someone was wrong.\nThe word \u0026ldquo;hallucination\u0026rdquo; is the problem. It makes LLM errors sound alien and bizarre when they\u0026rsquo;re actually doing exactly what any pattern-matching system does: occasionally connecting dots that shouldn\u0026rsquo;t be connected. You\u0026rsquo;ve done this, I\u0026rsquo;ve done this, we\u0026rsquo;ve all done this at time\u0026hellip;connected dots that resulted in a conclusion that was just plain wrong.\nBetter to think of LLMs as fallible assistants. Just like we plan for human error with double-checking and reviews, we should plan for LLM errors. When we hire people, we don\u0026rsquo;t expect perfection - we have processes for validation and oversight. We base those on the criticality of the work being done. Same principle applies here.\nExpectation Mismatch: Machines Aren\u0026rsquo;t Always Calculators The core issue? We\u0026rsquo;re stuck thinking machines should work like calculators - perfect, precise, repeatable. When a calculator gets math wrong, it\u0026rsquo;s broken. But LLMs aren\u0026rsquo;t calculators. They\u0026rsquo;re more like driven new employees: quick, helpful, usually right, but definitely not infallible. Anyone who has hired recent college grads will know they type, they can be incredibly helpful but they still need a lot of supervision, validation, and guidance.\nWe\u0026rsquo;re actually pretty good at accepting uncertainty in some areas. Nobody expects two doctors to give identical diagnoses. Weather forecasts change and we shrug. Poker involves luck (duh!) But when our AI assistant makes something up? Suddenly it\u0026rsquo;s a crisis.\nThe problem is framing. If people understood LLMs as probabilistic thinking tools instead of truth machines, the errors would feel normal. We haven\u0026rsquo;t taught users to interact with these systems like they would with a smart but imperfect human colleague, but this exactly how we should think about an LLM and how we should build systems that utilize any non-deterministic inputs.\nDesigning for Fallibility: Lessons from Human Systems Look at how we handle human decision-making in critical fields. We never assume people will be perfect. Instead we use:\nChecklists (pilots, surgeons)\nPeer review (scientists, researchers)\nApproval chains (business, government)\nAppeals and audits (courts)\nThese systems work because they assume humans will screw up sometimes while keeping things mostly reliable.\nSystems that will depend on AI need to take the same approach:\nVerification layers: Check LLM output against reliable sources\nHuman oversight: Keep humans in charge of final decisions\nSmart constraints: Control when and how LLMs can answer\nHonest warnings: Tell users when the AI might be guessing\nOnce you accept LLMs are probabilistic, the goal changes. We should stop trying to force perfect accuracy because no matter how much we reduce errors we are never going to get to zero. Thus, we must be building robust processes around naturally imperfect reasoning tools.\nMoving Forward: Adapting Our Thinking We need to change how we talk about LLMs. The current obsession with \u0026ldquo;hallucinations\u0026rdquo; and errors misses the point: we\u0026rsquo;re using non-deterministic reasoning systems in a world built for deterministic machines. That\u0026rsquo;s why people are confused and skeptical.\nWhen you understand what LLMs actually are, they become incredibly useful—not because they\u0026rsquo;re perfect, but because they\u0026rsquo;re flexible, creative, and fast. The trick is setting proper expectations, building in verification, and staying within their limits.\nWe don\u0026rsquo;t demand perfection from humans. We can\u0026rsquo;t expect it from LLMs. What we need to accept is predictable imperfection, and then build our systems accordingly.\nThe bottom line: LLMs making mistakes isn\u0026rsquo;t the problem. Pretending they won\u0026rsquo;t is.\nSo I finish with this: once we accept fallibility as part of complex reasoning - not a bug to be fixed - we\u0026rsquo;ll use these tools much more effectively. Just like we\u0026rsquo;ve learned to work with flawed but brilliant (and not so brilliant) humans. And this means we are going to have to teach, coach, train, and develop people on how to think about computers that don\u0026rsquo;t always give the same answer to the same question.\n*This is cross-posted at *https://www.linkedin.com/pulse/human-blind-spot-around-non-deterministic-machines-nicolas-nowinski-sp1le.\n","permalink":"https://test.nicknow.net/humans-hallucinations-and-ai-llm-non-deterministic-machines/","summary":"\u003cp\u003eWhy LLM\u0026rsquo;s will always make mistakes and we shouldn\u0026rsquo;t call them hallucinations\u003c/p\u003e\n\u003cp\u003eI saw a tweet from Paul Graham a while back about how as LLMs become better their hallucinations will become more convincing. And it makes sense, a smart confident person saying something wrong often sounds more reliable than a less confident person saying the right thing timidly. Even more so, as you get good answers from the smart confident person you become more trustworthy and are less likely to question and double-check their future answers. That\u0026rsquo;s both a reality of and defect of human thinking.\u003c/p\u003e","title":"The Human Blind Spot Around Non-Deterministic Machines"},{"content":"I’ve been using GitHub Copilot, Claude, and ChatGPT to help me code for a couple of years now. But AI has always been in the assistant role – I was the one in the driver’s seat, asking technical questions or letting GitHub Copilot generate sections of code based on what I was writing. It makes you a more productive developer because it’s faster than Googling, but at the end of the day, I was still the one fundamentally coding, just with better tooling.\nMy real interest, however, has always been getting others to code for me. Not because I can’t code or I’m lazy but because coding takes time – it’s a gap between “knowing what needs to be built” and “having it built.” Hence why I always have found platforms (Microsoft Power Platform, Salesforce, etc.) so interesting. It’s why scaffolding sites and code generation from a data model always interested me. Anything that reduced the time it took from when someone wrote down what to do and there was a system doing it excites me.\nThis is what a lot of “consultants” are doing. Understanding requirements and writing out specifications for developers who often have limited knowledge of the domain they are building for. If you have good developers, it works okay; if not, it’s frustrating. But this is how most software gets built today.\nThe problem is the inevitable back-and-forth – it’s time-consuming and suffers from all the usual communication challenges. It’s often less efficient than doing it yourself. The mythical man-month principle still holds: nine women can’t make a baby in one month.\nThat’s why I’ve been really interested in products like Cursor.AI, Bolt.new, and CLINE for VS Code. The idea of giving natural language prompts to an LLM and receiving working software in return sounds too good to be true. I didn’t really believe it could work.\nI was waiting for the right project to try it out. One Saturday morning, we were playing a word card game that my (just-turned) five-year-old daughter, Emilia, received for Christmas. She really enjoyed it, and it was educational. I thought it would be fun to create something similar for her to play on her own.\nAnd here we come to the classic problem. I could code the logic – no problem. It would be a fun Saturday night project, and I figured I could knock it out in a couple of hours. The logic wasn’t complicated. But I’m not deeply experienced in building interactive HTML pages. I don’t have all the CSS memorized. My UI experience is mostly in boring business applications. I knew I could figure it out, but that would turn it from a two-hour project into an all-day event.\nThis seemed like the perfect opportunity to try AI-driven development – using agentic AI to build complete solutions.\nThe BLUF: It Worked.\nAnd it worked so well that in the same evening, I built two more games. Since then, I’ve added a fourth. That success has pushed me deeper into prompting AI to build applications. CLINE’s ability to utilize the terminal means it can run commands and process output, allowing it to scaffold and build projects on its own.\nI’ve since taken it further, having it create an ASP.NET Core API solution with a React frontend, set up persistence (for both development and production), create deployment scripts, document the solution, write tests, and generate API endpoints to validate functionality. And it worked. I also had it build a working mobile application using the Ionic framework – I’ve tested it successfully on Android, though I haven’t gotten around to copying it to a Mac to build for iOS. But I’m confident it will work fine or require only minor tweaks. I’ve also been experimenting with using ChatGPT and other LLMs to generate the prompts for these types of applications – I’m not an iOS/Android developer, I don’t know all the nuances to account for in a prompt but the LLMs are great at figuring it out.\nThis is going to fundamentally change how organizations operate. So much of how organizations operate is driven by what can and cannot be automated and where organizations must adopt their process to available tooling because custom tools are not financially justifiable. I’m more focused in this post on my experience building, but I think there is a lot of to think through here from an impact perspective – and I think most of the thinking at the enterprise level on this is way behind the curve.\nThe Bigger Picture\nThis is going to fundamentally change how organizations operate. So much of organizational decision-making is based on what can and cannot be automated. Companies often adapt their processes to available tooling because custom solutions aren’t financially justifiable.\nI’ve focused here on my hands-on experience, but there’s a lot to unpack from a business and strategic perspective. And right now, I think most enterprise-level thinking on this is way behind the curve.\nBtw, these games may seem trivial. And they are. As far as software goes. The applications we build in enterprises are orders of magnitude larger and more complicated. But it doesn’t matter because the time savings is real. And the time to build applications go up as they become more complicated because there are more moving parts to keep track of and test in an integrated manner. But in just this trivial use case we are talking about a 90% reduction in effort (2 hours to 10 minutes.) And that was with really poor prompting, I can only imagine how much better this stuff would get with better quality prompts.\nSo my message to every one - CIOs, developers, business unit leaders, etc. - is that this is real. It is going to completely change how we think about building and deploying capabilities. Many existing investments will be turned on their head. And anyone trying to hang on to the past and previous investments is setting their organization up for failure. If you don\u0026rsquo;t have people in your organization working on this today, figuring out how you\u0026rsquo;ll go faster and faster using this technology you already have a problem.\nHow I Actually Built What I Built\nSo now, here my experience building this little game and how I prompted Anthropic using CLINE/VS Code:\nFor reference, I used VS Code with the CLINE extension. I have an account with Anthropic that I bought tokens through. It’s a bit hard for me to get an exact number but it was less than $3 in Claude consumption to create this application.\nAt first, I was going to write up the JavaScript logic and then just ask it to build a UI based on a set of method calls. See if it could just take natural language, not visual, prompting to build a UI against defined logic. But I decided I should just try having it build everything, why should I spend 2 hours coding if I didn’t need to (okay, well I like coding but that’s another matter.)\nI wrote up what I wanted the application to do and it built everything - essentially reducing coding time to a matter of minutes (during which I was just waiting.) Even an experienced and good frontend dev would have still had to think through the problem and solution and then write the code, so at least an hour of work. Then you have revisions, which I could do at my leisure rather than be tied to a developer. Not to mention, any issues they found with my logic while building the frontend causing more time to be consumed.\nIt wouldn\u0026rsquo;t work if you didn\u0026rsquo;t know anything about software development, you would get lost and not be able to work with the tooling to get to the desired outcome. And once I had the basic game working I did spend another hour or so having it add additional capabilities (sound effects, high score tracking), but I did that at 10 pm with a few beers and got near instant feedback on my requests.\nSo this was the requirement I gave it to start with:\nIn phonics (and phonological awareness), we often talk about a syllable as having two parts: the onset (the initial consonant or consonant cluster) and the rime (the vowel and everything after it). In the word cat:\nOnset = c\nRime = at\nSo, the “at” portion of “cat” is called the rime. By changing the onset (for example, from c to p), you get pat—different word, same rime.\nWe are creating an online learning game for kids based on the above concept.\nThere will be two decks of cards, the Onsets and the Rimes, where the Onsets are always a single consonant letter.\nTo play the game the player is dealt three onset cards face up.\nTo start a round the user clicks the “Go” button. They are then dealt a single Rime card face up. The object is to match one of your Onsets with the Rime card to create a valid English word: Onset + Rime = Valid Word. If there is no valid match they click “No Match”. They have 10 seconds to complete the round. If they don’t finish in 10 seconds the round is over and they get 0 points.\nWhen the user clicks on “No Match” or one of their Onset cards the application should check their result. If they selected an Onset card then check if the Onset + Rime = Valid Word, if it doesn’t they lose the round and get 0 points. If they selected “No Match” the application should validate no valid word exists based on the available Onset cards and the Rime card, if a valid word exists they get 0 points.\nIf they were successful they get a point for each second that was left from the 10 second count down.\nAfter 10 rounds the game is over. Display the total score and allow the user to start over.\nAnd that got me this game: Onset-Rime Word Game. And that was all I gave it. No screen mockup or anything. It didn\u0026rsquo;t have a very good list of rimes and words, so I had ChatGPT create a much larger list and provide it to me in JavaScript array format that I then just plugged in. Btw, I also had ChatGPT write the top part of that requirement.\nGetting started I didn’t have a really good way of explaining the word breakdown. So I asked ChatGPT o1 to help me with this prompt:\nIn the word \u0026ldquo;cat\u0026rdquo;, what is the \u0026ldquo;at\u0026rdquo; part of the word called? For example, I can replace \u0026ldquo;c\u0026rdquo; with \u0026ldquo;p\u0026rdquo; and have the word \u0026ldquo;pat\u0026rdquo;. How would we describe this in terms of parts of words?\nOnce it gave me the answer (which is in the prompt above) I gave it the following prompt:\nGreat. I have the following list of onset\u0026rsquo;s: [\u0026lsquo;B\u0026rsquo;, \u0026lsquo;C\u0026rsquo;, \u0026lsquo;D\u0026rsquo;, \u0026lsquo;F\u0026rsquo;, \u0026lsquo;G\u0026rsquo;, \u0026lsquo;H\u0026rsquo;, \u0026lsquo;J\u0026rsquo;, \u0026lsquo;K\u0026rsquo;, \u0026lsquo;L\u0026rsquo;, \u0026lsquo;M\u0026rsquo;, \u0026lsquo;N\u0026rsquo;, \u0026lsquo;P\u0026rsquo;, \u0026lsquo;Q\u0026rsquo;, \u0026lsquo;R\u0026rsquo;, \u0026lsquo;S\u0026rsquo;, \u0026lsquo;T\u0026rsquo;, \u0026lsquo;V\u0026rsquo;, \u0026lsquo;W\u0026rsquo;, \u0026lsquo;X\u0026rsquo;, \u0026lsquo;Y\u0026rsquo;, \u0026lsquo;Z\u0026rsquo;] I need you to generate two lists in JavaScript array format. A list of of 2-3 letter rimes and a list of all valid English words that can be generated using the list of onsets provided and the list of rimes you provide.\nBut I wasn’t super happy with it’s response. It basically was over-reasoning, making assumptions that weren’t necessary. Basically the overambitious junior person. So I gave it another prompt and that got me the lists that are in the app today:\nI need significantly more rines and valid words. Use both 2-letter and 3-letter rines. Aim for at least 500 valid english non-slang words. Do not attempt to limit the word list arbitrarily.\nAnd so I have a fully working game that I dropped onto my website. I spent a few dollars making it. It also had a massive productivity benefit, I never had to get into a flow state. If I want to code something significant I need to be in flow state and interrupts become the enemy of my productivity. And external interruption to one’s flow state can derail a developer for an hour or more. But I wasn’t coding. I didn’t need to keep track of a bunch of different objects, their purposes, names, methods, etc.\nBut then I wanted to create another game (I feel this could become an addiction, but a healthy one.) This was one to help master sight words. I had built one for phonics, so why not.\nSo the first thing I needed was a list of sight words and I needed them to be spoken:\nSo off to ChatGPT o1:\nI need to generate a list of 300 sight words.\nThat worked great. But I need to figure out how to get them into sound files:\nThe list of 300 is perfect. I need a sound file of the word being pronounced. What would be the best way to get an individual MP3 file of each word being pronounced?\nI got suggestions to use AWS (or Google or Azure) along with a Python script to call the service and save an MP3 locally. But I also got a recommendation to use gTTS which is a Python text to speech package and a script to run to create the MP3s. I took the gTTS path because it was the easiest and the files were good enough, I’m sure a cloud service could produce higher quality files.\nFinally, I had ChatGPT convert the list of words to a Python array (which, I also used as a JavaScript array in the app.)\nSo now I had a list of words and sounds files so I went back to VS Code and gave CLINE the following task:\nWe will be creating a sight word game. It should have a similar UI/UX to wordgame.html and mathgame.html. The game will be in the file sightwords.html. It will be called “Our Sight Words”.\nThere is no timer for this game. There are no difficulty levels.\nIt is played in rounds of 10.\nFor each round the app will randomly select a sight word from an array of words. Each word has a corresponding mp3 sound file of the same name in the sightwordmp3s directory. For example, the word “the” would use the file named “the.mp3”.\nThere is a large speaker icon for the user to press to hear the word. The user presses this button to play the sound.\nBelow the icon are four buttons each with a sight word in it. One is the correct word and the other two are randomly selected.\nThe user can press the speaker to play the sound as many times as they wish. The sound will play once automatically at the start of each round. The user gets 3 guesses to get the word. If the user selects an incorrect answer that answer is locked out for the rest of the round.\nIf they get the correct answer on their first guess they get 5 points, on their second guess 3 points, and on their third guess 1 point.\nIn between I had created another game of math problems (hence the reference to mathgame.html and difficulty levels in the task prompt.)\nAfter it created the game I did have some back and forth to get the button experience to be what I wanted.\nThe resulting game: https://nicknow.net/games/games/sightwords.html\nOne of the coolest experiences I had was on the Math Game I created (https://nicknow.net/games/games/mathgame.html). When I originally prompted for it I only had a Level slider. After watching my kid play with it I realized I needed the timer to be variable because she needed more time for anything but the most basic addition problems (she isn’t even in Kindergarten yet, so timed math tests are not her experience.)\nWhen I prompted it to add the time limit slider it did it correctly but it didn’t work right. The problem was it was using a ‘range’ control with min of 10, a max of 60, and a step of 10. So it would let you select 40 and 50, which wasn’t part of the requirement I gave it. I had told it the options were 10, 20, 30, and 60. But it was struggling with how to update it and after several tries it didn’t seem to figure out how to make it work correctly.\nSo I played senior dev. I looked at the code and realized that the time limit slider needed to work the same as the level slider: range of 1 to 4 with a step of 1 which is then mapped to a time limit. I prompted it by telling it to look at it this way, and with that simple instruction it figured it out and got it working.\n","permalink":"https://test.nicknow.net/ai-driven-development-is-the-future/","summary":"\u003cp\u003eI’ve been using GitHub Copilot, Claude, and ChatGPT to help me code for a couple of years now. But AI has always been in the assistant role – I was the one in the driver’s seat, asking technical questions or letting GitHub Copilot generate sections of code based on what I was writing. It makes you a more productive developer because it’s faster than Googling, but at the end of the day, I was still the one fundamentally coding, just with better tooling.\u003c/p\u003e","title":"Building a Simple Game or Why AI is the Future of Software Development"},{"content":"First things first\u0026hellip;YamlDotNet is a great library and I\u0026rsquo;m thankful it exists and is so well maintained.\nAlso, this is just how I figured out a solution to my requirement. I\u0026rsquo;m fully open to and would welcome suggestions on a simpler way to do this.\nI was recently trying to find a way to do some configuration definitions in as clean a manner as possible. Generally, I\u0026rsquo;m not a fan of YAML and agree with many of the complaints about YAML. But YAML is probably the most plain english and clutter free model for defining a configuration. XML and JSON are much preferred - in my developer brain - but JSON is harder to write by hand and XML seems to have fallen out of favor. (Personal note: I still have a love for XML and XML Schema.)\nOkay, so I wanted to be able to read and write YAML from a .NET application. Thus, I turned to YamlDotNet. YDN is a great library that is continually updated and does a great job handling a complex specification. So, while it\u0026rsquo;s not perfect, I haven\u0026rsquo;t seen anyone do a better job and it does a really good job.\nBut I quickly ran into a problem. One of the requirements I had was the ability to have a list of different types in a YAML document that would load into a C# list as class objects that implement an interface, i.e., List\u0026lt;IConcept\u0026gt;. Following this type of code pattern:\npublic class Root { public List\u0026lt;IConcept\u0026gt; Concepts {get; set;} } public interface IConcept {} public class Concept1 : IConcept { public string Name {get; set;} public List\u0026lt;IConcept\u0026gt; InnerConcepts {get; set;} } public class Concept2 : IConcept { public string Descriptions { get; set; } public int? Value { get; set; } public IConcept SingleConcept {get; set;} } public class Concept3 : IConcept { public string Descriptions { get; set; } public int Value { get; set; } public ConceptDetails Details {get; set;} } public class ConceptDetails { public string Detail {get; set;} public int? Rating {get; set;} } And I very much wanted my YAML documents to look like this:\nConcepts: - Concept1: Name: ConceptOne InnerConcepts: \u0026amp;ic0001 - Concept2: Descriptions: Ow wow too much... Value: 92 - Concept2: Descriptions: This is getting too big Value: 343 - Concept1: Name: Building stuff deeper and deeper - Concept2: Descriptions: A description of Concept Two Value: 42 SingleConcept: Concept2: Descriptions: Deep Descriptions Value: 2432 - Concept1: Name: Another Concept One InnerConcepts: *ic0001 - Concept2: Descriptions: Another description for Concept Two Value: 99 - Concept3: Descriptions: description for Concept Three Value: 867 Details: Detail: Some special details Rating: 874 The above YAML will deserialize without issue to a Dictionary model using YamlDotNet.\nvar obj = (new Deserializer()).Deserialize\u0026lt;object\u0026gt;(yamlDocument) But YamlDotNet won\u0026rsquo;t deserialize to the Root object graph because it can\u0026rsquo;t create an instance of an interface.\nvar root = (new Deserializer()).Deserialize\u0026lt;Root\u0026gt;(yamlDocument); This line will throw an exception: Cannot dynamically create an instance of type \u0026lsquo;IConcept\u0026rsquo;. Reason: Cannot create an instance of an interface.\nIn order to successfully deserialize YDN needs to know the class to use for each item in the list. The YamlDotNet wiki describes a couple ways to do this with type discriminators. While both of these work they didn\u0026rsquo;t meet the requirements I had for my YAML document model.\nI also found that I could do this by turning items into tags:\n- !Concept2 Descriptions: Another description for Concept Two Value: 99 But I didn\u0026rsquo;t want to use tags, if I could avoid them, because it wasn\u0026rsquo;t the experience I wanted and would make the documents functionally different if in the future they were to be deserialized without the object graph. Mostly it was that I wanted the documents to be as natural to write, as possible, and tags introduced a complexity, that however minor, I was hoping to avoid.\nThrough a lot of web searches and a bunch of suggestions from ChatGPT and GitHub Copilot, I eventually landed on a working solution.\nI will present my solution in pieces related specifically to the demonstration model I used for this article. Then I will present it as a generic model using a mapper object that to avoid hard coding interfaces and classes within the core code.\nWe need to create a deserializer to specifically handle any item mapped to the IConcept interface. If it isn\u0026rsquo;t expecting an IConcept interface than we let the default deserializer handle the item (last line in the Deserialize method. For IConcept items we determine the class from the scalar value. Then we pass the class to the object deserializer for regular deserialization. If we can\u0026rsquo;t match we throw an exception. ChatGPT and I went back and forth several times figuring out this code and getting it to a working form.\npublic class PolymorphicConceptDeserializer : YamlDotNet.Serialization.INodeDeserializer { private readonly INodeDeserializer _innerDeserializer; public PolymorphicConceptDeserializer(INodeDeserializer innerDeserializer) { _innerDeserializer = innerDeserializer; } public bool Deserialize( IParser reader, Type expectedType, Func\u0026lt;IParser, Type, object\u0026gt; nestedObjectDeserializer, out object value, ObjectDeserializer rootDeserializer) { // Check if we are deserializing an IConcept type if (expectedType == typeof(IConcept)) { var current = reader.Current as MappingStart; if (current != null) { // Read the key (e.g., Concept1, Concept2) reader.MoveNext(); var scalar = reader.Current as Scalar; if (scalar != null) { Type concreteType = scalar.Value switch { \u0026#34;Concept1\u0026#34; =\u0026gt; typeof(Concept1), \u0026#34;Concept2\u0026#34; =\u0026gt; typeof(Concept2), _ =\u0026gt; throw new InvalidOperationException($\u0026#34;Unknown concept type \u0026#39;{scalar.Value}\u0026#39;\u0026#34;) }; // Move to the object value reader.MoveNext(); value = nestedObjectDeserializer(reader, concreteType); reader.MoveNext(); // Move past the end of the mapping node return true; } } } // If it isn\u0026#39;t an IConcept type then use the default deserializer return _innerDeserializer.Deserialize(reader, expectedType, nestedObjectDeserializer, out value, rootDeserializer); } } As you can see, we are using the scalar value from the list items to map to the class. For my purposes, as you\u0026rsquo;ll see in the complete solution, I\u0026rsquo;m happy to live with class names having to match with values in my YAML document, but you could build an additional mapping/translation layer in to drive off of class attributes or another source/transformation rule.\nTo use this class we have to tell YamlDotNet about it. We do this by building a deserializer object and then calling the Deserialize method.\nvar deserializer = new DeserializerBuilder() .WithNodeDeserializer(inner =\u0026gt; new PolymorphicConceptDeserializer(inner), syntax =\u0026gt; syntax.InsteadOf\u0026lt;ObjectNodeDeserializer\u0026gt;()) .Build(); var root = deserializer.Deserialize\u0026lt;Root\u0026gt;(yamlDocument); The result will be an object graph. If you are working in LinqPad you can visualize it by calling root.Dump():\nConfigName: TestConfiguration Version: 1 Tables: - Table1 - Table2 - Table3 Concepts: - Concept2: Descriptions: A description of Concept Two Value: 42 - Concept1: Name: Another Concept One - Concept2: Descriptions: Another description for Concept Two Value: 99 Now we can successfully deserialize but I also wanted to be able to serialize a Root object. My goal was to support full round trips (YAML doc to object graph back to valid YAML doc.) If we execute var rootDoc = (new Serializer()).Serialize(root); we\u0026rsquo;ll get a YAML document without the scalar values to indicate the class. This does not meet the requirement for our YAML document and won\u0026rsquo;t allow the serialized document to be deserialized, thus failing to meet the round trip goal.\nConfigName: TestConfiguration Version: 1 Tables: - Table1 - Table2 - Table3 Concepts: - Descriptions: A description of Concept Two Value: 42 - Name: Another Concept One - Descriptions: Another description for Concept Two Value: 99 This makes sense, we had to provide a handler to meet our deserialization requirement so we shouldn\u0026rsquo;t expect YamlDotNet to meet our serialization requirement without a handler.\nTo get the serialization to work, as desired, we have to implement a custom type converter, IYamlTypeConverter, to handle serializing the object as its class, otherwise it\u0026rsquo;s just serialized as properties on an object. I want to give credit to two Stackoverflow answers for getting me to the solution: https://stackoverflow.com/questions/64242023/yamldotnet-custom-serialization and https://stackoverflow.com/questions/78211029/.\nThere are three methods for a type converter but only two are relevant to our solution. The Accept method tells YamlDotNet\u0026rsquo;s serializer/deserializer process whether this converter will handle a particular type. In our case we will handle types that implement the IConcept interface and the WriteYaml will handle the serialization for those objects. The ReadYaml isn\u0026rsquo;t used, although I do wonder if it could do what I\u0026rsquo;m doing in the INodeDeserializer implementation (left to be wondered about some other day), so we simply pass along to the root deserializer. I do wonder if I should throw a NotImplemented exception here. It doesn\u0026rsquo;t matter to me because I only register this on a SerializerBuilder so it won\u0026rsquo;t be called for deserialization processes (until I or someone forgets and registers it wrong!)\npublic sealed class PolymorphicConceptConverter : IYamlTypeConverter { //Credit where credit is due: //\thttps://stackoverflow.com/questions/64242023/yamldotnet-custom-serialization //\tand https://stackoverflow.com/questions/78211029/convert-list-to-objects-with-custom-names-in-yamldotnet //These two Stackoverflow posts got me to this solution. // Unfortunately the API does not provide those in the ReadYaml and WriteYaml // methods, so we are forced to set them after creation. public IValueSerializer ValueSerializer { get; set; } public IValueDeserializer ValueDeserializer { get; set; } public bool Accepts(Type type)=\u0026gt; typeof(IConcept).IsAssignableFrom(type); public object ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) { return rootDeserializer(typeof(IConcept)); } public void WriteYaml(IEmitter emitter, object value, Type type, ObjectSerializer serializer) { emitter.Emit(new MappingStart()); var component = value; var otherPropertisMap = type .GetProperties() .ToDictionary(p =\u0026gt; p.Name, p =\u0026gt; p.GetValue(component)); ValueSerializer.SerializeValue(emitter, type.Name, typeof(string)); ValueSerializer.SerializeValue(emitter, otherPropertisMap, typeof(Dictionary\u0026lt;string, object\u0026gt;)); emitter.Emit(new MappingEnd());\t} } Our method starts and ends with calls to MappingStart() and MappingEnd(). These tell the emitter that we are starting a new YAML object and that we done with that YAML object, it\u0026rsquo;s how the emitter knows that whatever comes before and after what we emit is part of a different object.\nTo serialize supported classes we use the type to get a list of properties and then build a dictionary of the property names and their values from the object. Note, that this doesn\u0026rsquo;t respect YamlDotNet code attributes - if you need that you would need to implement it.\nThe first value we serialize is the name of the class, type.Name. This is what writes Concept1 as the list\u0026rsquo;s value.\nThen we pass this dictionary to the value serializer to be written to the YAML document. We have to do this as a dictionary as if we pass the object itself to the value serializer we\u0026rsquo;ll create a stackoverflow exception as the WriteYaml method would be called recursively.\nNow we need to tell the serializer to use our custom type converter. This is a bit more complex than with the deserializer because we have to pass the ValueSerializer to our class, since it doesn\u0026rsquo;t have access to an object from which to access it.\nvar conceptObjectConverter = new PolymorphicConceptConverter(); var rootSerializerBuilder = new SerializerBuilder() .WithTypeConverter(conceptObjectConverter); conceptObjectConverter.ValueSerializer = rootSerializerBuilder.BuildValueSerializer(); var serializer = rootSerializerBuilder.Build(); As you can see, we create an instance of the type converter, PolymorphicConceptConverter, and pass it to the SerializerBuilder, and then we set the value of ValueSerializer from the SerializerBuilder instance. Finally, we call Build() to return the Serializer instance that we\u0026rsquo;ll call to serialize the Root object.\nA call to serializer.Serialize() will return a string object with our YAML document: var rootDoc = serializer.Serialize(root);.\nConfigName: TestConfiguration Version: 1 Tables: - Table1 - Table2 - Table3 Concepts: - Concept2: Descriptions: A description of Concept Two Value: 42 - Concept1: Name: Another Concept One - Concept2: Descriptions: Another description for Concept Two Value: 99 You can copy that YAML and pass it back through the deserializer to get an instance of Root. I\u0026rsquo;m able to meet my requirements.\nYou\u0026rsquo;ll notice in the beginning of this document I posted some C# code defining a Root object graph more complicated than what I used in the examples. I used a simplified YAML document to keep the examples shorter. I built the more complicated object graph so I could test nesting and ensure the solution would work with nested lists and objects - it does.\nOf course, the solution has a problem as it is very strongly linked to a specific interface and implementing classes. You can\u0026rsquo;t do a Concept3 or implement a new interface and classes without changing the core code. That won\u0026rsquo;t work.\nTo overcome that issue I implemented a mapping class that makes it easy to configure this information and pass it to the serializer and deserializer.\npublic class PolymorphicObjectMapper { private Dictionary\u0026lt;string, InterfaceMap\u0026gt; interfaces = new Dictionary\u0026lt;string, InterfaceMap\u0026gt;(); private HashSet\u0026lt;string\u0026gt; handledTypes = new HashSet\u0026lt;string\u0026gt;(); public void Add(Type InterfaceClass, Type ConcreteClass) { if (handledTypes.Contains(ConcreteClass.Name)) return; if (!interfaces.ContainsKey(InterfaceClass.Name)) interfaces.Add(InterfaceClass.Name, new InterfaceMap()); handledTypes.Add(ConcreteClass.Name); interfaces[InterfaceClass.Name].classMappings.Add(ConcreteClass.Name, ConcreteClass); } public bool CanHandleInterface(Type interfaceType) { return interfaces.ContainsKey(interfaceType.Name); } public bool CanHandleType(Type type) { return handledTypes.Contains(type.Name); } public Type GetConcreteType(string typeName, Type interfaceType) { if (interfaces.ContainsKey(interfaceType.Name) \u0026amp;\u0026amp; interfaces[interfaceType.Name].classMappings.ContainsKey(typeName)) return interfaces[interfaceType.Name].classMappings[typeName]; else throw new Exception(\u0026#34;Cannot Find Type for Specificed Type Name and Interface\u0026#34;); } } public class InterfaceMap { public string interfaceName { get; set;} public Dictionary\u0026lt;string, Type\u0026gt; classMappings { get; set;} public InterfaceMap() { classMappings = new Dictionary\u0026lt;string, Type\u0026gt;(); } } We then update our node deserializer and type converter classes to have a constructor that takes a mapping object:\npublic PolymorphicObjectDeserializer(INodeDeserializer innerDeserializer, PolymorphicObjectMapper polymorphicObjectMapper)\npublic PolymorphicObjectConverter (PolymorphicObjectMapper polymorphicObjectMapper)\nAnd we configure the mapper in our main code before passing it to constructors:\n//This will configure a mapper to let the Polymorhpic serializers handle interfaces and concrete classes var mapper = new PolymorphicObjectMapper(); mapper.Add(typeof(IConcept), typeof(Concept1)); mapper.Add(typeof(IConcept), typeof(Concept2)); mapper.Add(typeof(IConcept), typeof(Concept3)); var deserializer = new DeserializerBuilder() .WithNodeDeserializer(inner =\u0026gt; new PolymorphicObjectDeserializer(inner, mapper), syntax =\u0026gt; syntax.InsteadOf\u0026lt;ObjectNodeDeserializer\u0026gt;()) .Build(); var polymorhpicObjectConverter = new PolymorphicObjectConverter(mapper); var rootSerializerBuilder = new SerializerBuilder() .WithTypeConverter(polymorhpicObjectConverter); The addition of the mapper logic opens up additional possibilities for more complex scenarios. For example, you could have a builder that uses attributes to populate a mapper with relevant interfaces and classes. If you wanted to handle logic where the YAML document values don\u0026rsquo;t map to class names, the mapper class can be customized to handle it. etc.\nBelow is the complete solution. You can drop this into a LinqPad query, add a reference to the YamlDotNet NuGet package, and run it.\nvoid Main() { var yamlDocument = @\u0026#34; ConfigName: TestConfiguration Version: 1 Tables: - Table1 - Table2 - Table3 Concepts: - Concept1: Name: ConceptOne InnerConcepts: \u0026amp;ic0001 - Concept2: Descriptions: Ow wow too much... Value: 92 - Concept2: Descriptions: This is getting too big Value: 343 - Concept1: Name: Building stuff deeper and deeper - Concept2: Descriptions: A description of Concept Two Value: 42 SingleConcept: Concept2: Descriptions: Deep Descriptions Value: 2432 - Concept1: Name: Another Concept One InnerConcepts: *ic0001 - Concept2: Descriptions: Another description for Concept Two Value: 99 - Concept3: Descriptions: description for Concept Three Value: 867 Details: Detail: Some special details Rating: 874 \u0026#34;; //This will configure a mapper to let the Polymorhpic serializers handle interfaces and concrete classes var mapper = new PolymorphicObjectMapper(); mapper.Add(typeof(IConcept), typeof(Concept1)); mapper.Add(typeof(IConcept), typeof(Concept2)); mapper.Add(typeof(IConcept), typeof(Concept3)); var deserializer = new DeserializerBuilder() .WithNodeDeserializer(inner =\u0026gt; new PolymorphicObjectDeserializer(inner, mapper), syntax =\u0026gt; syntax.InsteadOf\u0026lt;ObjectNodeDeserializer\u0026gt;()) .Build(); var root = deserializer.Deserialize\u0026lt;Root\u0026gt;(yamlDocument); var polymorhpicObjectConverter = new PolymorphicObjectConverter(mapper); var rootSerializerBuilder = new SerializerBuilder() .WithTypeConverter(polymorhpicObjectConverter); polymorhpicObjectConverter.ValueSerializer = rootSerializerBuilder.BuildValueSerializer(); var rootSerializer = rootSerializerBuilder.Build(); var rootDoc = rootSerializer.Serialize(root); string seperator = \u0026#34;------------------------------\u0026#34;; Console.WriteLine(\u0026#34;Original YAML Document\u0026#34;); Console.WriteLine(seperator); yamlDocument.Dump(); Console.WriteLine(seperator); Console.WriteLine(\u0026#34;Deserialized Object Graph\u0026#34;); root.Dump(); Console.WriteLine(seperator); Console.WriteLine(\u0026#34;Serialized Document from Object Graph\u0026#34;); Console.WriteLine(seperator); rootDoc.Dump(); Console.WriteLine(seperator); } public class PolymorphicObjectDeserializer : YamlDotNet.Serialization.INodeDeserializer { private readonly INodeDeserializer _innerDeserializer; private PolymorphicObjectMapper _map; public PolymorphicObjectDeserializer(INodeDeserializer innerDeserializer, PolymorphicObjectMapper polymorphicObjectMapper) { _innerDeserializer = innerDeserializer; _map = polymorphicObjectMapper; } public bool Deserialize( IParser reader, Type expectedType, Func\u0026lt;IParser, Type, object\u0026gt; nestedObjectDeserializer, out object value, ObjectDeserializer rootDeserializer) { // Check if we are deserializing an IConcept type if (_map.CanHandleInterface(expectedType)) { var current = reader.Current as MappingStart; if (current != null) { // Read the key (e.g., Concept1, Concept2) reader.MoveNext(); var scalar = reader.Current as Scalar; if (scalar != null) { Type concreteType = _map.GetConcreteType(scalar.Value, expectedType); // Move to the object value reader.MoveNext(); value = nestedObjectDeserializer(reader, concreteType); reader.MoveNext(); // Move past the end of the mapping node return true; } } } // Fallback to the default deserializer return _innerDeserializer.Deserialize(reader, expectedType, nestedObjectDeserializer, out value, rootDeserializer); } } public sealed class PolymorphicObjectConverter : IYamlTypeConverter { //Credit where credit is due: //\thttps://stackoverflow.com/questions/64242023/yamldotnet-custom-serialization //\tand https://stackoverflow.com/questions/78211029/convert-list-to-objects-with-custom-names-in-yamldotnet //These two Stackoverflow posts got me to this solution. // Unfortunately the API does not provide those in the ReadYaml and WriteYaml // methods, so we are forced to set them after creation. public IValueSerializer ValueSerializer { get; set; } public IValueDeserializer ValueDeserializer { get; set; } private PolymorphicObjectMapper _mapper; public PolymorphicObjectConverter (PolymorphicObjectMapper polymorphicObjectMapper) { _mapper = polymorphicObjectMapper; } public bool Accepts(Type type) { //return typeof(IConcept).IsAssignableFrom(type); return _mapper.CanHandleType(type); } public object ReadYaml(IParser parser, Type type, ObjectDeserializer rootDeserializer) { return rootDeserializer(type); } public void WriteYaml(IEmitter emitter, object value, Type type, ObjectSerializer serializer) { emitter.Emit(new MappingStart()); var component = value; var otherPropertisMap = type .GetProperties() .Where(p =\u0026gt; p.GetValue(component) != null) .ToDictionary(p =\u0026gt; p.Name, p =\u0026gt; p.GetValue(component)); ValueSerializer.SerializeValue(emitter, type.Name, typeof(string)); ValueSerializer.SerializeValue(emitter, otherPropertisMap, typeof(Dictionary\u0026lt;string, object\u0026gt;)); emitter.Emit(new MappingEnd());\t} } public class PolymorphicObjectMapper { private Dictionary\u0026lt;string, InterfaceMap\u0026gt; interfaces = new Dictionary\u0026lt;string, InterfaceMap\u0026gt;(); private HashSet\u0026lt;string\u0026gt; handledTypes = new HashSet\u0026lt;string\u0026gt;(); public void Add(Type InterfaceClass, Type ConcreteClass) { if (handledTypes.Contains(ConcreteClass.Name)) return; if (!interfaces.ContainsKey(InterfaceClass.Name)) interfaces.Add(InterfaceClass.Name, new InterfaceMap()); handledTypes.Add(ConcreteClass.Name); interfaces[InterfaceClass.Name].classMappings.Add(ConcreteClass.Name, ConcreteClass); } public bool CanHandleInterface(Type interfaceType) { return interfaces.ContainsKey(interfaceType.Name); } public bool CanHandleType(Type type) { return handledTypes.Contains(type.Name); } public Type GetConcreteType(string typeName, Type interfaceType) { if (interfaces.ContainsKey(interfaceType.Name) \u0026amp;\u0026amp; interfaces[interfaceType.Name].classMappings.ContainsKey(typeName)) return interfaces[interfaceType.Name].classMappings[typeName]; else throw new Exception(\u0026#34;Cannot Find Type for Specificed Type Name and Interface\u0026#34;); } } public class InterfaceMap { public string interfaceName { get; set;} public Dictionary\u0026lt;string, Type\u0026gt; classMappings { get; set;} public InterfaceMap() { classMappings = new Dictionary\u0026lt;string, Type\u0026gt;(); } } public class Root { public string ConfigName {get; set;} public int Version {get; set;} public List\u0026lt;string\u0026gt; Tables {get; set;} public List\u0026lt;IConcept\u0026gt; Concepts {get; set;} } public interface IConcept {} public class Concept1 : IConcept { public string Name {get; set;} public List\u0026lt;IConcept\u0026gt; InnerConcepts {get; set;} } public class Concept2 : IConcept { public string Descriptions { get; set; } public int? Value { get; set; } public IConcept SingleConcept {get; set;} } public class Concept3 : IConcept { public string Descriptions { get; set; } public int Value { get; set; } public ConceptDetails Details {get; set;} } public class ConceptDetails { public string Detail {get; set;} public int? Rating {get; set;} } So that\u0026rsquo;s about it. I hope if you wondered upon this page you found it useful. If you have suggestions or figure out a better way to meet this requirement I would appreciate you leaving a comment.\nAlso\u0026hellip;this is not production ready code so please don\u0026rsquo;t use it without taking the time to put some basic error handling into place\u0026hellip;and, as always, use it at your own risk.\nI\u0026rsquo;ve made this code available under an MIT License at the following Gist: https://gist.github.com/nicknow/c5320f8544118f5a5b4baea5ade56324\n","permalink":"https://test.nicknow.net/yamldotnet-interfaces-lists-and-classes/","summary":"\u003cp\u003eFirst things first\u0026hellip;YamlDotNet is a great library and I\u0026rsquo;m thankful it exists and is so well maintained.\u003c/p\u003e\n\u003cp\u003eAlso, this is just how I figured out a solution to my requirement. I\u0026rsquo;m fully open to and would welcome suggestions on a simpler way to do this.\u003c/p\u003e\n\u003cp\u003eI was recently trying to find a way to do some configuration definitions in as clean a manner as possible. Generally, I\u0026rsquo;m not a fan of YAML and agree with many of the complaints about YAML. But YAML is probably the most plain english and clutter free model for defining a configuration. XML and JSON are much preferred - in my developer brain - but JSON is harder to write by hand and XML seems to have fallen out of favor. (Personal note: I still have a love for XML and XML Schema.)\u003c/p\u003e","title":"YamlDotNet, Interfaces, Lists, and Classes"},{"content":"I\u0026rsquo;ve been spending some time with the modern tooling and thought it would help to blog some of the step-by-step to help others.\nInstall PAC CLI Open a command prompt and type pac to see if the Power Platforms CLI (command line interface) is installed on your machine. If you get an error (not found) you\u0026rsquo;ll need to install the PAC CLI.\nGo to https://aka.ms/PowerAppsCLI to download the installer. Then run the installer. If the CLI installs successfully than the pac command should run successfully and display a list of commands.\nEnsure you are working with the latest version by running the command pac install latest and pac use latest.\nAnd if you are wondering, yes you can install and use previous versions by specifying the version number. Try using the above commands changing latest to 1.12.2. Just be sure to do a pac use latest to switch back to the latest version.\nWhy would you select a version other than the latest? If you are writing a script you may want to ensure specific behavior regardless of what version is installed on the machine. By using these commands you can ensure that your scripts pac references execute using a known and tested version of the cli.\nConnecting to a Tenant Now that you\u0026rsquo;ve got PAC CLI working you\u0026rsquo;ll likely want to connect to a tenant and, potentially, select a specific organization to work with using commands.\nYou\u0026rsquo;ll use the pac auth command to connect, list, and select a tenant. The PAC CLI tool supports connections to multiple tenants.\nTo get started we\u0026rsquo;ll see if there are any existing connections. Issue a pac auth list command to show any existing tenant connections.\nIf you have a commercial (not a sovereign cloud such as GCC or GCC High) that you can authenticate with using a browser-based (Azure AD) login you can issue the command pac auth create to quickly create an authentication. You\u0026rsquo;ll get a pop-up browser window allowing you to select an existing connection or create a new connection.\nAfter signing in you\u0026rsquo;ll be returned to the terminal window and see a successful connection.\nFor more complicated authentication scenarios, such as Managed Identities and App Id/Client Secret, you can use the pac auth help command to identify the appropriate switches. For US users in Gov Cloud (GCC, GCC High, DOD) environments you will need to use the --cloud switch to indicate the cloud instance you want to authenticate with.\nYou can authenticate to multiple tenants and authenticate to the same tenant with different credentials.\nI\u0026rsquo;ve authenticated to the same tenant (thinkplusplus.com) as two different users, as shown in the image there are two authentication records (1 and 2) when I run pac auth list.\nBy looking at the list the asterisk (*) indicates which authentication profile (user in a tenant) is currently active.\nI can switch by using the index (number) with the pac auth select --index [INDEX] command. To switch to the first profile I enter pac auth select --index 1.\nLooking at the two previous images you\u0026rsquo;ll selected profile has changed from 2 to 1. This means any interactions performed by the pac command will occur using the context of the user shown on the selected profile.\nHaving to refer to authentication profiles by number can become inconvenient and you cannot reliably trust that a specific index will match to a specific profile. The better way to reference profiles is to assign them unique names. We can do this by specifying the name when authenticating using the --name switch or assigning a name after authenticating using the pac auth name --index [INDEX] --name [NAME] .\nNow we can switch between profiles using the --name switch. For example, to switch from the Nick to the Mike profile I run the command pac auth select --name \u0026quot;Mike\u0026quot;.\nMultiple Organizations Within in a Power Platform tenant there will be multiple environments. Environments are still commonly referred to as organizations, and the PAC CLI tool is no different. Environments are managed with the org command. You can list out the environments you have access to with the selected profile by issuing the command pac org list.\nYou can then select an environment by providing its Display Name, Environment Id, Environment URL, or Unique Name value using the command pac org select --environment [VALUE]. For the value it\u0026rsquo;ll take a partial of the Unique Name or Display Name but not for any of the other values.\nWhoAmI the PAC CLI way The WhoAmIRequest() is a classical first call when programming against the Dataverse API, especially when writing command line applications. It provides an output of exactly who the user was and what environment/organization was being accessed. The PAC CLI tool provides an equivalent command, pac org who.\nThat\u0026rsquo;s a wrap folks\u0026hellip;we\u0026rsquo;ve covered installing the PAC CLI tool, connecting to a tenant, and selecting an organization. From here you can start using any of the commands and verbs in pac to work with Power Platform.\nThe full PAC CLI command reference is available at: Microsoft Power Platform CLI Command Groups - Power Platform | Microsoft Learn.\n","permalink":"https://test.nicknow.net/power-platform-pac-cli-installing-connecting-and-selecting-an-organization/","summary":"\u003cp\u003eI\u0026rsquo;ve been spending some time with the modern tooling and thought it would help to blog some of the step-by-step to help others.\u003c/p\u003e\n\u003ch2 id=\"install-pac-cli\"\u003eInstall PAC CLI\u003c/h2\u003e\n\u003cp\u003eOpen a command prompt and type \u003ccode\u003epac\u003c/code\u003e to see if the Power Platforms CLI (command line interface) is installed on your machine. If you get an error (not found) you\u0026rsquo;ll need to install the PAC CLI.\u003c/p\u003e\n\u003cp\u003eGo to \u003ca href=\"https://aka.ms/PowerAppsCLI\"\u003ehttps://aka.ms/PowerAppsCLI\u003c/a\u003e to download the installer. Then run the installer. If the CLI installs successfully than the \u003ccode\u003epac\u003c/code\u003e command should run successfully and display a list of commands.\u003c/p\u003e","title":"Power Platform CLI: Installing, Connecting, and Selecting an Organization"},{"content":"When IT leaders push back on \u0026ldquo;citizen development\u0026rdquo; they are just displaying their closed mindedness and incompetence. Every successful organization is - right now, today - full of citizen developers, people using whatever technology tools they have available (and often finding ways to get around IT limitations to get additional tools) to get their job done.\nIf you don\u0026rsquo;t enable your workforce to create solutions for themselves they will still find a way to create them. No organization has the budget to solve every use case with centralized IT. Workers don\u0026rsquo;t have a choice, they have a job to get done and they\u0026rsquo;ll get it done - with or without IT\u0026rsquo;s support or blessing.\nThose quasi-apps - created using unapproved cloud services, email, Excel files, Word macros, SharePoint lists, etc. - proliferate in enterprises. These essentially unregulated solutions create enormous risks around reliability and security, and the blame will fall on CIOs and CISOs when things go bad - whether they knew about the risk or not.\nIt\u0026rsquo;s critical that an organization enable every worker with a need and the motivation to have the ability to self-create the tools they need in a secure, reliable, discoverable, and governed manner. Only Microsoft Power Platform provides an enterprise grade solution covering the full gamut of solution requirements, from individual productivity apps to work group solutions to full enterprise applications. Other than Microsoft Power Platform there is simply NO other platform that can support the full spectrum of requirements.\nIf you fail to provide your workforce with what they need they will find what they need, and it\u0026rsquo;ll still be your problem when it goes bad. A commitment to Microsoft Power Platform solves that problem and allows every worker who wants to build something to build something in a secure well-regulated manner.\n","permalink":"https://test.nicknow.net/citizen-developers-have-always-existed/","summary":"\u003cp\u003eWhen IT leaders push back on \u0026ldquo;citizen development\u0026rdquo; they are just displaying their closed mindedness and incompetence. Every successful organization is - right now, today - full of citizen developers, people using whatever technology tools they have available (and often finding ways to get around IT limitations to get additional tools) to get their job done.\u003c/p\u003e\n\u003cp\u003eIf you don\u0026rsquo;t enable your workforce to create solutions for themselves they will still find a way to create them. No organization has the budget to solve every use case with centralized IT. Workers don\u0026rsquo;t have a choice, they have a job to get done and they\u0026rsquo;ll get it done - with or without IT\u0026rsquo;s support or blessing.\u003c/p\u003e","title":"Citizen Developers Have Always Existed"},{"content":"About 4 1/2 years ago I wrote a post on how to calculate a next anniversary (birthday) date in Dynamics 365. It\u0026rsquo;s been a top 3 post according to Google Analytics. I\u0026rsquo;m proud of that solution because it was a real no-code solution to a common requirement for lots of applications (especially CRM systems.)\nA client of mine recently asked for support to show the next birthday for a contact. Often there will be an ask for a list view of contacts with a birthday in the next month. In this post I’m going to show you how to use a business rule and calculated fields to achieve this functionality without writing any code. This will be a a native calculated field so it can be used in lists, forms, queries, etc.\nThis is not limited to birthdays, the same method use can used to calculate any anniversary date. Sale anniversaries, on-hire anniversaries, wedding anniversaries, etc. In this example I’m going to do the birthday for a contact – but this strategy can be used with any date field.\nThe design uses all out-of-the-box configuration capabilities. There is no code, nothing unsupported, and nothing “wacky” – just a few fields and a business rule (and a workflow if you want to update historical records.) So lets get started.\nI felt it was a good solution and it worked for my client (and several others who have used this design since I wrote this article.) But it certainly isn\u0026rsquo;t ideal, it has two internal backing fields, and required a business rule to populate a field (meaning existing records wouldn\u0026rsquo;t work until their birthday field was updated.)\nFast forward to today and we have had so much evolution on the platform it seemed appropriate to revisit for a simpler solution.\nThe key to building a simpler solution is the introduction of Power Fx for formula columns in Microsoft Dataverse. Using Power Fx we can create a formula column that will calculate the next anniversary/birthday based on fixed date. In this post we\u0026rsquo;ll be using the out-of-the-box Contact table and the Birthday field. Our goal is to create a field that will based on the Birthday field date show when contact\u0026rsquo;s next birthday will be.\nSo lets get started. First, make sure you are using the preview URL for the Power Apps Maker portal (https://make.preview.powerapps.com/), this is necessary as formula columns are still a preview feature.\nClick the + (plus) sign in the upper right corner to add a new field.\nWe\u0026rsquo;ll title the new field Next Birthday (1) and set its data type to Formula (2). If you don\u0026rsquo;t have the Formula option see above about the preview URL. When we set the data type to formula the Power Fx entry box (3) will be shown.\nWe\u0026rsquo;ll now use a couple nested If statements in Power Fx along with UTCToday(), to get today\u0026rsquo;s date (1), to determine if a contact\u0026rsquo;s birthday has already occurred. Yes, I explain the formula below. If it has occurred we\u0026rsquo;ll set the field to use next year and if it has not occurred (or is occurring today) we\u0026rsquo;ll set the field to use this year.\nBut we aren\u0026rsquo;t done yet. We need to tweek one more thing. You\u0026rsquo;ll see that Dataverse has set the column\u0026rsquo;s type to Date and Time (2), but we aren\u0026rsquo;t returning time data. If you attempt to save now you\u0026rsquo;ll get an error.\nThe solution is to change the format to Date Only.\nClick save to add the column and your Next Birthday column should be displaying correctly, add a few records to check it out!\nIf you refer to my original post on how to do this with business rules and calculated fields you\u0026rsquo;ll see we\u0026rsquo;ve eliminate the need for two backing fields and the need for a business rule to calculate the initial backing field. The only column we have added is the business needed column of the next occurrence of the event. Using Power Fx formula column we\u0026rsquo;ve reduced a lot of complexity.\nA big reason we could reduce this complexity is the ability to nest comparisons in an If statement in Power Fx using And and Or. I think this has a lot of potential and we haven\u0026rsquo;t even scratched the surface.\nThe Formula and UTCToday() and Time Zones So date calculations are one of my favorite things although I\u0026rsquo;ll admit I prefer just dates and not dealing with time zones (I may have issues but I\u0026rsquo;m not a masochist.)\nThe logic of the formula is fairly simple. If the date of birth\u0026rsquo;s (Birthday) month has occurred or if it is the current month and the day has already occurred we need to calculate the birthday for next year, otherwise the birthday will occur this year.\nIf( Month(Birthday) We do a check to see if the date is in the past, either the month has passed or if it\u0026#39;s the current month then the day has passed. Then we use the *DateAdd* to add the appropriate number of years to the original date of birth. If their birthday has already occurred this year it\u0026#39;s their current age plus one year otherwise it is the age they will turn this year. We get that number by subtracting the current year from their birth year (and adding 1 if their birthday has already occurred.) I took that screen shot at 10:34 PM on July 22, 2022 in the US Eastern time zone. You\u0026#39;ll notice that *Jane Janet* is showing as not having a birthday until next year even though her birthday is occurring today and should show as today. ![](/images/2022/07/image-14.png) This is a limitation of the *UTCToday()* function to get today\u0026#39;s date. It ignores your local timezone. So while it\u0026#39;s July 22nd at my desk in the world of UTC time it is already July 23rd. ![](/images/2022/07/image-13.png) From a business process standpoint this is the right choice. You don\u0026#39;t want a formula column - which is essentially virtual - to be changing based on the time zone of the user viewing the record. But it is something to be aware of, especially as you get larger gaps between the local time of your users and UTC. And, no, there is not an option in the Formula columns to user a user local date. It is *UTCToday() *or nothing. ### What about Leap Years? Yes, leap years **can** be a problem and I have simply ignored that problem in the calculation above. Here is the reality, if you have a leap year baby (i.e., born on February 29th) their birthday will show as February 28th in non-leap years. ![](/images/2022/07/image-15.png)In a leap year it will show as February 29th. I validated this by slightly modifying the formula to add 2 years to get Lisa Leap to 2024 and got the the 29th. ![](/images/2022/07/image-16.png) But that doesn\u0026#39;t solve the **\u0026#34;leap year problem\u0026#34;**. The problem is whether you should treat such a person\u0026#39;s non-leap year birthday as being February 28th or March 1st. There is **no consensus**. Go Bing it if you want - there is no clear answer. It may actually matter for the system you are building. If you are just sending out birthday cards it probably doesn\u0026#39;t matter. **But**, if you are building a system to issue driver\u0026#39;s licenses or sell people age restricted items this probably matters a lot to you. If your use case requires that a leap year birthday be shown as March 1st, instead of February 28th, I\u0026#39;ve got an answer for you but it\u0026#39;ll have to wait for the next blog post - because it\u0026#39;s a wee bit more complicated. **Best of luck and have fun with Power Fx Formula columns in your Model Drive Power Apps!** If you have any questions please ask them in the comments! ","permalink":"https://test.nicknow.net/calculating-next-anniversary-birthday-in-dataverse-with-power-fx-revisited/","summary":"\u003cp\u003eAbout 4 1/2 years ago I wrote a \u003ca href=\"https://nicknow.net/dynamics-365-calculate-view-next-birthday-anniversary-date/\"\u003epost on how to calculate a next anniversary (birthday) date in Dynamics 365\u003c/a\u003e. It\u0026rsquo;s been a top 3 post according to Google Analytics. I\u0026rsquo;m proud of that solution because it was a real no-code solution to a common requirement for lots of applications (especially CRM systems.)\u003c/p\u003e\n\u003cp\u003eA client of mine recently asked for support to show the next birthday for a contact. Often there will be an ask for a list view of contacts with a birthday in the next month. In this post I’m going to show you how to use a business rule and calculated fields to achieve this functionality without writing any code. This will be a a native calculated field so it can be used in lists, forms, queries, etc.\u003c/p\u003e","title":"Calculating Next Anniversary/Birthday Date in Dataverse with Power Fx (Revisited)"},{"content":"TL;DR: Need to configure a Microsoft Power Apps (Power Platform) Lab environment for a workshop, App in a Day, etc. here is a ready to go script: https://github.com/nicknow/Setup-DataverseLabEnvironment.\nIn the Microsoft Power App in a Day package there used to be a script to quickly deploy a trial environment. It would setup the users, environments, and databases so attendees could get right to work. Somewhere along the way that script was removed and the directions now include instructions for attendees to setup a trial or demo instance on their own.\nWhen I used to put on a Power Apps Workshop I had users create their own trial. My thought being this was empowering for attendees (and it saved me time.) This was a reasonable tradeoff for a two-day workshop. Recently I conducted a Power App in 60 Minutes workshop. It wasn\u0026rsquo;t going to be a good use of time to spend the 15-20 minutes it can take a group of new users to setup a trial - not to mention delays because of issues with a text message or what not.\nSo I went looking for the old script to automate setup. Luckily I found that Jim Novak of Futurez Consulting had put an improved version of that script on GitHub. After pulling it down and making some changes I got it work. But, of course, getting it work just isn\u0026rsquo;t good enough. So I had to have some fun tweaking it.\nI cleared up some error conditions, removed a license check (that blocked me), added support for deploying the Sample Apps, and added support for configuring each environment with a security group (and putting the correct user in each security group.)\nThe script is now available on GitHub: https://github.com/nicknow/Setup-DataverseLabEnvironment. You can either clone the repository to your Windows client or download the script file from GitHub. The Power Apps cmdlets have a dependency on the .NET Framework so you need to run this in PowerShell 5.1, not PowerShell Core 6.\nIt will handle installation of the required modules so if they are not already installed make sure to open your PowerShell instance as an administrator.\nThe parameters are all explained in the README.MD file and in the script header. Here is an example command line:\n.\\Setup-DataverseLabEnvironment.ps1 -TargetTenant \u0026#39;mytenant\u0026#39; -UserName \u0026#39;admin\u0026#39; -Password \u0026#39;Admin Password\u0026#39; -TenantRegion \u0026#39;US\u0026#39; -CDSLocation unitedstates -NewUserPassword \u0026#39;password\u0026#39; -UserCount 2 -useSecurityGroup $true -installSampleApps $true Users are created as User01, User02, User 03, etc. up to whatever -UserCount you specify. Be aware, you need to have available licenses for all the users (so usually the limit is 24, 25 total licenses minus the initial user.)\nIt assigns the users based on the licenses in the account. So if you setup only a Power Apps trial they\u0026rsquo;ll only get those licenses. If you setup a Microsoft 365 E3 trial and a Power Apps Per User trial the users will get assigned all the licensing.\nAlso, big warning here: this is for a lab environment. It\u0026rsquo;s going to delete everything except for the user it is connecting to Power Platform as and the default environment. All other users, groups, databases, and environments will be deleted automatically.\nTake it for a spin. Please fork it, update it, and submit pull requests. If you have issues post them on GitHub.\n","permalink":"https://test.nicknow.net/setup-power-apps-lab-environment-for-app-in-a-day/","summary":"\u003cp\u003eTL;DR: Need to configure a Microsoft Power Apps (Power Platform) Lab environment for a workshop, App in a Day, etc. here is a ready to go script: \u003ca href=\"https://github.com/nicknow/Setup-DataverseLabEnvironment\"\u003ehttps://github.com/nicknow/Setup-DataverseLabEnvironment\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eIn the \u003ca href=\"https://aka.ms/AIADEvent\"\u003eMicrosoft Power App in a Day package\u003c/a\u003e there used to be a script to quickly deploy a trial environment. It would setup the users, environments, and databases so attendees could get right to work. Somewhere along the way that script was removed and the directions now include instructions for attendees to setup a trial or demo instance on their own.\u003c/p\u003e","title":"Setting Up a Power Apps Lab Environment (App in A Day / App in 60 minutes)"},{"content":"I get annoyed with the way COVID-19 data is reported. There is a lot of emphasis put on the number today and on the aggregate (total cases, total deaths, etc.) These make good headline numbers but don\u0026rsquo;t do much to help people understand the current trend - are we getting better or worse.\nSo I built a report using the COVID-19 Tracking Project at The Atlantic\u0026rsquo;s data feed and Power BI for visualization. You can access the dashboard at bit.ly/NNCOVID19DB. The data is automatically updated several times daily.\nThere are definitely prettier dashboards out there, including on the COVID-19 Tracking Project website, but none that I see show two moving averages to get rate of change visualizations. That\u0026rsquo;s a problem.\nIn my view what really matters is whether we are seeing upward or downward trends. Thus I wanted to see - and suggest more people look at - moving average (MA) comparisons. You want to see the shorter moving average trending below the longer moving average to indicate a downward trend (which in the case of this dashboard is the good direction.) And, vice versa, when the shorter is above the longer it indicates an uptrend (i.e., hospitalizations, cases, or deaths are increasing.)\nAdditionally, I\u0026rsquo;m a big fan of looking at the hospitalization trend to see if the problem is getting better or worse. It eliminates lots of side-discussion about whether or not COVID-19 infections are among the young and/or how we are protecting the elderly and vulnerable populations. Ultimately, if you end up hospitalized for a respiratory illness that\u0026rsquo;s bad, so looking at COVID-19 hospitalization provides the secondary data point (after cases) to see how we are doing.\nBack to trends: they really matter a lot more than top line numbers. The top line numbers shift and a single moving average is either too responsive to change or too slow to change, making it hard to visualize if a measure is accelerating or decelerating.\nLets look at an example to understand the value and importance of this data.\nComparing COVID-19 Moving Average Rate of Change in Slope for Trend Analysis\nAbove (#1) we see an increasing (bad) trend. Throughout the entire period shown the MAs are going up. But, if you were looking at just one daily MA (DMA) trend line you would miss the important change from 1 to 2. In 1 the slope of the yellow line (7 DMA) is increasing faster than the blue line (21 DMA) indicating not just a growing problem but a problem that is escalating as it grows faster each day. Hence, we are failing to manage the growth of the problem, let alone slowing the problem.\nThen in #2 the trend is continuing upwards (bad) but there is a change in the 7 DMA slope relative to the 21 DMA slope, as they begin to run parallel. This indicates that we are seeing progress towards a solution. Generally, in absence of other information, this would indicate that the actions being taken are working and should be continued and (possibly) accelerated.\nIn this case, ultimately, we saw the 7 DMA crest and eventually turn down crossing below the 21 DMA, indicating the problem was getting better.\nThe short term 7 DMA cresting and crossing below the long term 21 DMA.\nLets look at another example of using DMA slopes to see the value of this analysis.\nIn # 1 we see a steadily improving situation, both lines sloping down in parallel. This indicates the problem is improving but nothing we are doing is improving the problem faster. For example, if we implemented certain closures to get a problem under control and then increased the closures (hoping to speed up improvement) then # 1 would indicate the additional closures were not delivering benefits.\nThen in # 2 we see the shorter term (7 DMA) line bottom out and turn slightly upwards. Ultimately the two trends merge together (# 3) indicating we are now in stasis, able to keep the problem under control but not reduce it further.\nUsing Two DMA lines to Visualize Remediation Impact\nMy goal was to encourage people to look beyond simple data points and take the time to understand the trends. Numbers on their own can be misleading. Even graphs of a single data trend can lead to erroneous conclusions. Comparative rates of change are ultimately the best way to visualize and understand a problem.\nFeedback is welcome in the comments.\nAgain, the dashboard Link: bit.ly/NNCOVID19DB\n","permalink":"https://test.nicknow.net/importance-of-moving-averages-on-covid-19-tracking/","summary":"\u003cp\u003eI get annoyed with the way COVID-19 data is reported. There is a lot of emphasis put on the number \u003cem\u003etoday\u003c/em\u003e and on the \u003cem\u003eaggregate\u003c/em\u003e (total cases, total deaths, etc.) These make good headline numbers but don\u0026rsquo;t do much to help people understand the current trend - are we getting better or worse.\u003c/p\u003e\n\u003cp\u003eSo I built a report using the \u003ca href=\"https://covidtracking.com/\"\u003eCOVID-19 Tracking Project at The Atlantic\u0026rsquo;s\u003c/a\u003e \u003ca href=\"https://covidtracking.com/data/api\"\u003edata feed\u003c/a\u003e and \u003ca href=\"https://powerbi.microsoft.com\"\u003ePower BI\u003c/a\u003e for visualization. You can access the dashboard at \u003ca href=\"https://bit.ly/NNCOVID19DB\"\u003ebit.ly/NNCOVID19DB\u003c/a\u003e. The data is automatically updated several times daily.\u003c/p\u003e","title":"The Importance of Moving Averages on COVID-19 Tracking Dashboards"},{"content":"In normal times life, liberty, and happiness build upon each other. When one grows our overall life is raised up (and you protect all three because if any shrinks it takes away from your life.) In times of crisis - especially the one we are experiencing now - life becomes more like a set of competing interests, such that more in one area means less in another area.\nThis is the driver of much of the internal frustration people are experiencing right now. It\u0026rsquo;s vital we learn to recognize the trade-off decisions we are being forced to make so that we can manage the inherent internal and external tension that comes from these choices. Learning to recognize how this impacts yourself, your family members, your colleagues, your friends, and others allows you to be more effective in our interactions and communications.\nPeople have been forced in a matter of weeks to go from a lifetime of maximization seeking to a balancing strategy. That is an abrupt change for which many people were not mentally prepared. We will all adjust but it will take time and it will not be without individual challenges.\nCredit to David Sinclair, PhD for the idea and graphic. I recommend reading his book, Lifespan, if you are interested in the aging process - it\u0026rsquo;s well researched and fascinating.\nhttps://twitter.com/davidasinclair/status/1252729527551307777\n","permalink":"https://test.nicknow.net/balancing-life-in-a-time-of-covid-19/","summary":"\u003cp\u003eIn normal times life, liberty, and happiness build upon each other. When one grows our overall life is raised up (and you protect all three because if any shrinks it takes away from your life.) In times of crisis - especially the one we are experiencing now - life becomes more like a set of competing interests, such that more in one area means less in another area.\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"/images/2020/04/IMG_1297-1024x576.jpg\"\u003e\u003c/p\u003e\n\u003cp\u003eThis is the driver of much of the internal frustration people are experiencing right now. It\u0026rsquo;s vital we learn to recognize the trade-off decisions we are being forced to make so that we can manage the inherent internal and external tension that comes from these choices. Learning to recognize how this impacts yourself, your family members, your colleagues, your friends, and others allows you to be more effective in our interactions and communications.\u003c/p\u003e","title":"Balancing Life in a time of COVID-19"},{"content":"This decade will see the rise of carbon-neutral supply chains which will impact businesses everywhere - even those far removed from serving tech firms in Silicon Valley. As more Fortune 500 companies join this trend carbon-neutral requirements will be pushed deep down the supply chain to the point that companies many layers deep in the supply chain will need to be carbon-neutral (or forgo significant business opportunities.)\nSource: https://www.theinformation.com/articles/microsofts-plan-to-go-carbon-negative-raises-bar-for-tech-rivals?shared=a0ca6f346c3fb947\nWe\u0026rsquo;ll see the rise of auditing \u0026amp; certification for carbon-neutral suppliers. It won\u0026rsquo;t be much different than ISO quality standards for manufacturers with one HUGE exception: ISO standards only impacted the manufacturing and operations part of a business - the ISO registered plant only cared about ISO for raw material/part suppliers.\nAudits and certifications around carbon-neutral (and zero-emissions) will incorporate the entire value chain. The break room supplier, the janitorial supplier, the payroll processor, the holiday party caterer, the IT providers, their accounting firm, etc. are usually outside the bounds of ISO 9001 like standards, but for carbon-neutral standards they\u0026rsquo;ll be be considered part of the value chain. As organizations seek to become carbon-neutral they will require their suppliers to be certified as carbon-neutral, which will be a challenge for many established businesses and create opportunity for disruption.\nLastly, Federal Government suppliers, don\u0026rsquo;t be surprised to see set-asides/preferences for carbon-neutral suppliers emerge by the middle of the decade.\nUPDATE FEB 21 2021\nMaersk has announced they\u0026rsquo;ll deploy their first carbon-neutral vessel several years ahead of schedule and that all new vessels will be able to run carbon-neutral. This will be crucial for shippers who want to bring to market carbon-neutral products, because its great to say you got to carbon-neutral in manufacturing but if you don\u0026rsquo;t get down to zero through the entire value chain it is not really carbon-neutral.\n","permalink":"https://test.nicknow.net/carbon-neutral-supply-chains/","summary":"\u003cp\u003eThis decade will see the rise of carbon-neutral supply chains which will impact businesses everywhere - even those far removed from serving tech firms in Silicon Valley. As more Fortune 500 companies join this trend carbon-neutral requirements will be pushed deep down the supply chain to the point that companies many layers deep in the supply chain will need to be carbon-neutral (or forgo significant business opportunities.)\u003c/p\u003e\n\u003cp\u003e\u003cimg loading=\"lazy\" src=\"https://dmxvlyap9srmn.cloudfront.net/production/articles/4191/cf0ae04b-2b3c-409d-9075-2b813db80db2.jpg\"\u003eSource: \u003ca href=\"https://www.theinformation.com/articles/microsofts-plan-to-go-carbon-negative-raises-bar-for-tech-rivals?shared=a0ca6f346c3fb947\"\u003ehttps://www.theinformation.com/articles/microsofts-plan-to-go-carbon-negative-raises-bar-for-tech-rivals?shared=a0ca6f346c3fb947\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eWe\u0026rsquo;ll see the rise of auditing \u0026amp; certification for carbon-neutral suppliers. It won\u0026rsquo;t be much different than ISO quality standards for manufacturers with one HUGE exception: ISO standards only impacted the manufacturing and operations part of a business - the ISO registered plant only cared about ISO for raw material/part suppliers.\u003c/p\u003e","title":"Carbon Neutral Supply Chains"},{"content":"2020 is going to be the year that Kubernetes (which really means containers) becomes fully ingrained in the enterprise. DevOps becomes the default model for building and deploying enterprise applications (full code, low code, and no code). Enterprise customers will increasingly want both custom apps and COTS products to fit to a Kubernetes and DevOps test/deployment/implementation model. Cybersecurity continues to grow and is a critical part of every conversation, it will be required that security is baked into every layer.\nCustomers will increasingly expect to see this combined in a complete DevSecOps offering that abstracts the complexity of Kubernetes clusters (no kubectl), secures the cluster and the containers and the applications, manages across public and private cloud, and is self-healing/maintaining.\nIf you are selling technology - whether COTS products, cloud services, or app dev - and can\u0026rsquo;t do this (most cannot) you need to partner with firms that can aggregate technology and deliver it for customers in single solutions for customers without deployment, integration, and management headaches.\n","permalink":"https://test.nicknow.net/2020-kubernetes-devsecops-and-cyber/","summary":"\u003cp\u003e2020 is going to be the year that Kubernetes (which really means containers) becomes fully ingrained in the enterprise. DevOps becomes the default model for building and deploying enterprise applications (full code, low code, and no code). Enterprise customers will increasingly want both custom apps and COTS products to fit to a Kubernetes and DevOps test/deployment/implementation model. Cybersecurity continues to grow and is a critical part of every conversation, it will be required that security is baked into every layer.\u003c/p\u003e","title":"2020: Kubernetes, DevSecOps, and Cyber"},{"content":"What is the Power platform all about? I get this question a lot.\nThe reality is that the Power platform is more than one thing and it can be \u0026ldquo;about\u0026rdquo; a lot of different things.\nPowerApps is a pixel-perfect mobile-first UX app creation for the enterprise. Common Data Service is a ready-to-go no-limits data service for building an application backend. PowerApps is the ability to rapidly build forms and views over that data service with minimal effort. Dynamics 365 is a series of commercial applications ready to run your business processes. Power BI is about analyzing and visualizing data from anywhere. Flow is integrating data from multiple services and automating business processes across those services.\nhttps://www.youtube.com/watch?v=prfGT2X_Flg\nIt isn\u0026rsquo;t just one thing. It\u0026rsquo;s a collection of services that work together to help people make organizations run better.\nThe Power platform can enable an organization to take a legacy data source - imagine some SQL Server or Oracle database sitting out there with an out-dated UI and missing business logic - to modernize it without having to rip-and-replace. It means being able to put a modern mobile-friendly UI, driving business processes that talk to other services, and analyzing the underlying data with a modern analysis and visualization tool.\nThe Power platform gives an organization the ability to stand-up capabilities across a wide range of common use cases, such as service and case management, scheduling and dispatching, opportunity identification and tracking, contact and relationship management, project execution, direct marketing, etc. It means all of those ready-to-go applications can be further configured to meet the domain-specific needs of a particular industry or organization, so no one ever has to try to fit into a one-size fit all application.\n[caption id=\u0026ldquo;attachment_680\u0026rdquo; align=\u0026ldquo;alignright\u0026rdquo; width=\u0026ldquo;300\u0026rdquo;] Microsoft Power platform is the fastest way I\u0026rsquo;ve found to go from idea to application[/caption]\nThe Power platform allows non-developer power users can rapidly configure an application starting from zero in a matter of hours to days, complete with enterprises security and control. It means configuring a data model, security, workflow/logic and UI is done with drag-and-drop/point-and-click tools, not code and script.\nThe Power platform empowers the true developer to build faster-better-cheaper systems by taking advantage of a ready-to-go development platform in the cloud. Rapidly implementing the basic requirements of an application such as data persistence, security and authentication controls, auditing, user search, forms/views, etc. through a service allows developers to focus their time on implementing the bespoke functionality required for a particular organization - writing code, building Logic Apps, complex integrations, etc.\nI\u0026rsquo;m a believer in the Power platform because it enables me to help an organization achieve what I value most: better performance delivered fast.\nhttps://www.youtube.com/watch?v=8B5UyUKvXkU\nMaking organizations run better is my passion. I focus on process engineering and re-engineering, value optimization, and process automation. Power platform is the single best way I\u0026rsquo;ve found to implement the technical change required to make these concepts a reality.\nOrganizations usually can\u0026rsquo;t start over every time a better way is found; frankly, I\u0026rsquo;ve never found any organization - even a startup - that can start over every few months (and, if you are looking hard enough, you\u0026rsquo;ll find areas to improve constantly.) Having a toolset, preferably a reliable long-term well-integrated toolset, to rapidly implement systems (partially or fully) is essential to success.\nEvery organization needs a no-code/low-code platform to run, without one they\u0026rsquo;ll fall behind. I\u0026rsquo;m investing my time, energy, and career in the Microsoft Power platform because it is the most complete option and it is built around the Azure platform, meaning you\u0026rsquo;ll never run into business needs that can\u0026rsquo;t ultimately be implemented.\n","permalink":"https://test.nicknow.net/microsoft-power-platform-no-low-code/","summary":"\u003cp\u003eWhat is the \u003ca href=\"https://dynamics.microsoft.com/en-us/microsoft-power-platform/\"\u003ePower platform\u003c/a\u003e all about? I get this question a lot.\u003c/p\u003e\n\u003cp\u003eThe reality is that the Power platform is more than one thing and it can be \u0026ldquo;about\u0026rdquo; a lot of different things.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://powerapps.microsoft.com/\"\u003ePowerApps\u003c/a\u003e is a pixel-perfect mobile-first UX app creation for the enterprise. Common Data Service is a ready-to-go no-limits data service for building an application backend. PowerApps is the ability to rapidly build forms and views over that data service with minimal effort. \u003ca href=\"https://dynamics.microsoft.com/\"\u003eDynamics 365\u003c/a\u003e is a series of commercial applications ready to run your business processes. \u003ca href=\"https://powerbi.microsoft.com\"\u003ePower BI\u003c/a\u003e is about analyzing and visualizing data from anywhere. \u003ca href=\"https://flow.microsoft.com/\"\u003eFlow\u003c/a\u003e is integrating data from multiple services and automating business processes across those services.\u003c/p\u003e","title":"Why the Microsoft Power Platform is the No-Code Low-Code Platform You Need Now"},{"content":"Protest filing by Oracle regarding the JEDI RFP issued by the Department of Defense.\nSoftware giant Oracle is challenging the Pentagon’s decision to choose just one company for a not-yet-awarded $10 billion cloud computing contract, according to a bid protest document reviewed by The Washington Post, firing off a salvo in what is shaping up to be a heated competition among tech giants for one of the biggest government software contracts in years.\nOracle took the unusual step of bringing its protest long before contractors have even submitted bids, alleging that the procurement of what is called the Joint Enterprise Defense Infrastructure (JEDI) has been problematic from the outset. In the bid protest document dated Aug. 6, the company accused the Pentagon of failing to adhere to procurement regulations and pursuing a strategy that will hurt the U.S. military’s technological prowess.\n\u0026mdash; Washington Post\nNote, I got a real kick out of the footnote referencing Heraclitus of Ephesus (for something he didn\u0026rsquo;t actually say!)\n[caption id=\u0026ldquo;attachment_664\u0026rdquo; align=\u0026ldquo;aligncenter\u0026rdquo; width=\u0026ldquo;339\u0026rdquo;] Heraclitus didn\u0026rsquo;t say \u0026ldquo;the only constant is change\u0026rdquo;[/caption]\nOracle JEDI Protest Filing Download the PDF.\n","permalink":"https://test.nicknow.net/oracle-jedi-contract-protest-filing/","summary":"\u003cp\u003e\u003ca href=\"https://www.gao.gov/docket/B-416657.1\"\u003eProtest filing\u003c/a\u003e by Oracle regarding the JEDI RFP issued by the Department of Defense.\u003c/p\u003e\n\u003cp\u003eSoftware giant Oracle is challenging the Pentagon’s decision to choose just one company for a not-yet-awarded $10 billion cloud computing contract, according to a bid protest document reviewed by The Washington Post, firing off a salvo in what is shaping up to be a heated competition among tech giants for one of the biggest government software contracts in years.\u003c/p\u003e","title":"Oracle JEDI Contract Protest Filing"},{"content":"I used to have a monthly Gogo Wifi subscription. Then I got rid of it. Flying is better for me now, it\u0026rsquo;s more beneficial because it helps me to focus.\nNot long ago I realized that Delta offered free wifi for messaging (iMessage, WhatsApp, etc.) Awesome. Now I can stay in contact but not get sucked into Apps and Internet world. I wish American offered this, but they don\u0026rsquo;t - so choose Delta if it\u0026rsquo;s an option.\nLife is good without always being on. In fact, if you need to focus on stuff for a few hours. Book yourself a first class ticket (same-day roundtrip, whatever is cheaper - or, heck, stay overnight if you want) and go sit on a plane for several hours. Bring a notepad or bring your computer with Cold Turkey Writer. What is Cold Turkey Writer? It is this awesome app that forces you to write. I love it. It takes over your computer and you get a simple full screen notepad experience. You just write. It can be set for X amount of time or X number of words. It forces you to write. You can\u0026rsquo;t get distracted or goof off. I imagine it being the modern equivalent of Hemingway sitting at his typewriter with a blank piece of paper. He didn\u0026rsquo;t have to worry about flipping over to Outlook or clicking a button and losing himself in Solitaire for an hour. There is great power in forced focus.\nI\u0026rsquo;m an idea person. I love ideas, I think about ideas, I create ideas, I discover, I ponder, and I do this stuff non-stop. I\u0026rsquo;ve never worried about \u0026ldquo;protecting\u0026rdquo; an idea - they are a dime a dozen, steal one - great. I had it, I wasn\u0026rsquo;t pursuing it, so you might as well take it.\nHere is the thing, ideas don\u0026rsquo;t create focus. They do the exact opposite. They distract. There is always something new. Hence, I have a hard time focusing. So I\u0026rsquo;ve learned to force myself to focus, and when I force myself to focus I eventually get to hyper-focus at which point I feel as though I can accomplish anything.\nMaybe you see where I\u0026rsquo;m getting. Being locked in a plane, without escape, at 30k feet is an amazing opportunity. Most people waste opportunity. They are busy surfing the internet, watching movies, updating their CRM, sending emails, posting Instagram pics, etc.\nScrew that. You can do that anywhere. Here you are undisturbed. Stop complaining about flying, make it work as a benefit.\nHave you ever flown across the country overnight? Sure, but do you sleep? I usually sleep, because, unfortunately, I have to do stuff the next day. Some people can\u0026rsquo;t sleep on planes, I\u0026rsquo;m one of those people - except for the redeye, where I always am able to grab sleep.\nBut it\u0026rsquo;s such a waste. Better idea - if you don\u0026rsquo;t need to get a full day in the next day or don\u0026rsquo;t mind being tired later in the day. Get a window seat (or an aisle if you go the bathroom a lot, you\u0026rsquo;re choice.) And take a nap for several hours (4 PM - 8 PM, or at least 5 PM - 8:30 PM) before getting on a 10 pm flight. Now you have all night to think and create. Write. Ideate. Read. Program (I\u0026rsquo;m a coder still.) Invent. Organize. Plan. Whatever…just don\u0026rsquo;t get on the internet and start browsing, scrolling, or posting! Do a little of each, an hour of coding followed by an hour of writing followed by an hour of reading and wrap it up by planning out the next few weeks. That flight will be priceless.\nAnd before someone comments about how they \u0026ldquo;need the internet\u0026rdquo; to do these things….no you don\u0026rsquo;t. You really don\u0026rsquo;t. I use the internet a bunch when I\u0026rsquo;m coding. But without the internet I just put a \u0026ldquo;//TODO\u0026rdquo; in my code and return to it later. This actually drives efficiency because we are forced to move along rather than get sucked down a rat-hole. The same is true for anything else. Get done what you can and then go back to research the open items. If you jump straight to finding out the answers you are constantly distracted. Screw that, that\u0026rsquo;s the path of low productivity.\nBut, last, make sure you download some music (and maybe even a television show or two) if you know you\u0026rsquo;ll need a mental rest. Just don\u0026rsquo;t download so many you can skip the hard parts can get overtaken by re-watching the Sopranos for the third time. Make sure your mobile device only contains enough for 20% of your flight - and don\u0026rsquo;t start watching until you\u0026rsquo;re at least half-way through the trip.\nAnd yes, this was written while on plane and posted after we landed.\nTheoretically the same applies to trains, but for me (personally) it doesn\u0026rsquo;t work because the train is too bouncy to use a computer comfortably. You may not be as motion sensitive - be thankful for that.\nFinally, don\u0026rsquo;t treat this as an absolute rule. If you must have internet access for a flight to work on a proposal due the next day: Use the damn internet, fool! But if that is every time you are on a plane you probably want to reconsider your approach to life and work.\n","permalink":"https://test.nicknow.net/focus-by-flying-without-airplane-internet/","summary":"\u003cp\u003eI used to have a monthly Gogo Wifi subscription. Then I got rid of it. Flying is better for me now, it\u0026rsquo;s more beneficial because it helps me to focus.\u003c/p\u003e\n\u003cp\u003eNot long ago I realized that Delta offered free wifi for messaging (iMessage, WhatsApp, etc.) Awesome. Now I can stay in contact but not get sucked into Apps and Internet world. I wish American offered this, but they don\u0026rsquo;t - so choose Delta if it\u0026rsquo;s an option.\u003c/p\u003e","title":"No Gogo: Gain Focus by Flying Without Internet"},{"content":"Microsoft Inspire 2018 wrapped up on Thursday (7/19) with a Bruno Mars concert. But, before the music there were a bunch of very useful sessions on Microsoft Business Applications (i.e., Dynamics 365, PowerApps, Flow, PowerBI, etc.)\nYes, I know the marketing/branding still a bit unclear but hopefully that will be cleared up by James Phillips next week at the Microsoft Business Applications Summit in Seattle.\nYou can find all the session videos from Microsoft Inspire 2018 on the web site. I\u0026rsquo;ve curated a handful of sessions that would be top of list in prioritizing. I still recommend going through the site and finding other sessions that may be of interest.\nFull Disclosure These are the session that I recommend, and are driven by my biases. My world is all about building applications that automate business processes (the more complex the more fun) for enterprises and governments. So I generally do not spend much time working with and thinking about the ERP side (Business Central/Finance and Operations) while I spend a lot of time with PowerApps and newer Dynamics 365/CDS platform capabilities.\nAnd, as always, although I work for Microsoft this blog is purely my personal opinion.\nLastly, as a reminder, these sessions are from Inspire, which is a partner oriented event. They are focused on bringing information to partners and enabling those partners to support customers in solving their challenges. I still believe a lot of this information is just as relevant and useful for end-users, but it is not presented directly for end-users.\nFavorites for Business Applications These first four are my favorite sessions and really get you into PowerApps and Flow, what are going to change the approach to delivering applications.\nBA138t - Build a full business app in 10 minutes\nJoin this fast-paced overview and hear how to leverage Microsoft PowerApps and the Common Data Service for Apps to create rich and comprehensive apps, leveraging a custom data model, forms and tools to guide users through your business processes.\nBA137 - Accelerate your business with PowerApps and the Business Application Platform\nTurn your business expertise into solutions with ease and transform your business with the Business Application Platform. PowerApps, Microsoft Flow, the Common Data Service and Power BI enable rapid development of web and mobile business apps, standalone or across Office 365 and Dynamics 365. Together they help combine data across business solutions for richer insight, new business opportunities, and competitive advantage. Learn about the current state of platform and our vision for the future.\nBA153 - Business process digital transformation with Microsoft Flow\nWith Microsoft Flow – Microsoft’s workflow and business process management platform – it’s now easier for every business to transform how they work. Used by end-users and developers alike, Flow has deep integrations into Office 365, Microsoft Dynamics 365, the Common Data Service for Apps, and over 200 other services. Learn how you can leverage Flow to drive an automation culture across organizations. This session covers both the current state of platform and our vision for the future.\nBA114 - Driving action from Azure IoT: Connected field service\nThis is all about Dynamics 365 Field Service. If you are not active in Field Service you are missing out on a huge opportunity, whether for your own business or (if you are a partner) for your customers. Automating field service operations and deploying connected devices to make proactive field service a reality is a requirement for everyone - or you will eventually be passed by your competition.\nWelcome to the new connected world. We are rapidly moving from reactive to proactive, designed to delight our clients. Harnessing the power of Azure IoT Suite and Microsoft Dynamics 365 for Field Service, you can help your customers transform the concept of “everything as a service” with predictive maintenance to reduce costs, improve customer service and open new revenue channels. Join Ben Vollmer, WW Field Service Lead, to learn more about bringing connected field service to your market.\nGood To Know These sessions are all really well done and present valuable information that everyone - customers and partners - should know.\nBA001 - Accelerate your digital transformation with business applications 60 minutes\nA great overview of how Microsoft Business Applications can be used to drive digital transformation in a variety of organizations.\nLearn about Microsoft Business Applications and see innovative solutions that are helping our mutual customers on their digital transformation journey. Join us to get a 360 degree view of how leveraging Microsoft Dynamics 365 and Power BI provide a robust platform to support continued growth, while providing customers with intelligent solutions that connect people, products and ideas, deliver exceptional customer experiences, unify and optimize operations.\nBA106t - Having Dynamics 365 customer engagement security/compliance conversations\nYou will have these conversations. Security will keep coming up. And the answer of the cloud is more secure than most private data centers isn\u0026rsquo;t going to cut it. Learn to talk about cloud security.\nWhen customers come to Microsoft Dynamics 365 cloud services, there are some common discussions and concerns they wish to raise. In this session we share experiences of having security/compliance discussions with customers as they make the move to Dynamics 365 and the information and approaches that can be used to reassure and confirm to customers that Dynamics 365 is a secure and compliant service that they can rely on.\nBA110p - Microsoft Dynamics 365 for Customer Service: Capitalize on the Customer Service opportunity by understanding your customers and selling value\nJoin this session as we explore the current market opportunity, the pains that compel organizations to evaluate customer service solutions, and how to position Microsoft Dynamics 365 for Customer Service as the hero over competing offers.\nOFC403t - Microsoft Visio: Business insights at a glance\nVisio lives and it makes PowerBI even better!\nHelp customers bring their ideas to life with Visio. Microsoft Visio integrates with other powerful tools, such as Power BI, to update or add real-world visualizations to diagrams.\nIndustry These are not necessarily about Microsoft Business Applications but they focus on government, where I spend a lot of my time. Plus, you often find some of the most interesting and challenging use cases in government. The solutions to those use cases can then be a driver for solutions outside of government.\nIND32 - Empowered by innovation in Civilian and Local/Regional Government\nIND33 - Empowered by innovation in defense and intelligence\n","permalink":"https://test.nicknow.net/microsoft-business-applications-powerapps-dynamics-365-inspire-2018/","summary":"\u003cp\u003e\u003ca href=\"https://news.microsoft.com/inspire2018/\"\u003eMicrosoft Inspire 2018\u003c/a\u003e wrapped up on Thursday (7/19) with a Bruno Mars concert. But, before the music there were a bunch of very useful sessions on Microsoft Business Applications (i.e., Dynamics 365, PowerApps, Flow, PowerBI, etc.)\u003c/p\u003e\n\u003cp\u003eYes, I know the marketing/branding still a bit unclear but hopefully that will be cleared up by \u003ca href=\"https://www.linkedin.com/in/jamesmalcolmphillips/\"\u003eJames Phillips\u003c/a\u003e next week at the \u003ca href=\"https://www.microsoft.com/en-us/businessapplicationssummit\"\u003eMicrosoft Business Applications Summit\u003c/a\u003e in Seattle.\u003c/p\u003e\n\u003cp\u003eYou can find all the session videos from Microsoft Inspire 2018 on the \u003ca href=\"https://myinspire.microsoft.com/videos\"\u003eweb site\u003c/a\u003e. I\u0026rsquo;ve curated a handful of sessions that would be top of list in prioritizing. I still recommend going through the site and finding other sessions that may be of interest.\u003c/p\u003e","title":"Microsoft Business Applications (PowerApps/Dynamics 365) at Inspire 2018"},{"content":"This will be a quick post, but thought someone out there might find it useful if they are working in Microsoft Flow and need to get a local date and time and/or format a date and time.\nThis evening I was building a Flow. In this case it is a Flow that sends an email and I wanted to include the current date in the subject of the email (i.e., \u0026ldquo;Here are your work items for 01/21/2018\u0026rdquo;.) The expression design in Flow still seems odd to me - being that I primarily write C# code and a good bit of JavaScript.\nSo after a few minutes of digging I figured out the expression:\nformatDateTime(convertFromUtc(utcNow(),\u0026lsquo;Eastern Standard Time\u0026rsquo;), \u0026rsquo;d\u0026rsquo;)\nBe sure to replace \u0026lsquo;Eastern Standard Time\u0026rsquo; with the correct time zone name. You can get a list from this Microsoft support site. Be sure to use the value in the Name of Time Zone column. Also, if you are using a time zone with periods \u0026ldquo;.\u0026rdquo; in it you may or may not need to remove them, you\u0026rsquo;ll have to experiment. You can also get a list of time zone names on your computer (so they should work on Flow, but not guaranteed) with this line of code in LINQPad:\nTimeZoneInfo.GetSystemTimeZones().Dump();\nYou can find the options for the time zone format here in the .NET documentation.\nAnd keep having fun with Microsoft Flow\u0026hellip;it\u0026rsquo;s a great platform that is constantly growing with new Connectors and Actions!\n","permalink":"https://test.nicknow.net/microsoft-flow-dates-times-timezones-formatting/","summary":"\u003cp\u003eThis will be a quick post, but thought someone out there might find it useful if they are working in \u003ca href=\"https://flow.microsoft.com/\"\u003eMicrosoft Flow\u003c/a\u003e and need to get a local date and time and/or format a date and time.\u003c/p\u003e\n\u003cp\u003eThis evening I was building a Flow. In this case it is a Flow that sends an email and I wanted to include the current date in the subject of the email (i.e., \u0026ldquo;Here are your work items for 01/21/2018\u0026rdquo;.) The expression design in Flow still seems odd to me - being that I primarily write C# code and a good bit of JavaScript.\u003c/p\u003e","title":"Microsoft Flow Dates Times Timezones and Formatting"},{"content":"As a Dynamics 365 (CRM) developer you have probably come to rely on the Dynamics CRM SDK over the years. With the release of Dynamics 365 Customer Engagement 9.0 (a.k.a. July 2017 Update) the old downloadable SDK has been replaced by an online document set and NuGet packages. This allows the SDK to become more of a living document where everyone is always referencing the most up-to-date information from Microsoft. Overall, I believe this is a big positive for developers which will make for a better development experience.\nNow, just because it\u0026rsquo;ll be better in the long-term doesn\u0026rsquo;t mean there isn\u0026rsquo;t some pain. Primarily, the question of where do I get this info and how do I use these NuGet packages. Or, as someone put it, where did the Plugin Registration Tool go. Don\u0026rsquo;t worry, everything is still available and easily accesses.\nFirst, as a developer you will want to use (probably bookmark) the following link: Developer Guide for Dynamics 365 Customer Engagement (a.k.a. Dynamics CRM SDK).\n[caption id=\u0026ldquo;attachment_520\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;600\u0026rdquo;] The Dynamics 365 SDK on docs.microsoft.com[/caption]\nAn Interactive SDK One of the great things about driving SDK usage to docs.microsoft.com is that users are encouraged to provide immediate feedback on the SDK. The SDK pages allow for public comments and responses. The result being that over time a richer will come to be than could ever be produced by just the product team responsible for documentation. When you find something is slightly different than the SDK says, just post a comment to let Microsoft know and also to help other developers who may come to that page looking for the information.\n[caption id=\u0026ldquo;attachment_521\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;650\u0026rdquo;] Example of Commenting on Dynamics SDK content on docs.microsoft.com[/caption]\nWhere is PluginRegistrationTool.exe? So all of the binaries and tools that you previously got as part of the SDK download have been moved to NuGet packages. This makes it much easier for Microsoft to update and distribute them. It should also make your job as a developer much easier, because you can take a depedency on NuGet (released packages can\u0026rsquo;t be deleted) and always get the latest before doing a build - eliminating the need to store a binary file in your source code control system.\nOkay, but I still need the PluginRegistrationTool.exe file so how do I get it? The good news is that Microsoft has put together an easy to use PowerShell script to download the unpack the relevant NuGet file. If you go the Download tool from NuGet page you\u0026rsquo;ll find the list of NuGet packages and a handy PowerShell script with instructions.\nFollow the instructions on the page to install all the relevant bits. In about 30 seconds, depending on how fast the downloads go, you\u0026rsquo;ll have a directory full of all the SDK goodies you need to build amazing solutions with Dynamics 365.\n[caption id=\u0026ldquo;attachment_513\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;809\u0026rdquo;] Listing of \\tools\\pluginregistration after installing NuGet Packages using PowerShell[/caption]\nOther NuGet Packages for the Dynamics SDK Additional NuGet packages from Microsoft can be found at: https://www.nuget.org/profiles/crmsdk. You\u0026rsquo;ll need to write up your own PowerShell to automate downloading and unpacking these, as necessary. Most of these are for use in Visual Studio as part of your development pipeline (and should be handled by Visual Studio) but there are some, such as sample code, that you may find handy at times.\n","permalink":"https://test.nicknow.net/get-dynamics-crm-sdk-dynamics-365-customer-engagement-sdk-9-0-and-beyond/","summary":"\u003cp\u003eAs a Dynamics 365 (CRM) developer you have probably come to rely on the Dynamics CRM SDK over the years. With the release of Dynamics 365 Customer Engagement 9.0 (a.k.a. July 2017 Update) the old downloadable SDK has been replaced by an online document set and NuGet packages. This allows the SDK to become more of a living document where everyone is always referencing the most up-to-date information from Microsoft. Overall, I believe this is a big positive for developers which will make for a better development experience.\u003c/p\u003e","title":"Where to Get the Dynamics CRM SDK (Dynamics 365 SDK)"},{"content":"“Normality is a paved road: It’s comfortable to walk, but no flowers grow on it.”\n― Vincent van Gogh Too many people spend their time seeking normality and the false security it provides. In reality, normality is a front - it makes you think you are safe, while providing no safety net at all. For when you need a safety net, normality will leave you there unprepared and inexperienced to change direction, take the other fork in the road, challenge the status quo, or make change happen.\nNormality will leave you unprepared to handle the unexpected, normality is based on things changing slightly in a world that looks significantly the same.\nEmbrace being the exception, embrace the nontraditional, eccentric, and unconventional. This isn\u0026rsquo;t a call to be different for the sake of being different. It is a call to to look at things differently, assume changes are coming that don\u0026rsquo;t fit the current paradigm, and to embrace the joy of not knowing.\nYou don\u0026rsquo;t know the future, nobody does. A lot of people guess and some get it right. The greatest, the real successes, know they don\u0026rsquo;t know and are constantly building and preparing for different outcomes that take things in different directions.\nFundamentally, this is what we need to teach ourselves and our children. It is this ability to think, more than a specific skill: STEM, English, Art, Music, etc. that will separate the winners and losers. Building diverse skill-sets is more important now (and will be in the future) than a specific skill, because you can\u0026rsquo;t possibly know what you will need to know in five years let alone twenty.\n","permalink":"https://test.nicknow.net/normality-not-future/","summary":"\u003cp\u003e“Normality is a paved road: It’s comfortable to walk, but no flowers grow on it.”\u003c/p\u003e\n\u003cp\u003e― Vincent van Gogh\nToo many people spend their time seeking normality and the false security it provides. In reality, normality is a front - it makes you think you are safe, while providing no safety net at all. For when you need a safety net, normality will leave you there unprepared and inexperienced to change direction, take the other fork in the road, challenge the status quo, or make change happen.\u003c/p\u003e","title":"Normality Is Not For The Future"},{"content":"If you don’t “do” New Year’s resolutions or they work for you or really for any other reason this doesn’t apply to you, please ignore it.\nThis year skip your New Year’s resolution and make a January 31-Day Resolution, you are much more likely to keep that resolution and positively impact your life. And make it a real resolution — something both measurable and achievable.\nCannot Measure vs Can Measure You cannot measure success against “losing weight”, “eating healthier”, “drinking less”, “liking your job”, \u0026ldquo;being a better friend\u0026rdquo;, etc. You can measure “lose 5 pounds”, “don’t eat processed foods”, “no more than 3 drinks a week”, “apply to three jobs a week”, \u0026ldquo;call someone you haven\u0026rsquo;t talked to in 3 months each week\u0026rdquo; etc. If you cannot measure your goal you cannot know if you are achieving your goal — i.e., it will be just a crap shoot hoping for the outcome you desire.\nMake your resolution realistic. If you haven’t been to the gym in a year then you shouldn’t commit to working out 5 days a week for an entire year — be realistic, commit to yourself 30 minutes twice a week. If you eat pizza three times a week don’t say you won’t eat pizza for an entire year — be realistic, pizza on Friday only. If you set unrealistic goals you are likely to either intimidate yourself into failure or become so overwhelmed in a short period of time that you quit.\nSetting a measurable goal and then measuring your achievement of that goal is the only way to successfully improve yourself.\nCommit for a Month Now, forget the New Year’s Resolution and go with the January 31-Day Resolution. Same idea, but you are only committing — right now — to do something for the month of January. If it works, if it makes you happy…great, keep it up and move into a February Resolution and then to a March Resolution and on and on. Allow the start of each month to be an opportunity to reevaluate and reset your personal expectations.\nBy reigning in the New Year Resolution to be the January Resolution you’ll make it easier to stick with your resolution — when you are hating the lack of dairy in your diet next Friday you are only three weeks, instead of 51 weeks, away from having a chance to re-evaluate and set new goals.\nSuccess is achieved one step at a time. Marathons are not run in a single step. Set yourself short realistic measurable goals. Execute against those goals. Measure your achievement of those goals. Look at the output of achieving those goals. And then start over.\nIf you haven’t been achieving what you want from your New Year’s Resolutions then don’t you think it is time to try something new? Try out the monthly resolution starting with a January 31-Day Resolution — see how it works for you and then you can decide if you want to continue.\nNote: I\u0026rsquo;m republishing this now (Dec 31 2017), after having originally published this idea two years ago. I successfully used this strategy to eliminate both coffee and soda from my life, back at the start of 2016. Having committed to abstain for just January I discovered I kept it going month-after-month through the entire year. Although I\u0026rsquo;ve since allowed myself to enjoy both beverages, I\u0026rsquo;m now in complete control - as neither are part of my regular lifestyle.\n","permalink":"https://test.nicknow.net/drop-the-new-years-resolution-try-the-january-resolution/","summary":"\u003cp\u003eIf you don’t “do” New Year’s resolutions or they work for you or really for any other reason this doesn’t apply to you, please ignore it.\u003c/p\u003e\n\u003cp\u003eThis year skip your New Year’s resolution and make a January 31-Day Resolution, you are much more likely to keep that resolution and positively impact your life. And make it a real resolution — something both measurable and achievable.\u003c/p\u003e\n\u003ch2 id=\"cannot-measure-vs-can-measure\"\u003eCannot Measure vs Can Measure\u003c/h2\u003e\n\u003cp\u003eYou \u003cstrong\u003ecannot\u003c/strong\u003e measure success against “losing weight”, “eating healthier”, “drinking less”, “liking your job”, \u0026ldquo;being a better friend\u0026rdquo;, etc. You \u003cstrong\u003ecan\u003c/strong\u003e measure “lose 5 pounds”, “don’t eat processed foods”, “no more than 3 drinks a week”, “apply to three jobs a week”, \u0026ldquo;call someone you haven\u0026rsquo;t talked to in 3 months each week\u0026rdquo; etc. If you cannot measure your goal you cannot know if you are achieving your goal — i.e., it will be just a crap shoot hoping for the outcome you desire.\u003c/p\u003e","title":"Drop the New Year’s Resolution try the January Resolution"},{"content":"Interesting original research by Maria Droganova on the historical differences in pay in the US Federal Government (civilian) workforce and how it is impacted by the gender of leadership.\nI found the significant impact of supervisor gender to be most interesting. From a manager/leader side it is a strong indicator that unconscious bias is real, and we must actively manage against it in how we manage. From the worker side, it might indicate that you should target having a same-gender manager to maximize rewards. I find that in offices where all supervisors are men, male wages are on average 10.6% higher than female wages. In contrast, in offices where all supervisors are women, the wage gap in favor of men disappears and becomes 3.2% in favor of women due to a 7.1% increase in female wages and a 6.7% decline in male wages. Also, the gender of an executive (a higher level supervisor) has a lesser impact on wages than the gender of regular supervisors. However, the gender of an executive has a greater impact on wages of supervisors than on wages of non-supervisors, which is consistent with the theory of mentorship. On a personal note, I\u0026rsquo;ve not found this to be my experience. Having had significant time under both male and female direct managers. My experience is just anecdotal and anecdotal doesn\u0026rsquo;t mean much, always look to the research.\nThis was another section I found interesting. It may have political ramifications in terms of the anger we see from certain demographics. If men are seeing more competition for promotion there may be a segment of us that are prone to backlash and anger over what everyone else would call progress: I find that under female leadership, the female employees have higher propensity to be promoted, a higher starting position and a higher exiting position than under female leadership. For male employees, female leadership decreases their chances to be promoted and increases their chances to exit and have lower exiting positions. Droganova, Maria, Women Working for Women: Career Advancement and the Gender Wage Gap in the U. S. Federal Government (November 30, 2017). Available at SSRN: https://ssrn.com/abstract=3074466\n","permalink":"https://test.nicknow.net/gender-pay-promotion-us-federal-workforce/","summary":"\u003cp\u003eInteresting original research by \u003ca href=\"https://www.linkedin.com/in/maria-droganova-95549b28/\"\u003eMaria Droganova\u003c/a\u003e on the historical differences in pay in the US Federal Government (civilian) workforce and how it is impacted by the gender of leadership.\u003c/p\u003e\n\u003cp\u003eI found the significant impact of supervisor gender to be most interesting. From a manager/leader side it is a strong indicator that unconscious bias is real, and we must actively manage against it in how we manage. From the worker side, it might indicate that you should target having a same-gender manager to maximize rewards.\nI find that in offices where all supervisors are men, male wages are on average 10.6% higher than female wages. In contrast, in offices where all supervisors are women, the wage gap in favor of men disappears and becomes 3.2% in favor of women due to a 7.1% increase in female wages and a 6.7% decline in male wages. Also, the gender of an executive (a higher level supervisor) has a lesser impact on wages than the gender of regular supervisors. However, the gender of an executive has a greater impact on wages of supervisors than on wages of non-supervisors, which is consistent with the theory of mentorship.\nOn a personal note, I\u0026rsquo;ve not found this to be my experience. Having had significant time under both male and female direct managers. My experience is just anecdotal and anecdotal doesn\u0026rsquo;t mean much, always look to the research.\u003c/p\u003e","title":"Gender, Pay, and Promotion in the US Federal Workforce"},{"content":"A client of mine recently asked for support to show the next birthday for a contact. Often there will be an ask for a list view of contacts with a birthday in the next month. In this post I\u0026rsquo;m going to show you how to use a business rule and calculated fields to achieve this functionality without writing any code. This will be a a native calculated field so it can be used in lists, forms, queries, etc.\nThis is not limited to birthdays, the same method use can used to calculate any anniversary date. Sale anniversaries, on-hire anniversaries, wedding anniversaries, etc. In this example I\u0026rsquo;m going to do the birthday for a contact - but this strategy can be used with any date field.\nThe design uses all out-of-the-box configuration capabilities. There is no code, nothing unsupported, and nothing \u0026ldquo;wacky\u0026rdquo; - just a few fields and a business rule (and a workflow if you want to update historical records.) So lets get started.\n*For this post I\u0026rsquo;ll be working with the most recent online release. *\nGet The Right Type of Birthday Field Our goal is to have a field which shows us the Next Birthday of the contact.\n[caption id=\u0026ldquo;attachment_455\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;415\u0026rdquo;] Contact\u0026rsquo;s Birthday Field[/caption]\nThe birthday field on the contact entity is date only. Unfortunately this means we will not be able to use the date differential calculations in a calculated field with it.\nThe solution to this is to copy the value to a date and time field that can be used in a calculated field formula. We\u0026rsquo;ll start by creating a new field, new_internalbirthday, to hold this value. By creating a new field we allow any existing uses of birthday field to continue working - so we don\u0026rsquo;t have to change any forms, views, reports, etc. In addition, we don\u0026rsquo;t have to worry about an instance where someone (or some AppSource solution) expects birthdays to be in the *birthday *field, and they aren\u0026rsquo;t.\n[caption id=\u0026ldquo;attachment_457\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;810\u0026rdquo;] Create the Internal Birthday field[/caption]\nNext we need to create and activate a business rule to populate the new_internalbirthday field - this rule should be scoped to Entity. This rule copies the value of birthday to new_internalbirthday, or clears it if birthday is blank.\n[caption id=\u0026ldquo;attachment_460\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;667\u0026rdquo;] Business Rule to Populate Internal Birthday[/caption]\nWhat Day Is It You\u0026rsquo;ll find that calculated field conditions do not have the ability to use the NOW() function. I have not investigated whether you can work around this by updating your calculated field formula using the SDK (i.e., is it really not possible or just a UI limitation.) In order to work around this limitation we\u0026rsquo;ll create a calculated field to represent the current date minus one day, this will allow us to refer to that field in a calculated field condition statement. (BONUS: You can use this same strategy to access the current date in a business rules - just account for the minus one day!)\nMinus one day? Yep, it\u0026rsquo;s the only way I\u0026rsquo;ve found to reliably ensure that if a birthday falls on today\u0026rsquo;s date that it will show today as the birthday and not the birthday next year (which could cause a lot of confusion.)\n[caption id=\u0026ldquo;attachment_471\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;811\u0026rdquo;] Create the Internal Today Minus One field[/caption]\nAnd configure the field calculation to set the field equal to NOW() - 1:\n[caption id=\u0026ldquo;attachment_472\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;464\u0026rdquo;] Calculated Field Definition[/caption]\nCalculate The Next Birthday (or Anniversary date) Now we can create a calculated field to get the next birthday of the contact. This will require an intermediate calculated field to calculate the contact\u0026rsquo;s birthday for the current calendar year. WHY? Well, because of the limited functions available for a calculated field formula we have to use two formulas to calculate the Next Birthday, depending on whether the contact\u0026rsquo;s birthday this year has already occurred. And, we need to know the birthday in the current calendar year so we can compare it to the new_internaltodayminusone field we previously created.\nSo, yes, we are creating two calculated fields (*new_internaltodayminusone *and new_internalbirthdaythisyear) to use in an If/Then condition to know what formula will give us the correct date for the contact\u0026rsquo;s next birthday.\nCreate a field, new_internalbirthdaythisyear, which will always represent the contact\u0026rsquo;s birthday in the current calendar year:\n[caption id=\u0026ldquo;attachment_468\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;810\u0026rdquo;] Create the Internal Birthday This Year field[/caption] And configure the field calculation:\n[caption id=\u0026ldquo;attachment_469\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;747\u0026rdquo;] Calculate The Contact\u0026rsquo;s Birthday for the Current Year[/caption]\nNext we create the field new_nextbirthday (this will be the field we actually show on forms and views):\n[caption id=\u0026ldquo;attachment_461\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;810\u0026rdquo;] Create the Next Birthday field[/caption]\nNow we setup the field calculation:\n[caption id=\u0026ldquo;attachment_473\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;701\u0026rdquo;] Calculated Field Definition for new_nextbirthday[/caption]\nThis calculation checks if the new_internalbirthdaythisyear field is greater than or equal to new_internaltodayminusone. If it is greater than the contact\u0026rsquo;s birthday has not occurred yet and we set the field equal to new_internalbirthdaythisyear. Otherwise, the birthday has occurred and we the field equal to new_internalbirthdaythisyear plus one year (since their next birthday is in the next calendar year.)\nGo ahead and add the new_nextbirthday field to your contact form (if you want.) I also decided to rename Birthday to Birthdate, for clarity. And now you are free to start building views like this (so you don\u0026rsquo;t forget to send out a birthday card to your favorite customers!)\n[caption id=\u0026ldquo;attachment_476\u0026rdquo; align=\u0026ldquo;alignnone\u0026rdquo; width=\u0026ldquo;520\u0026rdquo;] Filter a Contact View by Birthday Next Week[/caption]\nBtw, this is also a great place to use the new_internalbirthdaythisyear field - since it doesn\u0026rsquo;t change when their birthday occurs. So if you want a list of all birthdays in the current month that\u0026rsquo;ll stay static through the month, use the new_internalbirthdaythisyear field.\nWarning: You can filter on new_nextbirthday in the view but you cannot sort on it.\nExisting Records If you have existing contacts with the birthday field populated you\u0026rsquo;ll need to create a workflow to copy the value over to new_internalbirthday. For new and modified records this will be handled by the business rule we created, but the business rule only runs during record creation and when there is an applicable update. Create an on-demand workflow that will check if birthday has a value and copy it to new_internalbirthday. It should look similar to: You can execute this manually, by selecting up to 250 records at a time and running it, or us the Bulk Workflow Tool plugin for XRM Toolbox. Have fun, keep making users happy, and continue to bring the awesomeness of Dynamics 365 to users everywhere!\n","permalink":"https://test.nicknow.net/dynamics-365-calculate-view-next-birthday-anniversary-date/","summary":"\u003cp\u003eA client of mine recently asked for support to show the \u003cstrong\u003enext\u003c/strong\u003e birthday for a contact. Often there will be an ask for a list view of contacts with a birthday in the next month. In this post I\u0026rsquo;m going to show you how to use a business rule and calculated fields to achieve this functionality without writing any code. This will be a a native calculated field so it can be used in lists, forms, queries, etc.\u003c/p\u003e","title":"Dynamics 365: Calculating Next Anniversary/Birthday Date"},{"content":"Since it is the start of December we\u0026rsquo;re now down to one month left to accomplish this year\u0026rsquo;s goals and set some goals for next year\u0026hellip;for a lot of people those goals include getting some big projects done, and one of the reasons we fail to accomplish a lot of our big projects is because we aren\u0026rsquo;t in the right state to do deep work.\nDeep Work I only came across this NPR podcast (worth the 40 minutes to listen to) from July the other day and found it very interesting, in light of the need many of us have to find ways to be more effective. I see people complaining about their procrastination problem. (And no, you probably don\u0026rsquo;t have ADHD - not even \u0026ldquo;a little bit\u0026rdquo; - but if you think you legitimately might have ADHD then find a good psychiatrist and schedule an appointment.) Our world is becoming full of distractions and that is taking away from our ability to really focus and do deep work.\nI suspect what a lot of people describe as a procrastination issue is actually more of a distraction issue. If locked in a room where they could only do task A they would quickly accomplish task A and then be bored, but if locked in a room with all kinds of things to look at and explore they would go for the fun and the easy, before - if ever - getting to task A. That isn\u0026rsquo;t a procrastination problem, it\u0026rsquo;s a focus problem. Procrastinators put things off because they are anxious about starting them, distracted people put things off because they have found other things to do. But Cal Newport, a computer scientist at Georgetown University and author of Deep Work: Rules for Focused Success in a Distracted World*, *says we\u0026rsquo;re downplaying the problems created by constant interruption.\n\u0026ldquo;We treat it, I think, in this more general sense of, \u0026rsquo;eh, I probably should be less distracted.\u0026rsquo; But I think it\u0026rsquo;s more urgent than people realize,\u0026rdquo; he says.\nBy letting email and other messages guide our workday, Cal says we\u0026rsquo;re weakening our ability to do the most challenging kinds of work**—**what he calls \u0026ldquo;deep work.\u0026rdquo; Deep work requires sustained attention, whether the task is writing marketing copy or solving a tricky engineering problem. If you want to accomplish stuff. I don\u0026rsquo;t mean just get your work done, I\u0026rsquo;m talking about accomplishing big things - the things that matter, the things that have impact, the things that get you new opportunities and promotions - then you have to learn how to do deep work in our age of distractions.\nOne of the points that Cal made in the podcast is that anyone who has to use their brain - any role that has a level of creative thinking - will be impacted by their inability to engage in deep work. He makes the point that this is no difference than a lots of hands-on work. Craftsman have long known they needed to have focus to accomplish their best work - think of wood workers, jewelers, welders, etc. They all know they need clear singular focus on their task to do their best, so as Cal points out why would we expect that it would be any different just because you are trying to figure out a financial model in Excel or build a marketing presentation in PowerPoint.\nGoing Cold Turkey Two related things that I\u0026rsquo;ve found to help fight the distractions and get to deep work are Cold Turkey (getcoldturkey.com) and Cold Turkey Writer (getcoldturkey.com/writer). Cold Turkey is available for Mac, Windows, and Android while Cold Turkey Writer is available for Mac and Windows. Both applications have Free versions - fully functional - and paid versions with even more features!\nThe first of these blocks websites. I shutdown Outlook \u0026amp; Skype, silence my phone and put it in the other room, and start a two hour session of Cold Turkey - viola, there is nothing to distract me for a couple hours and even if I\u0026rsquo;m tempted to open a web browser and look at news, social media, Amazon, Gmail, etc. I\u0026rsquo;m blocked from doing so (which is a very in-your-face reminder that you are trying to cheat.) This is a great way to get into a deep work phase.\nI use Cold Turkey Writer for when I need to be totally focused on getting ideas written down. I love it! Just fire it up and set a goal: time (minutes) or words typed. It blocks out your entire screen until whichever goal you selected is met. It isn\u0026rsquo;t fancy, but that is a large part of the effort. You can spend a lot of time laying out text or animating a PowerPoint - but first you need to get the ideas out of your head and that is what Cold Turkey Writer really enables.\nImagine sitting in front of a computer where the only thing you can do is write for 60 minutes each day. I\u0026rsquo;ll bet you would produce and document some amazing ideas both for things you must think about (what is going on today) and things you want to think about for the future. Give it a try for a few weeks - it saves the files to your documents folder - and then take a look to see what you have produced. My guess is you\u0026rsquo;ll be pretty impressed with yourself.\n","permalink":"https://test.nicknow.net/deep-work-stopping-distractions-killing-performance/","summary":"\u003cp\u003eSince it is the start of December we\u0026rsquo;re now down to one month left to accomplish this year\u0026rsquo;s goals and set some goals for next year\u0026hellip;for a lot of people those goals include getting some big projects done, and one of the reasons we fail to accomplish a lot of our big projects is because we aren\u0026rsquo;t in the right state to do deep work.\u003c/p\u003e\n\u003ch3 id=\"deep-work\"\u003eDeep Work\u003c/h3\u003e\n\u003cp\u003eI only came across \u003ca href=\"https://www.npr.org/2017/07/25/539092670/you-2-0-the-value-of-deep-work-in-an-age-of-distraction\"\u003ethis NPR podcast\u003c/a\u003e (worth the 40 minutes to listen to) from July the other day and found it very interesting, in light of the need many of us have to find ways to be more effective. I see people complaining about their procrastination problem. (And no, \u003ca href=\"https://totallyadd.com/blog/23-signs-you-do-not-have-adhd/\"\u003eyou probably don\u0026rsquo;t have ADHD\u003c/a\u003e - not even \u0026ldquo;a little bit\u0026rdquo; - but if you think you legitimately might have ADHD then find a good psychiatrist and schedule an appointment.) Our world is becoming full of distractions and that is taking away from our ability to really focus and do \u003cem\u003edeep work\u003c/em\u003e.\u003c/p\u003e","title":"Deep Work: Stopping the Distractions Killing Your Performance"},{"content":"This site and its contents are Copyright © 2008 - 2026 by Nicolas A. Nowinski. Some content, including images, may be from third-parties and is used in accordance with the licensing provided by those third parties.\nAll original (i.e., not third-party) content is licensed under Creative Commons Attribution-NoDerivatives 4.0 International CC BY-ND 4.0. It is the obligation of the user/publisher to confirm the content being used is original content and not from a third-party.\nAll original source code is licensed under the MIT License.\n","permalink":"https://test.nicknow.net/copyright/","summary":"\u003cp\u003eThis site and its contents are Copyright © 2008 - 2026 by Nicolas A. Nowinski. Some content, including images, may be from third-parties and is used in accordance with the licensing provided by those third parties.\u003c/p\u003e\n\u003cp\u003eAll original (i.e., not third-party) content is licensed under Creative Commons Attribution-NoDerivatives 4.0 International \u003ca href=\"https://creativecommons.org/licenses/by-nd/4.0/\"\u003eCC BY-ND 4.0\u003c/a\u003e. It is the obligation of the user/publisher to confirm the content being used is original content and not from a third-party.\u003c/p\u003e","title":"Copyright \u0026 License"},{"content":"I saw this tweet from the Tom Peters (@tom_peters), the management guru, the other day and it really struck a cord with me.\nhttps://twitter.com/tom_peters/status/914155487595245569\nI can\u0026rsquo;t say I always felt that way, there was a time I would have put \u0026ldquo;nice person\u0026rdquo; lower down on my criteria for hiring someone. My younger self would have said nice is nice but smarts are way smarter. I still believe smarts are important (as is drive, motivation, passion) but I have come to firmly believe nice matters a lot.\nWhy? Because people who aren\u0026rsquo;t nice have a harder time getting along well with others and getting along well is one of the keys to building a high-performing team (HPT) and creating HPTs is one of the keys to going from ordinary performance to extraordinary performance. See it here.\nIf we start with the premise that you look for motivated and driven people with passion then I would take someone 75% as smart if they were nice and the other person wasn\u0026rsquo;t. In very few cases will your hiring decision be about a single person\u0026rsquo;s performance, it is about building a team that will achieve maximum performance.\nSo hire nice people that are reasonable smart and motivated and driven and have passion. With the right leadership those people are way more likely to build teams that perform at a high level day-in-day-out than a bunch of super smart folks that aren\u0026rsquo;t willing to get along with each other and put the focus on the team\u0026rsquo;s overall success.\n","permalink":"https://test.nicknow.net/hire-nice-people/","summary":"\u003cp\u003eI saw this tweet from the Tom Peters (\u003ca href=\"https://twitter.com/tom_peters\"\u003e@tom_peters\u003c/a\u003e), the management guru, the other day and it really struck a cord with me.\u003c/p\u003e\n\u003cp\u003e\u003ca href=\"https://twitter.com/tom_peters/status/914155487595245569\"\u003ehttps://twitter.com/tom_peters/status/914155487595245569\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eI can\u0026rsquo;t say I always felt that way, there was a time I would have put \u0026ldquo;nice person\u0026rdquo; lower down on my criteria for hiring someone. My younger self would have said nice is nice but smarts are way smarter. I still believe smarts are important (as is drive, motivation, passion) but I have come to firmly believe nice matters a lot.\u003c/p\u003e","title":"Hire Nice People To Build Effective Teams"},{"content":"Almost every B2C (Business to Consumer) organization knows that high-quality customer service is critical in today\u0026rsquo;s market. But many B2B (Business to Business) and B2G (Business to Government) firms fail to pay enough attention to customer service, this is a critical mistake.\nThe B2B/B2G customer is also a B2C customer and expects the same service from their business partners - technology partners, marketing firms, real estate, consultants, etc. - as they get at Nordstrom.\nThis will become even more so as a new generation of leadership takes over that sees less of a line between their professional life and their business life. As the managers and leaders of tomorrow take over they are going to expect, frankly demand, their relationships with business vendors look more like the business relationships they have in their personal life. This will mean they expect a 24/7 personalized friction-less online experience. Just as firms must adjust to a new generation of workers they must also adjust to a new generation of business customers.\nIn this Forbes article, How To Humanize Customer Service For B2B Organizations, Shep Hyken provides four areas that every B2B leader should consider in their customer service game plan:\n- ***Understand the customer:*** Customer support agents must have information about the customer – both the company and its employees. Support must be able to see the entire picture, which includes the customer’s profile, history of purchases, problems and more. A good system should be able to bring all of that information together. And while you may get info on the company as a whole, you must remember that you are dealing with a person (or people) inside that company. Having access to this information is essential, as it is the basis for delivering a good customer experience. - ***Provide omnichannel support options:*** Giving customers options for how they connect with you is prevalent in the B2C world, but not as much in B2B. Still, customers from any type of business want to be able to connect with you in the way that’s most convenient for them. Cater to those preferences. Some may want to use the phone. Others might want to engage in chat, a ticket system, or even a self-service option. Not all options may be used, but all may need to be considered. Furthermore, the system you use to manage your customer support must consolidate all of the customer’s information, regardless of the channel the customer uses. It must appear seamless. - ***Use multimedia support tools to save time and provide clarity in communications:*** This is one of my favorite ways to deliver support. Using video, audio, screen sharing and other multimedia tools can create a great customer experience. For example, an agent can create a custom video for the customer. That is a powerful way to interact. Something as simple as a how-to video can be just as effective when presented the right way. Using company employees as the “stars” of the video also creates a Human-to-Human connection. There are many ways to use multimedia to enhance and humanize the customer’s experience. - ***Use metrics:*** This is another favorite topic of mine. Measuring performance and analyzing data can help identify which customers need more help and support. Companies can be proactive in reaching out to help, rather than reacting to incoming support requests. Measuring performance can help you spot where more training is needed. TeamSupport suggests that tracking customer satisfaction can shed light on “at-risk” relationships. For example, if a particular agent gets negative reviews from a customer, while the rest of that customer’s reviews about other agents are positive, it may indicate a personality conflict. Again, a good software system can spot this and give the company the information needed to build a stronger relationship with its customers. What shines through in each of these four areas is the critical importance of having the technology for delivering world class customer support. It is not enough to assume this will happen through existing sales and operations channels. The modern B2B/B2G firm needs to ensure that the customer support function is treated with the same importance as sales and finance. Having a customer support leader that reports up to the same level as the CFO, CMO, CIO, etc. should be a no-brainer for any CEO today.\nBottom line: B2B companies must be sure they have the people, processes, and systems to deliver the world class customer support their customers expect, and that means putting it front and center in terms of leadership and resources.\n","permalink":"https://test.nicknow.net/why-b2b-and-b2g-firms-need-nordstrom-customer-service/","summary":"\u003cp\u003e\u003cimg loading=\"lazy\" src=\"http://nicknow.net/wp-content/uploads/2017/08/friendly-customer-service-200x300.jpg\"\u003eAlmost every B2C (Business to Consumer) organization knows that high-quality customer service is critical in today\u0026rsquo;s market. But many B2B (Business to Business) and B2G (Business to Government) firms fail to pay enough attention to customer service, this is a critical mistake.\u003c/p\u003e\n\u003cp\u003eThe B2B/B2G customer is also a B2C customer and expects the same service from their business partners - technology partners, marketing firms, real estate, consultants, etc. - as they get at Nordstrom.\u003c/p\u003e","title":"Why B2B and B2G firms Need Nordstrom Customer Service"},{"content":"I\u0026rsquo;ve become a big fan of extension methods over the years to make my development work in Dynamics CRM, easier to implement and easier to read (i.e., easier to support.) Extension methods allow us to, exactly as the name implies, extended an existing class or interface with new methods - its a simpler version of implementing a derived class.\nAnyone familiar with developing .NET code for Dynamics CRM will be familiar with the IOrganizationService interface and its varied implementations. While in most cases I\u0026rsquo;m a fan of implementing my own version of IOrganizationService, often for code-base simplicity I\u0026rsquo;ll rely on some extension methods for my code.\nTwo of my favorites are to simplify the calling of the IOrganizationService.Retrieve() method. As you are aware the IOrganizationService.Retrieve() method requires an instance of the ColumnSet**()** class. It also has the limitation that will only return an Entity() object, not an early-typed object such as Account(). Now, both of these are minor but I find the resulting code to be less than elegant, and when code is less than elegant it will be more difficult for someone to read in the future.\nHence if I have to write this: _service.Retrieve(Account.EntityLogicalName, recordId, new ColumnSet(true)).ToEntity(); I would prefer to write this: _service.Retrieve(Account.EntityLogicalName, recordId); Or if I have to write this: _service.Retrieve(\u0026ldquo;account\u0026rdquo;, recordId, new ColumnSet(\u0026ldquo;accountid\u0026rdquo;, \u0026ldquo;name\u0026rdquo;, \u0026ldquo;primarycontactid\u0026rdquo;)); I would prefer to write this: _service.Retrieve(\u0026ldquo;account\u0026rdquo;, recordId, \u0026ldquo;accountid\u0026rdquo;, \u0026ldquo;name\u0026rdquo;, \u0026ldquo;primarycontactid\u0026rdquo;);\n//If you define your field name strings (which you should!) _service.Retrieve(Account.EntityLogicalName, recordId, Account.Fields.AccountId, Account.Fields.Name, Account.Fields.PrimaryContactId); I find, in my opinion at least, the second options to be less to type and generally quicker to understand (although, admittedly, you have to get used to not seeing new ColumnSet() everywhere.\nBtw, the use of generated field names (in the second line of the second preferred example) are a result of the XRM Early Bound Generator, which I highly recommend using, by Daryl LaBar. While this may appear to be more to type with the benefit of Intellisense it will be less typing and fewer errors.\nYou can implement these two extension methods by adding a public static class to your CRM projects. Once you have this class it can become a valuable utility class to add additional extension methods.\nhttps://gist.github.com/nicknow/5ac1fc11cf37ea1ef2ec\n","permalink":"https://test.nicknow.net/dynamics-crm-iorganizationservice-extension-methods/","summary":"\u003cp\u003eI\u0026rsquo;ve become a big fan of \u003ca href=\"http://www.dotnetperls.com/extension\"\u003eextension methods\u003c/a\u003e over the years to make my development work in Dynamics CRM, easier to implement and easier to read (i.e., easier to support.) \u003ca href=\"https://msdn.microsoft.com/en-us/library/bb383977.aspx\"\u003eExtension methods\u003c/a\u003e allow us to, exactly as the name implies, extended an existing class or interface with new methods - its a simpler version of implementing a \u003ca href=\"https://msdn.microsoft.com/en-us/library/a48h1tew.aspx\"\u003ederived class\u003c/a\u003e.\u003c/p\u003e\n\u003cp\u003eAnyone familiar with developing .NET code for Dynamics CRM will be familiar with the \u003ccode\u003eIOrganizationService\u003c/code\u003e interface and its varied implementations. While in most cases I\u0026rsquo;m a fan of implementing my own version of IOrganizationService, often for code-base simplicity I\u0026rsquo;ll rely on some extension methods for my code.\u003c/p\u003e","title":"Dynamics CRM: Extensions to Improve IOrganizationService"},{"content":"The very smart folks over at PowerObjects recently posted a blog article on how to retrieve the membership of an Access Team using SQL.\nWhen working in CRM Online or when we need to use the query for a view we have to make our SQL statements work as FetchXML. Here is the FetchXML that will retrieve Access Team members. You can edit it for the desired entity and place filtering as appropriate. In this case, we are retrieving all the Opportunity records and User records for the Opportunity Sales Teams (CRM\u0026rsquo;s default OOTB example of Access Teams.)\n","permalink":"https://test.nicknow.net/dynamics-crm-fetchxml-retrieve-access-team-members/","summary":"\u003cp\u003eThe very smart folks over at \u003ca href=\"http://www.powerobjects.com/\"\u003ePowerObjects\u003c/a\u003e recently posted a \u003ca href=\"http://www.powerobjects.com/2015/05/14/how-to-retrieve-all-the-access-team-members-for-all-accounts/\"\u003eblog article\u003c/a\u003e on how to retrieve the membership of an Access Team using SQL.\u003c/p\u003e\n\u003cp\u003eWhen working in CRM Online or when we need to use the query for a view we have to make our SQL statements work as FetchXML. Here is the FetchXML that will retrieve Access Team members. You can edit it for the desired entity and place filtering as appropriate. In this case, we are retrieving all the Opportunity records and User records for the Opportunity Sales Teams (CRM\u0026rsquo;s default OOTB example of Access Teams.)\u003c/p\u003e","title":"Dynamics CRM: FetchXML to Retrieve Access Team Members"},{"content":"This evening I was at a major national electronics retailer to purchase a new television. I recently moved into a new place and needed a television sized appropriately for the room (and, my old television being plasma, something that would run cooler to save money on air conditioning.)\nThere was a very nice sales person - not too much pressure (and, being honest, didn\u0026rsquo;t know much about televisions) but there to help when I needed it. I had already done some research and really just needed to see a few models side-by-side to make a final decision. It probably didn\u0026rsquo;t take me more than thirty minutes to decide which television I wanted, at which point the sales person sprung into action.\nAll in all the sales transaction went very smoothly - quick inventory check to confirm stock and an offer of the extended warranty (which even after being offered the longer term for the shorter term price I declined.) The sales person proceeded to complete the transaction. I had already indicated I would need the television delivered since it wouldn\u0026rsquo;t fit in my car.\nThis is where I watched the most bizarre process take place. We\u0026rsquo;ve already typed everything into the computer. It\u0026rsquo;s all sitting there in the machine - my name, my address, my phone, my email, etc. So what does the sales person do? Yep, you guessed why I\u0026rsquo;m writing this, out came an official form pad. Here we are in 2015 in a fully computerized - send the receipt directly to your email world - and we are going to fill out a form\u0026hellip;what could they possibly want to write on this form?\nWell\u0026hellip;how about the model number, my name, my address\u0026hellip;you get the picture. The sales person proceeded to write by hand all of the information from the computer to a form - some how this form would eventually make it to the delivery drivers so they can retrieve the television from another store and bring it to my house on Thursday.\nAll I wanted to do was get the phone number of the CEO so I could call and ask what were they thinking? And show them a demo of how I would process that sales transaction in Dynamics CRM 2015 to automatically create a Delivery record in the system with no additional work or room for error!\nThat\u0026rsquo;s my quick story of a retailer just not getting it when it comes to automation\u0026hellip;I\u0026rsquo;m sure they had the best of intentions but this retailer had made a critical mistake. They had put their front line sales and support staff into a backend system.\nThis is so common in retail that few people even think twice about it. The problem is that ERP systems are not designed for the type of rapid dynamic customizations you want to do on the point-of-sale/customer service side of the business.\nThe best option is to fully separate the two - ERP for the backend inventory/accounting/financials and CRM for the front-end sales/customer service/support. With a reasonable investment in quality middleware implementation you will have the ERP you need while remaining responsive to your customers - lower cost of sale, better information, fewer errors, and happier customers!\n","permalink":"https://test.nicknow.net/stop-duplication-dynamics-crm-retail/","summary":"\u003cp\u003eThis evening I was at a major national electronics retailer to purchase a new television. I recently moved into a new place and needed a television sized appropriately for the room (and, my old television being plasma, something that would run cooler to save money on air conditioning.)\u003c/p\u003e\n\u003cp\u003eThere was a very nice sales person - not too much pressure (and, being honest, didn\u0026rsquo;t know much about televisions) but there to help when I needed it. I had already done some research and really just needed to see a few models side-by-side to make a final decision. It probably didn\u0026rsquo;t take me more than thirty minutes to decide which television I wanted, at which point the sales person sprung into action.\u003c/p\u003e","title":"Duplication Instead of Automation: Retailers Need Dynamics CRM"},{"content":"Being able to use external DLLs in Dynamics CRM plugins is challenging but doable. Most people who have been doing development on the Dynamics CRM platform for any period of time know that it is not enough to simply reference the DLLs in Visual Studio - you must somehow make them available to run on the server - this can range from mildly annoying to impossible (if you using CRM Online.)\nYou can read the Dynamics CRM Blog article by Michael Scott for more details, but here is the jist (the same rules apply to 2013/2015): You may have noticed that Microsoft Dynamics CRM 2011 (and CRM 4 before it) does not really have support for referencing custom assemblies from a plug-in assembly. You are limited to .NET Framework assemblies and the public Microsoft Dynamics CRM 2011 Software Development Kit (SDK)assemblies. In Microsoft Visual Studio, your references will look something like this:\nIf you wanted to reference an assembly that you had written, your options were pretty limited:\n- Register the assembly on disk with any referenced assemblies in the same directory. - Register the referenced assembly in the GAC - Include the relevant source code in the plug-in assembly With the introduction of Solutions in Microsoft Dynamics CRM 2011, the first two options are not very manageable (as they require special setup on multiple servers during the installation of the solution\u0026quot;\u0026gt;PICTURE REMOVED]\nIf you wanted to reference an assembly that you had written, your options were pretty limited:\n- Register the assembly on disk with any referenced assemblies in the same directory. - Register the referenced assembly in the GAC - Include the relevant source code in the plug-in assembly With the introduction of Solutions in Microsoft Dynamics CRM 2011, the first two options are not very manageable\n. In addition, those options don’t work in Microsoft Dynamics CRM Online, since assemblies must be registered in the database in CRM Online. If you include source code, as the last option suggests, then all of the benefits of a referenced assembly are lost, without gaining any real benefits. In the same article it is recommended to use ILMerge. ILMerge is a tool from Microsoft Research that can combine multiple DLLs into a single DLL - eliminating the problem (in the case of Dynamics CRM) of having multiple DLL files.\nThe article goes on to describe the basics of using ILMerge to create a single plugin DLL. While I have done this on many projects over the year it has always been more complicated to initially setup and maintain than I would prefer. It can also be challenging to teach new developers - many of whom are still getting comfortable with Dynamics CRM development.\nI recently decided to do some research and figure out a simple and well defined set of step-by-step instructions to use ILMerge in development. In the next several steps I will describe the exact process I now use, which doesn’t involve any editing of MSBUILD files, creation of PowerShell or BAT scripts, etc. It only requires the use of Nuget and the Visual Studio GUI.\n- Start by creating a new Blank Solution in Visual Studio (Other Project Types -\u0026gt; Video Studio Solutions.) Name it as you wish, I used ThinkCrmBlog.PluginDllMerge. - Now that you have a new solution add a couple of class libraries. I’ve named mine ThinkCrmBlog.CrmHelper (this is inline with my best practice of having a standalone DLL of helper classes that can be used for CRM development but are not specific to any particular CRM org and can be used in plugins, workflows, and client side code) and ThinkCrmBlog.DemoPlugin (which will hold my IPlugin class. - So now your solution should look like this picture (assuming you deleted the Class1.cs files.) - We’ll add the Dynamics CRM libraries using NuGet. - Search for Microsoft.CrmSdk.CoreAssemblies and install. - You want to install to both projects. - Using NuGet greatly simplifies some tasks by including required dependencies. In this case it is Microsoft.IdentifyModel. Although technically not required to compile a plugin DLL if you were to use the core assemblies in a client side app it is necessary and can be something of pain when you do not realize you need it until runtime. - You can tell that everything has succeeded by the green check. - So now it is time to get ILMerge installed. Luckily for the modern developer we have NuGet to make this super simple. We don’t want just ILMerge, we want a tool that automates the ILMerge process into the build process. Do a search for MSBuild.ILMerge.Task and click install. - We only want to install to the project that will need to have DLLs merged, so uncheck the box next to ThinkCrmBlog.CrmHelper. Now, if you had more projects creating plugin DLLs that referenced ThinkCrmBlog.CrmHelper you would want to check the box for each of those projects. - The ILMerge application itself is available as a NuGet package and is a dependency, so it will be installed. - Again, the green check is your confirmation of success. - Now we need to add a reference to ThinkCrmBlog.CrmHelper from ThinkCrmBlog.DemoPlugin. - Just check the box. - Now we have to do a property update on the CRM SDK DLL files so they don’t get merged into our final DLL. The ILMerge build task we installed will merge all the DLLs in the \\bin directory. To avoid merge the CRM SDK DLLs and Microsoft.IdentityModel.DLL into our plugin DLL we need to tell Visual Studio to not copy them on build. Select the three files and set the property “Copy Local” to false. - One last, but critical step, be sure to sign both of the projects. Dynamics CRM requires that DLLs be signed and therefore any DLLs we include must be signed. - The solution should look similar to this picture. - For the source code, which I’ve placed online on GitHub @ https://github.com/nicknow/ThinkCrmBlog.PluginDllMerge, I created a very basic plugin will create an instance of a class in CrmHelper and call a method before throwing an exception to allow the user to via the trace log. This was done just for demonstration - it serves no real-world purpose. Afte writing the code I did a Clean Solution and a Rebuild Solution. - In the output directory you’ll see only the final DLL - the merged DLL(s) have been deleted. If you open the DLL in a decompiler, such as dotPeek, you’ll see that the DLL contains both the ThinkCrmBlog.DemoPlugin and ThinkCrmBlog.CrmHelper namespaces. - Install the DLL using the Plugin Registration Tool (or any other preferred tool.) You’ll see that it is a Sandbox deployment - so it will work with CRM Online. - Register a plugin step against an entity and step, we are just testing so it doesn’t matter what entity and step. I choose create on contact. - If I try to create a new Contact I’ll get the following error (as expected based on the code.) - If you click Download Log File you’ll see the following indicating that our plugin fired and successfully called CrmHelper.IsTeamMember. This confirms that our DLL merge is correctly working. - NOW: Be Smart - Delete that plugin if you have been following along, you don’t want it causing you an error unexpectedly down the road.\nI’ve tested this with a project that contained CrmSvcUtil.exe output for early bound objects without an issue. I’ve done this with JSON.NET without an issue (except for having to user v6.0.3 or earlier if you are in Sandbox.) I’ve run this, as shown above, in Sandbox without issue.\nRemember, just because you can merge DLLs doesn’t mean you don’t have any limitations. Code running in Sandbox must still adhere to the rules - no SQL calls, disk access, reflection, etc. Also, be careful that you aren’t merging so much that your plugin DLL becomes bloated causing issues with deployment or (possibly) a negative performance hit.\nTry it out and let me know your experience. I’ve only been using this method for a month but it certainly beats my previous processes that involved either using a batch file or a custom build step and editing the CSPROJ file.\n","permalink":"https://test.nicknow.net/dynamics-crm-ilmerge-dll-plugin/","summary":"\u003cp\u003eBeing able to use external DLLs in Dynamics CRM plugins is challenging but doable. Most people who have been doing development on the Dynamics CRM platform for any period of time know that it is not enough to simply reference the DLLs in Visual Studio - you must somehow make them available to run on the server - this can range from mildly annoying to impossible (if you using CRM Online.)\u003c/p\u003e","title":"Dynamics CRM and ILMerge: The Easy Way to Merge DLLs for Plugins"},{"content":"This is a product idea I have for Uber. I’m hopeful they will, one day, implement it.\nIntent Allow users to better understand and communicate pick-up locations at complex locations (stadiums, airports, conference centers, etc.) and special events (Super Bowl, Golf Tournament, etc.)\nReason In many of these instances it is very difficult for a requestor to understand and communicate their location to the driver in a manner that is consistent with the vehicle pick-up regulations.\nExample # 1: When a Uber user arrives at the airport their might be four locations where a Uber is allowed to pick-up a passenger (i.e., Terminal A and Teminal B each with Door 1 and Door 2.) When requesting a vehicle there is no method for specifying the correct location to the driver, and in many cases the requester may not even know how to reference a such a location.\nExample # 2: A Uber rider is leaving an NFL game and wants to request a vehicle but does not know what the most convenient and accessible area is to be picked up due to street closures, one-way traffic, etc. Uber may have identified there are four accessible pick-up locations after a game - but there is no clear way for Uber to communicate that to a rider and coordinate it with a driver.\nSolution - The Uber application should identify that the Uber rider may be requesting a ride from a Complex Location and allow the rider to see available designated pickup locations and request a vehicle to a specific designated pickup location. A Complex Location can be defined by a geographic point (or points) and a radius from the point. This will allow the Uber app to determine if the rider is located in a zone that indicates they me be at a Complex Location. - The app will prompt the rider as to whether they are at a Complex Location and allow the user to indicate that they are or are not at such a location. If the user indicates they are not at such a location (or does not want to use the Complex Location capability) the app will proceed with requesting a ride as normal. - The app will then present a specific map (image) created for an event/location. - The user will select the appropriate pick-up spot as indicated on the event/location map. - Additional information may be requested from the user, if necessary (such as final destination.) - This information will be transmitted to the driver. Experience I could have personally benefited from this service several times. Two specific examples are after Washington Nationals baseball games and when getting picked-up at Washington Reagan Airport.\nIn the case of the Nationals the DC police do not want car services picking up passengers everywhere around the stadium, there are specific sides of the street they want passengers picked up on. This is difficult for the passenger and driver to properly coordinate in the current application.\nWhen being picked up at Reagan Airport there are multiple terminals and doors. It is important that the driver know the correct terminal and door, which cannot be communicated by the current application. In addition, Reagan Airport requires that car services know the destination of their pick-up prior to picking them up (again, something not supported by the current application.)\n","permalink":"https://test.nicknow.net/uber-eventcomplex-location-pickup/","summary":"\u003cp\u003e\u003cem\u003eThis is a product idea I have for Uber. I’m hopeful they will, one day, implement it.\u003c/em\u003e\u003c/p\u003e\n\u003ch2 id=\"intent\"\u003eIntent\u003c/h2\u003e\n\u003cp\u003eAllow users to better understand and communicate pick-up locations at complex locations (stadiums, airports, conference centers, etc.) and special events (Super Bowl, Golf Tournament, etc.)\u003c/p\u003e\n\u003ch2 id=\"reason\"\u003eReason\u003c/h2\u003e\n\u003cp\u003eIn many of these instances it is very difficult for a requestor to understand and communicate their location to the driver in a manner that is consistent with the vehicle pick-up regulations.\u003c/p\u003e","title":"Uber Event/Complex Location Pickup"},{"content":"Occasionally, I need (or want – depending on your preference) a list of all the attributes (basic CRM metadata) in a Dynamics CRM organization. While there are several ways, including some great document generators, that will get such a list for you, SQL is always an option. If you are on-premises, or working in a developer VM, you can run this query against a CRM organization database to get the basic details. It can also be used as a starter for more complicated metadata query requirements. SELECT\ten.LogicalName , en.ObjectTypeCode , att.LogicalName , typ.Description , typ.XmlType FROM\tMetadataSchema.Entity en JOIN MetadataSchema.Attribute att on en.EntityId = att.EntityId JOIN MetadataSchema.AttributeTypes typ on att.AttributeTypeId = typ.AttributeTypeId ORDER BY\ten.LogicalName , att.LogicalName\n","permalink":"https://test.nicknow.net/dynamics-crm-sql-get-crm-metadata-2011-2013/","summary":"\u003cp\u003eOccasionally, I need (or want – depending on your preference) a list of all the attributes (basic CRM metadata) in a Dynamics CRM organization. While there are several ways, including some great document generators, that will get such a list for you, SQL is always an option. If you are on-premises, or working in a developer VM, you can run this query against a CRM organization database to get the basic details. It can also be used as a starter for more complicated metadata query requirements.\nSELECT\t\ten.LogicalName\n, en.ObjectTypeCode\n, att.LogicalName\n, typ.Description\n, typ.XmlType\nFROM\t\tMetadataSchema.Entity en\nJOIN MetadataSchema.Attribute att on en.EntityId = att.EntityId\nJOIN MetadataSchema.AttributeTypes typ on att.AttributeTypeId = typ.AttributeTypeId\nORDER BY\ten.LogicalName\n, att.LogicalName\u003c/p\u003e","title":"Dynamics CRM: SQL to Get CRM Metadata in 2011 \u0026 2013"},{"content":"Recently a question was asked about creating forms and specifying a default form in Dynamics CRM that was limited to specific group of users. The original question and answer are available on Stackoverflow. Stackoverflow is a great site for asking and getting answers to your Dynamics CRM questions.\nYou already have a default form for the entity that is used by all users (All Users). You want to add an additional form to that entity that is only available to some of the users (Select Users). All Users are currently assigned a security role that gives them the necessary access to the system.\n- Create a new security role (Form Specific Role). You don't have to give this role any privileges just a name. - Assign the *Select Users* the *Form Specific Role*. Do **NOT** remove their other security role(s). - Add the new form the entity, **Restricted Form**. - Highlight the new form and click ***Enable Security Roles***. Select the option *Display only to these selected security roles* and select the *Form Specific Role* you created in step # 1. Make sure ***Enabled for fallback*** is *unchecked*. Click *Ok*. ![](http://i.stack.imgur.com/dVruu.png) - From the forms list ***Form Order*** and select ***Main Form Set*** (or the appropriate form type if you are working on a Mobile or Quick Create Form.![](http://i.stack.imgur.com/JizoE.png) - Use the Up/Down arrows to make the new, **Restricted Form**, the top choice. ![](http://i.stack.imgur.com/jnZTf.png) - Save and Publish all changes. Now whenever a user that has been assigned the proper security role accesses this entity their default form choice will be the Restricted Form. There will be NO impact to any other forms they are accessing or any of their privileges in the rest of the system.\n","permalink":"https://test.nicknow.net/dynamics-crm-entity-forms-specific-to-users/","summary":"\u003cp\u003eRecently a question was asked about creating forms and specifying a default form in Dynamics CRM that was limited to specific group of users. The \u003ca href=\"http://stackoverflow.com/questions/21883230/where-security-role-is-used\"\u003eoriginal question and answer\u003c/a\u003e are available on Stackoverflow. Stackoverflow is a great site for asking and getting answers to your Dynamics CRM questions.\u003c/p\u003e\n\u003cp\u003eYou already have a default form for the entity that is used by all users (All Users). You want to add an additional form to that entity that is only available to some of the users (Select Users). All Users are currently assigned a security role that gives them the necessary access to the system.\u003c/p\u003e","title":"Dynamics CRM: Custom Entity Forms Specific to Users"},{"content":"I was recently attempting to install SQL Server 2012 SP1 (KB2674319) via Windows Update on a VM. This is a Dev VM - specifically a new one I had built for working with SharePoint 2013 \u0026amp; CRM 2013. Nice new environment: Windows Server 2012, Visual Studio 2013, ReSharper 8, Dynamics CRM 2013, SharePoint 2013, and even Office 2013\u0026hellip;heck 2013 is sounding like a great year!\nAnyway, while letting Windows Update install SQL Server 2012 SP1 I kept getting the dread red install failure and an error 20000009. I did several searches but couldn\u0026rsquo;t find anything. I performed a repair on SQL Server 2012 using the install media - still no luck. It was only went I back that next day and tried to copy a large file that I received an out-of-space error.\nI quickly looked at the available disk space and saw it was extremely low. I did some reconfiguration to give the VM\u0026rsquo;s C:\\ drive some extra space and tried the update again. And it worked, SP1 installed successfully!\nLesson When you get an error you can\u0026rsquo;t immediately diagnose - always checked the disk space!\n","permalink":"https://test.nicknow.net/20000009-windows-update-kb2674319/","summary":"\u003cp\u003eI was recently attempting to install \u003ca href=\"http://support.microsoft.com/kb/2674319\"\u003eSQL Server 2012 SP1 (KB2674319)\u003c/a\u003e via Windows Update on a VM. This is a Dev VM - specifically a new one I had built for working with SharePoint 2013 \u0026amp; CRM 2013. Nice new environment: Windows Server 2012, Visual Studio 2013, ReSharper 8, Dynamics CRM 2013, SharePoint 2013, and even Office 2013\u0026hellip;heck 2013 is sounding like a great year!\u003c/p\u003e\n\u003cp\u003eAnyway, while letting Windows Update install SQL Server 2012 SP1 I kept getting the dread red install failure and an error 20000009. I did several searches but couldn\u0026rsquo;t find anything. I performed a repair on SQL Server 2012 using the install media - still no luck. It was only went I back that next day and tried to copy a large file that I received an out-of-space error.\u003c/p\u003e","title":"Error 20000009 on Windows Update - Windows Server 2012"},{"content":"You are likely already familiar with the excellent development tool LINQPad and if you are a Dynamics CRM Developer you, hopefully, are familiar with LINQPad Plugin for Dynamics CRM. Using LINQPad along with the LINQPad CRM Plugin is a great way to learn the ins and outs of writing LINQ queries for Dynamics CRM.\nIn this article I will show you how, with just a minimal of effort, you can start using LINQPad to directly call Dynamics CRM. This will allow you to go beyond just building LINQ queries and execute code to test Request/Response messages, QueryExpression retrieval, FetchXml, and much more. Using LINQPad allows you to test and learn in real-time without waiting to compile your code and execute your test cases (if you even have test cases! You do have test cases, right?)\nBtw…if you end loving LINQPad you should really consider buying a license to unlock auto-completion. In fact, you can outfit your entire company with Premium Edition (all the features) for only $750 (as of 10/31/2013.) See the current comparison and pricing here: http://www.linqpad.net/Premium.aspx. (My only complaint is that they have activation limits – which are generous but seem like a real annoyance when you go through a couple dozen VMs in a year and have 4 to 5 active at any time. All dev products should license per Dev the same as ReSharper.)\nInstalling LINQPad Lets get started…\n- You must also have [.NET 4](http://www.microsoft.com/en-us/download/details.aspx?id=17851) and (possibly) [Windows Identity Foundation](http://www.microsoft.com/en-us/download/details.aspx?id=17331) installed. (This is usually a given on a CRM Dev machine, but I add it for completeness.) - Start by downloading LINQPad from [www.linqpad.net](http://www.linqpad.net) and installing the application. Note, I will not discuss the LINQPad Plugin for CRM in this article. I highly recommend checking it out at the link above and using it. It is extremely useful and a great way to learn to write LINQ queries and test them against Dynamics CRM.\nSo we now that we have everything installed it is time to fire up LINQPad.\nGetting a Connection The first thing we need to do is create a connection to the Dynamics CRM server and to do so we’ll use some CRM SDK functionality (that I discovered last year thanks to this great blog post from Shan McArthur of Adxstudio) to ensure support for any valid authentication setup (on-prem AD/on-prem Claims/partner hosted/Microsoft hosted.)\nIn the bottom left corner of LINQPad under My Queries locate the My Extensions document and double click to open it.\nYou should now see the following:\nIn the MyExtensions class paste the following code:\npublic IOrganizationServic GetCRMService(string connectionString) { CrmConnection connection = CrmConnection.Parse(connectionString);\nvar result = new Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy( connection.ServiceUri, connection.HomeRealmUri, connection.ClientCredentials, connection.DeviceCredentials);\nresult.EnableProxyTypes();\nreturn result; } This is what it should look like:\nIf you are wondering about why I did it this way it was so that I could get an IOrganizationService object that had proxy types enabled (which will be needed for a future blog article). Since I don’t have an assembly where I can set this value this is the only method I found. If you know a better way please leave a comment below.\nIf you hit the green arrow at this point you’ll get an error telling you “The type or namespace name \u0026lsquo;Sdk\u0026rsquo; does not exist in the namespace \u0026lsquo;Microsoft.Xrm\u0026rsquo; (Press F4 to check imported namespaces)” – since LINQPad doesn’t know to include these automatically, how could it, we have to add the necessary references and using statements. Note, if you have purchased the premium/pro version much of this will be done automatically – but I have intentionally written this for the 1st time user still testing out LINQPad.\nPress F4 or right-click on the window to open the Query Properties window:\nFrom the Query Properties window click the Add button and add System.Runtime.Serialization.dll and System.ServiceModel.dll. Then use the Browse button to add the microsoft.xrm.client.dll and the microsoft.xrm.sdk.dll.\nNext click on the Additional Namespace Imports tab. Add Microsoft.Xrm.Client and Microsoft.Xrm.Sdk, each on their own line. Then press Ok to close the window.\nWhoAmIRequest() or CRM’s Hello World We are now ready to start playing. I’ve always thought of a WhoAmIRequest() as the Dynamics CRM equivalent of hello world, so that’ll be our first set of commands.\nGo back to the Query 1 tab or click the plus (+) sign to get a new blank query tab. Be sure the Language drop-down is set to C# Statement(s).\nInto this screen paste the following code:\nvar response = (WhoAmIResponse)conn.Execute(new WhoAmIRequest());\nBefore you can run this code you must add the a reference to* microsoft.crm.sdk.proxy.dll* and an additional namespace import of Microsoft.Crm.Sdk.Messages (press F4 and follow the instructions from above.)\nLastly, fix the connection string in the first line to point to the correct CRM server and organization. You can pass credentials as part of the connection string, if necessary. To learn more about the CRM connection string refer to the SDK for details and examples.\nNow click the green arrow () in the top left to execute your code. If your connection string is correctly written you should see a response similar to this one:\nAs you can see we have executed a WhoAmIRequest and displayed the results in an easy to navigate/view format. Let me tell you, when working with unfamiliar message request/response types in the CRM SDK being able to see what a request is really returning data-wise can be absolutely invaluable and save you many hours of headache inducing debugging.\nDump() This That last line of results.Dump() may look confusing since, as you are probably aware, there is no Dump method on the WhoAmIResponse() class. The Dump() method is made available through LINQPad and it is what tells LINQPad to take an object visualize it. Now, I’ll show you what it can do with a more significant amount of data.\nWhat Will This QueryExpression Get Me Click the plus (+) to open a new query window and paste the following code: var conn = MyExtensions.GetCRMService(\u0026ldquo;url=http://tpp-crm2011-dev:5555/tppdevcrm/XRMServices/2011/Organization.svc;\u0026rdquo;); var response = (WhoAmIResponse)conn.Execute(new WhoAmIRequest()); response.Dump(); Hit F4 to add Microsoft.Xrm.Sdk.Query as an additional namespace (this should be old hat by now) and then click the green arrow or press F5 to run the code.\nThe query will execute and be visualized allowing you as s developer to know exactly what will be returned – I find seeing the objects with data to be much easier than the standard CRM SDK documentation.\nAnd don’t think for a minute that you are limited to simple three line code. From the query window that just executed press CTRL + SHIFT + N to open a new query window with the same setup as the current (avoiding having to add a namespace reference.) Now past the following code and let it run: var conn = MyExtensions.GetCRMService(\u0026ldquo;url=http://tpp-crm2011-dev:5555/tppdevcrm/XRMServices/2011/Organization.svc;\u0026rdquo;);\nvar query = new QueryExpression(\u0026ldquo;account\u0026rdquo;); var colSet = new ColumnSet();\ncolSet.AddColumn(\u0026ldquo;name\u0026rdquo;); colSet.AddColumns(\u0026ldquo;modifiedon\u0026rdquo;,\u0026ldquo;createdon\u0026rdquo;,\u0026ldquo;modifiedby\u0026rdquo;,\u0026ldquo;createdby\u0026rdquo;); query.ColumnSet = colSet;\nquery.AddOrder(\u0026ldquo;name\u0026rdquo;, OrderType.Ascending);\nvar results = conn.RetrieveMultiple(query);\nresults.Dump();\nConclusion If you weren’t already using LINQPad I hope that this article got you interested in giving it a try and if you are already using LINQPad, but not in this way, I hope you’ll explore these new options. I’ve been meaning to write a few LINQPad posts for over past 18 months and finally decided to get the first one done. I did this mostly so I don’t have to repeat myself in getting developers setup using LINQPad. I’ve simply found it to be one of the most valuable tools in getting my CRM-related code correct the first time.\nAs soon as I get time I’ll post a follow-up showing how to use your application’s specific early-bound entities with LINQPad.\nI welcome comments/questions/corrections/etc. in the comments area below. Thanks for reading.\n","permalink":"https://test.nicknow.net/linqpad-dynamics-crm-sdk/","summary":"\u003cp\u003eYou are likely already familiar with the excellent development tool \u003ca href=\"http://www.linqpad.net\"\u003eLINQPad \u003c/a\u003eand if you are a Dynamics CRM Developer you, hopefully, are familiar with \u003ca href=\"http://archive.msdn.microsoft.com/crmlinqpad\"\u003eLINQPad Plugin for Dynamics CRM\u003c/a\u003e. Using LINQPad along with the LINQPad CRM Plugin is a great way to learn the ins and outs of writing LINQ queries for Dynamics CRM.\u003c/p\u003e\n\u003cp\u003eIn this article I will show you how, with just a minimal of effort, you can start using LINQPad to directly call Dynamics CRM. This will allow you to go beyond just building LINQ queries and execute code to test Request/Response messages, QueryExpression retrieval, FetchXml, and much more. Using LINQPad allows you to test and learn in real-time without waiting to compile your code and execute your test cases (if you even have test cases! You do have test cases, right?)\u003c/p\u003e","title":"Using LINQPad for Dynamics CRM Development"},{"content":"I look forward to hearing from you and will make my best effort to respond to you within 48 hours!\nMessage sent! Thank you — I'll get back to you within 48 hours. Your Name * Your Email * Subject * Your Message * Send Message ","permalink":"https://test.nicknow.net/contact/","summary":"\u003cp\u003eI look forward to hearing from you and will make my best effort to respond to you within 48 hours!\u003c/p\u003e\n\u003cstyle\u003e\n.contact-form label { display: block; margin-bottom: 4px; font-weight: 500; }\n.contact-form input,\n.contact-form textarea {\n  width: 100%;\n  padding: 8px 12px;\n  margin-bottom: 16px;\n  border: 1px solid var(--border);\n  border-radius: 4px;\n  background: var(--entry);\n  color: var(--primary);\n  font-size: 1rem;\n  font-family: inherit;\n  box-sizing: border-box;\n}\n.contact-form textarea { resize: vertical; }\n.contact-form button {\n  background: var(--primary);\n  color: var(--theme);\n  border: none;\n  padding: 10px 28px;\n  border-radius: 4px;\n  font-size: 1rem;\n  font-family: inherit;\n  cursor: pointer;\n}\n.contact-form button:hover { opacity: 0.8; }\n.contact-success {\n  display: none;\n  padding: 12px 16px;\n  margin-bottom: 20px;\n  border-radius: 4px;\n  background: #d1e7dd;\n  color: #0a3622;\n}\n\u003c/style\u003e\n\n\u003cdiv id=\"contact-success\" class=\"contact-success\"\u003e\n  \u003cstrong\u003eMessage sent!\u003c/strong\u003e Thank you — I'll get back to you within 48 hours.\n\u003c/div\u003e\n\n\u003cform class=\"contact-form\" action=\"https://api.web3forms.com/submit\" method=\"POST\"\u003e\n  \u003cinput type=\"hidden\" name=\"access_key\" value=\"\"\u003e\n  \u003cinput type=\"hidden\" name=\"from_name\" value=\"nicknow.net contact form\"\u003e\n  \u003cinput type=\"hidden\" name=\"redirect\" value=\"https://nicknow.net/contact/?sent=true\"\u003e\n  \u003cinput type=\"checkbox\" name=\"botcheck\" style=\"display:none\"\u003e\n\n  \u003clabel for=\"contact-name\"\u003eYour Name *\u003c/label\u003e\n  \u003cinput type=\"text\" id=\"contact-name\" name=\"name\" required autocomplete=\"name\"\u003e\n\n  \u003clabel for=\"contact-email\"\u003eYour Email *\u003c/label\u003e\n  \u003cinput type=\"email\" id=\"contact-email\" name=\"email\" required autocomplete=\"email\"\u003e\n\n  \u003clabel for=\"contact-subject\"\u003eSubject *\u003c/label\u003e\n  \u003cinput type=\"text\" id=\"contact-subject\" name=\"subject\" required\u003e\n\n  \u003clabel for=\"contact-message\"\u003eYour Message *\u003c/label\u003e\n  \u003ctextarea id=\"contact-message\" name=\"message\" rows=\"6\" required\u003e\u003c/textarea\u003e\n\n  \u003cbutton type=\"submit\"\u003eSend Message\u003c/button\u003e\n\u003c/form\u003e\n\n\u003cscript\u003e\nif (new URLSearchParams(window.location.search).has('sent')) {\n  document.getElementById('contact-success').style.display = 'block';\n}\n\u003c/script\u003e","title":"Contact"},{"content":"Nicolas Nowinski Professional Technology Leadership Highlights Successful delivery of multiple complex technology projects. Comfortable working at all level from hands-on end users to C-Suite. Expertise in AI-Driven Development, Cloud-based deliveries, and modern DevSecOps concepts and tools. Technical leader with experience managing diverse technical and functional teams. Expert in Delivering Line-of-Business and CRM implementations with 15+ years experience. Experience leading requirements discovery, solution design, project estimation, and delivery. About Nicolas is a hands-on technologist and technology executive focused on helping organizations reinvent themselves for a non-deterministic AI driven natively digital future. He firmly believe the next 15 years will see 10x the change we saw over the last 15 years and that organziations who fail to embrace the future will find themselves permanently behind.\nExecuting in roles as a product owner, program manager, and software architect he has successfully led business and technology teams to bring about rapid results through business process engineering, value optimization, and digitization.\nAs a cloud technologist with Microsoft Certifications he has led several enterprise technology projects focusing on complex requirements, large data migrations, and extensive integration points both on-premises and in the cloud. Nicolas is a strong believer in using cloud technologies and DevOps as tools to help accelerate project velocity.\nFocused on creating trusting relationships by providing professional honest thoughts and ideas, setting realistic goals for a team, and delivering on commitments.\nModern organizations, those that are going to survive by operating at the frontier, need to embrace both a new mindset and new technical approach that starts with understanding non-deterministic systems, their strengths, weaknesses, and the opportunities they create. Building safe secure reliably trusted applications that natively incorporate AI is not easy. AI-driven software development and the non-deterministic nature of AI solutions are turning the logic we\u0026rsquo;ve used for decades on it\u0026rsquo;s head - consistent binary outcomes will no longer be the norm, scales and spectrums of rightness vs wrongness will be the new norm.\nThe frontier organizations that learn to embrace this thinking and approach will be the ones that survive and thrive. And those that don\u0026rsquo;t, won\u0026rsquo;t. That new modern frontier organization will be the one that embraces this future.\nFor many many years I\u0026rsquo;ve said \u0026ldquo;and, after they do all that, they must enable rapid change so that the organization is never slowed down by their systems\u0026rdquo;. That is as true today as when I first wrote it down 10-12 years ago. The organization that isn\u0026rsquo;t enables for rapid change is going to rapidly fall behind. The long cycle times of the past don\u0026rsquo;t work in world where first-class enterprise scale software can be envisioned on a Monday and running in production on a Friday. Because in the world where that is possible it will rapidly become the expecation and the CIO that can\u0026rsquo;t deliver it won\u0026rsquo;t be the CIO for long.\n- Nicolas Nowinski\nNicolas has worked for several organizations, including Microsoft and Accenture, in senior roles leading teams. He has long been responsible for technical leadership to a variety of organizations - ranging from midsize businesses to the largest corporations and Federal agencies.\nHe holds certifications in agile and from Microsoft for Power Platform. He has completed MIT continuing education on agentic AI.\nAs a technology leader Nicolas remains a hands-on technologist. His current areas of interest are AI-driven software development, agentic AI in line-of-business data and applications, low-code enterprise AI solution development on Microsoft Azure and Microsoft Power Platform.\nInformation on active US security clearances is available upon request.\n","permalink":"https://test.nicknow.net/about-nicolas-nowinski/","summary":"\u003ch1 id=\"nicolas-nowinski\"\u003e\u003cstrong\u003eNicolas Nowinski\u003c/strong\u003e\u003c/h1\u003e\n\u003ch2 id=\"professional-technology-leadership\"\u003eProfessional Technology Leadership\u003c/h2\u003e\n\u003ch3 id=\"highlights\"\u003eHighlights\u003c/h3\u003e\n\u003cul\u003e\n\u003cli\u003eSuccessful delivery of multiple complex technology projects.\u003c/li\u003e\n\u003cli\u003eComfortable working at all level from hands-on end users to C-Suite.\u003c/li\u003e\n\u003cli\u003eExpertise in AI-Driven Development, Cloud-based deliveries, and modern DevSecOps concepts and tools.\u003c/li\u003e\n\u003cli\u003eTechnical leader with experience managing diverse technical and functional teams.\u003c/li\u003e\n\u003cli\u003eExpert in Delivering Line-of-Business and CRM implementations with 15+ years experience.\u003c/li\u003e\n\u003cli\u003eExperience leading requirements discovery, solution design, project estimation, and delivery.\u003c/li\u003e\n\u003c/ul\u003e\n\u003ch3 id=\"about\"\u003eAbout\u003c/h3\u003e\n\u003cp\u003eNicolas is a hands-on technologist and technology executive focused on helping organizations reinvent themselves for a  non-deterministic AI driven natively digital future. He firmly believe the next 15 years will see 10x the change we saw over the last 15 years and that organziations who fail to embrace the future will find themselves permanently behind.\u003c/p\u003e","title":"About"},{"content":"Originally published at http://goo.gl/bkewP1 ​I can\u0026rsquo;t really take a lot of credit for this post. All of the difficult work was done by a couple of Dynamics gurus. XRM Prep Plug-in This is a plugin for XrmToolBox (http://xrmtoolbox.codeplex.com/) by Tanguy Touzard. Great thanks to Tanguy for releasing XrmToolBox and providing really solid documentation on how to create Plug-ins for it. XrmToolBox and his numerous other very useful Dynamics CRM tools, which all now run in XrmToolBox, are a great value to the Dynamics CRM community. The idea, implementation logic, and solution file that are the basis for this plug-in are the work of Marc Schweigert from Microsoft. His excellent blogging has been the source of great education for me about how to get the most out of Dynamics CRM. The XRM Starter solution file and the code were published by him in the blog post linked to below. http://blogs.msdn.com/b/devkeydet/archive/2013/01/22/getting-a-new-crm-2011-organization-ready-for-xrm.aspx You must install XrmToolBox on your machine to use this plug-in (http://xrmtoolbox.codeplex.com/). After installing XrmToolBox copy the Procetrnix.CleanForXRM.Dll file to the same directory that XrmToolBox.Exe is installed. Run XrmToolBox and you should see the XRM Prep listed as one of the modules under the Home tab. This plug-in is intended to be used against a new Dynamics CRM organization prior to making any customizations to prepare it for custom development, it can perform the following: - Install the XRM Starter solution file from Marc\u0026rsquo;s post. Hide the existing reports. Remove all the non-required security roles. Remove the standard dashboards. There are four checkboxes that allow you to select what all you want XRM Prep to handle for you. If you do not want the solution file to be imported you should uncheck Import Solution, etc. When you are ready click on Run in the toolbar at the top of the tab to run the process. You\u0026rsquo;ll see a status screen while the work is being done and a message box will inform you when it is completed. If you want a copy of the solution file you may download it from the link in Marc\u0026rsquo;s blog article (URL above) or you can click the Export XRM Solution File from the toolbar to export the file. The DLL exposes a public class, XrmSolutionSetup, that can be used by any .NET 4.0 code. XrmSolutionSetup has a method called Execute that expects to be used as the delegate for BackgroundWorker.DoWork. Thus, this code could be reused in another solution if you did not want to use XrmToolBox. One idea would be to implement this in a console application or PowerShell script that deployed and configured a new organization to start development. Here is the plug-in DLL: http://sdrv.ms/11pTAIn If you want to modify it for your own purposes or just see how it was implemented here is the source:http://sdrv.ms/11pTMaB No guarantees or anything\u0026hellip;the source code is there so make it do what you want it to do. I hope this will help you speed up development work and inspire a couple people to make use of the great platform that Tanguy has given us with XrmToolbox.\n","permalink":"https://test.nicknow.net/dynamics-crm-2011-prep-plug-in-for-xrmtoolbox/","summary":"\u003cp\u003eOriginally published at \u003ca href=\"http://goo.gl/bkewP1\"\u003ehttp://goo.gl/bkewP1\u003c/a\u003e ​I can\u0026rsquo;t really take a lot of credit for this post. All of the difficult work was done by a couple of Dynamics gurus. \u003cstrong\u003eXRM Prep Plug-in\u003c/strong\u003e This is a plugin for XrmToolBox (\u003ca href=\"http://xrmtoolbox.codeplex.com/\"\u003ehttp://xrmtoolbox.codeplex.com/\u003c/a\u003e) by Tanguy Touzard. Great thanks to Tanguy for releasing XrmToolBox and providing really solid documentation on how to create Plug-ins for it. XrmToolBox and his numerous other very useful Dynamics CRM tools, which all now run in XrmToolBox, are a great value to the Dynamics CRM community. The idea, implementation logic, and solution file that are the basis for this plug-in are the work of Marc Schweigert from Microsoft. His excellent blogging has been the source of great education for me about how to get the most out of Dynamics CRM. The XRM Starter solution file and the code were published\nby him in the blog post linked to below. \u003ca href=\"http://blogs.msdn.com/b/devkeydet/archive/2013/01/22/getting-a-new-crm-2011-organization-ready-for-xrm.aspx\"\u003ehttp://blogs.msdn.com/b/devkeydet/archive/2013/01/22/getting-a-new-crm-2011-organization-ready-for-xrm.aspx\u003c/a\u003e You must install XrmToolBox on your machine to use this plug-in (\u003ca href=\"http://xrmtoolbox.codeplex.com/\"\u003ehttp://xrmtoolbox.codeplex.com/\u003c/a\u003e). After installing XrmToolBox copy the Procetrnix.CleanForXRM.Dll file to the same directory that XrmToolBox.Exe is installed. Run XrmToolBox and you should see the XRM Prep listed as one of the modules under the Home tab. This plug-in is intended to be used against a new Dynamics CRM organization prior to making any customizations to prepare it for custom development, it can perform the following:  - Install the XRM Starter solution file from Marc\u0026rsquo;s post.  Hide the existing reports.  Remove all the non-required security roles.  Remove the standard dashboards. There are four checkboxes that allow you to select what all you want XRM Prep to handle for you. If you do not want the solution file to be imported you should uncheck Import Solution, etc. When you are ready click on Run in the toolbar at the top of the tab to run the process. You\u0026rsquo;ll see a status screen while the work is being done and a message box will inform you when it is completed. If you want a copy of the solution file you may download it from the link in Marc\u0026rsquo;s blog article (URL above) or you can click the Export XRM Solution File from the toolbar to export the file. The DLL exposes a public class, XrmSolutionSetup, that can be used by any .NET 4.0 code. XrmSolutionSetup has a method called Execute that expects to be used as the delegate for BackgroundWorker.DoWork. Thus, this\ncode could be reused in another solution if you did not want to use XrmToolBox. One idea would be to implement this in a console application or PowerShell script that deployed and configured a new organization to start development.  Here is the plug-in DLL: \u003ca href=\"http://sdrv.ms/11pTAIn\"\u003ehttp://sdrv.ms/11pTAIn\u003c/a\u003e If you want to modify it for your own purposes or just see how it was implemented here is the source:\u003ca href=\"http://sdrv.ms/11pTMaB\"\u003ehttp://sdrv.ms/11pTMaB\u003c/a\u003e No guarantees or anything\u0026hellip;the source code is there so make it do what you want it to do. I hope this will help you speed up development work and inspire a couple people to make use of the great platform that Tanguy has given us with XrmToolbox.\u003c/p\u003e","title":"Dynamics CRM 2011: Prep Plug-in for XrmToolbox"},{"content":"Originally published at http://goo.gl/XXm6z5 ​I wanted to bring your attention to two items that can be very useful for all of us working on Dynamics CRM. As you are aware, CRM customization and development has never really worked well with enterprise focused application lifecycle management (ALM.) The export capability (even with Solutions in 2011) has never worked very well with source code control and change management. In addition, scripting of builds and deployments for customizations have never been what I would call straight-forward or even possible. In the SDK released for Rollup 10 a Solution Packager command-line application that takes an exported solution file and breaks it up into its individual pieces. This combined with the command-line Solution Export tool in the MSCRM Toolkit provides the pieces necessary to automate CRM solutions in a system such as TFS or Git. (http://intovsts.net/2012/12/28/integration-of-dynamics-crm-2011-solutions-with-tfs/) Of course, the next request in enterprise development is automated deployment. As a holiday gift to the CRM world ADXStudio released a beta of their ADXStudio ALM Toolkit (http://community.adxstudio.com/products/adxstudio-alm-toolkit/) - licensing and pricing have not been announced so we\u0026rsquo;ll have to wait and see. This toolkit includes PowerShell Scriplets that allow for creating organizations and user and automated deployments of solutions, it includes a number of PowerShell scripts to demonstrate usage. It also includes a very valuable command-line tool to copy data from a source system to a file and then import the data during a deployment – this is especially useful for simplifying the process of loading configuration/base data during deployment. Taken together these tools provide the pieces necessary to fully automate the build and deployment process for Dynamics CRM. Many environments do not need this level of automation and the overhead for these tools has to be justified by the requirements. That said, for those environments where the needs justify the time/expense of full ALM it is good to know the requirements can be met with using pre-built tools.\n","permalink":"https://test.nicknow.net/dynamics-crm-2011-finally-enterprise-alm-for-dynamics-crm-2011/","summary":"\u003cp\u003eOriginally published at \u003ca href=\"http://goo.gl/XXm6z5\"\u003ehttp://goo.gl/XXm6z5\u003c/a\u003e ​I wanted to bring your attention to two items that can be very useful for all of us working on Dynamics CRM.\nAs you are aware, CRM customization and development has never really worked well with enterprise focused application lifecycle management (ALM.) The export capability (even with Solutions in 2011) has never worked very well with source code control and change management. In addition, scripting of builds and deployments for customizations have never been what I would call straight-forward or even possible.\nIn the SDK released for Rollup 10 a Solution Packager command-line application that takes an exported solution file and breaks it up into its individual pieces. This combined with the command-line Solution Export tool in the MSCRM Toolkit provides the pieces necessary to automate CRM solutions in a system such as TFS or Git. (\u003ca href=\"http://intovsts.net/2012/12/28/integration-of-dynamics-crm-2011-solutions-with-tfs/\"\u003ehttp://intovsts.net/2012/12/28/integration-of-dynamics-crm-2011-solutions-with-tfs/\u003c/a\u003e)\nOf course, the next request in enterprise development is automated deployment. As a holiday gift to the CRM world ADXStudio released a beta of their ADXStudio ALM Toolkit (\u003ca href=\"http://community.adxstudio.com/products/adxstudio-alm-toolkit/\"\u003ehttp://community.adxstudio.com/products/adxstudio-alm-toolkit/\u003c/a\u003e) - licensing and pricing have not been announced so we\u0026rsquo;ll have to wait and see. This toolkit includes PowerShell Scriplets that allow for creating organizations and user and automated deployments of solutions, it includes a number of PowerShell scripts to demonstrate usage. It also includes a very valuable command-line tool to copy data from a source system to a file and then import the data during a deployment – this is especially useful for simplifying the process of loading configuration/base data during deployment.\nTaken together these tools provide the pieces necessary to fully automate the build and deployment process for Dynamics CRM. Many environments do not need this level of automation and the overhead for these tools has to be justified by the requirements. That said, for those environments where the needs justify the time/expense of full ALM it is good to know the requirements can be met with using pre-built tools.\u003c/p\u003e","title":"Dynamics CRM 2011: Finally...Enterprise ALM for Dynamics CRM 2011"},{"content":"Originally published at http://goo.gl/C1n3Hw If you have worked with the Dynamics CRM 2011 SDK you are probably very familiar with the Request/Response model messages in Microsoft.Crm.Sdk.Messages. As a developer trying to write good code I always want to wrap any service call in a Try/Catch statement to provide proper error handling. Another goal is to keep the code as neat as possible for when I – or someone else – has to go back and read it. Wrapping calls in Try/Catch statements increases the total lines of code it takes to implement functionality and makes the code more difficult to read. Recently I was working on a project where I had several of these calls in a row: Execute a request, process the response, build a new request, execute, etc. etc. While I was looking at the code I realized that my catch routine was basically the same (format a message for the user and exit out of the program – in addition to sending a number of execution details to the tracing service). Since the code was getting very long, my first thought was to refactor each of these calls into its own method. While this approach would make my code a bit cleaner, it was still somewhat limited in value. After thinking about the problem a bit more, I decided this would be a perfect opportunity to implement generics, extension methods, and delegates. If you are unfamiliar with any of these topics, here is a super quick introduction: - Generics allow us to create a method without having to know all the input types or the response type thus allowing the developer to specify them when calling the method. Extension methods allow us to create static methods against an existing class without having to inherit to a new class thus we do not disturb any code already relying on the class we want to extend. Delegates let us take a method (that matches the specified signature) and pass it as a variable. You can find out more about each of these concepts in the MSDN documentation links provided. Before we get too far into the details we should review the issue we are trying to resolve. Here is a very basic CRM plug-in that executes a WhoAmI request and gets a WhoAmI response. As I count it there are 6 statements with the try/catch but not including the PluginSetup (see my previous post athttp://goo.gl/lEaa9), to complete the request. It may not seem like a lot, but in the real-world those calls also have logging and the request probably has actual properties that need to be set. No matter what request message you use the basic pattern will remain the same. public void Execute(IServiceProvider serviceProvider) { var p = new PluginSetup(serviceProvider); var req = new WhoAmIRequest(); WhoAmIResponse response = (WhoAmIResponse)p.Service.Execute(req);\ntry { response = (WhoAmIResponse)p.Service.Execute(req); } catch (Exception ex) { // Do some error handling... throw new InvalidPluginExecutionException(ex.Message); } //Do something with the response... } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, \u0026ldquo;Courier New\u0026rdquo;, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }\n.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, \u0026ldquo;Courier New\u0026rdquo;, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }\nWhat if we could achieve the same functionality with the following code? public void Execute(IServiceProvider serviceProvider) { var p = new PluginSetup(serviceProvider); var req = new WhoAmIRequest(); var response = p.Service.Execute (req, GotError);\n//Do something with the response! } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, \u0026ldquo;Courier New\u0026rdquo;, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }\n.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, \u0026ldquo;Courier New\u0026rdquo;, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }\nWe are now down to 2 statements. Your code just got cleaner and became easier to write. So now let me show you how we did it. public static class GenericCRMRequest { public delegate void ErrHandler(Exception Ex);\npublic static RESP Execute(this IOrganizationService Service, REQ Request, ErrHandler Err) where REQ : OrganizationRequest where RESP : OrganizationResponse { RESP response = null; try { response = (RESP)Service.Execute(Request); } catch (Exception ex) { if (Err != null) Err(ex); else throw; } return response; } }\n.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, \u0026ldquo;Courier New\u0026rdquo;, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }\nThe first thing we do is declare a delegate called ErrHandler. This will allow us to pass in a method that can be called when an exception occurs. In my demo below I just throw the error as an InvalidPluginException. In my real-world application the exception is logged and then a user-friendly message is sent to the user. We can implement as many of these methods as we need and we can do so anywhere in our code. So long as it matches the signature, void return and one parameter of type Exception, any static method will work. Btw, you could certainly expand this to pass request details to the error handler and log them. In my application I pass an ILogging instance (which I\u0026rsquo;ll discuss in a future post) in addition to the Exception that allows me to write to a log file, the plugin tracer service, LOG4NET, etc. protected static void GotError(Exception ex) { throw new InvalidPluginExecutionException(\u0026ldquo;We got an Error in ExecuteCrmRequest - Please tell someone!\u0026rdquo;); }\n.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, \u0026ldquo;Courier New\u0026rdquo;, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }\nThe method itself is generic (meaning when called we have to define everything – within the constraints defined by the where clause and the delegate signature) and is an extension toIOrganizationService, this means that we\u0026rsquo;ll be able to call this method from any instance of a class that implements the IOrganizationService interface. By making it an extension method (the requirement being that it be a static method in a static class) it can be called without either having to pass a IOrganizationService object. In addition, since we named the method Execute it will overload the existing Execute method making for cleaner easier to read code. public static RESP Execute(this IOrganizationService Service, REQ Request, ErrHandler Err) where REQ : OrganizationRequest where RESP : OrganizationResponse\n.csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, \u0026ldquo;Courier New\u0026rdquo;, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }\nMy hope is that you\u0026rsquo;ll take this and expand on it. While the CRM SDK is really well done we can always do things that allow us to work more efficiently while creating more manageable code. You\u0026rsquo;ll appreciate it, your colleagues will appreciate it, and your clients will appreciate it. Here is all the code in this blog article together in one place. Please use and expand on this concept to standardize your development, save time, reduce errors, and produce easier to read code. public static class GenericCRMRequest { public delegate void ErrHandler(Exception Ex);\npublic static RESP Execute(this IOrganizationService Service, REQ Request, ErrHandler Err) where REQ : OrganizationRequest where RESP : OrganizationResponse { RESP response = null; try { response = (RESP)Service.Execute(Request); } catch (Exception ex) { if (Err != null) Err(ex); else throw; } return response; } }\npublic class CRMRequestPluginDemo : IPlugin { public void Execute(IServiceProvider serviceProvider) { var p = new PluginSetup(serviceProvider); var req = new WhoAmIRequest(); var response = p.Service.Execute (req, GotError);\n//Do something with the response! } protected static void GotError(Exception ex) { throw new InvalidPluginExecutionException(\u0026quot;We got an Error in ExecuteCrmRequest - Please tell someone!\u0026quot;); } } .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, \u0026ldquo;Courier New\u0026rdquo;, courier, monospace; background-color: #ffffff; /white-space: pre;/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }\n","permalink":"https://test.nicknow.net/dynamics-crm-2011-simplifying-the-request-response-model/","summary":"\u003cp\u003eOriginally published at \u003ca href=\"http://goo.gl/C1n3Hw\"\u003ehttp://goo.gl/C1n3Hw\u003c/a\u003e  If you have worked with the Dynamics CRM 2011 SDK you are probably very familiar with the Request/Response model messages in Microsoft.Crm.Sdk.Messages. As a developer trying to write good code I always want to wrap any service call in a Try/Catch statement to provide proper error handling. Another goal is to keep the code as neat as possible for when I – or someone else – has to go back and read it. Wrapping calls in Try/Catch statements increases the total lines of code it takes to implement functionality and makes the code more difficult to read.  Recently I was working on a project where I had several of these calls in a row: Execute a request, process the response, build a new request, execute, etc. etc. While I was looking at the code I realized that my catch routine was basically the same (format a message for the user and exit out of the program – in addition to sending a number of execution details to the tracing service). Since the code was getting very long, my first thought was to refactor each of these calls into its own method. While this approach would make my code a bit cleaner, it was still somewhat limited in value.  After thinking about the problem a bit more, I decided this would be a perfect opportunity to implement generics, extension methods, and delegates.  If you are unfamiliar with any of these topics, here is a super quick introduction:   - \u003ca href=\"http://msdn.microsoft.com/en-us/library/twcad0zb(v=vs.10).aspx\"\u003eGenerics\u003c/a\u003e allow us to create a method without having to know all the input types or the response type thus allowing the developer to specify them when calling the method.  \u003ca href=\"http://msdn.microsoft.com/en-us/library/bb383977.aspx\"\u003eExtension\u003c/a\u003e methods allow us to create static methods against an existing class without having to inherit to a new class thus we do not disturb any code already relying on the class we want to extend.  \u003ca href=\"http://msdn.microsoft.com/en-us/library/ms173171(v=VS.10).aspx\"\u003eDelegates\u003c/a\u003e let us take a method (that matches the specified signature) and pass it as a variable. \u003cem\u003eYou can find out more about each of these concepts in the MSDN documentation links provided.\u003c/em\u003e  Before we get too far into the details we should review the issue we are trying to resolve. Here is a very basic CRM plug-in that executes a WhoAmI request and gets a WhoAmI response. As I count it there are 6 statements with the try/catch but not including the PluginSetup (see my previous post at\u003ca href=\"http://goo.gl/lEaa9\"\u003ehttp://goo.gl/lEaa9\u003c/a\u003e), to complete the request. It may not seem like a lot, but in the real-world those calls also have logging and the request probably has actual properties that need to be set. No matter what request message you use the basic pattern will remain the same. public void Execute(IServiceProvider serviceProvider)\n{\nvar p = new PluginSetup(serviceProvider);\nvar req = new WhoAmIRequest();\nWhoAmIResponse response = (WhoAmIResponse)p.Service.Execute(req);\u003c/p\u003e","title":"Dynamics CRM 2011: Simplifying the Request Response Model"},{"content":"Originally published at http://bit.ly/RIxgt9\nHow people do it today… Often times when looking at Dynamics CRM plugin code that someone else has written – or that I have written in the past, I\u0026rsquo;m presented with a large collection of setup and validation code at the start of the Execute method. Overtime it becomes obvious that this is simply cluttering up our core Plugin code with what is really overhead infrastructure work.\npublic void Execute(IServiceProvider serviceProvider)\n{\nIPluginExecutionContext context = (Microsoft.Xrm.Sdk.IPluginExecutionContext)serviceProvider.GetService(typeof(Microsoft.Xrm.Sdk.IPluginExecutionContext));\nIOrganizationServiceFactory serviceFactory = (IOrganizationServiceFactory)serviceProvider.GetService(typeof(IOrganizationServiceFactory));\nIOrganizationService service = serviceFactory.CreateOrganizationService(context.UserId);\nITracingService tracing = (ITracingService)serviceProvider.GetService(typeof(ITracingService));\n//Okay, now lets do some actual work\u0026hellip;\ntracing.Trace(\u0026ldquo;Getting started\u0026hellip;\u0026rdquo;);\nEntity target;\nif (context.InputParameters[\u0026ldquo;Target\u0026rdquo;] is Entity) target = (Entity)context.InputParameters[\u0026ldquo;Target\u0026rdquo;];\n} Normally there would also be validation logic at this step to ensure that the values passed into the plugin are valid (i.e., in a Create or Update operation, verify the Contact entity and that a pre-image was provided.) For this posting I\u0026rsquo;m ignoring that so we can focus on just the basic plumbing above.\nIs there a better way? One of my favorite sayings is that \u0026ldquo;lazy people innovate.\u0026rdquo; So in that vein let me show you an easy way to do less work.\nLooking at the above code you can see that we have four variable names we need to remember. In addition, we either need to type out this code or cut/paste for every plugin we create. At this point it is likely that different developers will start naming things differently, skipping steps, etc. For example, in the above code we could have skipped IOrganizationServiceFactory andIOrganizationService since the logic we implemented did not require them. Of course, if later on while developing this plugin we need to make a call to IOrganizationService then we\u0026rsquo;ll have to add this code and – with lazy developers being who we are – we are likely to just get added wherever we need it and not at the beginning of the method.\nWhat I have been doing in my day-to-day work and strongly suggest to others is to abstract this plumbing code into a class thus reducing the above code the following: public void Execute(IServiceProvider serviceProvider) {\nvar p = new PluginSetup(serviceProvider);\n//Okay, now lets do some actual work\u0026hellip;\np.Tracing.Trace(\u0026ldquo;Getting started\u0026hellip;\u0026rdquo;);\nEntity target;\nif (p.Context.InputParameters[\u0026ldquo;Target\u0026rdquo;] is Entity) target = (Entity)p.Context.InputParameters[\u0026ldquo;Target\u0026rdquo;];\n} As you can see we are taking the only input variable, IServiceProvider, and passing it to a constructor for PluginSetup thus returning an object which we have named p (which means the maximum additional keystrokes to access anything will be two.)\nThe PluginSetup class is shown below. It has a single public constructor which throws an exception if IServiceProvider is null. It then uses a fairly common pattern of instantiating a value for each property the first time it is accessessed. This pattern eliminates the problem, I mentioned earlier, where the developer has to know what they\u0026rsquo;ll need ahead of time. In this case there is no need to know if or when you\u0026rsquo;ll need to make a call to IOrganizationService.Create, the developer just calls p.Service.Execute and if the IOrganizationService has not been instantiated already it is taken care of effortlessly. using System; using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Client;\nnamespace Procentrix.Blog {\npublic class PluginSetup { private IPluginExecutionContext context; private IServiceProvider serviceProvider; private IOrganizationServiceFactory serviceFactory; private IOrganizationService service; private OrganizationServiceContext orgContext; private ITracingService tracing; public PluginSetup(IServiceProvider ServiceProvider) { if (ServiceProvider == null) throw new Exception(\u0026quot;PluginSetup requires a valid IServiceProvider.\u0026quot;); serviceProvider = ServiceProvider; } public IServiceProvider ServiceProvider { get { return serviceProvider; } } public IPluginExecutionContext Context { get { if (context != null) { return context; } else { context = (Microsoft.Xrm.Sdk.IPluginExecutionContext) ServiceProvider.GetService(typeof (Microsoft.Xrm.Sdk.IPluginExecutionContext)); return context; } } } public IOrganizationServiceFactory ServiceFactory { get { if (serviceFactory != null) { return serviceFactory; } else { serviceFactory = (IOrganizationServiceFactory) ServiceProvider.GetService(typeof (IOrganizationServiceFactory)); return serviceFactory; } } } public IOrganizationService Service { get { if (service != null) { return service; } else { service = ServiceFactory.CreateOrganizationService(Context.UserId); return service; } } } public OrganizationServiceContext ServiceContext { get { if (orgContext != null) { return orgContext; } else { orgContext = new OrganizationServiceContext(Service); return orgContext; } } } public ITracingService Tracing { get { if (tracing != null) { return tracing; } else { tracing = (ITracingService) ServiceProvider.GetService(typeof (ITracingService)); return tracing; } } } } }\nConclusion Implementing the PluginSetup class (or something similar), can improve developer productivity by eliminating work and increasing standardization. In future posts I\u0026rsquo;ll show additional capabilities we can wrap into and around the PluginSetup class to further improve our efficiency and development experience.\nBonus Item If you want, feel free to rename the properties in the class to give them shorter names (i.e., rename Context to ctx, etc.) This will just eliminate more keystrokes for developers. So long as you are standardized so that all plugins use the same class I see no problem is shortening the names.\nFinally, a couple quick notes on this class. I know some people will balk at providing access toOrganizationServiceContext in a plugin. Feel free to delete it if you prefer. Also, theIOrganizationService will always use the IPluginExecutionContext.UserId, which would need to change if you are doing impersonation – you can implement that logic if needed and I\u0026rsquo;ll address it further in a future post.\n","permalink":"https://test.nicknow.net/dynamics-crm-2011-abstracting-plugin-setup/","summary":"\u003cp\u003eOriginally published at \u003ca href=\"http://bit.ly/RIxgt9\"\u003ehttp://bit.ly/RIxgt9\u003c/a\u003e\u003c/p\u003e\n\u003ch2 id=\"how-people-do-it-today\"\u003eHow people do it today…\u003c/h2\u003e\n\u003cp\u003eOften times when looking at Dynamics CRM plugin code that someone else has written – or that I have written in the past, I\u0026rsquo;m presented with a large collection of setup and validation code at the start of the Execute method. Overtime it becomes obvious that this is simply cluttering up our core Plugin code with what is really overhead infrastructure work.\u003c/p\u003e","title":"Dynamics CRM 2011: Abstracting Plugin Setup"},{"content":"Originally published at http://bit.ly/OPyMVn\nThe team in Dynamics CRM 2011 provides an ability to group users, assign record ownership to a group of users, and extend security roles to users based on their team membership (as opposed to individually assigning the role.)\nTeams in Dynamics CRM 2011: A team is a group of users. This organizational structure enables groups of users across an organization to share information. Each team must be associated with only one business unit. A team can include users from any business unit, not only the business unit with which the team is associated. Users can be associated with more than one team. More details can be found in the Dynamics CRM 2011 SDK Documentation. Beyond allowing cross-business unit record access and assignment of security roles, the Team entity can provide a simple way to create a group of users.\nThere is not a simplified method to retrieve teams for a system user or validate that a system user is a member of a specific team. The code included in this blog post will allow you to achieve this functionality in your plug-ins, custom workflows, and external .NET applications that use the SDK libraries.\nSystem Users and Teams have a many-to-many relationship named teammembership. This relationship is, in essence, another entity in CRM even though it is not displayed as an entity in CRM. What this means is that we can link to it in a QueryExpression. This pattern exists for all many-to-many relationships in CRM.\nThis code can be used as-is or incorporated into a Dynamics CRM Helper class with other methods to simplify your Dynamics CRM 2011 development work.\nNote: This code does not include any error handling or logging both of which should be added and that will be addressed in future blog posts. using System; using Microsoft.Xrm.Sdk; using Microsoft.Xrm.Sdk.Query;\nnamespace Procentrix.Blog { public class TeamsAndUsers { //Credit goes to http://a33ik.blogspot.com/2009/10/custom−workflow−action−team−members−and.html for getting me started with the queries.\nprivate IOrganizationService service; public TeamsAndUsers(IOrganizationService Service) { service = Service; } public bool IsTeamMember(Guid TeamID, Guid UserID) { QueryExpression query = new QueryExpression(\u0026quot;team\u0026quot;); query.ColumnSet = new ColumnSet(true); query.Criteria.AddCondition(new ConditionExpression(\u0026quot;teamid\u0026quot;, ConditionOperator.Equal, TeamID)); LinkEntity link = query.AddLink(\u0026quot;teammembership\u0026quot;, \u0026quot;teamid\u0026quot;, \u0026quot;teamid\u0026quot;); link.LinkCriteria.AddCondition(new ConditionExpression(\u0026quot;systemuserid\u0026quot;, ConditionOperator.Equal, UserID)); try { var results = service.RetrieveMultiple(query); if (results.Entities.Count \u0026gt; 0) { return true; } else { return false; } } catch (Exception ex) { // Do your Error Handling here throw ex; } } public bool IsTeamMember(String Teamname, Guid UserID) { QueryExpression query = new QueryExpression(\u0026quot;team\u0026quot;); query.ColumnSet = new ColumnSet(true); query.Criteria.AddCondition(new ConditionExpression(\u0026quot;name\u0026quot;, ConditionOperator.Equal, Teamname)); LinkEntity link = query.AddLink(\u0026quot;teammembership\u0026quot;, \u0026quot;teamid\u0026quot;, \u0026quot;teamid\u0026quot;); link.LinkCriteria.AddCondition(new ConditionExpression(\u0026quot;systemuserid\u0026quot;, ConditionOperator.Equal, UserID)); try { var results = service.RetrieveMultiple(query); if (results.Entities.Count \u0026gt; 0) { return true; } else { return false; } } catch (Exception ex) { // Do your Error Handling here throw ex; } } public Microsoft.Xrm.Sdk.EntityCollection UserTeams(Guid UserID) { QueryExpression query = new QueryExpression(\u0026quot;team\u0026quot;); query.ColumnSet = new ColumnSet(true); LinkEntity link = query.AddLink(\u0026quot;teammembership\u0026quot;, \u0026quot;teamid\u0026quot;, \u0026quot;teamid\u0026quot;); link.LinkCriteria.AddCondition(new ConditionExpression(\u0026quot;systemuserid\u0026quot;, ConditionOperator.Equal, UserID)); try { return service.RetrieveMultiple(query); } catch (Exception ex) { // Do your Error Handling here throw ex; } } } }\n","permalink":"https://test.nicknow.net/dynamics-crm-2011-check-team-membership-2/","summary":"\u003cp\u003eOriginally published at \u003ca href=\"http://bit.ly/OPyMVn\"\u003ehttp://bit.ly/OPyMVn\u003c/a\u003e\u003c/p\u003e\n\u003cp\u003eThe team in Dynamics CRM 2011 provides an ability to group users, assign record ownership to a group of users, and extend security roles to users based on their team membership (as opposed to individually assigning the role.)\u003c/p\u003e\n\u003cp\u003eTeams in Dynamics CRM 2011:\nA \u003cem\u003eteam\u003c/em\u003e is a group of users. This organizational structure enables groups of users across an organization to share information. Each team must be associated with only one business unit. A team can include users from any business unit, not only the business unit with which the team is associated. Users can be associated with more than one team.\n\u003cem\u003eMore details can be found in the \u003ca href=\"http://msdn.microsoft.com/en-us/library/gg328485.aspx\"\u003eDynamics CRM 2011 SDK Documentation\u003c/a\u003e.\u003c/em\u003e\nBeyond allowing cross-business unit record access and assignment of security roles, the Team entity can provide a simple way to create a group of users.\u003c/p\u003e","title":"Dynamics CRM 2011: Check Team Membership"}]