<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:googleplay="http://www.google.com/schemas/play-podcasts/1.0"><channel><title><![CDATA[Brian’s Making Things]]></title><description><![CDATA[Programming and other creative endeavors]]></description><link>https://blog.briancarroll.org</link><image><url>https://substackcdn.com/image/fetch/$s_!MR9m!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dcf9877-6097-49b7-9e50-1aee725b3624_144x144.png</url><title>Brian’s Making Things</title><link>https://blog.briancarroll.org</link></image><generator>Substack</generator><lastBuildDate>Sun, 12 Apr 2026 20:26:11 GMT</lastBuildDate><atom:link href="https://blog.briancarroll.org/feed" rel="self" type="application/rss+xml"/><copyright><![CDATA[Brian Carroll]]></copyright><language><![CDATA[en]]></language><webMaster><![CDATA[carrollb@substack.com]]></webMaster><itunes:owner><itunes:email><![CDATA[carrollb@substack.com]]></itunes:email><itunes:name><![CDATA[Brian Carroll]]></itunes:name></itunes:owner><itunes:author><![CDATA[Brian Carroll]]></itunes:author><googleplay:owner><![CDATA[carrollb@substack.com]]></googleplay:owner><googleplay:email><![CDATA[carrollb@substack.com]]></googleplay:email><googleplay:author><![CDATA[Brian Carroll]]></googleplay:author><itunes:block><![CDATA[Yes]]></itunes:block><item><title><![CDATA[Outlook is the Best Productivity Tool Ever, Part 2]]></title><description><![CDATA[Following up on my previous post, where I described the framework for how I manage work using Outlook, this post focuses on the technology behind it.]]></description><link>https://blog.briancarroll.org/p/outlook-is-the-best-productivity-77c</link><guid isPermaLink="false">https://blog.briancarroll.org/p/outlook-is-the-best-productivity-77c</guid><dc:creator><![CDATA[Brian Carroll]]></dc:creator><pubDate>Sat, 09 Nov 2024 18:24:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!W5v2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Following up on my <a href="https://blog.briancarroll.org/p/outlook-is-the-best-productivity">previous post</a>, where I described the framework for how I manage work using Outlook, this post focuses on the technology behind it.</p><p>I use Outlook Tasks to record all actionable items. I built an Outlook C# VSTO add-in to capture the work. When I am processing my email and find something I need to do, I select that email and click the Add Tasks button in the Outlook ribbon.</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!7XNC!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!7XNC!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png 424w, https://substackcdn.com/image/fetch/$s_!7XNC!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png 848w, https://substackcdn.com/image/fetch/$s_!7XNC!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png 1272w, https://substackcdn.com/image/fetch/$s_!7XNC!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!7XNC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png" width="509" height="199" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/fb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:199,&quot;width&quot;:509,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:13693,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:true,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!7XNC!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png 424w, https://substackcdn.com/image/fetch/$s_!7XNC!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png 848w, https://substackcdn.com/image/fetch/$s_!7XNC!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png 1272w, https://substackcdn.com/image/fetch/$s_!7XNC!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Ffb2c2e4f-82a9-4ad2-b679-2ed44ff0c414_509x199.png 1456w" sizes="100vw" fetchpriority="high"></picture><div></div></div></a></figure></div><p>This function opens a custom Outlook form. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!W5v2!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!W5v2!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png 424w, https://substackcdn.com/image/fetch/$s_!W5v2!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png 848w, https://substackcdn.com/image/fetch/$s_!W5v2!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png 1272w, https://substackcdn.com/image/fetch/$s_!W5v2!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!W5v2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png" width="977" height="393" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:393,&quot;width&quot;:977,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:16931,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:false,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!W5v2!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png 424w, https://substackcdn.com/image/fetch/$s_!W5v2!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png 848w, https://substackcdn.com/image/fetch/$s_!W5v2!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png 1272w, https://substackcdn.com/image/fetch/$s_!W5v2!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9faf96b7-59b6-45e8-8a45-6be7e76ac127_977x393.png 1456w" sizes="100vw"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p>Here I make a determination if this is something that needs to be done sooner rather than later (Is this Ready to Work?), select the Task folder in Outlook where I want it to be saved, apply (or add) a category to the task, and, most importantly, define the action I need to take. This is heart of it all. You can always drag an email to the Task pane and create a task but it keeps the email subject. Here I am deciding how to make the request actionable.</p><p>This is the main function: to distill a complex email into 1 or more definite action items. I can add multiple tasks by separating them with semicolons.</p><p>Clicking the Save Task button saves it in the selected folder and copies all of the information from the email into the task body, so I have a reference of that material when interacting with the task later on. </p><p>A variation of this process occurs when I send a mail. After clicking Send, I&#8217;m prompted whether I want to create a task from the sent mail. </p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!-y9A!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!-y9A!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png 424w, https://substackcdn.com/image/fetch/$s_!-y9A!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png 848w, https://substackcdn.com/image/fetch/$s_!-y9A!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png 1272w, https://substackcdn.com/image/fetch/$s_!-y9A!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!-y9A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png" width="447" height="191" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:191,&quot;width&quot;:447,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:3861,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!-y9A!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png 424w, https://substackcdn.com/image/fetch/$s_!-y9A!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png 848w, https://substackcdn.com/image/fetch/$s_!-y9A!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png 1272w, https://substackcdn.com/image/fetch/$s_!-y9A!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe392d32d-a663-4251-96e2-622de9d6e7b2_447x191.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>If I say yes, the same form opens and I can capture a new task, which is always going to be a Waiting task. For example, if I am sending a mail to someone asking them for something, I create the task: &#8220;Waiting on X re: the thing I asked them about&#8221;. This sets the task status to &#8220;waiting on someone&#8221; and saves it to the task folder. </p><p>This workflows enables to clear out my Inbox rapidly. I then follow it with the triage stage, which I do once a day after clearing out my email for the first time. </p><p>Task items have several user-defined fields on them. One is called Ready to Work. The other is Scheduled. Both are Yes/No fields. As I go through the long list of all tasks, I set Ready To Work to yes if I&#8217;m going to do it this week. I have the To-Do Bar turned on and grouped by Scheduled and filtered by Ready to Work = Yes. This gives me this view of tasks that are ready to be worked on:</p><div class="captioned-image-container"><figure><a class="image-link image2" target="_blank" href="https://substackcdn.com/image/fetch/$s_!EkAb!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!EkAb!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png 424w, https://substackcdn.com/image/fetch/$s_!EkAb!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png 848w, https://substackcdn.com/image/fetch/$s_!EkAb!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png 1272w, https://substackcdn.com/image/fetch/$s_!EkAb!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!EkAb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png" width="1454" height="351" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/bab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:351,&quot;width&quot;:1454,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20450,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!EkAb!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png 424w, https://substackcdn.com/image/fetch/$s_!EkAb!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png 848w, https://substackcdn.com/image/fetch/$s_!EkAb!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png 1272w, https://substackcdn.com/image/fetch/$s_!EkAb!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fbab6ff82-338e-45fb-ab45-79e45ef3d525_1454x351.png 1456w" sizes="100vw" loading="lazy"></picture><div></div></div></a></figure></div><p>The final stage is to switch to the calendar view and start choosing the tasks I need to work on today. I add the task to my calendar and then right-click the task, selecting a custom function called Toggle Schedule/RTW. </p><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!Ypbi!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!Ypbi!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png 424w, https://substackcdn.com/image/fetch/$s_!Ypbi!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png 848w, https://substackcdn.com/image/fetch/$s_!Ypbi!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png 1272w, https://substackcdn.com/image/fetch/$s_!Ypbi!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!Ypbi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png" width="1168" height="409" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/9c913978-606d-45f9-9679-6062433b414b_1168x409.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:409,&quot;width&quot;:1168,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:20648,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!Ypbi!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png 424w, https://substackcdn.com/image/fetch/$s_!Ypbi!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png 848w, https://substackcdn.com/image/fetch/$s_!Ypbi!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png 1272w, https://substackcdn.com/image/fetch/$s_!Ypbi!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F9c913978-606d-45f9-9679-6062433b414b_1168x409.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><div class="captioned-image-container"><figure><a class="image-link image2 is-viewable-img" target="_blank" href="https://substackcdn.com/image/fetch/$s_!xEsl!,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png" data-component-name="Image2ToDOM"><div class="image2-inset"><picture><source type="image/webp" srcset="https://substackcdn.com/image/fetch/$s_!xEsl!,w_424,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png 424w, https://substackcdn.com/image/fetch/$s_!xEsl!,w_848,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png 848w, https://substackcdn.com/image/fetch/$s_!xEsl!,w_1272,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png 1272w, https://substackcdn.com/image/fetch/$s_!xEsl!,w_1456,c_limit,f_webp,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png 1456w" sizes="100vw"><img src="https://substackcdn.com/image/fetch/$s_!xEsl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png" width="354" height="513" data-attrs="{&quot;src&quot;:&quot;https://substack-post-media.s3.amazonaws.com/public/images/e2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png&quot;,&quot;srcNoWatermark&quot;:null,&quot;fullscreen&quot;:null,&quot;imageSize&quot;:null,&quot;height&quot;:513,&quot;width&quot;:354,&quot;resizeWidth&quot;:null,&quot;bytes&quot;:15305,&quot;alt&quot;:null,&quot;title&quot;:null,&quot;type&quot;:&quot;image/png&quot;,&quot;href&quot;:null,&quot;belowTheFold&quot;:true,&quot;topImage&quot;:false,&quot;internalRedirect&quot;:null,&quot;isProcessing&quot;:false,&quot;align&quot;:null,&quot;offset&quot;:false}" class="sizing-normal" alt="" srcset="https://substackcdn.com/image/fetch/$s_!xEsl!,w_424,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png 424w, https://substackcdn.com/image/fetch/$s_!xEsl!,w_848,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png 848w, https://substackcdn.com/image/fetch/$s_!xEsl!,w_1272,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png 1272w, https://substackcdn.com/image/fetch/$s_!xEsl!,w_1456,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2Fe2dcfcdc-29f6-454b-b628-d27ea20186ad_354x513.png 1456w" sizes="100vw" loading="lazy"></picture><div class="image-link-expand"><div class="pencraft pc-display-flex pc-gap-8 pc-reset"><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container restack-image"><svg role="img" width="20" height="20" viewBox="0 0 20 20" fill="none" stroke-width="1.5" stroke="var(--color-fg-primary)" stroke-linecap="round" stroke-linejoin="round" xmlns="http://www.w3.org/2000/svg"><g><title></title><path d="M2.53001 7.81595C3.49179 4.73911 6.43281 2.5 9.91173 2.5C13.1684 2.5 15.9537 4.46214 17.0852 7.23684L17.6179 8.67647M17.6179 8.67647L18.5002 4.26471M17.6179 8.67647L13.6473 6.91176M17.4995 12.1841C16.5378 15.2609 13.5967 17.5 10.1178 17.5C6.86118 17.5 4.07589 15.5379 2.94432 12.7632L2.41165 11.3235M2.41165 11.3235L1.5293 15.7353M2.41165 11.3235L6.38224 13.0882"></path></g></svg></button><button tabindex="0" type="button" class="pencraft pc-reset pencraft icon-container view-image"><svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-maximize2 lucide-maximize-2"><polyline points="15 3 21 3 21 9"></polyline><polyline points="9 21 3 21 3 15"></polyline><line x1="21" x2="14" y1="3" y2="10"></line><line x1="3" x2="10" y1="21" y2="14"></line></svg></button></div></div></div></a></figure></div><p> </p><p>This sets Scheduled = Yes and the grouping in the To-Do Bar updates. I only work tasks that have been scheduled. When I complete them all, I look through the other tasks that are Ready to Work and schedule them.</p><p>That&#8217;s it. It&#8217;s simple and I&#8217;ve iterated on this form many times over the years. Sometimes I try a different way of triaging and categorizing. The add-in is easy to change and re-deploy. </p><p>Another benefit of using Outlook tasks is I can capture them in Teams (create Planner Task), on my phone (reminders sync to Outlook Task folders), and ad-hoc (I have a version of the tool running as an .exe that I can trigger from a shortcut.</p>]]></content:encoded></item><item><title><![CDATA[Mysterious Langchain Azure OpenAI Problems]]></title><description><![CDATA[I was banging my head on this problem for hours.]]></description><link>https://blog.briancarroll.org/p/mysterious-langchain-azure-openai</link><guid isPermaLink="false">https://blog.briancarroll.org/p/mysterious-langchain-azure-openai</guid><dc:creator><![CDATA[Brian Carroll]]></dc:creator><pubDate>Fri, 08 Nov 2024 12:45:40 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MR9m!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dcf9877-6097-49b7-9e50-1aee725b3624_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I was banging my head on this problem for hours. Using langchain and our Azure OpenAI model, I kept getting a Value error:</p><pre><code>As of openai&gt;=1.0.0, Azure endpoints should be specified via the `azure_endpoint` param not `openai_api_base` (or alias `base_url`).  </code></pre><p>I was not defining open_api_base anywhere in my code. LLMs were no use but I did find the suggestion on Reddit to check if open_api_base was an environment variable. </p><p>Sure enough, I had defined that months ago, never used it, and forgot it. Deleted the variable and problem solved.</p><p>Check the basics!</p>]]></content:encoded></item><item><title><![CDATA[Outlook is the Best Productivity Tool Ever, Part 1]]></title><description><![CDATA[I wrote that headline to bother my brother, who despises Outlook.]]></description><link>https://blog.briancarroll.org/p/outlook-is-the-best-productivity</link><guid isPermaLink="false">https://blog.briancarroll.org/p/outlook-is-the-best-productivity</guid><dc:creator><![CDATA[Brian Carroll]]></dc:creator><pubDate>Mon, 30 Sep 2024 10:47:25 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MR9m!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dcf9877-6097-49b7-9e50-1aee725b3624_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I wrote that headline to bother my brother, who despises Outlook. This post is not really about Outlook, although it is central to the topic. I really want to write about how I manage work and as a response to Ian Bogost&#8217;s <a href="https://www.theatlantic.com/technology/archive/2024/03/email-nightmare-just-give-up/677615/">article</a> in the Atlantic about the terribleness of email.</p><p>I adopted David Allen&#8217;s Getting Things Done (GTD) process and refined it for many years. I use Outlook as my inbox, with tasks as the central, actionable record. </p><p>My inbox is grouped by conversation, sorted newest first. I only ever read the latest one. Archive is a single folder. If I need something I can search for it. </p><p>I never start my day by opening Outlook. I usually go to the office 30-60 min early and program or learn. Then I start processing my email.</p><p>In the morning, I go through the GTD triage: </p><ol><li><p>is it irrelevant? then delete it (or unsubscribe, or make a rule to delete).</p></li><li><p>Informational only? Read and archive. </p></li><li><p>Something to do?</p><ol><li><p>Can you do it in under 2 min? Then do it and archive the email.</p></li><li><p>If not, create a task (this is the most important thing which I will discuss in a bit) and archive the email. </p></li></ol></li></ol><p>Creating smart tasks from these emails is crucial. Email is vague. Creating the task means clarifying the action(s). </p><ul><li><p>Received an email reminding you to take some training, make a task:  <em>(10/31) Complete X training.</em> </p></li><li><p>Got an email with a response to an RFP? Create a task: <em>Review vendor Y&#8217;s response to RFP.</em> </p></li></ul><p>Eventually there is no more email. I can then switch to planning the day and doing my work. </p><p>There are many schemes for prioritizing. It also changes based on other people&#8217;s prioritizations, like my manager&#8217;s. I keep flexible and limit work-in-progress. I commit to completing 3 a day. One can always do more. </p><p>Now, email is not the only way work comes in. I also have conversations, chats, meetings, ideas, phone calls. No difference, if there is something to do, make an actionable task. </p><p>There are also waiting tasks. When I am waiting on somebody else to do something, I create a task that says, <em>Waiting on X re: to provide budget numbers for project Y</em>. This task goes on a waiting list. I periodically review the waiting list and remind that person if they haven&#8217;t done it yet.</p><p>That&#8217;s the conceptual framework on my work process. The reason I brought up Outlook is that every company I have ever worked for has used it. I like the email, calendar, task framework. It is also easily extensible and I have built a number of tools to implement this system. I&#8217;ll describe this in the part 2. </p><p></p>]]></content:encoded></item><item><title><![CDATA[.bat File on Windows Taskbar]]></title><description><![CDATA[When building my Active Directory search tool, I wanted to launch it from the Windows taskbar.]]></description><link>https://blog.briancarroll.org/p/bat-file-on-windows-taskbar</link><guid isPermaLink="false">https://blog.briancarroll.org/p/bat-file-on-windows-taskbar</guid><dc:creator><![CDATA[Brian Carroll]]></dc:creator><pubDate>Sat, 28 Sep 2024 09:27:03 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MR9m!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dcf9877-6097-49b7-9e50-1aee725b3624_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When building my <a href="https://blog.briancarroll.org/p/llm-assisted-active-directory-search">Active Directory search tool</a>, I wanted to launch it from the Windows taskbar. I created a .bat file to activate the python virtual environment and run the program. However, you can&#8217;t directly add a .bat file to the taskbar. </p><p>To get around this you can rename the .bat file extension to .exe, add it to the taskbar, rename the .exe back to .bat, finally edit the properties of the taskbar icon to point back to the renamed .bat file. Why Microsoft?</p>]]></content:encoded></item><item><title><![CDATA[LLM-assisted Active Directory Search]]></title><description><![CDATA[I needed to check Active Directory (AD) to see who was part of a group.]]></description><link>https://blog.briancarroll.org/p/llm-assisted-active-directory-search</link><guid isPermaLink="false">https://blog.briancarroll.org/p/llm-assisted-active-directory-search</guid><dc:creator><![CDATA[Brian Carroll]]></dc:creator><pubDate>Fri, 27 Sep 2024 11:24:00 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MR9m!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dcf9877-6097-49b7-9e50-1aee725b3624_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>I needed to check Active Directory (AD) to see who was part of a group. I use AD infrequently and keep a list of queries in a text file on my desktop, as I can&#8217;t ever remember the syntax.</p><p>As I opened my list I thought...wait, I don&#8217;t ever have to do this again. Let&#8217;s write a program to take a natural language prompt and have our LLM figure out the PowerShell commands. Within 30 minutes I had a functional program. It took several small iterations and these are the prompts I used. Unfortunately, I can&#8217;t share the program.</p><p>The initial prompt was: </p><blockquote><p>&#8220;Create a python program that will query Active Directory based on a user's natural language query. Suggestion is to send the query to an LLM to determine the correct command(s) for Active Directory. Once the command(s) is returned, the python script should execute it. There should be a standard list of properties to return. There should be an automatic export of any returned valid data to Excel. Can use LDAP and/or Powershell AD Cmdlets. Provide the complete script to do all of these tasks. Ask any clarification questions you may have.&#8221;</p></blockquote><p>Asking the LLM to return any clarifications was helpful. However, it produced a functioning program with the first prompt. </p><blockquote><p>&#8220;Clarifications Needed:</p><p>1. LLM Setup: Do you have the necessary LLM endpoint, API key, and deployment name?</p><p>2. Active Directory Access: Are you using LDAP, PowerShell, or both for querying Active Directory?</p><p>3. Data Format: What is the expected format of the data returned from Active Directory? This will help in parsing the results correctly.</p><p>4. Error Handling: How should errors be handled, especially if the LLM response is not a valid command or if the AD query fails?&#8221;</p></blockquote><p>I responded with:</p><blockquote><p>1. I have the LLM variables set up already as environment variables in Windows. 2. Use Powershell. 3. Data is table format, exported to Excel. 4. Errors should be handled in a Try Except clause and any exceptions printed to terminal.</p><p>Question: can this code handle any query about AD? For example I may want basic user attributes, or find out all groups a user is a part of, or all users within a group.</p></blockquote><p>These 2 clarifications was enough to get a robust script. The next couple of iterations were usability related.</p><blockquote><p>one more addition, enable the user to keep making queries until they enter the 'q' key to quit. Add a prompt to the input to use 'q' to quit.</p><p>Add a function that if a user inputs 'help' then return a series of example queries. update the input prompt to include that help information.</p></blockquote><p>That&#8217;s it. It built a great tool. Really enjoyable. There is one small thing I don&#8217;t like about this process. Over time, the LLM keeps returning the full code script on each response. It takes too long. I have yet to come up with a way to focus in on just a part of the code, without starting a new thread. </p><p>After I had this script I thought that I needed to create something for my whole team, which meant a web front-end. I decided to convert this to a Shiny app and it failed miserably. Same with trying to convert it to use the ldap3 library. I&#8217;m still working on that one. </p><p>I think the failure of these 2 approaches is because I know less about the technology behind Shiny and the ldap protocol. </p><p>Anyway, a great tool and I was reminded of Al Sweigart&#8217;s book, <strong><a href="https://automatetheboringstuff.com/">Automate the Boring Stuff with Python</a>. </strong></p>]]></content:encoded></item><item><title><![CDATA[I was going to write a post but ...]]></title><description><![CDATA[Simon Willison beat me to it.]]></description><link>https://blog.briancarroll.org/p/i-was-going-to-write-a-post-but</link><guid isPermaLink="false">https://blog.briancarroll.org/p/i-was-going-to-write-a-post-but</guid><dc:creator><![CDATA[Brian Carroll]]></dc:creator><pubDate>Tue, 24 Sep 2024 21:17:50 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MR9m!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dcf9877-6097-49b7-9e50-1aee725b3624_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Simon Willison beat me to it. <a href="https://simonwillison.net/2024/Sep/20/using-llms-for-code/">This</a> sums up my experience coding with LLMs. I love it. For a brief bit I worried about it making me a lazy programmer but it isn&#8217;t. Asking the LLM about the code it writes is far better way to learn that copying code out of a book and hoping the author could explain it. </p>]]></content:encoded></item><item><title><![CDATA[Everything is Manipulatable]]></title><description><![CDATA[When working on the task scheduler issue I previously posted, I managed to lock myself out of my computer.]]></description><link>https://blog.briancarroll.org/p/everything-is-manipulatable</link><guid isPermaLink="false">https://blog.briancarroll.org/p/everything-is-manipulatable</guid><dc:creator><![CDATA[Brian Carroll]]></dc:creator><pubDate>Mon, 23 Sep 2024 21:07:22 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MR9m!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dcf9877-6097-49b7-9e50-1aee725b3624_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>When working on the task scheduler issue I previously posted, I managed to lock myself out of my computer. It&#8217;s been a long time since I have done that. I had some research to do. These days that means querying an LLM but I actually didn&#8217;t find this answer through them. Good ol&#8217; Reddit solved it. </p><p>See, on the Windows login screen, there is a button for the Ease of Access settings. If you click it, it will run an .exe called utilman.exe. This password recovery process involves you booting from the USB, opening the command-line, backing up utilman.exe, creating a copy of cmd.exe, renamed as utilman.exe. Now when you boot back to Windows, you can access the command prompt from the login screen by clicking Ease of Access and resetting your password.</p><p>This is all well-known and many people have commented on it. What is interesting about this approach is the mindset behind it, the one that thinks all things are manipulatable. (I heard that phrase on The History of The Gibson on the Hacker History Podcast.) It is the heart of creativity to transpose one thing into another, often unrelated context.  </p><p>I remember feeling happy doing this hack. It was joyful to remember this lesson. Day-to-day life seems to dull this askance approach to problem solving. Any time I can create something new or solve a problem through a sideways approach is very fulfilling.</p><p>Any way, I reset my password, figured out the task scheduling problem (by going an entirely different route), and am now debating whether to encrypt my drive! </p><div class="subscription-widget-wrap-editor" data-attrs="{&quot;url&quot;:&quot;https://blog.briancarroll.org/subscribe?&quot;,&quot;text&quot;:&quot;Subscribe&quot;,&quot;language&quot;:&quot;en&quot;}" data-component-name="SubscribeWidgetToDOM"><div class="subscription-widget show-subscribe"><div class="preamble"><p class="cta-caption">Thanks for reading Brian&#8217;s Making Things! Subscribe for free to receive new posts and support my work.</p></div><form class="subscription-widget-subscribe"><input type="email" class="email-input" name="email" placeholder="Type your email&#8230;" tabindex="-1"><input type="submit" class="button primary" value="Subscribe"><div class="fake-input-wrapper"><div class="fake-input"></div><div class="fake-button"></div></div></form></div></div>]]></content:encoded></item><item><title><![CDATA[Windows Task Scheduler Woes]]></title><description><![CDATA[My favorite cartoonist has a website where he displays daily selections from his archive.]]></description><link>https://blog.briancarroll.org/p/windows-task-scheduler-woes</link><guid isPermaLink="false">https://blog.briancarroll.org/p/windows-task-scheduler-woes</guid><dc:creator><![CDATA[Brian Carroll]]></dc:creator><pubDate>Fri, 20 Sep 2024 11:59:51 GMT</pubDate><enclosure url="https://substackcdn.com/image/fetch/$s_!MR9m!,w_256,c_limit,f_auto,q_auto:good,fl_progressive:steep/https%3A%2F%2Fsubstack-post-media.s3.amazonaws.com%2Fpublic%2Fimages%2F3dcf9877-6097-49b7-9e50-1aee725b3624_144x144.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>My favorite cartoonist has a website where he displays daily selections from his archive. I want this in my life but I can&#8217;t be bothered to go to a website everyday. So several years ago, I wrote a python script to take screenshots of the cartoons and email them to me (scraping didn&#8217;t work). The script was scheduled through Windows Task Scheduler.</p><p>Then I changed computers, brought over the code, and have been struggling for days to get the task scheduler to work. The task wouldn&#8217;t run the python script directly. I wrote .bat and .ps1 files to try and activate the virtual environment, then run the scripts. I fixed that, then the images were downloaded as black images. Over and over, problem after problem, including changing my password and getting locked out of my computer (&#8230; cool hack to restore to come).</p><p>I finally decided to run the script as a Windows Service. Using pywin, I installed the service but could not get it to start or provide any meaningful error logging. I went round and round on this as well. LLMs suggested using <a href="https://nssm.cc/">NSSM</a>, Non-Sucking Service Manager. I agree, it does not suck, and my code now runs as a Windows Service. I&#8217;m sharing the NSSM code in case it helps somebody. </p><p>In a future post, I am going to talk about using LLMs through this process. The original code was written before they were available. Now I use them incessantly. </p><p>As I was writing this I heard a voice in my head &#8220;Did you ever check if there was an RSS feed?&#8221; There is&#8230;</p><p>Installing a python script as a Windows Service using NSSM</p><ol><li><p>Open powershell as an administrator</p></li><li><p>Change to the NSSM.EXE working directory</p></li><li><p>Run these commands:</p></li></ol><pre><code><code># install service
.\nssm.exe install "MyServiceName" "&lt;full path&gt;\venv\Scripts\python.exe" "&lt;full path&gt;\&lt;python script name&gt;.py" 

# Set up logging for service
.\nssm.exe set "MyServiceName" AppStdout "&lt;full path&gt;\service.log"
.\nssm.exe set "MyServiceName" AppStderr "&lt;full path&gt;\service_error.log"

# Set working directory
.\nssm.exe set "MyServiceName" AppDirectory "&lt;full path&gt;"

# Set environment variable accessed in python using os.environ .\nssm.exe set "MyServiceName" AppEnvironmentExtra MY_ENVIRONMENT_VARIABLE=ev_value

# Run service
.\nssm.exe start &#8220;MyServiceName&#8221; (stop, remove, etc.)</code></code></pre>]]></content:encoded></item></channel></rss>