MyGeekDaddyhttps://mygeekdaddy.net/2024-01-24T20:30:02-06:00SQL Scripting to Manage Person Records in Maximo2024-01-24T19:27:55-06:002024-01-24T20:30:02-06:00Jason Verlytag:mygeekdaddy.net,2024-01-24:/2024/01/24/sql-scripting-to-manage-person-records-in-maximo/<p>One of the most frustrating tasks I've had over the years as a Maximo administrator is cleaning up records for an employee that has separated from the company. It's frustrating because the call/ticket I will likely receive from a Maximo user is asking about how to work around an …</p><p>One of the most frustrating tasks I've had over the years as a Maximo administrator is cleaning up records for an employee that has separated from the company. It's frustrating because the call/ticket I will likely receive from a Maximo user is asking about how to work around an error message like this when changing the employee's Person record from ACTIVE to INACTIVE:</p>
<figure><a href="http://share.mygeekdaddy.net/person_inactive_jp_supv_error.png"><img src="http://share.mygeekdaddy.net/person_inactive_jp_supv_error.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Searching IBM Support, you can find a couple of documents on what a Maximo user needs to do to inactivate a Person record:</p>
<ul>
<li><a href="https://www.ibm.com/support/pages/changing-person-record-inactive">Changing Person Record to Inactive (ibm.com)</a></li>
<li><a href="https://www.ibm.com/support/pages/error-after-changing-person-status-inactive">Error After Changing Person Status to INACTIVE (ibm.com)</a></li>
<li><a href="https://www.ibm.com/support/pages/unable-deactivate-person">Unable to Deactivate a Person (ibm.com)</a></li>
</ul>
<p>And it's the last suggested support page that is the most annoying. </p>
<p>Why? Because a Maximo user will normally recognize that the previous employee can't be on an active record and they did their due diligence to remove the previous employee. But when they do a search on the employee, the Maximo user will see the previous employee is still listed on historical copies of a record - e.g. a Job Plan. </p>
<figure><a href="http://share.mygeekdaddy.net/Window_and_Job_Plans.png"><img src="http://share.mygeekdaddy.net/Window_and_Job_Plans.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>From the out of the box Maximo UI, there is no way for a Maximo user to update a REVISED Job Plan, so now a Maximo administrator will have to get involved with this.</p>
<h4>Back end scripting to the rescue</h4>
<p>The work around is the Maximo/SQL<sup id="fnref:536510"><a class="footnote-ref" href="#fn:536510">1</a></sup> administrator has to remove the previous employee <code>PERSONID</code> from some of the historical records so the Person record can be set to Inactive. The challenge most administrators will find is that this issue can occur on several fields in Maximo:</p>
<ul>
<li>Supervisor on Job Plans</li>
<li>Lead on Job Plans</li>
<li>Planned Labor on Job Plans<sup id="fnref:60430"><a class="footnote-ref" href="#fn:60430">2</a></sup></li>
</ul>
<p>Over the years I've come up with a SQL script to clear out where a Person record could be used from sources that will prevent a Person record being inactivated. </p>
<p style="border: #1863a1 1px solid; border-radius: 10px; padding:10px; margin:20px; background-color: rgb(251,239,153);"><b>CAUTION:</b> The script below should be tested before using on your Productive/Live environment.</a></p>
<p>One caveat to this script: In the script I've created, the Person record that you are trying to inactivated will be set to a <em>NULL</em> value in the various fields. Some organizations have made the related Person field a required field. For example the <code>JOBPLAN.SUPERVISOR</code> field on may be a required field. This script will set the value for <code>JOBPLAN.SUPERVISOR</code> to <code>NULL</code>. The next time a PM attempts to use that Job Plan, the PM WO Gen will error out because a required field is now blank. </p>
<p>SQL Script to remove Person fields:</p>
<div class="highlight"><pre><span></span><code><span class="k">declare</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="nc">char</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span><span class="w"></span>
<span class="k">set</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="o">=</span><span class="s1">'WAYNEB01'</span><span class="w"></span>
<span class="k">delete</span><span class="w"> </span><span class="n">joblabor</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="ow">exists</span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">jobplan</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">jpnum</span><span class="o">=</span><span class="n">joblabor</span><span class="p">.</span><span class="n">jpnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">jobplanid</span><span class="o">=</span><span class="n">jobplan</span><span class="p">.</span><span class="n">jobplanid</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">status</span><span class="o">=</span><span class="s1">'ACTIVE'</span><span class="p">)</span><span class="w"> </span>
<span class="k">delete</span><span class="w"> </span><span class="n">joblabor</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="ow">exists</span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">jobplan</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">jpnum</span><span class="o">=</span><span class="n">joblabor</span><span class="p">.</span><span class="n">jpnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">jobplanid</span><span class="o">=</span><span class="n">jobplan</span><span class="p">.</span><span class="n">jobplanid</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">status</span><span class="o">=</span><span class="s1">'INACTIVE'</span><span class="p">)</span><span class="w"> </span>
<span class="k">delete</span><span class="w"> </span><span class="n">joblabor</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="ow">exists</span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">jobplan</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">jpnum</span><span class="o">=</span><span class="n">joblabor</span><span class="p">.</span><span class="n">jpnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">jobplanid</span><span class="o">=</span><span class="n">jobplan</span><span class="p">.</span><span class="n">jobplanid</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">status</span><span class="o">=</span><span class="s1">'REVISED'</span><span class="p">)</span><span class="w"> </span>
<span class="k">update</span><span class="w"> </span><span class="n">jobplan</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">supervisor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">supervisor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">status</span><span class="o">=</span><span class="s1">'REVISED'</span><span class="w"></span>
<span class="k">update</span><span class="w"> </span><span class="n">jobplan</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">supervisor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">supervisor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">status</span><span class="o">=</span><span class="s1">'INACTIVE'</span><span class="w"></span>
<span class="k">update</span><span class="w"> </span><span class="n">jobplan</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">supervisor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">supervisor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">status</span><span class="o">=</span><span class="s1">'ACTIVE'</span><span class="w"></span>
<span class="k">update</span><span class="w"> </span><span class="n">jobplan</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">status</span><span class="o">=</span><span class="s1">'REVISED'</span><span class="w"></span>
<span class="k">update</span><span class="w"> </span><span class="n">jobplan</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">status</span><span class="o">=</span><span class="s1">'INACTIVE'</span><span class="w"></span>
<span class="k">update</span><span class="w"> </span><span class="n">jobplan</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">status</span><span class="o">=</span><span class="s1">'ACTIVE'</span><span class="w"></span>
<span class="k">update</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">lead</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">lead</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"></span>
<span class="k">update</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="n">supervisor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="k">null</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">supervisor</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"></span>
<span class="k">delete</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">persongroupteam</span><span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">respparty</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@emp_id</span><span class="w"></span>
</code></pre></div>
<p>The script will remove the Person record from:</p>
<ul>
<li>Supervisor on all Job Plans</li>
<li>Lead on all Job Plans</li>
<li>Planned Labor on all Job Plans</li>
<li>Supervisor on all PM's</li>
<li>Lead on all PM's</li>
<li>Remove Person from all Person Groups</li>
</ul>
<p>After the script is run, all restricted fields should have been cleared with the employee's Person record. Maximo may<sup id="fnref:926003"><a class="footnote-ref" href="#fn:926003">3</a></sup> give other error messages when attempting to set the Person record to INACTIVE. Likely those will be active transactional records (e.g. open work orders) that will have to migrate through their lifecycle until the transactional records are closed. </p>
<p>At this point, the Person record can be set to INACTIVE. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:536510">
<p>To the organizations that don't give their Maximo administrator(s) SQL rights... why? <a class="footnote-backref" href="#fnref:536510" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:60430">
<p>Technically the JOBLABOR table <a class="footnote-backref" href="#fnref:60430" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:926003">
<p>Ok... probably will. <a class="footnote-backref" href="#fnref:926003" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>New Microsoft Windows App for macOS2023-11-16T16:03:53-06:002023-11-16T16:03:53-06:00Jason Verlytag:mygeekdaddy.net,2023-11-16:/2023/11/16/new-microsoft-windows-app-for-macos/<p>Microsoft announced <a href="https://learn.microsoft.com/en-gb/windows-app/overview">a new Windows App</a> yesterday. This kind of announcement normally doesn't send shock waves in the Apple community until you get an explanation on what the app really is. </p>
<blockquote>
<p>Windows App is your gateway to Azure Virtual Desktop, Windows 365, Microsoft Dev Box, Remote Desktop Services, and remote …</p></blockquote><p>Microsoft announced <a href="https://learn.microsoft.com/en-gb/windows-app/overview">a new Windows App</a> yesterday. This kind of announcement normally doesn't send shock waves in the Apple community until you get an explanation on what the app really is. </p>
<blockquote>
<p>Windows App is your gateway to Azure Virtual Desktop, Windows 365, Microsoft Dev Box, Remote Desktop Services, and remote PCs, securely connecting you to Windows devices and apps.</p>
<p>You can use Windows App on many different types of devices on different platforms and form factors, such as desktops and laptops, tablets, smartphones, and through a web browser. When using a web browser on a desktop or laptop, you can connect without having to download and install any software.</p>
</blockquote>
<p>As a long time Mac user, in a corporate Windows world, this kind of app instantly piqued my interest. <sup id="fnref:739009"><a class="footnote-ref" href="#fn:739009">1</a></sup> I've written in the past about tools I've adopted to develop and administer IBM Maximo from an Apple laptop. Needing to access Windows based servers was normally one of the lower priority items because there was usually a variety of software applications that would allow me to RDP into a server. That was until I recently migrated to a Apple Silicon based MBP.</p>
<p>The current Microsoft Remote Desktop app has <a href="https://techcommunity.microsoft.com/t5/azure-virtual-desktop-feedback/microsoft-remote-desktop-for-mac-copy-and-paste-works-a-while/idi-p/3930905">had problems copy/pasting information</a> from the Windows environment back to the macOS environment. Several articles on Microsoft Tech Community site will offer a solution to the problem, but then list multiple responses that the solution only worked for a while. So when I saw the post about the new app, I <a href="https://aka.ms/macOSWindowsAppBeta">signed up for a TestFlight copy</a> of the Windows App and took it for a spin. </p>
<figure><a href="https://share.mygeekdaddy.net/windows_app_screen.png"><img src="https://share.mygeekdaddy.net/windows_app_screen.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Since my initial testing was only for RDP connections, the goal was to test the copy/paste functionality. Bingo! I copied 8200+ rows of information from a SQL query and pasted the information back into an Excel spreadsheet on my MBP. When using the Windows App I didn't get any delay, or worse, a beach ball in Excel.</p>
<p>With that test passing with flying colors, I wanted to explore some of the new features/functions in the app. The next one I wanted to try was the multiple monitor support. To enable that function, just edit the settings for the RDP connection.</p>
<figure><a href="https://share.mygeekdaddy.net/Windows_App_Settings.png"><img src="https://share.mygeekdaddy.net/Windows_App_Settings.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now I can use both of my monitors when I connect to a Windows server. Once I get home I'll see if there is still room on the Test Flight for the iOS version.</p>
<p>You can find more information about the Windows App here: <a href="https://learn.microsoft.com/en-gb/windows-app/users">Windows App documentation for users</a></p>
<div class="footnote">
<hr>
<ol>
<li id="fn:739009">
<p>Like a lot. <a class="footnote-backref" href="#fnref:739009" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Using Dictation in iOS Shortcuts2023-11-07T15:21:54-06:002023-11-07T15:21:54-06:00Jason Verlytag:mygeekdaddy.net,2023-11-07:/2023/11/07/using-dictation-in-ios-shortcuts/<p>One of the features I was looking forward to the most with the iPhone 15 Pro has been the one I've taken advantage the least... the Action Button. The idea of having an assignable button on my digital assistant seemed like the perfect feature. So after getting my iPhone I …</p><p>One of the features I was looking forward to the most with the iPhone 15 Pro has been the one I've taken advantage the least... the Action Button. The idea of having an assignable button on my digital assistant seemed like the perfect feature. So after getting my iPhone I did the most unimaginable and set the button as a flashlight.<sup id="fnref:297460"><a class="footnote-ref" href="#fn:297460">1</a></sup></p>
<p>The real problem I had with the action button was that limits Apple had placed on the button itself. To date the button can be assigned one of 7 actions:</p>
<ul>
<li>Silent Mode</li>
<li>Focus</li>
<li>Flashlight</li>
<li>Magnifier</li>
<li>Shortcut</li>
<li>Accessibility feature</li>
<li>No action<sup id="fnref:181723"><a class="footnote-ref" href="#fn:181723">2</a></sup></li>
</ul>
<p>I had hoped that the button would have a feature like previous iPhones had with 3D Touch. One action if the button was pressed quickly and another if the button was held for a while. Or maybe if the button was pushed once it would do one action and if pushed twice quickly do a different action. Nope, the action button is a one trick pony and you can only choose one of the three previous choices. <sup id="fnref:782189"><a class="footnote-ref" href="#fn:782189">3</a></sup></p>
<p>A while back Dr Drang had a <a href="https://leancrew.com/all-this/2023/10/dictation-automation/">post about using Dictation</a> in Shortcuts. This got me thinking about the potential to use dictation to trigger different Shortcuts from the action button. Most of the time when I've used dictation it's been to either a) collect a thought I have and I don't have a means to quickly jot it down or 2) capture a to do item. What I wanted was a way to use dictation to select what I needed to do and then use dictation again to collect my thought. </p>
<h4>Action Button Choice</h4>
<p>I got a working version of a dictation Shortcut pretty quickly.</p>
<figure><a href="http://share.mygeekdaddy.net/Action_button_shortcut.png"><img src="http://share.mygeekdaddy.net/Action_button_shortcut.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The first action in the Shortcut will capture a dictation to determine if I want to collect a Note or a Task. I didn't put any indicator or display instructions since the goal of the Shortcut was to quickly collect what I needed to say. The Shortcut will extract the dictated text into actual text that can be used by a <code>If-Then</code> function to check if I want to collect a "Note" or a "Task". </p>
<p>If I dictated "Note", the Shortcut will select the <code>If-Then</code> path to run a subroutine to open a second dictation window. This window will take the dictation and do another speech to text conversion. The collected text will be placed into a new note in Drafts with current date prepended to the text. <sup id="fnref:616071"><a class="footnote-ref" href="#fn:616071">5</a></sup> </p>
<p>If I dictated "Task", the Shortcut will run the second part of the <code>If-Then</code> subroutine. This will open another dictation window and do a speech to text conversion, just like in the "Note" part of the Shortcut. But now the collected text is used to create a new task in my Inbox in OmniFocus and set a defer date 2 days from now. <sup id="fnref:891725"><a class="footnote-ref" href="#fn:891725">4</a></sup></p>
<p>Now when I press the Action Button on my iPhone, I can announce what choice of action I want to take and dictate the thought straight to the proper destination. The biggest roadblock I initially had with using dictation features was the weird looks I'd get when someone thought I was walking down the hall talking to myself. </p>
<p>Link to Shortcut: <a href="https://www.icloud.com/shortcuts/d67966cb1e51474aa93f729188c10fdd">Action Button Choice</a></p>
<div class="footnote">
<hr>
<ol>
<li id="fn:297460">
<p>Such a bold choice. <a class="footnote-backref" href="#fnref:297460" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:181723">
<p>Aka... do nothing. <a class="footnote-backref" href="#fnref:181723" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:782189">
<p>Cause the other 4 aren't worth the effort. <a class="footnote-backref" href="#fnref:782189" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:891725">
<p>The trick to push a new Task to your Inbox is to leave the "Project" field blank on the Shortcut action. <a class="footnote-backref" href="#fnref:891725" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:616071">
<p>Next version of the Shortcut is to collect all dictated notes into a single daily collection. <a class="footnote-backref" href="#fnref:616071" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>Migrating legacy text into Maximo Long Descriptions2023-09-11T16:46:04-05:002023-09-11T16:46:04-05:00Jason Verlytag:mygeekdaddy.net,2023-09-11:/2023/09/11/migrating-legacy-text-into-maximo-long-descriptions/<p>One of the trickier tasks a Maximo administrator will run into is migrating information from a legacy system into Maximo. And one of the trickiest migrations can be importing long text notes from a legacy system into Maximo's Long Description fields. When I have to migrate information into Maximo, understanding …</p><p>One of the trickier tasks a Maximo administrator will run into is migrating information from a legacy system into Maximo. And one of the trickiest migrations can be importing long text notes from a legacy system into Maximo's Long Description fields. When I have to migrate information into Maximo, understanding the source information is critical. Straight plain text will use hidden characters to do things like indent a line with a Tab or move the cursor to a new line with the Enter key. For text migrations, the focus is how does the legacy text handle character codes for <code>carriage return</code> and <code>new line feed</code>. </p>
<p style="border: #1863a1 1px solid; border-radius: 10px; padding:10px; margin:20px; background-color: rgb(251,239,153);">A couple of assumptions going forward: 1) that your Maximo environment is using Rich Text for Long Descriptions 2) that you're migrating information from a Microsoft based environment. If these don't apply, adjust as needed.</p>
<h4>A Little Background First</h4>
<p>The first step is making sure Maximo's External System being used to import the legacy text<sup id="fnref:985000"><a class="footnote-ref" href="#fn:985000">1</a></sup> is set up to use Long Descriptions. IBM has a quick tech note on <a href="https://www.ibm.com/support/pages/including-long-descriptions-maximo-enterprise-adapter">"Including long descriptions in the MIF"</a>. Review the Enterprise Service you'll be using in the External System to verify it's setup to use Long Descriptions. </p>
<p>The key point to remember going forward is the goal is not to migrate the legacy text character for character, but to migrate plain text into rich text. As prefaced earlier, the key is to understand how your legacy system interprets some key character. For most Microsoft based systems, hitting the <code>Enter</code><sup id="fnref:959549"><a class="footnote-ref" href="#fn:959549">2</a></sup> key on your keyboard puts your cursor at the beginning of the next line. Under the hood, getting that same functionality in text fields on SQL text requires the insertion of two hidden characters into your text document: <code>char(13)</code> and <code>char(10)</code>. </p>
<p>Since those byte characters don't show up in Rich text, doing a direct migration of SQL text into a Long description will look like this:</p>
<p>SQL Text: </p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. </p>
<p>Phasellus maximus nulla ut lectus dictum tristique. </p>
<p>Nam a faucibus odio. Aliquam erat volutpat.</p>
</blockquote>
<p>Maximo Long Description:</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus maximus nulla ut lectus dictum tristique. Nam a faucibus odio. </p>
</blockquote>
<p>Why?</p>
<p>There are 2 primary reasons:<sup id="fnref:668234"><a class="footnote-ref" href="#fn:668234">3</a></sup> </p>
<ol>
<li>When I extract the text from the SQL database, the typical path to extract and manipulate the text will strip the <code>char(13)</code> and <code>char(10)</code> characters. </li>
<li>Rich text doesn't recognize those characters, rich text recognizes <em>tags</em> within the text. </li>
</ol>
<p>So to get plain text to migrate to rich text, I have to covert the <code>char(13)</code> and <code>char(10)</code> characters into something recognizable by Maximo's rich text engine. </p>
<h4>Maximo Rich Text Tagging</h4>
<p>If I go into Maximo and enter parts of the <em>Lorem Ipsum</em> sentences into a long description field, it will look like this in the UI:</p>
<figure><a href="http://share.mygeekdaddy.net/Screenshot_2023-09-08_at_10.23.41_AM.png"><img src="http://share.mygeekdaddy.net/Screenshot_2023-09-08_at_10.23.41_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Looking at this same Long Description at the database level shows:</p>
<figure><a href="http://share.mygeekdaddy.net/Screenshot_2023-09-08_at_10.50.46_AM.png"><img src="http://share.mygeekdaddy.net/Screenshot_2023-09-08_at_10.50.46_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now I can see how Maximo will interpret a carriage return into rich text by using <code><div></code> tags. The problem is applying wrapping tags on text is more work than I normally want to take on.<sup id="fnref:764040"><a class="footnote-ref" href="#fn:764040">4</a></sup> Since the default by Maximo is to use a double <code><div></code> tags for a carriage return, I can use the equivalent of <code><br /></code> to do the same. If I update the long description field from:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><div></span>Lorem ipsum dolor sit amet, consectetur adipiscing elit.<span class="nt"></div><div></span> <span class="nt"></div><div></span>Phasellus maximus nulla ut lectus dictum tristique.<span class="nt"></div><div></span> <span class="nt"></div><div></span>Nam a faucibus odio.<span class="nt"></div></span><span class="cm"><!-- RICH TEXT --></span>
</code></pre></div>
<p>and switch the text string to:</p>
<div class="highlight"><pre><span></span><code>Lorem ipsum dolor sit amet, consectetur adipiscing elit. <br /><br />Phasellus maximus nulla ut lectus dictum tristique. <br /><br />Nam a faucibus odio.
</code></pre></div>
<p>The UI view when using the <code><br /> </code> tags results in the same visual output.</p>
<figure><a href="http://share.mygeekdaddy.net/Screenshot_2023-09-08_at_10.47.19_AM.png"><img src="http://share.mygeekdaddy.net/Screenshot_2023-09-08_at_10.47.19_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Since we get the same results, the use of <code><br /></code> tags for the text transformation is simpler. </p>
<h4>SQL Replacement for Extract</h4>
<p>Knowing that SQL will use two different byte characters to insert a carriage return in the legacy text field, I can use that information to create a script to shift the byte characters into rich text tags. Looking at the legacy text at the byte level, I can replace the characters in the output by using a double <code>REPLACE</code> statement. </p>
<div class="highlight"><pre><span></span><code><span class="n">select</span><span class="w"> </span><span class="n">KEYFIELD</span><span class="p">,</span><span class="w"> </span><span class="n">REPLACE</span><span class="w"> </span><span class="p">(</span><span class="n">REPLACE</span><span class="w"> </span><span class="p">(</span><span class="n">cast</span><span class="p">(</span><span class="n">LEGACYTEXT</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">nvarchar</span><span class="p">(</span><span class="nb">max</span><span class="p">)),</span><span class="w"> </span><span class="n">CHAR</span><span class="p">(</span><span class="mi">13</span><span class="p">),</span><span class="w"> </span><span class="s1">'<br />'</span><span class="p">),</span><span class="w"> </span><span class="n">CHAR</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span><span class="w"> </span><span class="s1">''</span><span class="p">)</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">LEGRACY_TEXT</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">LEGACYTABLE</span><span class="p">;</span><span class="w"></span>
</code></pre></div>
<p>The first <code>REPLACE</code> statement <code>CHAR(13), '<br />'</code> will transform the hidden <code>CHAR(13)</code> byte character insert a <code><br /></code> tag into the text. The other <code>REPLACE</code> will take the <code>CHAR(10)</code> byte code and leave a blank entry into the migrated text. </p>
<p>Now all the text I need to extract and migrate will be properly tagged for import as rich text into a Long Description field. Since the legacy text is encoded with the tags, using a plain text External System, like <code>CSVDATA</code>, all the legacy text will import properly. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:985000">
<p>In my case, I normally use the CSVDATA External System to import CSV flat files. <a class="footnote-backref" href="#fnref:985000" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:959549">
<p><code>Return</code> for my Mac friends. <a class="footnote-backref" href="#fnref:959549" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:668234">
<p>I could dedicate a whole blog text manipulation tricks on SQL databases. <a class="footnote-backref" href="#fnref:668234" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:764040">
<p>I'm an engineer, so by default I want a simple solution. <a class="footnote-backref" href="#fnref:764040" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Add Spacers to your macOS menu dock2023-07-28T11:52:22-05:002023-07-28T11:52:22-05:00Jason Verlytag:mygeekdaddy.net,2023-07-28:/2023/07/28/add-spacers-to-your-macos-menu-dock/<p>I've been able to convert a few more friends and family members to the Apple family. So I'm starting to get more questions on customizing their Apple device. One of my favorite customizations is adding spacers into my dock to help separate apps that I keep in my dock. So …</p><p>I've been able to convert a few more friends and family members to the Apple family. So I'm starting to get more questions on customizing their Apple device. One of my favorite customizations is adding spacers into my dock to help separate apps that I keep in my dock. So I'll start posting some of my favorite customizations. </p>
<p>I originally found this customization on Chris Pennington's (<a href="https://twitter.com/cpenned">@cpenned</a>) <a href="https://chrispennington.blog">blog site</a>, so I want to give credit to where I originally found the code. Plus I want to give a shout out to one of the sane people that place their dock on the left side too. <sup id="fnref:467177"><a class="footnote-ref" href="#fn:467177">1</a></sup></p>
<p>There are two sizes of spacers you can place on the Dock - Small and Large. </p>
<figure><a href="http://share.mygeekdaddy.net/Screenshot_2023-07-28_at_12_36_42_PM.png"><img src="http://share.mygeekdaddy.net/Screenshot_2023-07-28_at_12_36_42_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Code for Spacer</h4>
<p>Each Spacer has a code snippet that you can copy/paste into a Terminal window.</p>
<p><strong>Small Spacer:</strong> </p>
<div class="highlight"><pre><span></span><code>defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="small-spacer-tile";}'; killall Dock
</code></pre></div>
<p><strong>Large Spacer:</strong></p>
<div class="highlight"><pre><span></span><code>defaults write com.apple.dock persistent-apps -array-add '{"tile-type"="spacer-tile";}'; killall Dock
</code></pre></div>
<h4>Steps to apply Spacer</h4>
<ol>
<li>Open the Terminal app. </li>
<li>Choose spacer size you want to apply. </li>
<li>Copy and paste the code from your choice above and hit <code>Return</code>.</li>
<li>Open your Dock and move the spacer as needed. </li>
</ol>
<p>You can just right click and select <code>Remove from Dock</code> to delete the spacer</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:467177">
<p>Per Chris: My dock is on the left normally (the <em>only</em> correct choice 😏), but I rotated the screenshot so it wouldn't take up as much vertical space. <a class="footnote-backref" href="#fnref:467177" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Maximo Automation Script on Duplicate Records2023-07-13T14:25:10-05:002023-07-13T14:25:10-05:00Jason Verlytag:mygeekdaddy.net,2023-07-13:/2023/07/13/maximo-automation-script-on-duplicate-records/<p>One of the frustrations I always have with Maximo is knowing something I want to do can be done, but not having the technical skills to cross the finish line. Automation Scripting continues to be in that category for me. This week I was asked by a couple of users …</p><p>One of the frustrations I always have with Maximo is knowing something I want to do can be done, but not having the technical skills to cross the finish line. Automation Scripting continues to be in that category for me. This week I was asked by a couple of users if there was a way to clear out certain fields when a record is duplicated. We had the philosophical debate on "duplicate" vs "new". They presented a good case that <em>if</em> the fields they asked to get cleared could happen it would make their time in Maximo more effective. </p>
<p>What was being asked is when an Asset record is duplicated, the following should occur:</p>
<ul>
<li>The DESCRIPTION field should be cleared of the previous record's text.</li>
<li>The SERIALNUM field should be cleared of the previous record's text.</li>
<li>The <code>CUSTOM</code> fields should be cleared of the previous record's text. </li>
</ul>
<p>My immediate thought was this <em>should</em> be able to be handled by an Automation Script. So I did what every Maximo administrator does now... I went to Google. </p>
<blockquote>
<p>Maximo automation script clear duplicate record values</p>
</blockquote>
<p>The 3rd result led me back to a trusted source - Bruno Portaluri's (<a href="https://twitter.com/bportaluri">@bportaluri</a>) <a href="https://bportaluri.com/blog">blog</a> on Maximo. The <a href="https://bportaluri.com/2019/10/automation-scripts-new-save-duplicate.html">post that Google found</a> was almost what I was looking.<sup id="fnref:454341"><a class="footnote-ref" href="#fn:454341">1</a></sup> Bruno had done a great job explaining some new functionality in Automation Scripting when a Maximo record was modified under 3 different conditions:</p>
<ul>
<li>When a record is created (NEW)</li>
<li>When a record is saved (SAVED)</li>
<li>When a record is duplicated (DUPLICATE)</li>
</ul>
<p>Those record events could trigger an Automation Script to take scripted actions on the record. I didn't see a good working example in Bruno's blog post, so I continued looking around.<sup id="fnref:114230"><a class="footnote-ref" href="#fn:114230">2</a></sup> After some <a href="https://www.linkedin.com/posts/stephen-hume-8570003_4th-presentation-from-maxtech-phoenix-activity-6586968215723868160-odTp/">further reading</a>, and more than a few dead ends, I went back to Bruno's post to see what other hints I could pick up. After reading his blog post for the 5th time I finally saw what I missed... </p>
<blockquote>
<p>Open the Automation Scripts application and select Create > Script from the action menu.</p>
</blockquote>
<p>Now it clicked on what I needed to do.</p>
<h4>Visual example of ASSET.DUPLICATE script</h4>
<p>Just like Bruno's script example, I needed to create an Automation Script to change the values of fields when a record was duplicated. So I did as he instructed and created a new Script. </p>
<figure><a href="http://share.mygeekdaddy.net/create_new_script.png"><img src="http://share.mygeekdaddy.net/create_new_script.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Maximo will open a new Script dialog box with just the basic requirements. </p>
<figure><a href="http://share.mygeekdaddy.net/empty_script_dialog_2023-07-13.png"><img src="http://share.mygeekdaddy.net/empty_script_dialog_2023-07-13.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The upside to this focused version is you do not have to worry about the launch attributes like an Object or Attribute script. You literally just need to add the script details. </p>
<figure><a href="http://share.mygeekdaddy.net/asset_duplicate_script.png"><img src="http://share.mygeekdaddy.net/asset_duplicate_script.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>From what I read in Bruno's post and a couple of other blog posts, there is a built in understanding of the MBO object <code>dupmbo</code> used in the script. So to clear the value of the ASSET.DESCRIPTION field, all I needed to call was this MBO for Maximo to automagically know it should take action on the duplicate record. </p>
<h4>Small tweaks make a big difference</h4>
<p>Normally to set a value in an Automation Script you would use the syntax of</p>
<div class="highlight"><pre><span></span><code>mbo.setValue("DESCRIPTION", "Set New Text")
</code></pre></div>
<p>In my case I needed to set the values of the fields to <code>NULL</code> instead of a set value. So I attempted to set the value <code>NULL</code> or <code>NONE</code>, while using the <code>dupmbo</code>:</p>
<div class="highlight"><pre><span></span><code>dupmbo.setValue("DESCRIPTION", None)
</code></pre></div>
<p>That didn't work. Doing some more research I found <a href="https://maximotipscom.wordpress.com/setting-null-value/">a snippet on a blog post</a> on how to set the value of a field to a blank value. </p>
<div class="highlight"><pre><span></span><code>mbo.setValueNull("DESCRIPTION",11L);
</code></pre></div>
<p>So now I could use the reference to <code>dupmbo</code> and set the value of a field to a blank. </p>
<div class="highlight"><pre><span></span><code>dupmbo.setValueNull("DESCRIPTION",11L);
</code></pre></div>
<p>The whole script looks like this:</p>
<figure><a href="http://share.mygeekdaddy.net/asset_duplicate_script.png"><img src="http://share.mygeekdaddy.net/asset_duplicate_script.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Once the script was saved I could open an Asset record and see the current values:</p>
<figure><a href="http://share.mygeekdaddy.net/Assets_2023-07-13_1.jpg"><img src="http://share.mygeekdaddy.net/Assets_2023-07-13_1.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>And after duplicating the record, the key fields are now blank:</p>
<figure><a href="http://share.mygeekdaddy.net/Asset_duplicate_2023-07-13.jpg"><img src="http://share.mygeekdaddy.net/Asset_duplicate_2023-07-13.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Done. </p>
<p>Shout out to <a href="https://twitter.com/bportaluri">Bruno</a> and <a href="https://www.linkedin.com/in/stephen-hume-8570003/">Stephen Hume</a> on the information they've shared with the Maximo community. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:454341">
<p>Actually it was exactly what I was looking for, I just didn't read it close enough. <a class="footnote-backref" href="#fnref:454341" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:114230">
<p>Did I mentioned I didn't read it close enough? <a class="footnote-backref" href="#fnref:114230" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Maximo Version of SMRP PM Compliance2023-03-28T10:19:47-05:002023-03-28T10:19:47-05:00Jason Verlytag:mygeekdaddy.net,2023-03-28:/2023/03/28/maximo-version-of-smrp-pm-compliance/<p>One of the metrics commonly adopted by an organization early in their reliability journey is the Preventive Maintenance Compliance metric.[^92032] The goal of the metric is to understand how effective the maintenance and operations teams are getting PM actions completed. The goal is to get at least 90% of …</p><p>One of the metrics commonly adopted by an organization early in their reliability journey is the Preventive Maintenance Compliance metric.[^92032] The goal of the metric is to understand how effective the maintenance and operations teams are getting PM actions completed. The goal is to get at least 90% of the PM's completed before its due date each month. When you look at the metric, it's a pretty simple calculation on the surface. </p>
<blockquote>
<p>PM/PdM WO's completed by due date this month / PM/PdM WO's due this month</p>
</blockquote>
<p>For example, if an organization had 384 PM<sup id="fnref:115999"><a class="footnote-ref" href="#fn:115999">2</a></sup> work orders due in February, and got 318 work orders done on time,<sup id="fnref:185126"><a class="footnote-ref" href="#fn:185126">3</a></sup> that equates to 82.8% completion. The challenge most organizations have is converting a simple definition into the complex SQL query needed to extract that definition out of their Maximo work history. </p>
<h4>Defining the PM Compliance metric</h4>
<p>SMRP defines PM Compliance as:<sup id="fnref:9552"><a class="footnote-ref" href="#fn:9552">1</a></sup></p>
<blockquote>
<p>This metric is a review of completed preventive maintenance (PM) and predictive maintenance (PdM) work orders, wherein the evaluation is against preset criteria for executing and completing the work.</p>
</blockquote>
<p>The metric goes on to include guidance of an overall goal of an organization completing at least 90% of the PM work orders before its due date and giving 3 options to consider in determining if a PM/PdM activity was completed on time:</p>
<ol>
<li>A PM & PdM work order is considered completed on time if completed by the required date.</li>
<li>A PM & PdM work order is considered completed on time if completed by the required date + one day.</li>
<li>A PM & PdM work order is considered completed on time if completed by the required date + 20 % of the PM and PdM frequency up to a maximum of 28 days.</li>
</ol>
<p>The 20% grace period is based on the following: <sup id="fnref:185129"><a class="footnote-ref" href="#fn:185129">6</a></sup></p>
<table>
<thead>
<tr>
<th style="text-align: center;">PM Frequency</th>
<th style="text-align: center;">Grace Period</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">> 1 Year</td>
<td style="text-align: center;">28 Days</td>
</tr>
<tr>
<td style="text-align: center;">24 Months</td>
<td style="text-align: center;">28 Days</td>
</tr>
<tr>
<td style="text-align: center;">12 Months</td>
<td style="text-align: center;">28 Days</td>
</tr>
<tr>
<td style="text-align: center;">6 Months</td>
<td style="text-align: center;">28 Days</td>
</tr>
<tr>
<td style="text-align: center;">4 Months</td>
<td style="text-align: center;">24 Days</td>
</tr>
<tr>
<td style="text-align: center;">3 Months</td>
<td style="text-align: center;">18 Days</td>
</tr>
<tr>
<td style="text-align: center;">2 Months</td>
<td style="text-align: center;">12 Days</td>
</tr>
<tr>
<td style="text-align: center;">8 Weeks</td>
<td style="text-align: center;">11 Days</td>
</tr>
<tr>
<td style="text-align: center;">6 Weeks</td>
<td style="text-align: center;">8 Days</td>
</tr>
<tr>
<td style="text-align: center;">1 Month</td>
<td style="text-align: center;">6 Days</td>
</tr>
<tr>
<td style="text-align: center;">4 Weeks</td>
<td style="text-align: center;">6 Days</td>
</tr>
<tr>
<td style="text-align: center;">2 Weeks</td>
<td style="text-align: center;">3 Days</td>
</tr>
<tr>
<td style="text-align: center;">1 Weeks</td>
<td style="text-align: center;">1 Day</td>
</tr>
</tbody>
</table>
<p>This post takes a look at how to create a metric in Maximo that uses the 20% grace period. </p>
<h4>Translating SMRP into SQL</h4>
<p>The first step in creating a metric that we can use in Maximo is to take the definition of the metric and convert it into a SQL query. The best method is to describe what the SQL statement should capture and <em>then</em> create the actual code. From the SMRP definition, one description could be:</p>
<blockquote>
<p>Count all PM work orders that have been completed by a due date after the 1st of day of the previous month and before the last day of the previous month divided by all PM work orders due date after the 1st of day of the previous month and before the last day of the previous month</p>
</blockquote>
<p>The basics of the query are:</p>
<div class="highlight"><pre><span></span><code>count (wonum_PM_on_time) / count (wonum_all_PM)
</code></pre></div>
<p>Breaking this down into 2 parts, the numerator and the denominator, the SQL needed for each part can be created separately. </p>
<h4>Finding the PM/PdM work orders completed on time</h4>
<p>The numerator of the equation requires identifying all the PM's completed on time in the previous month. </p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">count</span><span class="ss">(</span><span class="nv">wonum</span><span class="ss">)</span><span class="w"> </span>
<span class="nv">from</span><span class="w"> </span><span class="nv">workorder</span><span class="w"></span>
<span class="nv">where</span><span class="w"> </span><span class="nv">pmnum</span><span class="w"> </span><span class="nv">is</span><span class="w"> </span><span class="nv">not</span><span class="w"> </span><span class="nv">null</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="ss">(</span><span class="nv">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'COMP'</span><span class="w"> </span><span class="nv">or</span><span class="w"> </span><span class="nv">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'CLOSED'</span><span class="ss">)</span><span class="w"> </span><span class="nv">and</span><span class="w"></span>
<span class="nv">pm_duedate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span><span class="nv">and</span><span class="w"></span>
<span class="nv">pm_dudate</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">-</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span>
<span class="nv">actfinish</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">-</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p>Unfortunately out of the box Maximo does not have a field <code>pm_duedate</code> on the <code>WORKORDER</code> object.<sup id="fnref:185127"><a class="footnote-ref" href="#fn:185127">4</a></sup> So this date will need to be calculated within the SQL query. Using the table above, due date rules can be set up inside a SQL Query:</p>
<div class="highlight"><pre><span></span><code><span class="ss">(</span><span class="nv">select</span><span class="w"> </span><span class="nv">case</span><span class="w"> </span>
<span class="w"> </span><span class="nv">when</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="ss">(</span><span class="nv">pm</span>.<span class="nv">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">0</span>.<span class="mi">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">1</span>.<span class="mi">0</span><span class="ss">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">isnull</span><span class="ss">(</span><span class="nv">workorder</span>.<span class="nv">schedstart</span>,<span class="w"> </span><span class="nv">workorder</span>.<span class="nv">targstartdate</span><span class="ss">)</span><span class="w"></span>
<span class="w"> </span><span class="nv">when</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">isnull</span><span class="ss">(</span><span class="nv">workorder</span>.<span class="nv">schedstart</span>,<span class="w"> </span><span class="nv">workorder</span>.<span class="nv">targstartdate</span><span class="ss">)</span><span class="w"></span>
<span class="w"> </span><span class="nv">when</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">0</span>.<span class="mi">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">7</span>.<span class="mi">0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">isnull</span><span class="ss">(</span><span class="nv">workorder</span>.<span class="nv">schedstart</span>,<span class="w"> </span><span class="nv">workorder</span>.<span class="nv">targstartdate</span><span class="ss">)</span><span class="w"></span>
<span class="w"> </span><span class="nv">when</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequency</span><span class="w"> </span><span class="o">>=</span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">isnull</span><span class="ss">(</span><span class="nv">workorder</span>.<span class="nv">schedstart</span>,<span class="w"> </span><span class="nv">workorder</span>.<span class="nv">targstartdate</span><span class="ss">)</span><span class="w"></span>
<span class="w"> </span><span class="nv">when</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">0</span>.<span class="mi">2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mi">30</span>.<span class="mi">0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">isnull</span><span class="ss">(</span><span class="nv">workorder</span>.<span class="nv">schedstart</span>,<span class="w"> </span><span class="nv">workorder</span>.<span class="nv">targstartdate</span><span class="ss">)</span><span class="w"></span>
<span class="w"> </span><span class="nv">when</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">isnull</span><span class="ss">(</span><span class="nv">workorder</span>.<span class="nv">schedstart</span>,<span class="w"> </span><span class="nv">workorder</span>.<span class="nv">targstartdate</span><span class="ss">)</span><span class="w"></span>
<span class="w"> </span><span class="nv">when</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">frequnit</span><span class="o">=</span><span class="s1">'YEARS'</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">isnull</span><span class="ss">(</span><span class="nv">workorder</span>.<span class="nv">schedstart</span>,<span class="w"> </span><span class="nv">workorder</span>.<span class="nv">targstartdate</span><span class="ss">)</span><span class="w"></span>
<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="nv">as</span><span class="w"> </span><span class="nv">freq_unit</span><span class="w"></span>
<span class="nv">from</span><span class="w"> </span><span class="nv">pm</span><span class="w"> </span>
<span class="nv">where</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">pmnum</span><span class="o">=</span><span class="nv">workorder</span>.<span class="nv">pmnum</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">pm</span>.<span class="nv">siteid</span><span class="o">=</span><span class="nv">workorder</span>.<span class="nv">siteid</span><span class="w"> </span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p style="border: #1863a1 1px solid; border-radius: 10px; padding:10px; margin:20px; background-color: rgb(251,239,153);">Reliability professionals will debate the choice of using <code>isnull(workorder.schedstart, workorder.targstartdate)</code> as part of the grace period because teams should be scheduling their work, so the <code>workorder.schedstart</code> should not be an empty field. We'll save that debate once a site hits 90% PM Compliance consistently.</a></p>
<p>Putting this all together gives us a SQL query of:</p>
<div class="highlight"><pre><span></span><code><span class="k">declare</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="nc">char</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span><span class="w"></span>
<span class="k">set</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="o">=</span><span class="s1">'lnc'</span><span class="w"></span>
<span class="k">select</span><span class="w"> </span><span class="nf">count</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">wonum</span><span class="p">)</span><span class="o">*</span><span class="mf">1.0</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">workorder</span><span class="w"> </span>
<span class="k">join</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="w"></span>
<span class="k">where</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span>
<span class="n">workorder</span><span class="p">.</span><span class="n">istask</span><span class="o">=</span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="k">null</span><span class="w"> </span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'COMP'</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">status</span><span class="o">=</span><span class="s1">'CLOSE'</span><span class="p">)</span><span class="w"></span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">case</span><span class="w"> </span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">(</span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">1.0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">7.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'YEARS'</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">freq_unit</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span>
<span class="k">where</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="p">)</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="w"> </span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">case</span><span class="w"> </span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">(</span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">1.0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">7.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'YEARS'</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="k">end</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">freq_unit</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span>
<span class="k">where</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="w"> </span>
<span class="ow">and</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">actfinish</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span><span class="w"></span>
</code></pre></div>
<p>Running this query would give us a result of 318 work orders against our sample data set. </p>
<h4>Finding the PM/PdM work orders due that month</h4>
<p>The denominator of the PM Compliance metric requires identifying all the PM's that were due the previous month. </p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">count</span><span class="ss">(</span><span class="nv">wonum</span><span class="ss">)</span><span class="w"> </span>
<span class="nv">from</span><span class="w"> </span><span class="nv">workorder</span><span class="w"></span>
<span class="nv">where</span><span class="w"> </span><span class="nv">pmnum</span><span class="w"> </span><span class="nv">is</span><span class="w"> </span><span class="nv">not</span><span class="w"> </span><span class="nv">null</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="ss">(</span><span class="nv">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'COMP'</span><span class="w"> </span><span class="nv">or</span><span class="w"> </span><span class="nv">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'CLOSED'</span><span class="ss">)</span><span class="w"> </span><span class="nv">and</span><span class="w"></span>
<span class="nv">pm_duedate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span><span class="nv">and</span><span class="w"></span>
<span class="nv">pm_dudate</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">-</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span><span class="nv">and</span><span class="w"></span>
</code></pre></div>
<p>The initial SQL query is pretty much the same as the numerator, minus <code>actfinish <= dateadd(month,datediff(month,1,getdate()) -0,0)</code>. Using this logic, we've already done all the work from the numerator query and we get:</p>
<div class="highlight"><pre><span></span><code><span class="k">declare</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="nc">char</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span><span class="w"></span>
<span class="k">set</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="o">=</span><span class="s1">'lnc'</span><span class="w"></span>
<span class="k">select</span><span class="w"> </span><span class="nf">count</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">wonum</span><span class="p">)</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">workorder</span><span class="w"> </span>
<span class="k">join</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="w"></span>
<span class="k">where</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span>
<span class="n">workorder</span><span class="p">.</span><span class="n">istask</span><span class="o">=</span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="k">null</span><span class="w"> </span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">case</span><span class="w"> </span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">(</span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">1.0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">7.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'YEARS'</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="k">end</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">freq_unit</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span>
<span class="k">where</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="p">)</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="w"></span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">case</span><span class="w"> </span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">(</span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">1.0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">7.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'YEARS'</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"> </span>
<span class="k">end</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">freq_unit</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span>
<span class="k">where</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span><span class="w"></span>
</code></pre></div>
<p>Running this query would give us a result of 384 work orders against our sample data set. </p>
<h4>Putting the two parts together</h4>
<p>Putting the two parts of the queries together require doing math inside a SQL query. The basic concept is to do select the previous select statements:</p>
<div class="highlight"><pre><span></span><code>select ( (select count (wonum_PM_on_time) /
(select count (wonum_all_PM) )
</code></pre></div>
<p>Putting the two previous parts together yields:</p>
<div class="highlight"><pre><span></span><code><span class="k">declare</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="nc">char</span><span class="p">(</span><span class="mi">10</span><span class="p">)</span><span class="w"></span>
<span class="k">set</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="o">=</span><span class="s1">'lnc'</span><span class="w"></span>
<span class="k">select</span><span class="w"> </span><span class="p">(</span><span class="w"></span>
<span class="k">select</span><span class="w"> </span><span class="nf">count</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">wonum</span><span class="p">)</span><span class="o">*</span><span class="mf">1.0</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">workorder</span><span class="w"> </span>
<span class="k">join</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="w"></span>
<span class="k">where</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span>
<span class="n">workorder</span><span class="p">.</span><span class="n">istask</span><span class="o">=</span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="k">null</span><span class="w"> </span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">status</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'COMP'</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">status</span><span class="o">=</span><span class="s1">'CLOSE'</span><span class="p">)</span><span class="w"></span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">case</span><span class="w"> </span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">(</span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">1.0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">7.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'YEARS'</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">end</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">freq_unit</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span>
<span class="k">where</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="p">)</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="w"> </span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">case</span><span class="w"> </span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">(</span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">1.0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">7.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'YEARS'</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="k">end</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">freq_unit</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span>
<span class="k">where</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="w"> </span>
<span class="ow">and</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">actfinish</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="w"> </span><span class="p">)</span><span class="w"> </span>
<span class="o">/</span><span class="w"> </span>
<span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="nf">count</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">wonum</span><span class="p">)</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">workorder</span><span class="w"> </span>
<span class="k">join</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span><span class="k">on</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="w"></span>
<span class="k">where</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">@worksite</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span>
<span class="n">workorder</span><span class="p">.</span><span class="n">istask</span><span class="o">=</span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="k">null</span><span class="w"> </span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">case</span><span class="w"> </span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">(</span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">1.0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">7.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'YEARS'</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="k">end</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">freq_unit</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span>
<span class="k">where</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="p">)</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="w"></span>
<span class="ow">and</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="k">case</span><span class="w"> </span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="p">(</span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">1.0</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'DAYS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">140</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">7.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'WEEKS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="mi">20</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">0.2</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mf">30.0</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'MONTHS'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequency</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="mi">5</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"></span>
<span class="k">when</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">frequnit</span><span class="o">=</span><span class="s1">'YEARS'</span><span class="w"> </span><span class="k">then</span><span class="w"> </span><span class="mi">28</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nf">isnull</span><span class="p">(</span><span class="n">workorder</span><span class="p">.</span><span class="n">schedstart</span><span class="p">,</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">targstartdate</span><span class="p">)</span><span class="w"> </span>
<span class="k">end</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">freq_unit</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">pm</span><span class="w"> </span>
<span class="k">where</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">pmnum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">pmnum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">pm</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="nf">datediff</span><span class="p">(</span><span class="nf">month</span><span class="p">,</span><span class="mi">1</span><span class="p">,</span><span class="nf">getdate</span><span class="p">())</span><span class="w"> </span><span class="o">-</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span><span class="w"> </span>
<span class="p">)</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="n">PM_GRACE_ONTIME</span><span class="w"></span>
</code></pre></div>
<p>That's the entire SQL query to give a facility's PM Compliance for the previous month.<sup id="fnref:326822"><a class="footnote-ref" href="#fn:326822">7</a></sup> Now this SQL query can be migrated to a BIRT report and scheduled on a monthly basis to generate an organization's PM Compliance. </p>
<p>Once the report is generated for a few months a PM Compliance trend can be generated and corrective actions can be taken when a facility is below their prescribed target. </p>
<figure><a href="http://share.mygeekdaddy.net/pm_compliance_trend.png"><img src="http://share.mygeekdaddy.net/pm_compliance_trend.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<hr>
<h4>PM Frequency Conversion</h4>
<p>Within the calculation of the grace period is the conversion of the PM's frequency into how many days should be added to the PM's due date. To account for this calculation, you have to decide on a standard for the conversion of the <code>PM.FREQUNIT</code> into a unit of "Days". For the SQL queries, I included the conversion numbers I've used in my Maximo environment. </p>
<ul>
<li><code>YEARS</code> = 365 days</li>
<li><code>MONTHS</code> = 30 days</li>
<li><code>WEEKS</code> = 7 days</li>
</ul>
<p>Depending on the <code>PM.FREQUNIT</code> used for a PM work order, the 20% grace period calculation could be <em>slightly</em> different for an equivalent frequency. For example:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">PM Frequency</th>
<th style="text-align: center;">Freq Conversion</th>
<th style="text-align: center;">Calculated Days</th>
<th style="text-align: center;">Grace Period</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">4 Months</td>
<td style="text-align: center;">4 * 30</td>
<td style="text-align: center;">120 Days</td>
<td style="text-align: center;">24 Days</td>
</tr>
<tr>
<td style="text-align: center;">16 Weeks</td>
<td style="text-align: center;">16 * 7</td>
<td style="text-align: center;">112 Days</td>
<td style="text-align: center;">23 Days</td>
</tr>
</tbody>
</table>
<ul>
<li>4 Months = 4 * 30 = 120 days > 24 day grace</li>
<li>16 Weeks = 16 * 7 = 112 days > 23 day grace</li>
</ul>
<p>The best practice is to lay out this conversions used for different PM frequencies up front to stop any debate on the grace period before it starts. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:9552">
<p>5.4.14 Preventive Maintenance (PM) & Predictive Maintenance (PdM) Compliance, From SMRP Best Practices, 6th Edition <a class="footnote-backref" href="#fnref:9552" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:115999">
<p>I'm just going to type "PM" going forward, but this includes PM, PdM, CdM work orders - basically any work order generated by the PM module. <a class="footnote-backref" href="#fnref:115999" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:185126">
<p>"On time" is a part of the metric later defined by SMRP. <a class="footnote-backref" href="#fnref:185126" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:185127">
<p><sup id="fnref:185128"><a class="footnote-ref" href="#fn:185128">5</a></sup> <a class="footnote-backref" href="#fnref:185127" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:185128">
<p>But it should ;-) <a class="footnote-backref" href="#fnref:185128" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:185129">
<p>The frequency conversion is listed at the end of the post. <a class="footnote-backref" href="#fnref:185129" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
<li id="fn:326822">
<p>On SQL Server, chat with your DBA if you want that in DB2 or Oracle. <a class="footnote-backref" href="#fnref:326822" title="Jump back to footnote 7 in the text">↩</a></p>
</li>
</ol>
</div>Should it really be this hard2023-03-28T08:33:04-05:002023-03-28T08:33:04-05:00Jason Verlytag:mygeekdaddy.net,2023-03-28:/2023/03/28/should-it-really-be-this-hard/<p>Over the weekend I attended a Pokemon TCG tournament in Charlotte with one of my kids. Most of the TCG community that I follow is still on Twitter.<sup id="fnref:315102"><a class="footnote-ref" href="#fn:315102">1</a></sup> So in between rounds I wanted to reply back to someone and just got this.</p>
<figure><a href="http://share.mygeekdaddy.net/IMG_2722_send_tweet.jpg"><img src="http://share.mygeekdaddy.net/IMG_2722_send_tweet.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p>Of course I muttered some remark …</p><p>Over the weekend I attended a Pokemon TCG tournament in Charlotte with one of my kids. Most of the TCG community that I follow is still on Twitter.<sup id="fnref:315102"><a class="footnote-ref" href="#fn:315102">1</a></sup> So in between rounds I wanted to reply back to someone and just got this.</p>
<figure><a href="http://share.mygeekdaddy.net/IMG_2722_send_tweet.jpg"><img src="http://share.mygeekdaddy.net/IMG_2722_send_tweet.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p>Of course I muttered some remark like, "I didn't lose connectivity, your API did." And of course that remark didn't help me send my reply. So I wondered if it was time to breakdown and just get the official Twitter app. </p>
<p>As I was collecting my things, a group of 5 or 6 players sat down a little ways from me to discuss the decks they'd seen so far. I overhead one player in the group start grumbling about also not being able send tournament updates on Twitter as well. Another player in the group asked if he used the app or the web page. Before the first player could answer, 3 other players all turned, looked in shock, and asked out loud why in the world he would ever install the Twitter app? I had expected the answer to be pretty simple, but the group started bickering in a quieter tone, so I couldn't hear the specifics. </p>
<p>I finished gather my things and got up to see how my son had done in his round. As I walked by the group I heard part of a sentence from one of the players, "... if you check the stats they collect on you."</p>
<p>I mentally paused on my walk over to my son. I never even thought about what "stats" the official Twitter app would collect if I installed it on my phone. Before the Twitterpocalypse I had used Tapbots Tweetbot app and knew Tapbots was very focused on a customer's privacy, so I was curious to see what the official Twitter app showed in the App Store. </p>
<p>I popped open the App Store and found the official Twitter app. I scrolled down to the privacy information and found this:</p>
<figure><a href="http://share.mygeekdaddy.net/IMG_2704_twitter.jpg"><img src="http://share.mygeekdaddy.net/IMG_2704_twitter.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p>I shouldn't have been that surprised, but holy !@$, Twitter collects just about everything about you through the app. That put an immediate stop to my idea of install the app.<sup id="fnref:677583"><a class="footnote-ref" href="#fn:677583">4</a></sup></p>
<p>And then yesterday Twitter announced some additional changes coming soon. </p>
<figure><a href="http://share.mygeekdaddy.net/Screenshot_2023-03-28_at_9.00.07_AM.png"><img src="http://share.mygeekdaddy.net/Screenshot_2023-03-28_at_9.00.07_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>I don't care for the "For You" list because I've curated my follow lists to see exactly what I want to see.<sup id="fnref:273908"><a class="footnote-ref" href="#fn:273908">2</a></sup> But losing the polling feature is a hard loss. A number of people I follow in the Reliability and TCG communities use polling quite a bit, some informational and some entertaining, but very few of them have the magical blue check mark to continue posting polls. </p>
<p>I guess for now I'll sit back and see how many more friends will finally migrate over to Mastodon<sup id="fnref:846247"><a class="footnote-ref" href="#fn:846247">3</a></sup> or if they will continue to use Twitter based on population stats, and less on functionality. </p>
<p>BTW... Tapbots still has customer's privacy in mind for their new app, Ivory, for Mastodon.</p>
<figure><a href="http://share.mygeekdaddy.net/IMG_2707_ivory.jpg"><img src="http://share.mygeekdaddy.net/IMG_2707_ivory.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p>Thanks Tapbots. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:315102">
<p>They haven't got the message about Mastodon yet. <a class="footnote-backref" href="#fnref:315102" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:273908">
<p>Or at least I did when I was on Tweetbot. <a class="footnote-backref" href="#fnref:273908" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:846247">
<p>@mygeekdaddy@mstdn.social <a class="footnote-backref" href="#fnref:846247" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:677583">
<p>I check a few other popular social apps and was surprised Twitter was the most egregious app out there. Congrats Markie Z for 2nd place. <a class="footnote-backref" href="#fnref:677583" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>When technology fails its fundamentals2023-03-13T11:51:48-05:002023-03-13T11:51:48-05:00Jason Verlytag:mygeekdaddy.net,2023-03-13:/2023/03/13/when-technology-fails-its-fundamentals/<p>At some point I'd like to think my choices in technology will help me. </p>
<figure><a href="http://share.mygeekdaddy.net/PhotoMar13114449AM.jpeg"><img src="http://share.mygeekdaddy.net/PhotoMar13114449AM.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>But every ~6 months I'm reminded that my choices will sometimes fail me. <sup id="fnref:828596"><a class="footnote-ref" href="#fn:828596">1</a></sup></p>
<div class="footnote">
<hr>
<ol>
<li id="fn:828596">
<p>And yes, it didn't escape me that even my iPhone has apparently failed me this daylight savings time change. Again. <a class="footnote-backref" href="#fnref:828596" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>New Mac Setup Notes2023-02-16T11:29:39-06:002023-02-21T14:53:59-06:00Jason Verlytag:mygeekdaddy.net,2023-02-16:/2023/02/16/new-mac-setup-notes/<p><meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="http://share.mygeekdaddy.net/mbp14-spacegray-gallery6-202301.jpeg" />
<meta name="twitter:site" content="@mygeekdaddy" />
<meta name="twitter:title" content="New Mac Setup Notes" />
<meta name="twitter:description" content="A note to my future self on setting up a new Mac." /></p>
<p><meta property="og:title" content="New Mac Setup Notes" />
<meta property="og:url" content="http://mygeekdaddy.net/2023/02/16/new-mac-setup-notes//" />
<meta property="og:image" content="http://share.mygeekdaddy.net/mbp14-spacegray-gallery6-202301.jpeg" /></p>
<p>I've been lucky enough to continue to use a Mac in my predominantly Windows centric company.<sup id="fnref:928802"><a class="footnote-ref" href="#fn:928802">1</a></sup> As I've continued to migrate off my old MBP to my new MBP, I've had to remind myself on the smaller details to fix on my new laptop. So this post is more …</p><p><meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:image" content="http://share.mygeekdaddy.net/mbp14-spacegray-gallery6-202301.jpeg" />
<meta name="twitter:site" content="@mygeekdaddy" />
<meta name="twitter:title" content="New Mac Setup Notes" />
<meta name="twitter:description" content="A note to my future self on setting up a new Mac." /></p>
<p><meta property="og:title" content="New Mac Setup Notes" />
<meta property="og:url" content="http://mygeekdaddy.net/2023/02/16/new-mac-setup-notes//" />
<meta property="og:image" content="http://share.mygeekdaddy.net/mbp14-spacegray-gallery6-202301.jpeg" /></p>
<p>I've been lucky enough to continue to use a Mac in my predominantly Windows centric company.<sup id="fnref:928802"><a class="footnote-ref" href="#fn:928802">1</a></sup> As I've continued to migrate off my old MBP to my new MBP, I've had to remind myself on the smaller details to fix on my new laptop. So this post is more of a note to my future self when I finally replace my aging Mac Mini so I don't have to find the steps again.</p>
<p>A lot of my work includes taking screenshots and putting them into documentation. So I had a task today and completely forgot about the drop shadow macOS places on screen shots be default. </p>
<figure><a href="http://share.mygeekdaddy.net/Screenshot_2023-02-16_at_11.34.06_AM.png"><img src="http://share.mygeekdaddy.net/Screenshot_2023-02-16_at_11.34.06_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So I went to my research assistant and looked up how to disable the drop shadows. Most of the results gave the keyboard option to selectively disable the drop shadows by pressing a ridiculous keyboard combination of: </p>
<div class="highlight"><pre><span></span><code>Command + Shift + 4 + Spacebar + Option
</code></pre></div>
<p>That was too much finger dexterity, and not enough muscle memory, for me to not permanently change the screenshot behavior. I went through my notes and found what I <em>thought</em> was the proper Terminal commands to disable drop shadows on screenshots.<sup id="fnref:39914"><a class="footnote-ref" href="#fn:39914">2</a></sup> After a couple of attempts, I concluded that either the command didn't work or macOS Monterey didn't have a Terminal command to do this anymore. </p>
<p>After some additional searching I found an update list of commands. <sup id="fnref:810543"><a class="footnote-ref" href="#fn:810543">3</a></sup> </p>
<p>The Terminal command to remove the drop shadows is:</p>
<div class="highlight"><pre><span></span><code>defaults write com.apple.screencapture "disable-shadow" -bool "true"
</code></pre></div>
<p>After turning off the drop shadows, either reboot or run the following command to make the change take effect:</p>
<div class="highlight"><pre><span></span><code>killall SystemUIServer
</code></pre></div>
<p>To turn drop shadows back on, just reverse the setting to <code>false</code>:</p>
<div class="highlight"><pre><span></span><code>defaults write com.apple.screencapture "disable-shadow" -bool "false"
</code></pre></div>
<p>After running the command to turn off drop shadows, my screenshots are flat again. </p>
<figure><a href="http://share.mygeekdaddy.net/Screenshot_2023-02-16_at_11.43.21_AM.png"><img src="http://share.mygeekdaddy.net/Screenshot_2023-02-16_at_11.43.21_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<hr>
<p>Update: Maybe I should just read my own blog... 🤣</p>
<figure><a href="http://share.mygeekdaddy.net/Screenshot_2023-02-16_at_12.27.14_PM.png"><img src="http://share.mygeekdaddy.net/Screenshot_2023-02-16_at_12.27.14_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<div class="footnote">
<hr>
<ol>
<li id="fn:928802">
<p>Thanks Marketing! <a class="footnote-backref" href="#fnref:928802" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:39914">
<p>I'm not sharing the old commands, so I don't confuse myself in the future. <a class="footnote-backref" href="#fnref:39914" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:810543">
<p>This <a href="https://techstacker.com/disable-mac-screenshot-shadows-mojave-catalina/">post was for macOS Catalina</a>, but also worked for Monterey. <a class="footnote-backref" href="#fnref:810543" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>A new GTDesque Shortcut2023-01-06T11:25:16-06:002023-01-06T11:25:16-06:00Jason Verlytag:mygeekdaddy.net,2023-01-06:/2023/01/06/a-new-gtdesque-shortcut/<p>Yesterday Jason Snell (<a href="https://twitter.com/jsnell">@jsnell</a>) shared a <a href="https://sixcolors.com/post/2023/01/when-two-calendars-are-not-better-than-one/">link to his post</a> about a <a href="https://routinehub.co/shortcut/2269/">Shortcut he found</a> that will review your calendar and give you a list of dates/times you're available. At first this seemed like a "kinda of ok" Shortcut after I read Jason's post because the Shortcut only pulled …</p><p>Yesterday Jason Snell (<a href="https://twitter.com/jsnell">@jsnell</a>) shared a <a href="https://sixcolors.com/post/2023/01/when-two-calendars-are-not-better-than-one/">link to his post</a> about a <a href="https://routinehub.co/shortcut/2269/">Shortcut he found</a> that will review your calendar and give you a list of dates/times you're available. At first this seemed like a "kinda of ok" Shortcut after I read Jason's post because the Shortcut only pulled from a single calendar.</p>
<p>I came back to the Shortcut later last night because I wanted to see what options I had with Fantastical<sup id="fnref:97915"><a class="footnote-ref" href="#fn:97915">2</a></sup>. Sadly the Shortcut functionality between Apple Calendar and Fantastical are like night and day. </p>
<figure><a href="http://share.mygeekdaddy.net/IMG_2468.png"><img src="http://share.mygeekdaddy.net/IMG_2468.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>After some of the testing I had done with the version of the Shortcut Jason had used, I poked around the original Shortcut and wondered if the original author (<a href="https://routinehub.co/user/senatorforlife">@senatorforlife</a>) was purposefully wanting to pull from a single calendar. My testing was showing that the "Find Calendar Events" action was pulling from multiple calendars. </p>
<p>I went back and found the entries in the original Shortcut that specified what calendar the Shortcut should be applied to. </p>
<figure><a href="http://share.mygeekdaddy.net/IMG_2469_2023-01-06.png"><img src="http://share.mygeekdaddy.net/IMG_2469_2023-01-06.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The new Shortcut would now run and give me a complete view of my availability for the next week. This view is a composite availability from 1 iCloud calendar, 2 shared iCloud calendars, and 1 Exchange calendar. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2023-01-06_at_11.55.06_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2023-01-06_at_11.55.06_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I think the best point Jason raised was...</p>
<blockquote>
<p>I also don’t understand how Fantastical—the app that Lex and I both use on macOS and iOS—doesn’t offer any actions like this one!</p>
</blockquote>
<p>I use Fantastical as calendar my merging tool<sup id="fnref:406255"><a class="footnote-ref" href="#fn:406255">1</a></sup> to see all my calendar events on all my devices (Mac, iPad and iPhone). I took a look at some other apps and all the <em>cool</em> actions are in Apple's native apps (Mail, Calendar, Contacts, etc.). </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:406255">
<p>Does require Fantastical's subscription. <a class="footnote-backref" href="#fnref:406255" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:97915">
<p>Just like Jason did. <a class="footnote-backref" href="#fnref:97915" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>My Year End Review2022-12-29T11:47:00-06:002022-12-29T11:47:00-06:00Jason Verlytag:mygeekdaddy.net,2022-12-29:/2022/12/29/my-year-end-review/<p>2022 is starting to wind down and I'm starting to take stock on a few things I'm "trying to do different".<sup id="fnref:20221228"><a class="footnote-ref" href="#fn:20221228">1</a></sup> Some of the ideas I have are trying to do take a better in stock in my ideas. Other things are on how I do things from day …</p><p>2022 is starting to wind down and I'm starting to take stock on a few things I'm "trying to do different".<sup id="fnref:20221228"><a class="footnote-ref" href="#fn:20221228">1</a></sup> Some of the ideas I have are trying to do take a better in stock in my ideas. Other things are on how I do things from day to day. So I've taken the holiday break to look at three things I want to different in 2023. </p>
<h4>Revisiting old skills</h4>
<p>The first thing I'm working on is reinvesting into my site. This site has been, for a better term, a hobby. Changes on multiple fronts has made me want to reinvest in my hobby. My hosting provider has been amazing, however, if you decide to keep the same underlying OS on your VPS, you eventually get left on an island of "No Upgrade Path".<sup id="fnref:20221229"><a class="footnote-ref" href="#fn:20221229">2</a></sup> So I've spending the past day or so looking at upgrade paths to a current OS version. </p>
<p>After spending a couple of hours running through a variety of forums I came to the following conclusion...</p>
<blockquote>
<p>no direct update path found...</p>
</blockquote>
<p>The closest path I could find was doing multiple in place updates:</p>
<ul>
<li>Update from 2.x to 4.x</li>
<li>Update from 4.x to 6.x.</li>
<li>Update from 6.x to 8.x</li>
<li>Update from 8.x to Current Ver</li>
</ul>
<p>Umm... no. I only say this because after multiple attempts to update in place, making the update from version 6.x to 8.x consistently hit a brick wall because too many underlying services were deprecated. This caused a whole slew of problems I didn't want to take on, so building a new VPS from scratch is the only choice left. <sup id="fnref:616492"><a class="footnote-ref" href="#fn:616492">3</a></sup></p>
<h4>Revisiting my task lists</h4>
<p>The second thing I'm working seems to be the system I'm always working on... GTD.<sup id="fnref:999369"><a class="footnote-ref" href="#fn:999369">4</a></sup> I've been an OmniFocus user for a number of years now and I never did the steps to fully realize the value of my GTD system. I've always front loaded my task list with the <em>Capture</em> step, but rarely did the critical <em>Review</em> step. </p>
<p>This year I've put time onto my daily calendar to actually take stock of what I need to get, truly capture inbox items, and give myself time to create a plan to be productive versus reactive. Part of this assessment led me to look at how I'm actually doing my work (when I'm focused enough to do it) and the steps I've been taking to plan my weeks out. I'll have more to share on this part as the new year progresses as I look to revamp my GTD toolbox. Part of this assessment led me to my third item.</p>
<h4>Revisiting my inbox</h4>
<p>The last thing I'm revisiting is how I interact with email. This is going to be a two fold exercise for both my personal and professional use of email. For a long time I tried to compartmentalize my personal email into different accounts based on the context of how I was going to use the account. Having multiple accounts had its place when I was in a more technically <em>"fiddlely"</em> mindset. Over the holidays I migrated to single email account and went back to Apple Mail on my iOS devices and Outlook for work. I'm now down to just a few accounts that have locked my username/userID to my email account that was originally used to set up the account.<sup id="fnref:345023"><a class="footnote-ref" href="#fn:345023">7</a></sup> </p>
<p>On the professional side, my relationship with email during Covid changed. I was fortunate enough to keep working through the lock down phase. One of the tactics I took on was trying to be more responsive to requests during that time period. This meant constantly checking email for anything I could address. Two plus years later and that tactic has become a bad chronic habit. Over the holidays I was starting to catch up on a backlog of podcasts. One podcast made me stop and write myself a quick note, because it's funny how you've known something for a long time, but for some reason, resonates with yourself how when someone <em>else</em> says the same thing. From the podcast and some reading I caught up on, I had two "new" ideas. </p>
<p>First one was:</p>
<blockquote>
<p>Email is an asynchronous form of communication.<sup id="fnref:99954"><a class="footnote-ref" href="#fn:99954">6</a></sup></p>
</blockquote>
<p>The other was:</p>
<blockquote>
<p>Checklists are quick and simple tools aimed to buttress the skills of expert professionals.<sup id="fnref:176911"><a class="footnote-ref" href="#fn:176911">5</a></sup></p>
</blockquote>
<p>My work habits started to treat email the same as a Slack or Teams conversation. Between my concerns on how I was going to re-engage with my GTD tools and start weening myself of the check-check-check email syndrome, I figured out I needed to put a check list together on what I should focus on for a small window of time each day. Anytime outside of these work bursts <strong>needs</strong> to be project work only. </p>
<h4>Daily Checklist</h4>
<p>I've created a checklist to help me keep my attention on what's important. The goal is to keep myself to processing email only 3 times a day, remind myself to stay off any attention grabbing distractions, and review if I made good choices the day before. </p>
<hr>
<p>Daily Action Items: </p>
<p>▢ Read for 30+ min <br>
▢ Worked out for 45+ min <br>
▢ Slept at least 8h night before </p>
<p>Morning Checklist: <br>
▢ Check calendar for today <br>
▢ Check calendar for next 5 days <br>
▢ Process email <br>
▢ Check task list for items due <br>
▢ Check "Waiting For" tasks <br>
▢ Check "Follow Up" tasks </p>
<p>Noon Checklist: <br>
▢ Process email<br>
▢ Schedule 20 min break for afternoon <br>
▢ Identify time to work out </p>
<p>Afternoon Checklist: <br>
▢ Process email<br>
▢ Update "Waiting For" tasks <br>
▢ Update "Follow Up" tasks <br>
▢ Review calendar for next 5 days</p>
<hr>
<p>I'm sure this list will get altered as the year progresses, but I wanted to start with good and work towards better. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:20221228">
<p>Cause I hate the term "resolution". <a class="footnote-backref" href="#fnref:20221228" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:20221229">
<p>It's a real place and scary to be stuck there. <a class="footnote-backref" href="#fnref:20221229" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:616492">
<p>You <del>should be</del> are reading this on the "new" site right now. <a class="footnote-backref" href="#fnref:616492" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:999369">
<p>Getting things done. <a class="footnote-backref" href="#fnref:999369" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:176911">
<p>Gawande, Atul. The Checklist Manifesto: How to Get Things Right. Henry Holt and Co. <a class="footnote-backref" href="#fnref:176911" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:99954">
<p>Yes, very insightful and should have been completely obvious. <a class="footnote-backref" href="#fnref:99954" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
<li id="fn:345023">
<p>These accounts use an email address as both the userID and the email contact. <a class="footnote-backref" href="#fnref:345023" title="Jump back to footnote 7 in the text">↩</a></p>
</li>
</ol>
</div>Another KM Macro Conversion2022-09-05T15:02:14-05:002022-09-05T15:02:14-05:00Jason Verlytag:mygeekdaddy.net,2022-09-05:/2022/09/05/another-km-macro-conversion/<p>The long holiday weekend allowed me to catch up on some reading <sup id="fnref:368902"><a class="footnote-ref" href="#fn:368902">1</a></sup> and some more ideas on matching my macOS automations for my iPad. In preparation for upcoming posts, I started looking at ways to get image links easily formatted for my site. </p>
<p>Since I write in Markdown, inserting …</p><p>The long holiday weekend allowed me to catch up on some reading <sup id="fnref:368902"><a class="footnote-ref" href="#fn:368902">1</a></sup> and some more ideas on matching my macOS automations for my iPad. In preparation for upcoming posts, I started looking at ways to get image links easily formatted for my site. </p>
<p>Since I write in Markdown, inserting an image link is straight forward. For example just typing in this:</p>
<div class="highlight"><pre><span></span><code><span class="w"> </span><span class="o">!</span><span class="p">[</span><span class="n">Mankato</span><span class="w"> </span><span class="n">Brewery</span><span class="p">](</span><span class="n">http</span><span class="o">:</span><span class="c1">//mygeekdaddy.net/share/IMG_2053.png)</span>
</code></pre></div>
<p>And I'll get this displayed in a blog post:</p>
<p><img alt="Mankato Brewery" src="http://share.mygeekdaddy.net/IMG_2053.png"></p>
<p>Most of my post have included images as a reference to the reader on a technical topic. I wanted to make sure the images included could be a)viewed in full size and b) similarly size for visual continuity. Because the Markdown image link syntax doesn't include any formatting options<sup id="fnref:124430"><a class="footnote-ref" href="#fn:124430">2</a></sup>, I use a set of specific HTML element tags for images on my site:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><figure><a</span> <span class="na">href=</span><span class="s">"http://share.mygeekdaddy.net/IMG_2053.png"</span><span class="nt">><img</span> <span class="na">src=</span><span class="s">"http://share.mygeekdaddy.net/IMG_2053.png"</span> <span class="na">style=</span><span class="s">"display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;"</span> <span class="nt">/></img></a></figure></span>
</code></pre></div>
<p>And thost tags get this displayed in a blog post:</p>
<figure><a href="http://share.mygeekdaddy.net/IMG_2053.png"><img src="http://share.mygeekdaddy.net/IMG_2053.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I can hear what you're thinking, <em>"Nice... but they look the same."</em> </p>
<p>True, but the second image can be clicked on and opened up to full size in your browser window. That allows me to keep the post visually similar, but let the reader see details on an image if they choose too. </p>
<h4>Migrating one more macro to iOS</h4>
<p>The challenge for iOS has always been the tools to get content off the iOS device and into another device. For now I'm still relying on <a href="https://panic.com/blog/the-future-of-transmit-ios/">Panic's Transmit for iOS</a>.<sup id="fnref:98664"><a class="footnote-ref" href="#fn:98664">3</a></sup> This allows me to take images from my iPad and post them onto the web server hosting my blog. The difference is I can't get the full URL of the image like I can on macOS. </p>
<p>In Drafts I created an Action to take the full path of the image on the web server and paste it back into my document with the correct HTML tags. </p>
<div class="highlight"><pre><span></span><code> let str = app.getClipboard();
str = '<span class="nt"><figure><a</span> <span class="na">href=</span><span class="s">"' + 'http://share.mygeekdaddy.net/' + encodeURIComponent(str.substr(15)) + '"</span><span class="nt">><img</span> <span class="na">src=</span><span class="s">"' + 'http://share.mygeekdaddy.net/' + encodeURIComponent(str.substr(15)) + '"</span> <span class="na">style=</span><span class="s">"display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;"</span> <span class="nt">/></img></a></figure></span>'
editor.setSelectedText(str);
</code></pre></div>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2022-09-05_at_2.57.40_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2022-09-05_at_2.57.40_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now I can get the same HTML tags wrapped around the image link I have from either Transmit for macOS or Transmit for iOS. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:368902">
<p>More on that soon. <a class="footnote-backref" href="#fnref:368902" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:124430">
<p>Size, margins, alignment, etc. <a class="footnote-backref" href="#fnref:124430" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:98664">
<p>Six years later and I still haven't found an app as good. <a class="footnote-backref" href="#fnref:98664" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Creating Pelican title blocks in Drafts2022-08-10T19:59:07-05:002022-08-10T19:59:07-05:00Jason Verlytag:mygeekdaddy.net,2022-08-10:/2022/08/10/creating-pelican-title-blocks-in-drafts/<p>There's a funny thing that happens when you start using good tools, you only want to use your good tools. One of my favorite tools for a while now has been the Markdown<sup id="fnref:32434"><a class="footnote-ref" href="#fn:32434">1</a></sup> text file format. The upside to using Markdown is that it's also the format I use …</p><p>There's a funny thing that happens when you start using good tools, you only want to use your good tools. One of my favorite tools for a while now has been the Markdown<sup id="fnref:32434"><a class="footnote-ref" href="#fn:32434">1</a></sup> text file format. The upside to using Markdown is that it's also the format I use for my blog posts. This entire post was written as Markdown text file, copied to a folder on my website, and then converted to HTML for the web server. </p>
<p>I use <a href="https://getpelican.com">Pelican</a> as the "conversion tool" from Markdown to HTML for this site. Part of the style used by Pelican is a metadata header format in the Markdown file for attributes for the blog post - title, date created, tags, etc. </p>
<p>The metadata keys include:</p>
<table>
<thead>
<tr>
<th style="text-align: center;"><strong>Metadata</strong></th>
<th style="text-align: center;"><strong>Description</strong></th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;"><code>title</code></td>
<td style="text-align: center;">Title of the article or page</td>
</tr>
<tr>
<td style="text-align: center;"><code>date</code></td>
<td style="text-align: center;">Publication date (e.g., YYYY-MM-DD HH:SS)</td>
</tr>
<tr>
<td style="text-align: center;"><code>modified</code></td>
<td style="text-align: center;">Modification date (e.g., YYYY-MM-DD HH:SS)</td>
</tr>
<tr>
<td style="text-align: center;"><code>tags</code></td>
<td style="text-align: center;">Content tags, separated by commas</td>
</tr>
<tr>
<td style="text-align: center;"><code>keywords</code></td>
<td style="text-align: center;">Content keywords, separated by commas (HTML content only)</td>
</tr>
<tr>
<td style="text-align: center;"><code>category</code></td>
<td style="text-align: center;">Content category (one only — not multiple)</td>
</tr>
<tr>
<td style="text-align: center;"><code>slug</code></td>
<td style="text-align: center;">Identifier used in URLs and translations</td>
</tr>
<tr>
<td style="text-align: center;"><code>author</code></td>
<td style="text-align: center;">Content author, when there is only one</td>
</tr>
<tr>
<td style="text-align: center;"><code>authors</code></td>
<td style="text-align: center;">Content authors, when there are multiple</td>
</tr>
<tr>
<td style="text-align: center;"><code>summary</code></td>
<td style="text-align: center;">Brief description of content for index pages</td>
</tr>
<tr>
<td style="text-align: center;"><code>lang</code></td>
<td style="text-align: center;">Content language ID (en, fr, etc.)</td>
</tr>
<tr>
<td style="text-align: center;"><code>translation</code></td>
<td style="text-align: center;">If content is a translation of another (true or false)</td>
</tr>
<tr>
<td style="text-align: center;"><code>status</code></td>
<td style="text-align: center;">Content status: draft, hidden, or published</td>
</tr>
<tr>
<td style="text-align: center;"><code>template</code></td>
<td style="text-align: center;">Name of template to use to generate content (without extension)</td>
</tr>
<tr>
<td style="text-align: center;"><code>save_as</code></td>
<td style="text-align: center;">Save content to this relative file path</td>
</tr>
<tr>
<td style="text-align: center;"><code>url</code></td>
<td style="text-align: center;">URL to use for this article/page</td>
</tr>
</tbody>
</table>
<p>The four critical keys that I normally use for my posts are: </p>
<ul>
<li><code>Title</code> </li>
<li><code>Category</code></li>
<li><code>Tags</code></li>
<li><code>Date</code> </li>
</ul>
<p>In the past I would normally do almost all my writing on my Mac because of the automation tools I had available to me to write<sup id="fnref:32435"><a class="footnote-ref" href="#fn:32435">2</a></sup>, proof<sup id="fnref:32436"><a class="footnote-ref" href="#fn:32436">3</a></sup>, and post<sup id="fnref:32437"><a class="footnote-ref" href="#fn:32437">4</a></sup> an article. I've started to write more and more on my iPad, so I've wanted to recreate my writing tools from my Mac to my iPad . </p>
<h4>Drafts Scripting</h4>
<p>Drafts has become my go to writing app in the past couple of months. The one drag on my system has been a difference in my automation tools on my Mac vs my iPad. The latest is recreating a Keyboard Maestro macro that would create a series of prompts to collect the Pelican metadata keys and then insert the properly formatted metakeys into the Markdown file. </p>
<p>Keyboard Maestro prompt:</p>
<figure><a href="http://share.mygeekdaddy.net/keyboard_maestro_prompt.png"><img src="http://share.mygeekdaddy.net/keyboard_maestro_prompt.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The Keyboard Maestro macro would then ask a few more questions and then insert the metadata header at the top of the document. This is the actual title block for this post:</p>
<div class="highlight"><pre><span></span><code> Title: Creating Pelican title blocks in Drafts
Category: Automation
Tags: Drafts, Pelican, Scripting
Date: 2022-08-10 19:59:07
</code></pre></div>
<p>What I wanted was the ability for Drafts to prompt me the same questions and insert the metadata header the same way. </p>
<p>I finally pieced together<sup id="fnref:32438"><a class="footnote-ref" href="#fn:32438">5</a></sup> a Drafts action that will give me the same prompt cycle and insert the metadata header at the top of a Drafts note. </p>
<p>Drafts prompt:</p>
<figure><a href="http://share.mygeekdaddy.net/drafts_prompt.png"><img src="http://share.mygeekdaddy.net/drafts_prompt.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I've posted the action to the Drafts Directory - <a href="https://directory.getdrafts.com/a/2Bt">Pelican Markdown Header</a> action. The action is a series of 4 scripts for each header item:</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2022-08-12_at_9.14.37_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2022-08-12_at_9.14.37_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The 4 actions could eventually be merged into a single script. But I'm <em>still</em> trying to find a good javascript book that doesn't think I just want to learn DOM and do web page forms. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:32434">
<p>Ok... actually <a href="https://rawgit.com/fletcher/MultiMarkdown-6-Syntax-Guide/master/index.html">MultiMarkdown </a> <a class="footnote-backref" href="#fnref:32434" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:32435">
<p>nvAlt <a class="footnote-backref" href="#fnref:32435" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:32436">
<p>Marked 2 <a class="footnote-backref" href="#fnref:32436" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:32437">
<p>Transmit <a class="footnote-backref" href="#fnref:32437" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:32438">
<p>Literally pieced it from other Drafts actions. <a class="footnote-backref" href="#fnref:32438" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>Rethinking my what's in my toolbox2022-08-08T14:13:03-05:002022-08-08T14:13:03-05:00Jason Verlytag:mygeekdaddy.net,2022-08-08:/2022/08/08/rethinking-my-whats-in-my-toolbox/<p>This post has been a long time coming. Covid hit people in a lot of different ways. I'm still dealing with some of the personal challenges that came out of the past 2+ years. The biggest effect this had on me was professionally. A lot the areas I focus on …</p><p>This post has been a long time coming. Covid hit people in a lot of different ways. I'm still dealing with some of the personal challenges that came out of the past 2+ years. The biggest effect this had on me was professionally. A lot the areas I focus on got put on hold because they are value add activities versus core function.<sup id="fnref:896832"><a class="footnote-ref" href="#fn:896832">2</a></sup> I'll be attending my first conference since 2019.<sup id="fnref:229396"><a class="footnote-ref" href="#fn:229396">1</a></sup> And through all of this I've had 3 different bosses. Change happened, both good and bad. </p>
<p>I grew up with a boomer father who grew up with depression area parents. To say "work comes first" in my family is an understatement. The professional set backs also felt like personal set backs, hence the absolute lack of focus on my little corner of the internet. But things are start to feel like their turning a corner. </p>
<p>So as my senses feel like they've started to awaken, so has my sense of productivity. Over the the past couple of years I've picked up a few new tools and dropped a couple of beloved favorites.</p>
<p>New tools in the toolbox:
* GoodNotes - I've just about ditched the an ink pen for a digital one.
* Agenda - Working on capturing and automating meeting minutes.
* Shortcuts - Since they <em>should</em> work on Mac and iPad. </p>
<p>Tools I'm revisiting:
* Drafts - Having this on Mac and iPad make it a must.
* OmniFocus - New job has required new expectations of task tracking.
* Scripting - This will be a never ending journey.</p>
<p>Old tools that have been retired:
* Editorial - Not deleted, but not on the home screen anymore either.
* Pythonista - Same as Editorial. <sup id="fnref:896833"><a class="footnote-ref" href="#fn:896833">3</a></sup></p>
<p>I'm going to be transitioning into a new role for the company I work for and that move has really snapped me out of the </p>
<p>The new tools have been a focus for the inevitable crash my 6y old MBP will have. Politics aside, getting another MBP will be a challenge for me at work due to current IT standards and Apple's move to Mx Silicon processor. The latter obstacle being the larger one because that's limiting the tools I have available on my MBP for Windows VM's. I have some hope of the Windows 11 ARM version, but since that's technically in beta, company IT won't touch it with a 10' pole. </p>
<p>My main focus of late has been bringing some parity of my toolbox on my iPad for what I have on my MBP. The biggest challenge has been migrating Keyboard Maestro actions into Drafts actions. The current success has been migrating my <a href="https://directory.getdrafts.com/a/2Bo">footnote shortcut</a>. The shortcut will take a URL from the clipboard and transform highlighted text in your draft note and convert that into a Markdown link. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:229396">
<p>MaximoWorld 2022... speaking this time too. <a class="footnote-backref" href="#fnref:229396" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:896832">
<p>I help make the widgets faster, but I don’t actually make the widgets. <a class="footnote-backref" href="#fnref:896832" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:896833">
<p>🙏 Ole passes these projects on to someone soon. <a class="footnote-backref" href="#fnref:896833" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Setting the sort order of Select Value dialog box in Maximo2021-06-27T10:40:13-05:002021-06-27T10:40:13-05:00Jason Verlytag:mygeekdaddy.net,2021-06-27:/2021/06/27/setting-the-sort-order-of-select-value-dialog-box-in-maximo/<p>One of the under-appreciated functions in Maximo is the ability to create custom value lists for a <a href="https://www.ibm.com/docs/en/maximo-eam-saas?topic=overview-types-domains">field using a Domain</a>. The use of a Domain value list helps guide a Maximo user to use a specific set of choices to align the data choices used on a given field …</p><p>One of the under-appreciated functions in Maximo is the ability to create custom value lists for a <a href="https://www.ibm.com/docs/en/maximo-eam-saas?topic=overview-types-domains">field using a Domain</a>. The use of a Domain value list helps guide a Maximo user to use a specific set of choices to align the data choices used on a given field.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2021-06-27_at_9.47.41_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2021-06-27_at_9.47.41_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Maximo sorts the dialog box displaying the Domain value list in descending order by default. However, for some fields in Maximo this won't make sense - e.g. WO Priority. </p>
<figure><a href="http://share.mygeekdaddy.net/621_mx_ug_pdf.jpg"><img src="http://share.mygeekdaddy.net/621_mx_ug_pdf.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Work Order priority by design is a descending value list, meaning the lower the number, the lower priority. </p>
<p>But when viewing a WO Priority value in Maximo, the sort order defaults to an ascending order.</p>
<figure><a href="http://share.mygeekdaddy.net/Work_Order_Tracking_priority_asc.jpg"><img src="http://share.mygeekdaddy.net/Work_Order_Tracking_priority_asc.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This sort order places the highest priority at the bottom and contradicts the concept that the WO priority should be highest to lowest value. </p>
<h4>Adding a new VALUELIST lookup</h4>
<p>In Application Designer, the way a Domain value list is associated with a field is by setting the look up to <code>VALUELIST</code>.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2021-06-27_at_10.15.50_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2021-06-27_at_10.15.50_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The dialog box for the <code>VALUELIST</code> is set in the system XML file <code>LOOKUPS.XML</code>. To get the dialog box to sort in another order we need to add a new entry to the <code>LOOKUPS.XML</code> design file. </p>
<p>Open up Application Design and export the <code>LOOKUPS.XML</code> to your desktop.<sup id="fnref:953273"><a class="footnote-ref" href="#fn:953273">1</a></sup> Open the file in a text editor and search for the text string <code>table id="valuelist"</code>. You will find an entry for the Domain value list dialog box like this:</p>
<div class="highlight"><pre><span></span><code><span class="nt"></table></span>
<span class="nt"><table</span> <span class="na">id=</span><span class="s">"valuelist"</span> <span class="na">inputmode=</span><span class="s">"readonly"</span> <span class="na">selectmode=</span><span class="s">"single"</span> <span class="nt">></span>
<span class="nt"><tablebody</span> <span class="na">displayrowsperpage=</span><span class="s">"20"</span> <span class="na">filterable=</span><span class="s">"true"</span> <span class="na">filterexpanded=</span><span class="s">"true"</span> <span class="na">id=</span><span class="s">"valuelist_lookup_tablebody"</span><span class="nt">></span>
<span class="nt"><tablecol</span> <span class="na">dataattribute=</span><span class="s">"value"</span> <span class="na">id=</span><span class="s">"valuelist_lookup_tablebody_col_5"</span> <span class="na">mxevent=</span><span class="s">"selectrecord"</span> <span class="na">mxevent_desc=</span><span class="s">"Go To %1"</span> <span class="na">sortable=</span><span class="s">"true"</span> <span class="na">type=</span><span class="s">"link"</span><span class="nt">/></span>
<span class="nt"><tablecol</span> <span class="na">dataattribute=</span><span class="s">"description"</span> <span class="na">id=</span><span class="s">"valuelist_lookup_tablebody_col_6"</span> <span class="na">mxevent=</span><span class="s">"selectrecord"</span> <span class="na">mxevent_desc=</span><span class="s">"Go To %1"</span> <span class="na">sortable=</span><span class="s">"true"</span> <span class="na">type=</span><span class="s">"link"</span><span class="nt">/></span>
<span class="nt"></tablebody></span>
<span class="nt"></table></span>
</code></pre></div>
<p>Copy the entry above to a new document in your text editor and use the replace function to replace entries <code>valuelist</code> with <code>valuelist_desc</code>. Then add <code>orderby="value desc"</code> to the end of the first line. Your code snippet should look like this:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><table</span> <span class="na">id=</span><span class="s">"valuelist_desc"</span> <span class="na">inputmode=</span><span class="s">"readonly"</span> <span class="na">selectmode=</span><span class="s">"single"</span> <span class="na">orderby=</span><span class="s">"value desc"</span><span class="nt">></span>
<span class="nt"><tablebody</span> <span class="na">displayrowsperpage=</span><span class="s">"20"</span> <span class="na">filterable=</span><span class="s">"true"</span> <span class="na">filterexpanded=</span><span class="s">"true"</span> <span class="na">id=</span><span class="s">"valuelist_desc_lookup_tablebody"</span><span class="nt">></span>
<span class="nt"><tablecol</span> <span class="na">dataattribute=</span><span class="s">"value"</span> <span class="na">id=</span><span class="s">"valuelist_desc_lookup_tablebody_col_desc5"</span> <span class="na">mxevent=</span><span class="s">"selectrecord"</span> <span class="na">mxevent_desc=</span><span class="s">"Go To %1"</span> <span class="na">sortable=</span><span class="s">"true"</span> <span class="na">type=</span><span class="s">"link"</span><span class="nt">/></span>
<span class="nt"><tablecol</span> <span class="na">dataattribute=</span><span class="s">"description"</span> <span class="na">id=</span><span class="s">"valuelist_desc_lookup_tablebody_col_desc6"</span> <span class="na">mxevent=</span><span class="s">"selectrecord"</span> <span class="na">mxevent_desc=</span><span class="s">"Go To %1"</span> <span class="na">sortable=</span><span class="s">"true"</span> <span class="na">type=</span><span class="s">"link"</span><span class="nt">/></span>
<span class="nt"></tablebody></span>
</code></pre></div>
<p>Copy the code snippet and paste it below the original <code>valuelist</code> code. Save the XML file and re-import the <code>LOOKUPS.XML</code> file into Maximo. </p>
<p>With the new dialog box in Maximo, you can update the lookup on a field in Application Designer. In the example below I updated the look up for the <code>WOPRIORITY</code> field in the WO Tracking app. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2021-06-27_at_10.26.08_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2021-06-27_at_10.26.08_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>With the new value list look up, Maximo will set the sort order of the dialog box to have the key values sorted in descending order. </p>
<figure><a href="http://share.mygeekdaddy.net/Work_Order_Tracking_priority_desc.jpg"><img src="http://share.mygeekdaddy.net/Work_Order_Tracking_priority_desc.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now the value list Maximo users interact with match the top down concept of work order priorities. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:953273">
<p>Make a back up copy of the XML file in case you make a mistake. <a class="footnote-backref" href="#fnref:953273" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Reviewing PM completion requirements2021-06-16T15:29:15-05:002021-06-16T15:29:15-05:00Jason Verlytag:mygeekdaddy.net,2021-06-16:/2021/06/16/reviewing-pm-completion-requirements/<p>I believe the most important part of being a leader is also being a teacher. Reliability leaders are generally asked to teach and explain new concepts on how to improve the methods being utilized to maintain our facility's equipment. As teachers we sometimes fail to see a contextual change that …</p><p>I believe the most important part of being a leader is also being a teacher. Reliability leaders are generally asked to teach and explain new concepts on how to improve the methods being utilized to maintain our facility's equipment. As teachers we sometimes fail to see a contextual change that is so completely obvious to us, but is not even on the radar for the people we are leading. </p>
<p>The first part was on the workshop focused on the tasks to be migrated and how the previous software managed multiple task intervals on the single piece of equipment versus job plan sequencing those activities for a single piece of equipment onto a single PM in Maximo. For example, we have a piece of equipment that has 4 tasks that should be completed our the course of a year:</p>
<ul>
<li>1 Month: Inspect widget maker</li>
<li>3 Month: Change air filters on widget maker</li>
<li>6 Month: Change oil filters on widget maker</li>
<li>12 Month: Verify tolerances on widget maker</li>
</ul>
<p>In Maximo this will be a single PM with 4 sequenced job plans. This is a <em>key</em> difference between how legacy CMMS software platforms handle tasks compared to modern EAM solutions. </p>
<p>As we discussed the PM setup, we got on the topic of how soon should a maintenance team should get these tasks completed which lead into the next topic for the workshop - metrics. We reviewed <a href="https://portal.smrp.org/online-store/merchandise-details/?&ClearCache=no&dialog=yes&action=edit&id=909c13d4-1f32-44c5-a04b-6b6d456538f1&isAdminSite=0&browserId=541f55c6-ac60-4b63-8cff-5053b9d518ed">SMRP Metric 5.4.10 - PM & PdM Work Order Compliance</a> with the group on the concept of PM completion grace periods. The metric states that PM's tasks should be completed within 20% of the frequency, up to a maximum of 28 days. </p>
<p>Here's a chart based on the SMRP 5.4.10 metric about task interval and grace periods:</p>
<figure><a href="http://share.mygeekdaddy.net/smrp_pm_grace_period.png"><img src="http://share.mygeekdaddy.net/smrp_pm_grace_period.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>I asked the group again what the grace period should be for these 4 tasks we used as an example. I let everyone go back and forth on what the "correct" grace period should be while I put the following grid on a white board:</p>
<figure><a href="http://share.mygeekdaddy.net/pm_task_interval_table.png"><img src="http://share.mygeekdaddy.net/pm_task_interval_table.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>The grid was supposed to visually show: </p>
<ul>
<li>In January and February the team has to do the 1M task.</li>
<li>In March the team has to do the 1M and 3M tasks.</li>
<li>In June the team has to do the 1M, 3M and 6M tasks.</li>
<li>In January the team has to do the 1M, 3M, 6M and 12M tasks. </li>
</ul>
<p>After walking through what the grid represented I stated to the team that <em>all these tasks should be completed within a 6 day grace period</em> because we're doing a 1 Month PM on the widget maker that just has additional tasks at different intervals. </p>
<p><strong>Task interval != PM Frequency</strong></p>
<p>The maintenance team saw this and looked stunned. We discussed this context reset and discussed what information sources allowed the team to still see sequenced activities as distinct intervals. </p>
<p>So go have a chat with your team and see what they think about PM frequencies. You might be surprised what you hear. </p>Migrating my plain text files2021-05-05T20:44:28-05:002021-05-05T20:44:28-05:00Jason Verlytag:mygeekdaddy.net,2021-05-05:/2021/05/05/migrating-my-plain-text-files/<p>My first exposure to using text files to store little bits of information came from <a href="https://www.relay.fm/mpu/046">Merlin Mann on a Mac Power Users</a> episode.<sup id="fnref:691570"><a class="footnote-ref" href="#fn:691570">1</a></sup> This is one of those episodes I consider part of the foundation of my personal automation path. Using Merlin's text file tag names has been a …</p><p>My first exposure to using text files to store little bits of information came from <a href="https://www.relay.fm/mpu/046">Merlin Mann on a Mac Power Users</a> episode.<sup id="fnref:691570"><a class="footnote-ref" href="#fn:691570">1</a></sup> This is one of those episodes I consider part of the foundation of my personal automation path. Using Merlin's text file tag names has been a key to how I've dumped digital information head out of my head over the past 10 years.</p>
<p>My choice for a long has been to use Editorial for iOS and nvAlt on my Mac to access my notes anywhere. These apps gave me the ability to run similar automation on either platform by using the automation tools in Editorial or Keyboard Maestro macros for nvAlt. I recently ran into a small issue with Editorial and went to check the forums to see if anyone else had some suggestions. When I got to the forums I was bummed to see the title for one of the recent posts - <a href="https://forum.omz-software.com/topic/6990/editorial-still-alive">Editorial still alive?</a> <sup id="fnref:601552"><a class="footnote-ref" href="#fn:601552">2</a></sup> Looking at Ole's twitter feed makes me think neither Editorial nor Pythonista are going to be updated soon. </p>
<h4>Migrating from nvAlt to Drafts</h4>
<p>With this information, I wanted to find a new home for my notes but continue to be able to use the same tools on both Mac and iOS devices. The list of choices had to be 1) an app I already had and 2) have used more than once. The obvious choice was Drafts, but the dilemma was how to get 10 years worth of notes into Drafts.<sup id="fnref:824893"><a class="footnote-ref" href="#fn:824893">5</a></sup> </p>
<p>I headed over to the Drafts forums and as expected the forums did not disappoint. A quick search and I found someone had already asked about this topic: <a href="https://forums.getdrafts.com/t/bulk-import-text-files/2852">Bulk import text files</a>:</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2021-05-04_at_6.00.02_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2021-05-04_at_6.00.02_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Poking around the forum post I saw <em>exactly</em> what I was looking for. <sup id="fnref:983574"><a class="footnote-ref" href="#fn:983574">3</a></sup></p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2021-05-04_at_2.30.58_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2021-05-04_at_2.30.58_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Taking this starting point, I adapted his action script to accommodate I few of my own needs:</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2021-05-04_at_2.32.46_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2021-05-04_at_2.32.46_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>My plan is after all my plain text files are added into Drafts I can use a dedicated workspace for all my nvAlt notes. So the script Greg provided was modified to use the first full word of the .MD file name as a tag and tag the note <code>nvalt</code> as well.<sup id="fnref:860440"><a class="footnote-ref" href="#fn:860440">4</a></sup> </p>
<h4>Going in reverse</h4>
<p>If I've learned anything about my automation processes, it's sometimes I need a path to undo my genius ideas. I'll continue to use my nvAlt file tagging style by using the first line on Draft to be the same as my nvAlt file name. This will allow me to use a Drafts action to push notes from Drafts back into my Markdown text file folder.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2021-05-04_at_8.55.46_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2021-05-04_at_8.55.46_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I'll give this new setup a couple of weeks and report back if I've committed to giving up my old tools. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:691570">
<p>You can jump to the 1h17m mark in the show to hear Merlin discuss the use of tags on text files - RUNX, REFX, MTGX, etc. <a class="footnote-backref" href="#fnref:691570" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:601552">
<p>Not the confidence builder for an app you consider "essential". <a class="footnote-backref" href="#fnref:601552" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:983574">
<p>No surprise that Greg offered the solution himself. <a class="footnote-backref" href="#fnref:983574" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:860440">
<p>I'm split on whether or not tags should allow capitalization. <a class="footnote-backref" href="#fnref:860440" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:824893">
<p>1159 and counting... <a class="footnote-backref" href="#fnref:824893" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>What time is it?2020-07-23T15:29:44-05:002020-07-23T15:29:44-05:00Jason Verlytag:mygeekdaddy.net,2020-07-23:/2020/07/23/what-time-is-it/<p>As much as things have been turned upside down the past couple of months, it's sometimes nice to have a "lively debate". <sup id="fnref:30794"><a class="footnote-ref" href="#fn:30794">1</a></sup> The recent discussion I participated in revolved around a specific part of a sentence that stated:</p>
<blockquote>
<p>"...requirement begins at midnight Friday, July 24..."</p>
</blockquote>
<p>Oh... so this begins …</p><p>As much as things have been turned upside down the past couple of months, it's sometimes nice to have a "lively debate". <sup id="fnref:30794"><a class="footnote-ref" href="#fn:30794">1</a></sup> The recent discussion I participated in revolved around a specific part of a sentence that stated:</p>
<blockquote>
<p>"...requirement begins at midnight Friday, July 24..."</p>
</blockquote>
<p>Oh... so this begins on Friday. </p>
<p>Nope, the rest of the sentence concluded:</p>
<blockquote>
<p>"...so, effectively, Saturday morning, July 25."</p>
</blockquote>
<p>I felt that was wrong on so many levels I blurted out my disbelief in front of a couple of peers. <sup id="fnref:728719"><a class="footnote-ref" href="#fn:728719">2</a></sup> </p>
<p>One co-worker said, "No wonder Minnesota is so messed up, you can't even tell time!" <sup id="fnref:485098"><a class="footnote-ref" href="#fn:485098">3</a></sup> </p>
<h4>Breaking down the logic</h4>
<p>I turned around, chuckled at his joke, and ask him to clarify what he meant.</p>
<p>Co-Worker: Duh... read it again. It starts at midnight, so of course it starts first thing on Saturday.</p>
<p>Me: Really? </p>
<p>CW: Yeah. Midnight is the end of the day, so midnight Friday is when Saturday starts.</p>
<p>Me: So when I say 'noon', that means 12:00pm, right?</p>
<p>CW: Yep.</p>
<p>Me: So when I say midnight, that must mean 12:00am, right?</p>
<p>CW: <em>(cautiously)</em> Yeah.</p>
<p>Me: So if this begins on Friday at midnight, that means it begins as 12:00am on Friday. So how does this start on Saturday, when 12:00am on Friday is the start of the day?</p>
<p>CW: <img src="http://share.mygeekdaddy.net/ummm.gif" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></p>
<p>The co-worker grabbed their snack and walked out of the break room. <sup id="fnref:712483"><a class="footnote-ref" href="#fn:712483">4</a></sup> </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:30794">
<p>Ok, at one point I may have uttered 'Idiot' under my breath. <a class="footnote-backref" href="#fnref:30794" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:728719">
<p>Mistake number one. <a class="footnote-backref" href="#fnref:728719" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:485098">
<p>Mistake number two. <a class="footnote-backref" href="#fnref:485098" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:712483">
<p>Challenging an engineer to a logic discussion... mistake number three. <a class="footnote-backref" href="#fnref:712483" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Extending BIRT's hidden parameters - Pt 22020-06-02T09:42:10-05:002020-06-02T09:42:10-05:00Jason Verlytag:mygeekdaddy.net,2020-06-02:/2020/06/02/extending-birts-hidden-parameters-pt-2/<p>I've continued to experiment with the <a href="http://mygeekdaddy.net/2020/05/30/extending-the-use-of-maximos-hidden-birt-parameter/">use of Maximo BIRT's hidden parameter</a>. In my previous post I was able to display values that were generated by related information of the Maximo user who ran the report. But the original data selection used the hidden <code>username</code> parameter in the SQL where …</p><p>I've continued to experiment with the <a href="http://mygeekdaddy.net/2020/05/30/extending-the-use-of-maximos-hidden-birt-parameter/">use of Maximo BIRT's hidden parameter</a>. In my previous post I was able to display values that were generated by related information of the Maximo user who ran the report. But the original data selection used the hidden <code>username</code> parameter in the SQL where clause:</p>
<div class="highlight"><pre><span></span><code>sqlText = "select inventory.itemnum,i4.description,inventory.location,inventory.binnum,inventory.catalogcode,inventory.siteid, "
+ " inventory.status,i4.commodity,i4.commoditygroup,i4.itemid "
+ " from inventory "
+ " left outer join item i4 on i4.itemnum = inventory.itemnum and i4.itemsetid = inventory.itemsetid "
+ " where " + params["where"]
+ " and inventory.siteid = (select defsite from maxuser where userid= '" + params["userName"] + "')"
+ " order by inventory.itemnum "
;
</code></pre></div>
<p>The line:</p>
<div class="highlight"><pre><span></span><code>+ " and inventory.siteid = (select defsite from maxuser where userid= '" + params["userName"] + "')"
</code></pre></div>
<p>gave essentially the same functionality as:</p>
<div class="highlight"><pre><span></span><code>siteid = (select defsite from maxuser where userid = :user)
</code></pre></div>
<p>The larger goal was to use the <code>username</code> parameter to pull related information of the Maximo user and use that information directly in the main dataset's SQL selection statement. </p>
<h4>Changing selection sequence</h4>
<p>In order to get the main dataset to use a parameter value in the SQL select statement, the parameter value has to be understood before the main dataset selection is made. BIRT runs data connections in the order they are presented in the Open method. The parameter values <code>displayname</code> and <code>site_ID</code> are available for use in the main dataset by moving the secondary connections above the main SQL select statement section.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-06-02_at_10.25.25_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-06-02_at_10.25.25_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now the main dataset SQL where clause can use the <code>site_ID</code> parameter directly in the SQL selection statement. </p>
<div class="highlight"><pre><span></span><code>sqlText = "select inventory.itemnum,i4.description,inventory.location,inventory.binnum,inventory.catalogcode,inventory.siteid, "
+ " inventory.status,i4.commodity,i4.commoditygroup,i4.itemid "
+ " from inventory "
+ " left outer join item i4 on i4.itemnum = inventory.itemnum and i4.itemsetid = inventory.itemsetid "
+ " where " + params["where"]
+ " and inventory.siteid = '" + params["site_ID"] + "'"
+ " order by inventory.itemnum "
;
</code></pre></div>
<p>The use of the <code>params["site_ID"]</code> parameter value now gives the report the functionality of being run against only records the Maximo user is currently checked into. </p>Extending the use of Maximo's hidden BIRT parameter2020-05-30T15:23:44-05:002020-05-30T15:23:44-05:00Jason Verlytag:mygeekdaddy.net,2020-05-30:/2020/05/30/extending-the-use-of-maximos-hidden-birt-parameter/<p>One of the common queries used by Maximo power users is:</p>
<div class="highlight"><pre><span></span><code>siteid = (select defsite from maxusers where userid = :user)
</code></pre></div>
<p>This selection limits records to the default site the current Maximo user is checked into. So if a query is saved for future use, it will work with any site a …</p><p>One of the common queries used by Maximo power users is:</p>
<div class="highlight"><pre><span></span><code>siteid = (select defsite from maxusers where userid = :user)
</code></pre></div>
<p>This selection limits records to the default site the current Maximo user is checked into. So if a query is saved for future use, it will work with any site a user is checked into. The challenge a lot of report writers have is using that same flexibility in BIRT reports. </p>
<p>Maximo has a built in parameter, <code>userName</code>,<sup id="fnref:17805"><a class="footnote-ref" href="#fn:17805">1</a></sup> that allows a report writer to pull the USERID of the person who ran the report and have it show up on report itself. The IBM KB document on how '<a href="https://www.ibm.com/support/pages/how-add-username-v7-birt-report">How to add Username to V7 BIRT Report</a>' shows the steps to use the hidden parameter in BIRT reports. But once you have the USERID of the person who ran the report, this <em>should</em> open a door to use other information related to the current report user. </p>
<p>So how can we pull the DEFSITE value out of the hidden parameter and into a useable data point in the BIRT report?</p>
<p style="border: #1863a1 1px solid; border-radius: 10px; text-align: center; padding: 10px; width: 600px; margin-left: auto; margin-right: auto; background-color: rgb(251,239,153);">The rest of this works in Maximo 7.6.0.x with BIRT 4.3.1 and should work in Maximo 7.6.1.x. I'm describing my testing to date, so the "technical" term for some of these functional steps _will not_ be accurate.</p>
<h4>Connecting to Maximo data</h4>
<p>Normally when a report is created, the report uses a <code>dataSet</code> to initiate the connection to the database and conduct the SQL query for data results. This is a generic example of a report opening the connection to a Maximo dataset:</p>
<div class="highlight"><pre><span></span><code><span class="n">maximoDataSet</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MXReportDataSetProvider</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">this</span><span class="o">.</span><span class="n">getDataSource</span><span class="p">()</span><span class="o">.</span><span class="n">getName</span><span class="p">(),</span><span class="w"> </span><span class="n">this</span><span class="o">.</span><span class="n">getName</span><span class="p">());</span><span class="w"></span>
<span class="n">maximoDataSet</span><span class="o">.</span><span class="n">open</span><span class="p">();</span><span class="w"></span>
<span class="k">var</span><span class="w"> </span><span class="n">sqlText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="nb nb-Type">String</span><span class="p">();</span><span class="w"></span>
<span class="n">sqlText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">" select ...</span>
<span class="n">where</span><span class="w"> </span><span class="s2">" + params["</span><span class="n">where</span><span class="s2">"]</span>
<span class="ow">and</span><span class="w"> </span><span class="o">...</span><span class="w"></span>
<span class="n">maximoDataSet</span><span class="o">.</span><span class="n">setQuery</span><span class="p">(</span><span class="n">sqlText</span><span class="p">);</span><span class="w"></span>
</code></pre></div>
<p>This is how all OOTB<sup id="fnref:310576"><a class="footnote-ref" href="#fn:310576">2</a></sup> BIRT reports connect to the Maximo database. </p>
<h4>Additional data connections</h4>
<p>The <em>"trick"</em> I'm going to use to get to the related information from the <code>MAXUSER</code> table is to use the hidden parameter as part of an additional database call. On the <code>Open</code> method for the primary data set, I'll add code to make a new data set to make an additional database connection. </p>
<div class="highlight"><pre><span></span><code><span class="o">//</span><span class="w"> </span><span class="nv">User</span><span class="err">'s Display Name</span>
<span class="err">userDispNameDataSet = MXReportDataSetProvider.create(this.getDataSource().getName(), "userDispNameDataSet");</span>
<span class="err">userDispNameDataSet.open();</span>
<span class="nv">userDispNameSQL</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"select DISPLAYNAME as Display_Name from person where personid = (select personid from maxuser where userid = upper('"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nb">params</span>[<span class="s2">"userName"</span>]<span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"'))"</span><span class="w"></span>
<span class="nv">userDispNameDataSet</span>.<span class="nv">setQuery</span><span class="ss">(</span><span class="nv">userDispNameSQL</span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
<span class="k">if</span><span class="ss">(</span><span class="nv">userDispNameDataSet</span>.<span class="nv">fetch</span><span class="ss">())</span><span class="w"> </span>{<span class="w"> </span><span class="nb">params</span>[<span class="s2">"displayname"</span>]<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">userDispNameDataSet</span>.<span class="nv">getString</span><span class="ss">(</span><span class="s2">"Display_Name"</span><span class="ss">)</span><span class="c1">; }</span><span class="w"></span>
<span class="nv">userDispNameDataSet</span>.<span class="nv">close</span><span class="ss">()</span><span class="c1">;</span><span class="w"></span>
<span class="o">//</span><span class="w"> </span><span class="k">End</span><span class="w"> </span><span class="nv">User</span><span class="err">'s Display Name</span><span class="w"></span>
</code></pre></div>
<p>This code will do the following: </p>
<ol>
<li>
<p>Create a new data set: </p>
<div class="highlight"><pre><span></span><code>userDispNameDataSet = MXReportDataSetProvider.create(this.getDataSource().getName(), "userDispNameDataSet");
</code></pre></div>
</li>
<li>
<p>Open the database connection: </p>
<div class="highlight"><pre><span></span><code>userDispNameDataSet.open();
</code></pre></div>
</li>
<li>
<p>Set the SQL connection string to a variable.</p>
<div class="highlight"><pre><span></span><code>userDispNameSQL = "select DISPLAYNAME as Display_Name from person where personid = (select personid from maxuser where userid = upper('" + params["userName"] + "'))"
</code></pre></div>
</li>
<li>
<p>Use the previously set variable <code>userDispNameSQL</code> for the data fetch:</p>
<div class="highlight"><pre><span></span><code>userDispNameDataSet.setQuery(userDispNameSQL);
</code></pre></div>
</li>
<li>
<p>Do a conditional check if the selection returned a value, and if it does, push that value to the corresponding parameter:</p>
<div class="highlight"><pre><span></span><code><span class="k">if</span><span class="ss">(</span><span class="nv">userDispNameDataSet</span>.<span class="nv">fetch</span><span class="ss">())</span><span class="w"> </span>{<span class="w"> </span><span class="nb">params</span>[<span class="s2">"displayname"</span>]<span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">userDispNameDataSet</span>.<span class="nv">getString</span><span class="ss">(</span><span class="s2">"Display_Name"</span><span class="ss">)</span><span class="c1">; }</span><span class="w"></span>
</code></pre></div>
</li>
<li>
<p>Close the database connection:</p>
<div class="highlight"><pre><span></span><code>userDispNameDataSet.close();
</code></pre></div>
</li>
</ol>
<p>With this code, I'm able to use the built-in hidden parameter in the SQL select statement to duplicate the functionality of the query:</p>
<div class="highlight"><pre><span></span><code>siteid = (select defsite from maxusers where userid = :user)
</code></pre></div>
<p>as a selection statement in my BIRT report.</p>
<h4>Example Report</h4>
<p>The example report I'm using will pull some details from the Inventory app, with the goal of pulling details based on the user's current site they're checked into. If you run the report in Eclipse, you will need to manually enter the <code>userName</code> parameter, because the code to identify your <code>USERID</code> is inherent when running the report in Maximo. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen%20Shot%202020-05-30%20at%201.10.47%20PM.png"><img src="http://share.mygeekdaddy.net/Screen%20Shot%202020-05-30%20at%201.10.47%20PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The report will have 3 parameters:</p>
<ul>
<li>userName</li>
<li>displayname</li>
<li>site_ID</li>
</ul>
<p>When setting up the parameters, make sure the 'Is Required' is unchecked. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_12_32_43_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_12_32_43_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The <code>userName</code> parameter is the built in hidden parameter and the other parameter values will be pulled from other database connections. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_1_17_31_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_1_17_31_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>When you add the report into Maximo, delete all of the parameters in the report setup in Maximo.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_1_00_07_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_1_00_07_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>When the report is setup, the values for the <code>displayname</code> and <code>site_ID</code> will be presented:</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_1.12.00_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_1.12.00_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So when the report is run, the report present the user's name and the site the user is checked into. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_1.11.32_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-05-30_at_1.11.32_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now I have the ability to have a report run against a site, without having the user select the site. </p>
<h4>Source Code</h4>
<p>The complete <code>Open</code> method for the report is listed below. </p>
<div class="highlight"><pre><span></span><code><span class="n">dataSet_inventory</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MXReportDataSetProvider</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">this</span><span class="o">.</span><span class="n">getDataSource</span><span class="p">()</span><span class="o">.</span><span class="n">getName</span><span class="p">(),</span><span class="w"> </span><span class="n">this</span><span class="o">.</span><span class="n">getName</span><span class="p">());</span><span class="w"></span>
<span class="n">dataSet_inventory</span><span class="o">.</span><span class="n">open</span><span class="p">();</span><span class="w"></span>
<span class="k">var</span><span class="w"> </span><span class="n">sqlText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="nb nb-Type">String</span><span class="p">();</span><span class="w"></span>
<span class="n">sqlText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"select inventory.itemnum,i4.description,inventory.location,inventory.binnum,inventory.catalogcode, "</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="s2">" inventory.siteid,inventory.status,i4.commodity,i4.commoditygroup,i4.itemid "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" from inventory "</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="s2">" left outer join item i4 on i4.itemnum = inventory.itemnum and i4.itemsetid = inventory.itemsetid "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" where "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">params</span><span class="p">[</span><span class="s2">"where"</span><span class="p">]</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" and inventory.siteid = (select defsite from maxuser where userid= '"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">params</span><span class="p">[</span><span class="s2">"userName"</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"')"</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="s2">" order by inventory.itemnum "</span><span class="w"></span>
<span class="p">;</span><span class="w"></span>
<span class="n">dataSet_inventory</span><span class="o">.</span><span class="n">setQuery</span><span class="p">(</span><span class="n">sqlText</span><span class="p">);</span><span class="w"></span>
<span class="n">dataSet_inventory</span><span class="o">.</span><span class="n">registerDataTranslation</span><span class="p">(</span><span class="s2">"description"</span><span class="p">,</span><span class="w"> </span><span class="s2">"itemid"</span><span class="p">,</span><span class="w"> </span><span class="s2">"item"</span><span class="p">,</span><span class="w"> </span><span class="s2">"DESCRIPTION"</span><span class="p">);</span><span class="w"></span>
<span class="o">//</span><span class="w"> </span><span class="n">User</span><span class="s1">'s Display Name</span>
<span class="n">userDispNameDataSet</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MXReportDataSetProvider</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">this</span><span class="o">.</span><span class="n">getDataSource</span><span class="p">()</span><span class="o">.</span><span class="n">getName</span><span class="p">(),</span><span class="w"> </span><span class="s2">"userDispNameDataSet"</span><span class="p">);</span><span class="w"></span>
<span class="n">userDispNameDataSet</span><span class="o">.</span><span class="n">open</span><span class="p">();</span><span class="w"></span>
<span class="n">userDispNameSQL</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"select DISPLAYNAME from person where personid = "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"(select personid from maxuser where userid = upper('"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">params</span><span class="p">[</span><span class="s2">"userName"</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"'))"</span><span class="w"></span>
<span class="n">userDispNameDataSet</span><span class="o">.</span><span class="n">setQuery</span><span class="p">(</span><span class="n">userDispNameSQL</span><span class="p">);</span><span class="w"> </span>
<span class="k">if</span><span class="p">(</span><span class="n">userDispNameDataSet</span><span class="o">.</span><span class="n">fetch</span><span class="p">())</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">params</span><span class="p">[</span><span class="s2">"displayname"</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userDispNameDataSet</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"displayname"</span><span class="p">);</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="n">userDispNameDataSet</span><span class="o">.</span><span class="n">close</span><span class="p">();</span><span class="w"></span>
<span class="o">//</span><span class="w"> </span><span class="n">End</span><span class="w"> </span><span class="n">User</span><span class="s1">'s Display Name</span>
<span class="o">//</span><span class="w"> </span><span class="n">User</span><span class="s1">'s Default SiteID</span>
<span class="n">userSiteIDDataSet</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MXReportDataSetProvider</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">this</span><span class="o">.</span><span class="n">getDataSource</span><span class="p">()</span><span class="o">.</span><span class="n">getName</span><span class="p">(),</span><span class="w"> </span><span class="s2">"userSiteIDDataSet"</span><span class="p">);</span><span class="w"></span>
<span class="n">userSiteIDDataSet</span><span class="o">.</span><span class="n">open</span><span class="p">();</span><span class="w"> </span>
<span class="n">userSiteIDSQL</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"select DEFSITE from MAXUSER where USERID = upper('"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">params</span><span class="p">[</span><span class="s2">"userName"</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"');"</span><span class="w"></span>
<span class="n">userSiteIDDataSet</span><span class="o">.</span><span class="n">setQuery</span><span class="p">(</span><span class="n">userSiteIDSQL</span><span class="p">);</span><span class="w"> </span>
<span class="k">if</span><span class="p">(</span><span class="n">userSiteIDDataSet</span><span class="o">.</span><span class="n">fetch</span><span class="p">())</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="n">params</span><span class="p">[</span><span class="s2">"site_ID"</span><span class="p">]</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">userSiteIDDataSet</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"DEFSITE"</span><span class="p">);</span><span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="n">userSiteIDDataSet</span><span class="o">.</span><span class="n">close</span><span class="p">();</span><span class="w"></span>
<span class="o">//</span><span class="w"> </span><span class="n">End</span><span class="w"> </span><span class="n">User</span><span class="s1">'s Default SiteID</span>
</code></pre></div>
<p>Update 2020-06-02: Clarified the step by step breakdown of the secondary database connection after further testing. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:17805">
<p>The parameter is case sensitive. <a class="footnote-backref" href="#fnref:17805" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:310576">
<p>Out of the box <a class="footnote-backref" href="#fnref:310576" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Conditionally make 'Memo' a requirement2020-04-23T20:09:58-05:002020-04-23T20:09:58-05:00Jason Verlytag:mygeekdaddy.net,2020-04-23:/2020/04/23/conditionally-make-memo-a-requirement/<p>I will always admit I get inspiration on how I administer my company's Maximo environment from other sources. The most recent update I've made to our Maximo environment was based on a something I've had on the back burner, but got a virtual nudge from Steven Shull (<a href="[https://twitter.com/shullsa">@shullsa</a>) after reading …</p><p>I will always admit I get inspiration on how I administer my company's Maximo environment from other sources. The most recent update I've made to our Maximo environment was based on a something I've had on the back burner, but got a virtual nudge from Steven Shull (<a href="[https://twitter.com/shullsa">@shullsa</a>) after reading his response on the <a href="https://community.ibm.com/community/user/internetofthings/communities/community-home/digestviewer/viewthread?MessageKey=6de57b07-859c-4020-b8c0-1376dff36294&CommunityKey=3d7261ae-48f7-481d-b675-a40eb407e0fd&tab=digestviewer#bm6de57b07-859c-4020-b8c0-1376dff36294">IBM Maximo forums</a>.</p>
<p>The original question was asked how to make the the 'Memo' field required on certain status changes.</p>
<blockquote>
<p>Does anybody know how to make changes to the Work Order Status change dialog. I Would like to make the Memo field compulsory if the user wants to cancel a work order.</p>
</blockquote>
<p>Steven responded with an explanation how </p>
<blockquote>
<p>...With a simple python script like below, it will be required. No screen changes and you can build out any logic you need should you require it for other status changes (for example, this looks for literal status='CAN', but you may have synonyms of that status)</p>
<p><code>if mbo.getString("STATUS")=="CAN":</code>
<code>mbo.getMboValue("MEMO").setRequired(True)</code> </p>
</blockquote>
<p>This was pretty much what I wanted to do, but this gave me the direction I needed. As Steven explained in the forum post, there is an issue with the Maximo framework when applying a global restriction on status changes. This was the problem I had run into in previous attempts to make the MEMO field required, but I assumed it was something else I had done wrong. </p>
<h4>Automation Script Creating</h4>
<p>From Steven's suggestion, the script should be applied against the 'Attribute Launch Point'. So open up Automation Script and create a new 'Script with Attribute Launch Point'. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10.32.42_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10.32.42_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Upon creation, a new dialog box will open. </p>
<ul>
<li>Launch Point: WO_STATUS</li>
<li>Object: WOCHANGESTATUS</li>
<li>Attribute: STATUS</li>
</ul>
<p>Leave the 'Events' and 'Script' areas as is and click 'Next'.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10.33.47_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10.33.47_AM.png" style="display:block; margin-left: auto; margin-right:auto;margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The next dialog box sets up the script you need to add to do make the functional check when a the status is changed. </p>
<ul>
<li>Launch Point: <em>This is pulled from the previous screen.</em></li>
<li>Active: <em>Leave box checked.</em></li>
<li>Script: <em>Functional name of the script, similar to saving a query.</em></li>
<li>Description: <em>A description of the script being created. (Not labeled).</em></li>
</ul>
<p>You don't need to do anything else except clicking 'Next'.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10.34.29_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10.34.29_AM.png" style="display:block; margin-left: auto; margin-right:auto;margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The final dialog box is the actual script entry. </p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">psdi.mbo</span> <span class="kn">import</span> <span class="n">MboConstants</span>
<span class="kn">from</span> <span class="nn">psdi.server</span> <span class="kn">import</span> <span class="n">MXServer</span>
<span class="k">if</span> <span class="n">mbo</span><span class="o">.</span><span class="n">getString</span><span class="p">(</span><span class="s2">"STATUS"</span><span class="p">)</span><span class="o">==</span><span class="s2">"CAN"</span><span class="p">:</span>
<span class="n">mbo</span><span class="o">.</span><span class="n">getMboValue</span><span class="p">(</span><span class="s2">"MEMO"</span><span class="p">)</span><span class="o">.</span><span class="n">setRequired</span><span class="p">(</span><span class="kc">True</span><span class="p">)</span>
</code></pre></div>
<p>Click 'Create' to activate the Automation Script. This will create the script and set the script to active in your Maximo instance. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10.38.06_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10.38.06_AM.png" style="display:block; margin-left: auto; margin-right:auto;margin-bottom:10px; width:600px;" /></img></a></figure>
<p>After hitting 'Create', you should get a confirmation that the script creation was successful. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_8.03.40_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_8.03.40_PM.png" style="display:block; margin-left: auto; margin-right:auto;margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Testing Automation Script</h4>
<p>You can now go to WO Tracking and open a WO to test the script actions. Since this script is activated on the object, you don't need to stop/restart the Maximo server or log out to have the logic get loaded. The script will be active as soon as it's created. </p>
<p>Test a WO status changes to 'CAN' and the MEMO field is required. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10_41_34_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10_41_34_AM.png" style="display:block; margin-left: auto; margin-right:auto;margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Testing with a WO status change to the synonym status 'MISSED' and the MEMO field <em>is not</em> required. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10_41_17_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2020-04-23_at_10_41_17_AM.png" style="display:block; margin-left: auto; margin-right:auto;margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Anytime a user sets a WO status to 'CAN', Maximo will require the user to add a note on why the WO needed to be cancelled.</p>Controlling BIRT Chart Colors in Maximo2019-10-31T13:44:18-05:002019-10-31T13:44:18-05:00Jason Verlytag:mygeekdaddy.net,2019-10-31:/2019/10/31/controlling-birt-chart-colors-in-maximo/<p>One of the efforts I'm making as we head into 2020<sup id="fnref:963786"><a class="footnote-ref" href="#fn:963786">1</a></sup> is data consistency. I started looking at some of our key reports and noticed that as our maturity evolved, our reports evolved as well, but sometimes in a disjointed way. We'd discover a new technique in BIRT or …</p><p>One of the efforts I'm making as we head into 2020<sup id="fnref:963786"><a class="footnote-ref" href="#fn:963786">1</a></sup> is data consistency. I started looking at some of our key reports and noticed that as our maturity evolved, our reports evolved as well, but sometimes in a disjointed way. We'd discover a new technique in BIRT or better define a business process, which could alter one of our reports. As these alterations of our reports occurred, the reports across our environment wouldn't have a consistent feel because some reports may have been untouched. <sup id="fnref:279298"><a class="footnote-ref" href="#fn:279298">2</a></sup> </p>
<p>I'm working on an update to our reliability scorecard and I wanted to add some visual cues to what has been just a set of numerical charts for a long time. I got the data loaded for various views of our work orders onto 3 separate pie charts. The charts looked like this:</p>
<figure><a href="http://share.mygeekdaddy.net/preview_pdf__1_page_.png"><img src="http://share.mygeekdaddy.net/preview_pdf__1_page_.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p>This was the correct visual representation of the data, but look at the charts closely... the colors change in each pic chart. That's not helpful when the goal was for a more consistent view.</p>
<h4>Setting Chart Colors</h4>
<p>I started digging through chart settings in BIRT and found nothing on how to set a chart color to the category value - e.g. worktype 'PM' will always be blue. I did some digging around and found a post similar to what I was looking for on the <a href="https://forums.opentext.com/forums/discussion/52359/pie-chart-color-by-categories">OpenText forums</a>. </p>
<blockquote>
<p>Hi, I'm using a multiple pie charts and the slices are colored based on what the value of the category series is. This is working as intended, but the question I have is can I specify the color based on the value of the category.</p>
</blockquote>
<p>The steps to force a BIRT chart to specific colors turned out to be pretty simple. I identified the top 4-5 work order types I knew that would consistently show up in all the pie charts. The key to the process is creating a script to connect the Category values in the chart to a specific color palette. </p>
<script src="https://gist.github.com/javerly/acd372d9efc965f1b7aab57c827d96ef.js"></script>
<h4>Steps to Force Chart Colors</h4>
<p>With the script created, I applied the script to each chart with the following steps:</p>
<ol>
<li>Create color palette for the Categories that will be shared across all the charts in BIRT. <em>(Use the example script from above.)</em></li>
<li>Open the BIRT report and select the chart you want to modify. </li>
<li>With chart selected, click on the <code>Script</code> button in the BIRT editor. <figure><a href="http://share.mygeekdaddy.net/screen_shot_2019-10-31.png"><img src="http://share.mygeekdaddy.net/screen_shot_2019-10-31.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
<li>This will open the <code>On Render</code> function for the chart, which is also the only function available. <figure><a href="http://share.mygeekdaddy.net/screen_shot_2019-10-31_01.png"><img src="http://share.mygeekdaddy.net/screen_shot_2019-10-31_01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
<li>Paste the categorization script you created. </li>
<li>Go back to the <code>Layout</code> tab and repeat steps for other charts. </li>
<li>Save the report file and preview the report. </li>
</ol>
<p>With the updated rendering scripts, all of the primary categories are now the same color:</p>
<figure><a href="http://share.mygeekdaddy.net/preview2_pdf__1_page_.png"><img src="http://share.mygeekdaddy.net/preview2_pdf__1_page_.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<h4>Data Consistency</h4>
<p>Doing a side by side comparison of the same dataset shows how the controlled version has more consistency between the category sets. </p>
<figure><a href="http://share.mygeekdaddy.net/IMG_2399.jpg"><img src="http://share.mygeekdaddy.net/IMG_2399.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The next step I could take would be to set a standard for <em>all</em> work types, so no matter what the dataset is I would have consistent coloring on all the charts. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:963786">
<p>My company's fiscal year starts on 2019-11-01, so it's essentially 2020 for me already. <a class="footnote-backref" href="#fnref:963786" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:279298">
<p>This is deeper than just colors and fonts. <a class="footnote-backref" href="#fnref:279298" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Running a Maximo Escalation to catch an event every 30d2019-10-08T09:17:45-05:002019-10-08T09:17:45-05:00Jason Verlytag:mygeekdaddy.net,2019-10-08:/2019/10/08/running-a-maximo-escalation-to-catch-an-event-every-30d/<p>I normally read through the <a href="https://www.ibm.com/developerworks/community/forums/html/forum?id=11111111-0000-0000-0000-000000001119&ps=100">Maximo forums</a> for new ideas or lend a helping hand when I can. A recent question was asked on how to have a Maximo Escalation <a href="https://www.ibm.com/developerworks/community/forums/html/topic?id=3c4c0add-fc2c-41c7-a904-51c7d7135f5d&ps=100">send a notification every 3 months</a>. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-10-08_at_9.05.45_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-10-08_at_9.05.45_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Looking at the question, there were a couple of points raised:</p>
<ul>
<li>The escalation needs …</li></ul><p>I normally read through the <a href="https://www.ibm.com/developerworks/community/forums/html/forum?id=11111111-0000-0000-0000-000000001119&ps=100">Maximo forums</a> for new ideas or lend a helping hand when I can. A recent question was asked on how to have a Maximo Escalation <a href="https://www.ibm.com/developerworks/community/forums/html/topic?id=3c4c0add-fc2c-41c7-a904-51c7d7135f5d&ps=100">send a notification every 3 months</a>. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-10-08_at_9.05.45_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-10-08_at_9.05.45_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Looking at the question, there were a couple of points raised:</p>
<ul>
<li>The escalation needs to catch any work order that may be past due on a 30d frequency. </li>
<li>The escalation needs to repeat every 30d, so the Escalation should send another notice on a 30d frequency. </li>
<li>The escalation needs to run daily so the recipients don't get overwhelmed with notifications if the Escalation was run every 30d.</li>
</ul>
<p>Forum user <a href="https://www.ibm.com/developerworks/community/profiles/html/profileView.do?userid=3100022BVM#&tabinst=Updates">@winterZZR1400</a> came up with the start of an elegant solution:</p>
<blockquote>
<p>Try in the Condition <code>MOD(((statusdate - sysdate)- MOD(statusdate - sysdate,1))/90,1)= 0</code></p>
</blockquote>
<p>I took what he posted and used a literal translation for testing, but that didn't work for me. The problem I ran into was the escalation ran once a day and the modulus on <code>statusdate</code> may not accurately catch a work order based modulus value with <code>getdate()</code> and the run time of the Escalation. </p>
<p>I looked at the code and determined the date/time stamp of <code>statusdate</code> and <code>getdate()</code> needed to be converted over to a date format. I converted both <code>statusdate</code> and <code>getdate()</code> to a <a href="https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql?view=sql-server-2017"><code>yyyy-mm-dd</code> ISO8601</a> format to see if the <a href="https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-transact-sql?view=sql-server-2017">difference between the dates as an integer</a> in days and check that the result was a modulus of 30. </p>
<p>The new Escalation Point: <code>(DATEDIFF(day, CONVERT(date, statusdate, 23),CONVERT(date, getdate(), 23)) % 30) = 0</code></p>
<p>The overall Escalation looks like this:</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-10-08_at_8.57.48_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-10-08_at_8.57.48_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now when the a work order is over due, based on a 30d frequency, the maintenance team will get the following reminder:</p>
<blockquote>
<p>The following work order has not had a status update in more than 180d. Please review the WO and check to see if the record needs to be forced to CLOSED status. If not, review the WO for a more appropriate status until further action can be taken. </p>
<p>WO Num: 888888 <br>
Descr: INSPECT COTTON CANDY MACHINE FOR BUILD UP <br>
Last Status Date: 4/9/19 3:24 PM <br>
LocID: PINKROOM-101 <br>
Asset: A113 </p>
<p>* <em> * Automated Message #1234 - Please Do Not Respond * </em> * </p>
</blockquote>
<p>What... you don't have a cotton candy machine where you work?</p>BIRT Data Set Types2019-09-24T11:41:57-05:002019-09-24T11:41:57-05:00Jason Verlytag:mygeekdaddy.net,2019-09-24:/2019/09/24/birt-data-set-types/<p>This is complete a personal reference for Maximo BIRT Reporting. The information is originally sourced from <a href="https://www.ibm.com/support/knowledgecenter/SS2JEC_7.2.0/com.ibm.itam.doc/reference/mam71_report_dev_guide.pdf">IBM's Report Developer Guide v7.1</a> PDF file. <sup id="fnref:118149"><a class="footnote-ref" href="#fn:118149">1</a></sup> </p>
<p>The following chart shows the database type, the corresponding BIRT Data Type, and the method used within the BIRT Designer to retrieve its value. This …</p><p>This is complete a personal reference for Maximo BIRT Reporting. The information is originally sourced from <a href="https://www.ibm.com/support/knowledgecenter/SS2JEC_7.2.0/com.ibm.itam.doc/reference/mam71_report_dev_guide.pdf">IBM's Report Developer Guide v7.1</a> PDF file. <sup id="fnref:118149"><a class="footnote-ref" href="#fn:118149">1</a></sup> </p>
<p>The following chart shows the database type, the corresponding BIRT Data Type, and the method used within the BIRT Designer to retrieve its value. This chart defines the data fields used during the Fetch method and how the Data Set Output columns are populated.</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Database Type</th>
<th style="text-align: center;">Data Type</th>
<th style="text-align: center;">BIRT Set Method</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">ALN, CLOB, GL, LONGALN, LOWER, UPPER</td>
<td style="text-align: center;">String</td>
<td style="text-align: center;">getString(String attributeName)</td>
</tr>
<tr>
<td style="text-align: center;">YORN</td>
<td style="text-align: center;">String</td>
<td style="text-align: center;">getBooleanString(String attributeName)</td>
</tr>
<tr>
<td style="text-align: center;">DATE, DATETIME, TIME</td>
<td style="text-align: center;">DateTime</td>
<td style="text-align: center;">getTimestamp(String attributeName)</td>
</tr>
<tr>
<td style="text-align: center;">AMOUNT, DECIMAL, DURATION</td>
<td style="text-align: center;">Decimal</td>
<td style="text-align: center;">getDouble(String attributeName)</td>
</tr>
<tr>
<td style="text-align: center;">FLOAT</td>
<td style="text-align: center;">Float</td>
<td style="text-align: center;">getFloat(String attributeName)</td>
</tr>
<tr>
<td style="text-align: center;">DURATION</td>
<td style="text-align: center;">String</td>
<td style="text-align: center;">getDuration(String attributeName)</td>
</tr>
<tr>
<td style="text-align: center;">INTEGER, SMALLINT</td>
<td style="text-align: center;">Integer</td>
<td style="text-align: center;">getInteger(String attributeName)</td>
</tr>
</tbody>
</table>
<p>Example of data types in BIRT <code>Fetch</code> method:</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-09-24_at_11.44.01_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-09-24_at_11.44.01_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<div class="footnote">
<hr>
<ol>
<li id="fn:118149">
<p>I still use 5.2 reference material. <a class="footnote-backref" href="#fnref:118149" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Adding Context Messages to your Maximo processes2019-09-18T13:01:43-05:002019-09-18T13:01:43-05:00Jason Verlytag:mygeekdaddy.net,2019-09-18:/2019/09/18/adding-context-messages-to-your-maximo-processes/<p>One of the analogies I've used over the years is that out of the box Maximo is a giant lump of clay - it's fun to play with in its raw form, but needs to be skillfully molded to be useful. One of these molding steps is to put your organization's …</p><p>One of the analogies I've used over the years is that out of the box Maximo is a giant lump of clay - it's fun to play with in its raw form, but needs to be skillfully molded to be useful. One of these molding steps is to put your organization's business processes into Maximo. Maximo has multiple ways to enforce business rules with tools like Data Restrictions on a Security Group, conditions on a status domain, and Escalations.<sup id="fnref:369767"><a class="footnote-ref" href="#fn:369767">1</a></sup> Each of these tools are great ways to enforce your organization's business processes inside Maximo, but they rarely offer context about when they are being enforced. One way to give your Maximo users context of your business processes is to use an Automation Script. In this use case I want the Automation Script to pop up a dialog box to give context about what's happening with a record and guide the user on what choices they really have available to them. </p>
<p>There are 3 parts to setting up an Automation Script with an alert dialog box in Maximo:</p>
<ol>
<li>Identifying the condition the script should be triggered.</li>
<li>Creating a custom error message.</li>
<li>Creating the automation script.</li>
</ol>
<h4>Conditions to trigger automation script</h4>
<p>This is the foundation of Automation Script, but none of it actually happens in Maximo. The method that works for me is to create a single paragraph that describes everything that should happen and all the fields that would be involved. </p>
<blockquote>
<p>When a Maximo user sets a purchase requisition into APPR status (PR.STATUS), and the total cost (PR.TOTALCOST) is less than $100.00, Maximo should show a pop-up dialog box warning the user about the record is less than the current soft cost standard of $100.00. </p>
</blockquote>
<p>This completely describes 1) the fields I need to use as part of the script, 2) gives the conditions when the script should fire off, and 3) what outcome should occur when the script is triggered.</p>
<h4>Creating custom message</h4>
<p>The key part of this process is the message that will be presented to the Maximo user. We want the message dialog box to pop up and cause the Maximo user to acknowledge the message, but not restrict the user from approving the PR.<sup id="fnref:780274"><a class="footnote-ref" href="#fn:780274">2</a></sup> When setting up this message, the <code>Message ID Suffix</code> is set to WARN. This allows the message to pop up, but does not restrict the action a Maximo user is being alerted to. </p>
<ul>
<li>Message Group: Set this to the object/table the script will be run against. In this case <code>PR</code>.</li>
<li>Message Key: This is the tag the message will use to be called up in the Automation Script. This is user defined, so choice something connected to the message.</li>
<li>Display Message: Leave the default <code>MSGBOX</code>.</li>
<li>Message ID Prefix: Use <code>BMXZZ</code>, this is the standard in Maximo for use generated messages.</li>
<li>Message ID Suffix: This is how we define this is a warning message. It also triggers the icon that is displayed in the pop-up dialog box. </li>
<li>Message ID: With the previous choices, Maximo will generate an ID number. </li>
<li>Display ID: Check box on whether or not to include the full BMXZZ message ID number. I left this off in this example.</li>
<li>Value: This is the actual message that will be displayed in the pop-up dialog box. </li>
<li>Buttons: Allows you to select what buttons will be displayed in the pop-up dialog box.</li>
</ul>
<p>Here's what the complete message looks like:</p>
<figure><a href="http://share.mygeekdaddy.net/PR_warning_message.png"><img src="http://share.mygeekdaddy.net/PR_warning_message.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>One of the key items used in the message is the variable <code>{0}</code> that allows the message to pick up a passed parameter from the automation script. As shown later on, we can set the parameter value within the automation script. </p>
<h4>Creating the automation script</h4>
<p>In the first part we laid out <em>how</em> the script should work and now we're putting the concept of the script into Maximo. Since we deciced that the script should only fire when the status of the purchase request is set to <code>APPR</code>, the script needs to be set against an Attribute Launch Point.</p>
<figure><a href="http://share.mygeekdaddy.net/script_define_launchpoint.png"><img src="http://share.mygeekdaddy.net/script_define_launchpoint.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>In this case we want to set the attribute as the PR.STATUS field. Maximo will open the automation script dialog box after clicking Create > Script with Attribute Launch Point. You will need to add values to all the required fields. As we laid out in the first step, the script should be triggered on the PR.STATUS field, so that's the launch point for the script. </p>
<figure><a href="http://share.mygeekdaddy.net/validate_attribute_launch_point.png"><img src="http://share.mygeekdaddy.net/validate_attribute_launch_point.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Next we setup the variables that will be used in the script:</p>
<figure><a href="http://share.mygeekdaddy.net/vStatus_variable.png"><img src="http://share.mygeekdaddy.net/vStatus_variable.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<figure><a href="http://share.mygeekdaddy.net/vTotalCost_variable.png"><img src="http://share.mygeekdaddy.net/vTotalCost_variable.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>With both variables created, step 2 in the script creation is complete:</p>
<figure><a href="http://share.mygeekdaddy.net/variable_inplace.png"><img src="http://share.mygeekdaddy.net/variable_inplace.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Last step is to add the script logic:</p>
<figure><a href="http://share.mygeekdaddy.net/full_script_logic.png"><img src="http://share.mygeekdaddy.net/full_script_logic.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Click <code>Create</code> to create the Automation Script and set it to Active and run. </p>
<p>The actual script is listed below:</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">psdi.mbo</span> <span class="kn">import</span> <span class="n">MboConstants</span>
<span class="kn">from</span> <span class="nn">psdi.server</span> <span class="kn">import</span> <span class="n">MXServer</span>
<span class="k">if</span> <span class="n">MXServer</span><span class="o">.</span><span class="n">getMXServer</span><span class="p">()</span><span class="o">.</span><span class="n">getMaximoDD</span><span class="p">()</span><span class="o">.</span><span class="n">getTranslator</span><span class="p">()</span><span class="o">.</span><span class="n">toInternalString</span><span class="p">(</span><span class="s2">"POSTATUS"</span><span class="p">,</span><span class="n">vStatus</span><span class="p">,</span> <span class="n">mbo</span><span class="p">)</span> <span class="o">==</span> <span class="s1">'APPR'</span><span class="p">:</span>
<span class="k">if</span> <span class="n">vTotalCost</span> <span class="o"><</span> <span class="mf">100.00</span><span class="p">:</span>
<span class="n">warngroup</span> <span class="o">=</span> <span class="s2">"PO"</span>
<span class="n">warnkey</span> <span class="o">=</span> <span class="s2">"POValueWarn"</span>
<span class="n">warnparams</span> <span class="o">=</span> <span class="p">[</span><span class="s2">"100.00"</span><span class="p">]</span>
</code></pre></div>
<p>In our warning message, we had the variable <code>{0}</code> included as part of the text. Maximo uses that as a way to pass parameter values from one part of the application to the message. In our case, the parameter as created as part of the automation script. When the script gets triggered the script will trigger the warning dialog box <code>POValueWarn</code> to pop up. The script also creates the parameter value of <code>100.00</code> that will get get passed to the dialog box. </p>
<h4>Testing the Automation Script</h4>
<p>Once the script has been created, it will automatically become active and run against Maximo records. The business logic is that a warning message should pop up when a Maximo user tries to set a PR records to APPR status. The example below is setup to trigger the automation script.</p>
<figure><a href="http://share.mygeekdaddy.net/new_pr_testing_records.png"><img src="http://share.mygeekdaddy.net/new_pr_testing_records.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So when a Maximo user attempts to approve the PR, they will see this message:</p>
<figure><a href="http://share.mygeekdaddy.net/PR_warning_dialog_box.png"><img src="http://share.mygeekdaddy.net/PR_warning_dialog_box.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Since the goal was not to restrict the Maximo user's choice, the PR is allowed to be set to <code>APPR</code> and be approved. </p>
<figure><a href="http://share.mygeekdaddy.net/approved_pr_records.png"><img src="http://share.mygeekdaddy.net/approved_pr_records.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now when a Maximo user approves a PR that is less than $100.00, Maximo will give the user a gentle reminder about our current business rules. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:369767">
<p>This is not a complete list, but hits most of the ones I've used to date. <a class="footnote-backref" href="#fnref:369767" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:780274">
<p>You can use an <code>ERROR</code> type message to prevent a record from being processed. <a class="footnote-backref" href="#fnref:780274" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Flexible date ranges in Maximo BIRT reports2019-04-26T10:09:25-05:002019-04-26T10:09:25-05:00Jason Verlytag:mygeekdaddy.net,2019-04-26:/2019/04/26/flexible-date-ranges-in-maximo-birt-reports/<p>For a long time I've always promoted the idea that a report should have flexibility with date ranges. Either the report should allow a user to select a date range or include rolling date ranges. To match this philosophy, we have have several reports that include rolling date range, but …</p><p>For a long time I've always promoted the idea that a report should have flexibility with date ranges. Either the report should allow a user to select a date range or include rolling date ranges. To match this philosophy, we have have several reports that include rolling date range, but need to be generated on a specific date. The business has date ranges that are fixed - e.g. the maintenance reporting period is Saturday through Friday. An example of report need to run against a specific date range is our Labor Utilization report. Our "work week" is Saturday through Friday, since the Labor Utilization report has a rolling date selection, the report needs to be run around 2am on Saturday morning to ensure it selects Saturday through Friday.</p>
<p>Recently I got a request that wanted to monitor how well a department was meeting their labor utilization up to the Friday before metric scorecard report was created. This didn't match the typical date range styles I'd seen in Maximo reports before:</p>
<ul>
<li>Hard Date: The date range is fixed inside the report's selection query.<sup id="fnref:176496"><a class="footnote-ref" href="#fn:176496">2</a></sup> So no matter what is added to the report, the results will return the same date range. </li>
<li>Fixed Date: The date range is selectable when running or scheduling the report in Maximo, but the date range doesn't change if the report is scheduled to run on a regular basis (e.g. run once a week). </li>
<li>Rolling Date: The date range will automatically adjust each time the report is run, whether it's one time or regularly scheduled. An example is the report has a date range of 7 to 14 days ago.</li>
</ul>
<p>What was being requested was a new style of date range functionality where the report period is some fixed period in the past, to match a business reporting period, but the report should be able to be run on various dates, still select the same date range, and then select a new date range after a certain period time. </p>
<p>Let's say the reporting period for a recurring report, like a Labor Utilization report, needs to match the business practice that the work week is Saturday through Friday. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-04-25_at_8.18.44_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-04-25_at_8.18.44_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So the report will always need to select this date range. With a Rolling Date styled report, the report would need to be schedule on a specific date so the report always selects the day range of Saturday to Friday. </p>
<p>What was being requested was the report should still select the same Saturday through Friday date range, but be able to run the report on Mon, Thu, or Fri and still return results from the same date range. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-04-25_at_8.25.10_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-04-25_at_8.25.10_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This shift in timing required both a date selection in SQL (for the record selection) and in BIRT (for the report presentation). </p>
<h4>SQL Date Selections</h4>
<p>Historically I've used a date selection that picks midnight from <code>x</code> days to/from today: </p>
<div class="highlight"><pre><span></span><code><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">14</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"></span>
</code></pre></div>
<p>The <code>-14</code> is what would select how many days forward/backward I wanted a rolling date range to go. </p>
<p>To get a flexible rolling date, I needed a SQL date selection to:</p>
<ul>
<li>Get to a specific number of weeks back.</li>
<li>Get to a fixed day of the selected week.</li>
<li>Set the time of the day to midnight - <code>00:00:00.000</code></li>
</ul>
<p>Working my way back I wanted to get midnight for tonight. This was something I had from other SQL queries with:</p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">day</span>,<span class="w"> </span><span class="mi">0</span>,<span class="w"> </span><span class="nv">datediff</span><span class="ss">(</span><span class="nv">day</span>,<span class="w"> </span><span class="mi">0</span>,<span class="w"> </span><span class="k">getdate</span><span class="ss">()))</span><span class="w"></span>
</code></pre></div>
<p>After some tinkering I found a short cut. When playing with the select statement above, I noticed the <code>datediff</code> function returns an integer value of the date difference. So I could get the current week integer value with:</p>
<div class="highlight"><pre><span></span><code><span class="nv">datediff</span><span class="ss">(</span><span class="nv">wk</span>,<span class="w"> </span><span class="mi">0</span>,<span class="w"> </span><span class="k">getdate</span><span class="ss">())</span><span class="w"> </span>
<span class="nb">result</span>:<span class="w"> </span><span class="mi">6225</span><span class="w"></span>
</code></pre></div>
<p>Offsetting the result to give me the previous week:</p>
<div class="highlight"><pre><span></span><code><span class="nv">datediff</span><span class="ss">(</span><span class="nv">wk</span>,<span class="w"> </span><span class="o">+</span><span class="mi">8</span>,<span class="w"> </span><span class="k">getdate</span><span class="ss">())</span><span class="w"></span>
<span class="nb">result</span>:<span class="w"> </span><span class="mi">6224</span><span class="w"></span>
</code></pre></div>
<p>So now I offset that week back to a date/time value by <code>'x'</code> number of days. The first selection I got was for the Saturday of the report period:</p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">wk</span>,<span class="w"> </span><span class="nv">datediff</span><span class="ss">(</span><span class="w"> </span><span class="nv">wk</span>,<span class="w"> </span><span class="o">+</span><span class="mi">8</span>,<span class="w"> </span><span class="k">getdate</span><span class="ss">())</span>,<span class="w"> </span><span class="o">-</span><span class="mi">2</span><span class="w"> </span><span class="ss">)</span><span class="w"> </span>
<span class="nb">result</span>:<span class="w"> </span><span class="mi">6224</span><span class="w"></span>
</code></pre></div>
<p>Now I could convert the week integer back to a date/time with the <code>dateadd</code> function and add an offset to get to the first date in the range:</p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">wk</span>,<span class="w"> </span><span class="nv">datediff</span><span class="ss">(</span><span class="w"> </span><span class="nv">wk</span>,<span class="w"> </span><span class="o">+</span><span class="mi">8</span>,<span class="w"> </span><span class="k">getdate</span><span class="ss">())</span>,<span class="w"> </span><span class="o">-</span><span class="mi">2</span><span class="w"> </span><span class="ss">)</span><span class="w"></span>
<span class="nb">result</span>:<span class="w"> </span><span class="mi">2019</span><span class="o">-</span><span class="mi">04</span><span class="o">-</span><span class="mi">13</span><span class="w"> </span><span class="mi">00</span>:<span class="mi">00</span>:<span class="mi">00</span>.<span class="mi">000</span><span class="w"></span>
</code></pre></div>
<p>The same could be done to the end of the date range as well:</p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">wk</span>,<span class="w"> </span><span class="nv">datediff</span><span class="ss">(</span><span class="w"> </span><span class="nv">wk</span>,<span class="w"> </span><span class="o">+</span><span class="mi">1</span>,<span class="w"> </span><span class="k">getdate</span><span class="ss">())</span>,<span class="w"> </span><span class="o">-</span><span class="mi">2</span><span class="w"> </span><span class="ss">)</span><span class="w"></span>
<span class="nb">result</span>:<span class="w"> </span><span class="mi">2019</span><span class="o">-</span><span class="mi">04</span><span class="o">-</span><span class="mi">20</span><span class="w"> </span><span class="mi">00</span>:<span class="mi">00</span>:<span class="mi">00</span>.<span class="mi">000</span><span class="w"></span>
</code></pre></div>
<p>The results would now select Saturday through Friday<sup id="fnref:769937"><a class="footnote-ref" href="#fn:769937">3</a></sup>, no matter what day of the week I run the query. A sample of the query running over 9 days. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-04-25_at_4.06.33_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-04-25_at_4.06.33_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>One detail I found in testing is that SQL Server treats Sunday as the first day of the week. Additional adjustments would need to be made to have the date range run from Monday to Sunday as an example. </p>
<h4>BIRT Date Range</h4>
<p>A standard we have for recurring reports is to include the date range in the report header (presentation) so an employee can easily discern what date range the information in the report is from. So now I needed a method to have BIRT show a date range of the reporting period, regardless of what date the report is run. Similar to the SQL date range, the report should print a report date range no matter what day the report is printed. BIRT benefits from having some built in scripting options for Date/Time values. </p>
<p>The first one is getting today's date at midnight:</p>
<div class="highlight"><pre><span></span><code>BirtDateTime.today() [^959949]
Result: 2019-04-25 00:00:00.000
</code></pre></div>
<p>From there I could use the out of the box function for the first day of the week: </p>
<div class="highlight"><pre><span></span><code>BirtDateTime.firstDayOfWeek(BirtDateTime.today())
Result: 2019-04-21 00:00:00.000
</code></pre></div>
<p>And then add/subtract the number of days to get to the first date of the reporting period.</p>
<div class="highlight"><pre><span></span><code>BirtDateTime.addDay(BirtDateTime.firstDayOfWeek(BirtDateTime.addWeek(BirtDateTime.today(), -1)), -1)
Result: 2019-04-13 12:00:00.000
</code></pre></div>
<p>Then do the same for the end of the reporting period:</p>
<div class="highlight"><pre><span></span><code>BirtDateTime.addDay(BirtDateTime.firstDayOfWeek(BirtDateTime.addWeek(BirtDateTime.today(), -1)), +5)
Result: 2019-04-19 12:00:00.000
</code></pre></div>
<p>So unlike the SQL statement, I'm not as concerned about the <em>time</em> aspect of the date/time value. Eventually the presentation scripting would format the value to just a date value.</p>
<div class="highlight"><pre><span></span><code><span class="s1">'Labor Utilization Report for ACME site from '</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">BirtDateTime</span>.<span class="nv">month</span><span class="ss">(</span><span class="nv">row</span>[<span class="s2">"report_beg"</span>]<span class="ss">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"/"</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="nv">BirtDateTime</span>.<span class="nv">day</span><span class="ss">(</span><span class="nv">row</span>[<span class="s2">"report_beg"</span>]<span class="ss">)</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="s2">"/"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">BirtStr</span>.<span class="nv">right</span><span class="ss">((</span><span class="nv">BirtDateTime</span>.<span class="nv">year</span><span class="ss">(</span><span class="nv">row</span>[<span class="s2">"report_beg"</span>]<span class="ss">))</span>.<span class="nv">toString</span><span class="ss">()</span>,<span class="w"> </span><span class="mi">2</span><span class="ss">)</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="s1">' - '</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">BirtDateTime</span>.<span class="nv">month</span><span class="ss">(</span><span class="nv">row</span>[<span class="s2">"report_end"</span>]<span class="ss">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"/"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">BirtDateTime</span>.<span class="nv">day</span><span class="ss">(</span><span class="nv">row</span>[<span class="s2">"report_end"</span>]<span class="ss">)</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="s2">"/"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">BirtStr</span>.<span class="nv">right</span><span class="ss">((</span><span class="nv">BirtDateTime</span>.<span class="nv">year</span><span class="ss">(</span><span class="nv">row</span>[<span class="s2">"report_end"</span>]<span class="ss">))</span>.<span class="nv">toString</span><span class="ss">()</span>,<span class="w"> </span><span class="mi">2</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-04-26_at_10.37.57_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-04-26_at_10.37.57_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now I have date functions that will give me the two ends of the report period in both my SQL selection and report presentation. The minor detail that SQL Server considers the first day of the week to be Monday and BIRT considers the first day of the week to be Sunday was a nugget I wished I'd seen sooner. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:959949">
<p>Note the function <code>BirtDateTime.now()</code> will give current time stamp like <code>getdate()</code>. <a class="footnote-backref" href="#fnref:959949" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:176496">
<p>This typically happens in AdHoc reports. <a class="footnote-backref" href="#fnref:176496" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:769937">
<p>Yes <code>2019-04-20 00:00:00.000</code> is Saturday, but best practice is to use selection statement of <code>datefield < dateadd(wk, datediff( wk, +1, getdate()), -2 )</code>. This statement selects everything less than, but not including, the date value of <code>2019-04-20 00:00:00.000</code>, which is equivalent to <code>datefield <= 2019-04-19 23:59:59.999</code>. However it's easier to get a date/time field at midnight rather than 1 millisecond before midnight. <a class="footnote-backref" href="#fnref:769937" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Getting OmniFocus 3 Task List on Paper (like real paper)2019-02-07T10:09:38-06:002019-02-07T10:09:38-06:00Jason Verlytag:mygeekdaddy.net,2019-02-07:/2019/02/07/getting-omnifocus-3-task-list-on-paper-like-real-paper/<p>A new year always brings out the hopeful GTD'er in me. I was doing my year end review and noticed some holes in how I was tracking my work and how well I was finishing what I wanted to get done. Too often I was reverting back to latest/loudest …</p><p>A new year always brings out the hopeful GTD'er in me. I was doing my year end review and noticed some holes in how I was tracking my work and how well I was finishing what I wanted to get done. Too often I was reverting back to latest/loudest versus what I really needed to get done. Looking back I realized I had dropped my routine to <a href="http://mygeekdaddy.net/2015/07/03/getting-my-daily-to-do-list-out-of-omnifocus/">get my To Do list out of OmniFocus</a> and into a <code>.md</code> file. <sup id="fnref:623135"><a class="footnote-ref" href="#fn:623135">2</a></sup></p>
<p>Because OmniFocus (OF) has shifted from using Contexts to Tags, it meant I needed to make a couple of quick edits to the original script. After I got the edits done I started to use the script and found I was starting to keep on top of what I <em>should</em> be working on. </p>
<h4>Updating my Due List script</h4>
<p>Last weekend when I fired up the script for my weekly review, I took a little time to think about how my to do list could help me out even more. I made a quick list of changes I wanted to make:</p>
<ul>
<li>Automate the loading of the <code>.md</code> file into Marked.</li>
<li>Add Due Date and Start Dates to my task list. <sup id="fnref:111100"><a class="footnote-ref" href="#fn:111100">3</a></sup> </li>
<li>Separate active tasks that have a due date from tasks with just a start date.</li>
<li>Add conditional formatting to the dates based on whether they are over due or not. </li>
</ul>
<p>Over the past couple of days I've tweaked the script to one I'm pretty happy with right now. </p>
<script src="https://gist.github.com/mygeekdaddy/a96beba4a02183e4ab74e2545e292cfd.js"></script>
<h4>Loading the updated Due List script</h4>
<p>Like in previous versions of OmniFocus, there are two different script folders OF can access. </p>
<p>Using <em>Help > Open Scripts</em> will open a path to
<code>/Users/your_name/Library/Application Scripts/com.omnigroup.OmniFocus3</code></p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-02-07_at_8.06.34_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-02-07_at_8.06.34_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Using <em>Scripts Icon > Open OmniFocus Scripts Folder</em> <sup id="fnref:710379"><a class="footnote-ref" href="#fn:710379">1</a></sup> will open a path to
<code>/Users/your_name/Library/Scripts/Applications/OmniFocus</code></p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-02-07_at_8.18.22_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-02-07_at_8.18.22_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>These folders <em>are not</em> the same.</p>
<figure><a href="http://share.mygeekdaddy.net/OmniFocus_and_com_omnigroup_OmniFocus3_and_Inbox.png"><img src="http://share.mygeekdaddy.net/OmniFocus_and_com_omnigroup_OmniFocus3_and_Inbox.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>You'll probably want to drop any updated scripts into the first option because those scripts can be customized by OmniFocus to include a button to run the script.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-02-07_at_8_43_14_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-02-07_at_8_43_14_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>New To Do List</h4>
<p>The previous version of the script would automagically<sup id="fnref:976317"><a class="footnote-ref" href="#fn:976317">4</a></sup> sort the projects by Project Name. In the previous version I realized know the name of the project the task came from didn't matter as much as knowing what was due soon versus what was over due. So the conditional formatting to add color to the due dates/start dates was the biggest improvement </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-02-07_at_9_26_49_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-02-07_at_9_26_49_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now when I open OF in the morning, I can do the following with one button:</p>
<ol>
<li>Collect all tasks that are over due or due in the next 7 days.</li>
<li>Collect all tasks I should have already started or should start in the next 7 days.</li>
<li>Create a <code>.md</code> file with all these tasks.</li>
<li>Open Marked with the task list <code>.md</code> file. </li>
</ol>
<p>The only thing I need to add to the script is to have Marked print the file after it opens. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:710379">
<p><div>To enable the AppleScript menu on the Mac OS X menu bar, follow these steps:
1. Click Applications
2. Scroll down and click Utilities
3. Click Script Editor (this was called AppleScript Editor in older OS X versions)
4. Click the “Script Editor” menu item, then click “Preferences...”
5. On the Preferences dialog click “Show Script menu in menu bar”
6. If it isn’t selected, you’ll want to enable the “Show Computer scripts” option</div> <a class="footnote-backref" href="#fnref:710379" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:623135">
<p>Why I dropped they routine is probably the question I should answer. <a class="footnote-backref" href="#fnref:623135" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:111100">
<p>I use OF's Defer Date as a Start Date. It just makes more sense to me. <a class="footnote-backref" href="#fnref:111100" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:976317">
<p>I <em>think</em> the projects were sorting alphabetically was built into how AppleScript parsed the project list. <a class="footnote-backref" href="#fnref:976317" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>How to turn off drop shadow on screenshots2019-02-07T09:20:46-06:002019-02-07T09:20:46-06:00Jason Verlytag:mygeekdaddy.net,2019-02-07:/2019/02/07/how-to-turn-off-drop-shadow-on-screenshots/<p>This is nothing more than a reminder to myself on how to turn off the drop shadow that macOS always wants to add to screen shots. I keep forgetting how to do this when I upgrade to a new version of macOS. <sup id="fnref:533887"><a class="footnote-ref" href="#fn:533887">1</a></sup></p>
<ol>
<li>
<p>Open terminal and enter the following command …</p></li></ol><p>This is nothing more than a reminder to myself on how to turn off the drop shadow that macOS always wants to add to screen shots. I keep forgetting how to do this when I upgrade to a new version of macOS. <sup id="fnref:533887"><a class="footnote-ref" href="#fn:533887">1</a></sup></p>
<ol>
<li>
<p>Open terminal and enter the following command:
<code>defaults write com.apple.screencapture disable-shadow -bool true</code></p>
</li>
<li>
<p>Next you need to refresh the system UI to stop adding the drop shadow:
<code>killall SystemUIServer</code></p>
</li>
<li>
<p>Now using Cmd-Shift-4-Spacebar to capture a full window, the captured image will not have the drop shadow captured. </p>
</li>
</ol>
<p>To turn the drop shadow back on, run </p>
<blockquote>
<p>defaults write com.apple.screencapture disable-shadow -bool true</p>
</blockquote>
<div class="footnote">
<hr>
<ol>
<li id="fn:533887">
<p>It's like I should create a check list or something. 🤣 <a class="footnote-backref" href="#fnref:533887" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Triggering events on macOS from iOS2019-01-21T15:33:18-06:002019-01-21T15:33:18-06:00Jason Verlytag:mygeekdaddy.net,2019-01-21:/2019/01/21/triggering-events-on-macos-from-ios/<p>With my <a href="http://mygeekdaddy.net/2018/11/08/rationalizing-my-choices-for-the-mac-mini/">updated Mac mini</a> <sup id="fnref:20190117132737"><a class="footnote-ref" href="#fn:20190117132737">1</a></sup>, I've started getting back into looking at automation ideas for my home setup. A recent <a href="https://www.relay.fm/mpu/465">Mac Power Users podcast</a> hit close to home for me because it was a great discussion by David and Stephen on the recently updated Mac mini. David and Stephen …</p><p>With my <a href="http://mygeekdaddy.net/2018/11/08/rationalizing-my-choices-for-the-mac-mini/">updated Mac mini</a> <sup id="fnref:20190117132737"><a class="footnote-ref" href="#fn:20190117132737">1</a></sup>, I've started getting back into looking at automation ideas for my home setup. A recent <a href="https://www.relay.fm/mpu/465">Mac Power Users podcast</a> hit close to home for me because it was a great discussion by David and Stephen on the recently updated Mac mini. David and Stephen were talking about a possible automation idea that would allow David to automate turning on/off macOS services that would enable David to connect to his Mac using Screenson his iPad.<sup id="fnref:531306"><a class="footnote-ref" href="#fn:531306">2</a></sup> </p>
<h4>Triggering Outline</h4>
<p>David's idea motivated me to look at creating a framework that could be easily duplicated to trigger events on my Mac mini from my iPad or iPhone. I wanted a process that would do the following:</p>
<ul>
<li>From iOS, create a trigger mechanism that can use Dropbox or iCloud.</li>
<li>From macOS, monitor for the trigger mechanism and initiate an action on the Mac <em>without</em> user interaction.</li>
<li>From iOS get confirmation that the trigger action successfully completed. </li>
</ul>
<p>To set up this automation process, you'll need a few tools on both your iOS device and macOS computer:</p>
<ul>
<li>iOS: <a href="https://itunes.apple.com/us/app/shortcuts/id915249334?mt=8">Shortcuts app</a></li>
<li>macOS: <a href="https://www.noodlesoft.com">Hazel by Noodlesoft</a></li>
</ul>
<p>From there you'll need to select your cloud platform of choice: Dropbox or iCloud. All the directions listed below will be for Dropbox. The alterations to make the workflow fit for iCloud are pretty minor. </p>
<h4>Create trigger file on Dropbox</h4>
<p>The initiator to this process is using an action in Shortcuts to create the trigger file in Dropbox. I don't care what the file name is, so I asked one of my kids for a made up word.<sup id="fnref:679030"><a class="footnote-ref" href="#fn:679030">3</a></sup></p>
<figure><a href="http://share.mygeekdaddy.net/IMG_0257.JPG"><img src="http://share.mygeekdaddy.net/IMG_0257.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>So when this shortcut is run, it will create an empty text file in Dropbox in the designated folder.</p>
<h4>Watching for trigger file on macOS</h4>
<p>Now that the trigger file has been created, a Hazel rule needs to monitor the folder for the file. Hazel will do 2 things in this example: </p>
<ul>
<li>Remove the trigger file</li>
<li>Run an AppleScript. </li>
</ul>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-01-21_at_12.41.11_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-01-21_at_12.41.11_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Applescript FTW</h4>
<p>The last piece is what action should take place if the trigger file is found. In my working example I wanted to know what the external IP address is for my Mac mini via an email message. This is the AppleScript embedded in the Hazel rule in the previous step. </p>
<figure><a href="http://share.mygeekdaddy.net/external_ip_email_script.png"><img src="http://share.mygeekdaddy.net/external_ip_email_script.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The script has 2 parts:</p>
<ol>
<li>Determine the external IP address of the Mac.</li>
<li>Email the information to a preset email address.</li>
</ol>
<p>Once triggered, the email will look like this:</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-01-21_at_12_46_39_PM.jpg"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-01-21_at_12_46_39_PM.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Side note: I'll probably update the script to send a Message instead of an email since that's even more universal for my normal workflows. </p>
<h4>Wrapping it all up</h4>
<p>The main upside of using Shortcuts app, instead of other automation tools, is the Shortcut actions are automatically sync'd across all my iOS devices. So now with one button I can get the current <em>external</em> IP address of my Mac mini from any of my iOS devices. </p>
<figure><a href="http://share.mygeekdaddy.net/IMG_0925.PNG"><img src="http://share.mygeekdaddy.net/IMG_0925.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<div class="footnote">
<hr>
<ol>
<li id="fn:20190117132737">
<p>I still think it should be "Mini" vs "mini" <a class="footnote-backref" href="#fnref:20190117132737" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:531306">
<p>Fastforward to about 58 min into the episode. <a class="footnote-backref" href="#fnref:531306" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:679030">
<p>I'm thinking of using my kids as my password generator from now on. <a class="footnote-backref" href="#fnref:679030" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Adventures in driving2019-01-17T08:50:46-06:002019-01-17T08:50:46-06:00Jason Verlytag:mygeekdaddy.net,2019-01-17:/2019/01/17/adventures-in-driving/<p>My adulting life for the past 18 months has <em>allowed</em> me to make frequent trips to the great state of Wisconsin. Normally I wouldn't disparage a state that has such a great selection of craft beers<sup id="fnref:702690"><a class="footnote-ref" href="#fn:702690">1</a></sup> and beautiful scenery. But Wisconsin is home to the two biggest annoyances in …</p><p>My adulting life for the past 18 months has <em>allowed</em> me to make frequent trips to the great state of Wisconsin. Normally I wouldn't disparage a state that has such a great selection of craft beers<sup id="fnref:702690"><a class="footnote-ref" href="#fn:702690">1</a></sup> and beautiful scenery. But Wisconsin is home to the two biggest annoyances in my life: Green Bay Packers fans and Left Lane Louies. </p>
<p>What? You don't know what a Left Lane Louie is? This is what a Left Lane Louie is:</p>
<figure><a href="http://share.mygeekdaddy.net/left_lane_louie.jpg"><img src="http://share.mygeekdaddy.net/left_lane_louie.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a><figcaption>Photo: Jeff Roberson, Associated Press</figcaption></figure>
<p>It's the one driver that believes they should drive in the left because then they don't have to think about anything else. No worries about on coming traffic, slowing down for someone getting off the ramp, or a possible vehicle on the side of the road. Nope, they have the left lane and are free to think of nothing else. This past week was so bad I had to plead with the Wisconsin DMV to do something about it. </p>
<p style="border: #1863a1 1px solid; border-radius: 10px; padding:10px; margin:20px; background-color: rgb(251,239,153);">Dear WI DMV,<br><br>Please update your driver’s ed books to teach WI drivers that the left lane is for passing, not for cruising. Help us put a stop to Left Lane Louies. <br><br>❤️ MN/IA/IL/MI<br><br>— Jason Verly (@mygeekdaddy) <a href="https://twitter.com/mygeekdaddy/status/1084978437624905728?ref_src=twsrc%5Etfw">January 15, 2019</a></p>
<p>I know a few of the people I converse with on Twitter also visit the lovely state of Wisconsin and Dr. Drang<a href="https://twitter.com/drdrang">(@drdrang)</a> summarized my experience best. </p>
<p style="border: #1863a1 1px solid; border-radius: 10px; padding:10px; margin:20px; background-color: rgb(251,239,153);">But seeing a car in the left lane going 0.0000001 mph faster than the car to his right is how I know I’ve crossed the border.<br><br>— Dr. Drang (@drdrang) <a href="https://twitter.com/drdrang/status/1084981032087158784?ref_src=twsrc%5Etfw">January 15, 2019</a></p>
<p>So that got me wondering, maybe the WI DMV <em>really</em> hasn't mentioned what the left lane is actually for. So I got back home last night and did a little digging and found a PDF copy of <a href="https://wisconsindot.gov/Documents/dmv/shared/bds126-motorists-handbook.pdf">State of WI Drivers Manual</a>. Reading through the manual I was surprised to find exactly what I had hoped all of Wisconsin had been instructed to learn. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2019-01-17_at_8.41.00_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2019-01-17_at_8.41.00_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>So in the most recent manual, drivers <em>should</em> know that the left is for passing, not cruising. </p>
<p>But you know what is sometimes amazing about the internet, you can find artifacts and relics of information. So after little digging<sup id="fnref:983378"><a class="footnote-ref" href="#fn:983378">2</a></sup>, I was able to find an older copy fo the <a href="https://wisconsindot.gov/Documents/dmv/shared/bds124-driverbook.pdf">WI DMV manual</a>. Huh? There was nothing in the manual about the left lane. I did a little more searching<sup id="fnref:244879"><a class="footnote-ref" href="#fn:244879">3</a></sup> and found most of the drivers education school manuals also failed to mention the proper etiquette on multilane highways. </p>
<p>So for the past 50+ years<sup id="fnref:720034"><a class="footnote-ref" href="#fn:720034">4</a></sup>, the drivers in the State of Wisconsin have not been told the proper use of the left lane. </p>
<p>That explains so so much...</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:702690">
<p>Stone Arch Brewing in Appleton is one of my favs. <a class="footnote-backref" href="#fnref:702690" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:983378">
<p>Ok, it was 2 spots down on my search results. <a class="footnote-backref" href="#fnref:983378" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:244879">
<p>For real this time. <a class="footnote-backref" href="#fnref:244879" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:720034">
<p>The Wisconsin Department of Transportation (WisDOT) was officially established in 1967 by combining formerly independent agencies and the Department of Motor Vehicles (which included the State Highway Commission, State Aeronautics Commission and State Patrol). <a class="footnote-backref" href="#fnref:720034" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>A new way to look at 20192019-01-01T16:27:26-06:002019-01-01T16:27:26-06:00Jason Verlytag:mygeekdaddy.net,2019-01-01:/2019/01/01/a-new-way-to-look-at-2019/<h2>Welcome to 2019! <sup id="fnref:20190101124037"><a class="footnote-ref" href="#fn:20190101124037">1</a></sup></h2>
<p>I've spent the afternoon sitting at my desk doing a mix of reading and high level planning for a few projects I know that are coming up this year. A lot of what I've been reading are the affirmations of what everyone is going to do …</p><h2>Welcome to 2019! <sup id="fnref:20190101124037"><a class="footnote-ref" href="#fn:20190101124037">1</a></sup></h2>
<p>I've spent the afternoon sitting at my desk doing a mix of reading and high level planning for a few projects I know that are coming up this year. A lot of what I've been reading are the affirmations of what everyone is going to do next year - I'm going to write more, make more time for reading, spend more time with my kids. I read through the posts, tweets, and chats and I was starting to get envious of the ambition everyone was going to have in 2019. As I sat there I realized I was taking the wrong approach to 2019.</p>
<p>One of the traditions in my martial arts school is the instructors share an inspiration quote each week. A couple of years ago one of the instructors shared this quote from Bruce Lee:</p>
<blockquote>
<p>It's not the daily increase but daily decrease. <br>
Hack away at the unessential.</p>
</blockquote>
<p>I'm not sure how the quote popped back into my head, but this is how I feel I'll gain ground on my goals for the year. By doing less of the inconsequential, I'll make time for what I value.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:20190101124037">
<p>And may the odds be ever in your favor! <a class="footnote-backref" href="#fnref:20190101124037" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>iOS Shortcuts - Return to Home Screen2018-12-18T20:49:31-06:002018-12-19T21:26:35-06:00Jason Verlytag:mygeekdaddy.net,2018-12-18:/2018/12/18/ios-shortcuts-return-to-home-screen/<p>As I've started to dabble in iOS Shortcuts I've increasingly become annoyed that when a Shortcut is done, especially those that are turned into home screen shortcuts, you aren’t returned back to the home screen. When the shortcut is done you’re left in the Shortcut app. </p>
<p>After doing …</p><p>As I've started to dabble in iOS Shortcuts I've increasingly become annoyed that when a Shortcut is done, especially those that are turned into home screen shortcuts, you aren’t returned back to the home screen. When the shortcut is done you’re left in the Shortcut app. </p>
<p>After doing some research, I found a <a href="https://www.reddit.com/r/shortcuts/comments/9pzn2k/return_to_home_screen/">hint on Reddit</a>. The trick is to use a launcher program (in this case it’s actually called <a href="https://itunes.apple.com/us/app/launcher-with-multiple-widgets/id905099592?mt=8">Launcher</a><sup id="fnref:F3443598656"><a class="footnote-ref" href="#fn:F3443598656">1</a></sup>) to get you back to the home screen. </p>
<p>The idea is that you run your Shortcut and then trigger Launcher to default to a crashed condition. When that happens, Launcher will return to the home screen. </p>
<p>To do this, add the following two steps to your shortcut. </p>
<p><img src="http://share.mygeekdaddy.net/Photo%20Dec%2019,%206%2038%2055%20PM.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></p>
<p>Now you can launch the Shortcut, and when it’s completed, you will be returned you back to the home screen. Here’s an example Shortcut that with a single button texts my wife when I leave work. <sup id="fnref:20181219203359"><a class="footnote-ref" href="#fn:20181219203359">2</a></sup></p>
<p><img src="http://share.mygeekdaddy.net/shortcut_sample_2018-12-18.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></p>
<p>As I looked at how well this worked in Shortcuts, I realized this would work with my iOS automation work horse - Pythonista. Normally when you run a script in Pythonista you return to the console in the app. I wanted to have the same experience in Pythonista as I did in Shortcuts. Similar to the Shortcuts, you add a redirect URL to the end of the python script to open the Launcher URL. </p>
<p>To get this to work you need to add <code>import webbrowser</code> at the beginning of the a Pythonista script to include the browser module. Then at the end, or defined break in your script, include the line:</p>
<p><code>webbrowser.open_new('launcher://crash')</code></p>
<p>Now when a Pythonista script completes, the script will return me to my home screen. This trick to get back to the home screen is finally motivating me to explore some more intricate Shortcuts over my holiday break.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:F3443598656">
<p>If you use this app, please consider tipping him a couple bucks. <a class="footnote-backref" href="#fnref:F3443598656" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:20181219203359">
<p>Hokey, yes. Effective, very yes. <a class="footnote-backref" href="#fnref:20181219203359" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Rationalizing my choices for the Mac Mini2018-11-08T07:26:28-06:002018-11-08T07:26:28-06:00Jason Verlytag:mygeekdaddy.net,2018-11-08:/2018/11/08/rationalizing-my-choices-for-the-mac-mini/<p>My <a href="http://mygeekdaddy.net/2018/11/05/pondering-next-computer-purchase/">recent internal deliberations</a> on what to replace my ailing computer setup has led to quite a few false starts on what I put into my virtual shopping cart. As much as I wanted to love the new MacBook Air, the power and flexibility didn't hit enough cylinders to trigger …</p><p>My <a href="http://mygeekdaddy.net/2018/11/05/pondering-next-computer-purchase/">recent internal deliberations</a> on what to replace my ailing computer setup has led to quite a few false starts on what I put into my virtual shopping cart. As much as I wanted to love the new MacBook Air, the power and flexibility didn't hit enough cylinders to trigger my 'Must Buy' button. The iPad Pro has everything I believe I'd want, except an OS to achieve the 'Pro' status the iPad has in it's name. This led me to go with the Mac I've been hoping would be updated for over 6 years.<sup id="fnref:897420"><a class="footnote-ref" href="#fn:897420">3</a></sup></p>
<p>The final configuration I chose is:</p>
<p><img src="http://share.mygeekdaddy.net/final_macmini_hardware.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></p>
<p>Overall this will be setup that I can live with for quite a while. </p>
<h4>Configuration Choices</h4>
<p>The Mac Mini has 4 configurable items when you order it:</p>
<ul>
<li>Processor</li>
<li>Hard drive</li>
<li>Memory</li>
<li>Network adapter</li>
</ul>
<p>I don't foresee the need for 10 Gbit networking in my future, so I opted for the default Gigabit ethernet card. The other three options did give me something to think about because not all choices are an easy financial decision. Base price for a stock Mini is $800. The fully decked out version, with all the bells and whistles, sets you back $4200. I needed to find something in the middle. </p>
<h4>Processor</h4>
<p>The Mac Mini has been updated to use eighth generation Intel CPU's. There are two key points to note here. One, Apple is using the relatively recent version of Intel CPU's.<sup id="fnref:896382"><a class="footnote-ref" href="#fn:896382">1</a></sup> Two, only the i7 processors have hyper threading. From Apple's processor selection notes:</p>
<blockquote>
<p>The standard 3.0GHz 6-core Intel Core i5 processor has 9MB of shared L3 cache and features Turbo Boost speeds of up to 4.1GHz. The 3.2GHz 6-core Intel Core i7 processor has 12MB of shared L3 cache, Turbo Boost speeds of up to 4.6GHz, and Hyper-Threading technology.</p>
</blockquote>
<p>My Mac Mini will not only be my desktop computer, but will also be the media server for our house. So I opted for the best processor I could get right now. </p>
<h4>Hard Drive</h4>
<p>This was probably the easiest choice to make. My current laptop for work has a 512GB SSD and that's been the right size for almost 3 years now. Going with a smaller hard drive could have been an option due to the four USB-C ports and how cheap external storage is right now. While the speeds of the built-in PCI drives are impressive, most of my file storage will be on external drives anyway - movie library, photo collection, etc. </p>
<h4>Memory</h4>
<p>This is the option I could have been smarter about. The memory options when I ordered the Mac Mini are shown below. As you can see the cost for memory isn't additive, but multiplicative. </p>
<p><img src="http://share.mygeekdaddy.net/Mac_mini_-_Apple_54.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></p>
<p>Based on the pricing I went with the 16GB option because at the time I ordered the Mini, I wasn't sure if the memory upgradable. After I placed the ordered I got some additional information from an <a href="https://appleinsider.com/articles/18/10/30/frequently-asked-questions-about-the-2018-mac-mini-ram-storage-and-more">Apple Insider review</a>. </p>
<blockquote>
<p>Is the RAM user-expandable?
Yes. The slots are SO-DIMM slots, and are mostly accessible to the user. In conversations with Apple corporate employees, we've been told that users with a "modicum of skill"<sup id="fnref:801163"><a class="footnote-ref" href="#fn:801163">4</a></sup> can get to the pair of RAM slots.</p>
</blockquote>
<p>The same review further adds:</p>
<blockquote>
<p>Apple says that the new Mac mini uses 2666MHZ DDR4 SO-DIMM RAM. Specifically, it looks like DDR-4 PC4-21300, non-ECC unbuffered RAM.</p>
</blockquote>
<p>So doing a little searching I found a <a href="http://www.crucial.com/usa/en/ct2k16g4sfd8266">32GB memory kit</a> is currently going for around $280. </p>
<p>So if I'd done a little more math before I ordered,<sup id="fnref:855935"><a class="footnote-ref" href="#fn:855935">2</a></sup> I could have saved myself a bit of money and a higher spec Mini. </p>
<table>
<thead>
<tr>
<th>Current Configuration</th>
<th style="text-align: right;">Cost</th>
</tr>
</thead>
<tbody>
<tr>
<td>i7 Mac Mini</td>
<td style="text-align: right;">$1299</td>
</tr>
<tr>
<td>512GB Hard Drive</td>
<td style="text-align: right;">$200</td>
</tr>
<tr>
<td>Apple 16GB</td>
<td style="text-align: right;">$200</td>
</tr>
<tr>
<td>Total</td>
<td style="text-align: right;">$1699</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th>Optimal Configuration</th>
<th style="text-align: right;">Cost</th>
</tr>
</thead>
<tbody>
<tr>
<td>i7 Mac Mini</td>
<td style="text-align: right;">$1299</td>
</tr>
<tr>
<td>512GB Hard Drive</td>
<td style="text-align: right;">$200</td>
</tr>
<tr>
<td>Apple 8GB</td>
<td style="text-align: right;">inc.</td>
</tr>
<tr>
<td>3rd Party 32GB Memory Kit</td>
<td style="text-align: right;">$280</td>
</tr>
<tr>
<td>Total</td>
<td style="text-align: right;">$1779</td>
</tr>
</tbody>
</table>
<p>So for $80 more I could have 32GB ram in the same configuration I ordered. </p>
<h4>Future setup</h4>
<p><img src="http://share.mygeekdaddy.net/Photo%20Nov%204,%209%2058%2051%20AM.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></p>
<p>The new Mac Mini will a home server for several projects:</p>
<ul>
<li>Plex Server: I'll resurrect my Plex server after my previous Mac Mini decided it was doing enough work.</li>
<li>iTune Server: We still have a mix of Roku and Apple TV's in the house, so to stream ripped movies I'll turn on iTunes Sharing off the Mac Mini. </li>
<li>Windows Desktop: As much as I appreciate that I have a Mac at work, so many of the things I work with today are Windows based, especially the world of PC games. So I'll setup Boot Camp and dip my toes into PC gaming. </li>
</ul>
<p>The most exciting idea of the Mini is using an eGPU for gaming. I've wanted a setup that allows me to use both the macOS functionality for day to day work, but also give me the flexibility to experiment with PC gaming on sthe site. My plan right now is to use Boot Camp on the Mac Mini to dual boot into Windows 10 and start playing around with PC gaming. Early comments on some eGPU forums hint that eGPU usage in Boot Camp may work better on the Mac Mini than a MBP because the Mac Mini won't be fighting the need to push to a internal laptop display and the Mac Mini uses an integrated graphics card, not a dedicated discrete card. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:896382">
<p>Yes, Intel does have a refresh slated i5 and i7 processors for Q4 2018. <a class="footnote-backref" href="#fnref:896382" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:855935">
<p>This what 12:30am purchases look like. <a class="footnote-backref" href="#fnref:855935" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:897420">
<p>Because the 2014 update was actually a step backwards. <a class="footnote-backref" href="#fnref:897420" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:801163">
<p>The <em>"modicum of skill"</em> also appears to be a special Torx screwdriver that includes a hole for the security pin Apple uses on the access panel. <a class="footnote-backref" href="#fnref:801163" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Pondering next computer purchase2018-11-05T09:09:24-06:002018-11-05T09:09:24-06:00Jason Verlytag:mygeekdaddy.net,2018-11-05:/2018/11/05/pondering-next-computer-purchase/<p>Like a lot of Apple fans, I watched the presentation by Tim Cook and Co. last Tuesday about Apple’s new fall product releases. The order that Apple presented their new products was absolute genius. </p>
<ul>
<li>Mac Book Air: Here’s a gorgeous new mobile device.</li>
<li>Mac Mini: Here’s a …</li></ul><p>Like a lot of Apple fans, I watched the presentation by Tim Cook and Co. last Tuesday about Apple’s new fall product releases. The order that Apple presented their new products was absolute genius. </p>
<ul>
<li>Mac Book Air: Here’s a gorgeous new mobile device.</li>
<li>Mac Mini: Here’s a power update to a staple in our product line.</li>
<li>iPad Pro: Here’s an update that touches both mobile and power. </li>
</ul>
<p><img src="http://share.mygeekdaddy.net/ipadpromacmini.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></p>
<p>I’ve been working with an almost 2y old iPad and dual booting off my work laptop for the past 10 months. This is a situation I’d call less than ideal. The recent announcements by Apple have finally got me excited again. So for the past week I’ve been contemplating what I’d like to do to stop leeching off my work’s hardware and using an iPad that’s showing its age.</p>
<p>Gabe over at <a href="http://www.macdrifter.com/2018/11/standing-still-ipad-pro-2018.html">Macdrifter.com</a> has a post on his thoughts on the new iPad Pro. He brought up a point that hit a chord with me on the improvements Apple made to the new iPad Pro. </p>
<blockquote>
<p>These are iterative improvements because any major changes require major changes to iOS and the entire interaction model behind app and window management.</p>
</blockquote>
<p>Gabe also referenced a review by <a href="https://verschoren.com/2018/10/2018-10-standing-still-ipad-pro-2018/">Thomas Verschoren</a> that had a lot of the same feelings I had about the iPad. But I think his closing argument said it best.</p>
<blockquote>
<p>They [Apple] need a more versatile OS. It’s an iPad. Not a bigger iPhone.</p>
</blockquote>
<p>And I think that’s the part of the disappointment from Apple’s event. Apple gave us an amazing piece of technology, but nothing to make it stand out from the phone I have in my pocket. The specs of the new iPad Pro make it on par with some of the best equipment Apple is currently selling, but the new iPad is limited by iOS and the ways we interact with the the iPad. </p>
<p>The move to USB-C for the connector is a move I'd hoped would make the iPad Pro stand out against all the other iOS devices. But as reported by <a href="https://www.theverge.com/2018/11/5/18062612/apple-ipad-pro-review-2018-screen-usb-c-pencil-price-features">The Verge</a>, the connector is limited by the constraints all iOS devices have. </p>
<blockquote>
<p>But one extremely important category of devices will definitely not work: iOS does not support external storage. You can plug as many flash drives or hard drives as you want into the iPad Pro’s USB-C port, and nothing will happen. Apple says third parties can write apps to talk to external storage, but out of the box, this $1899 tablet simply won’t talk to a flash drive.</p>
</blockquote>
<p>Those constraints are not just in the accessories but how we can interact with the iPad itself. I have a pencil for my iPad and I love to use it when the app I'm using treats the pencil as more than an expensive screen pointer. I know Apple wants us to move past the keyboard and mouse interactive paradigm, but do we really have one that’s so much better? When you look at the accessories available for the iPad, did you ever notice a lot of them are made to try and make the iPad look like a laptop? Case in point... my current iPad.</p>
<p><img src="http://share.mygeekdaddy.net/IMG_0592.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></p>
<p>You know what I do about everyday with this setup? Put my fingers just below the spacebar to move a phantom cursor on my screen.</p>
<p>Here's what I'm hoping we'll see in the next 12 months from Cupertino:</p>
<ul>
<li>Separate out iOS for iPhone and iPad - The iPhone and iPad are separate devices with separate functions, so they should have separate feature sets.</li>
<li>Give us professional features on the iPad - With the USB-C connector available on the iPad Pro, make it work with USB-C devices. If I want to connect directly to a printer sitting on my desk, let me. If I want to import my pictures off of an SD card into Photoshop, let me. Make me want to do my professional work and hobbies on this device.</li>
<li>Give the enclosure some love - I know mimicking the competitor is frowned upon by Apple, but adding a built in kick stand to the iPad makes <em>soooo</em> much sense. </li>
</ul>
<p>Apple continues to amaze and frustrate me every time they have a reveal session like this. I think the iPad Pro is on the right track to be an amazing mobile work device.</p>
<p>Just not yet. </p>Limiting the voices of my Monkey brain2018-10-25T14:00:02-05:002018-10-25T14:00:02-05:00Jason Verlytag:mygeekdaddy.net,2018-10-25:/2018/10/25/limiting-the-voices-of-my-monkey-brain/<p>For a while I've been training in Tae Kwon Do.<sup id="fnref:715327"><a class="footnote-ref" href="#fn:715327">1</a></sup> Most of the training has been the physical side of martial arts and self defense. I had the opportunity recently to participate in a different kind of self defense course called '<a href="http://violencedynamics.com">Violence Dynamics</a>'. The concept of the course is …</p><p>For a while I've been training in Tae Kwon Do.<sup id="fnref:715327"><a class="footnote-ref" href="#fn:715327">1</a></sup> Most of the training has been the physical side of martial arts and self defense. I had the opportunity recently to participate in a different kind of self defense course called '<a href="http://violencedynamics.com">Violence Dynamics</a>'. The concept of the course is that in the training for self defense you need to understand the events leading up to moment you need to actually use your training. And if you're smart about understanding the concepts around violence, you can minimize the need to engage in a physical encounter. </p>
<p>Part of the training is on a topic called <a href="https://www.amazon.com/dp/B00IO9TTAG/">Conflict Communication (Con Com)</a>, written by Rory Miller. A core idea in the book is that your brain is broken down into 3 parts:<sup id="fnref:130134"><a class="footnote-ref" href="#fn:130134">4</a></sup></p>
<ul>
<li>Lizard: the part of the brain that controls our survival instincts (fight or flight)</li>
<li>Monkey: the part of the brain that handles our emotional and social needs</li>
<li>Human: the part of the brain that solves complex problems</li>
</ul>
<p>We normally live in the realm of our Monkey brain. We do things to make sure we conform to social norms (we say hi when we walk into the office) and we react when someone else violates our norms (honk at someone who cuts us off). The problem with the Monkey brain is that it's not as intuitive as the Lizard brain and it's not as logical as our Human brain. The Monkey brain wants things to be stable and will guide us to make decisions that want to keep things stable, even if they aren't in our personal best interest. The book goes into some background on the concepts that humans are social creatures, and as such, will take steps to keep group healthy at the expense of the individual. </p>
<p>Parallel to attending this self defense course is that my job has absolutely exploded in the past couple of months. I've been looking for ways to keep my focus <sup id="fnref:730502"><a class="footnote-ref" href="#fn:730502">2</a></sup> and work through some bigger projects at work. As I was reading last night it struck me about all the things I was doing to trigger my Monkey brain and distract me from using my Human brain to get work done. </p>
<blockquote>
<p>Number one on this list was Twitter. </p>
</blockquote>
<p>I started realizing all the rabbit holes I was going down with Twitter. I would spend time randomly scrolling through my timeline looking at stuff that had nothing to do with what I was supposed to be focusing on at the moment. The other part has been the people I've been interacting with on Twitter. I've met some amazing people randomly on Twitter. I've also run into some absolutely batshit crazy people too. In the partisan political era we're now, it seems <em>batshit crazy</em> is the new normal. People I've been following for years are starting to retweet stuff I know they would never say out loud in real life.<sup id="fnref:420818"><a class="footnote-ref" href="#fn:420818">3</a></sup> </p>
<p>These thoughts happened to coincide to a recent <a href="https://www.newyorker.com/science/elements/after-years-of-abusive-e-mails-the-creator-of-linux-steps-aside">New Yorker article</a> I stumbled upon on how Linus Torvalds, creator of the Linux operating system, is going to <a href="https://lkml.org/lkml/2018/9/16/167">take a sabbatical</a> to 'take time off and get some assistance on how to understand people’s emotions and respond appropriately.' While I don't think I'm as much of an asshole as Linus Torvalds, the idea of taking a step back and spending more time to work on how <em>my</em> focus and attention can be improved did resonate with me. </p>
<p style="border: #1863a1 1px solid; border-radius: 10px; text-align: center; padding: 10px; width: 600px; margin-left: auto; margin-right: auto; background-color: rgb(251,239,153);">tldr... I'm off Twitter for a while, not sure when I'll be back.</p>
<p>The only downside I see to being off Twitter is the news and information feeds I'll be losing. But I guess that will be minor to the literal hours a week I believe I'll reclaim. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:715327">
<p>I'm not sure when <em>a few years</em> turns into <em>several years</em>, so we'll just go with <em>a while</em>. <a class="footnote-backref" href="#fnref:715327" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:730502">
<p>Which is ironic as I write this over my lunch break. <a class="footnote-backref" href="#fnref:730502" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:420818">
<p>Because I know them IRL. <a class="footnote-backref" href="#fnref:420818" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:130134">
<p>Most these concepts are based on the <a href="https://en.wikipedia.org/wiki/Triune_brain#Lay_interest">triune brain model</a>. <a class="footnote-backref" href="#fnref:130134" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Setting a DateTime for testing SQL statements2018-10-02T20:01:58-05:002018-10-02T20:01:58-05:00Jason Verlytag:mygeekdaddy.net,2018-10-02:/2018/10/02/setting-a-datetime-for-testing-sql-statements/<p>One of the tenets I teach about reporting in Maximo is to look for the exceptions in the data, not the data itself. Out of the box, Maximo has quite a few key reports included, one of them is the WO List report (<code>wotrack.rptdesign</code>). That report lists every work …</p><p>One of the tenets I teach about reporting in Maximo is to look for the exceptions in the data, not the data itself. Out of the box, Maximo has quite a few key reports included, one of them is the WO List report (<code>wotrack.rptdesign</code>). That report lists every work order contained in the current search criteria. And if that search criteria is empty, you'll get every open work order. </p>
<p>For the company I work for, we've looked at our work orders based on the work week and reporting period. For us, our work week is from Saturday through Friday. <sup id="fnref:551881"><a class="footnote-ref" href="#fn:551881">1</a></sup> So when we report on upcoming work, it was natural for us to look at work orders only from the next Saturday to the Friday after that. So if today is 2018-10-02, then we'd want to see a date range of Sat (2018-10-06) through Fri (2018-10-12). </p>
<p>When testing date queries, most beginners use variation of <code>getdate()</code>. So if we test a SQL query like what is the first day of next month</p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="w"> </span><span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="k">getdate</span><span class="ss">()</span><span class="w"> </span><span class="ss">)</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p>That kind of query can be tested on any day of the month - it works or it doesn't. </p>
<p>But then there are times when we want to have a query find a specific day of the week, like this coming Saturday. That requires some more complex query statements and we need to check to see if the calendar date rolls over or not. For example, if we wanted to find the the date of this coming Saturday. </p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">wk</span>,<span class="w"> </span><span class="nv">datediff</span><span class="ss">(</span><span class="nv">wk</span>,<span class="w"> </span><span class="o">-</span><span class="mi">8</span>,<span class="w"> </span><span class="k">getdate</span><span class="ss">()</span><span class="w"> </span><span class="ss">)</span>,<span class="w"> </span><span class="o">-</span><span class="mi">2</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p>While the statement works, the question is does it work for each day of the week?</p>
<p>We can temporarily set a date value and then be able to change the date to see how the query <em>rolls</em> through the rest of the week. </p>
<div class="highlight"><pre><span></span><code><span class="k">declare</span><span class="w"> </span><span class="nv">@calendardate</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nc">datetime</span><span class="w"></span>
<span class="k">set</span><span class="w"> </span><span class="nv">@calenderdate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'10/6/2018'</span><span class="w"></span>
<span class="k">select</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="n">wk</span><span class="p">,</span><span class="w"> </span><span class="nf">datediff</span><span class="p">(</span><span class="n">wk</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">8</span><span class="p">,</span><span class="w"> </span><span class="nv">@calenderdate</span><span class="p">),</span><span class="w"> </span><span class="o">-</span><span class="mi">2</span><span class="p">)</span><span class="w"></span>
<span class="k">select</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="n">wk</span><span class="p">,</span><span class="w"> </span><span class="nf">datediff</span><span class="p">(</span><span class="n">wk</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">15</span><span class="p">,</span><span class="w"> </span><span class="nv">@calenderdate</span><span class="p">),</span><span class="w"> </span><span class="o">-</span><span class="mi">2</span><span class="p">)</span><span class="w"></span>
</code></pre></div>
<p>Now I have a way to test date/time queries to see how they change through the week. But this method means I need to manually iterate the dates over the next 7 days. I'd prefer to have a method to roll through the next 7 days and output the results. In SQL you can iterate over a data set. So to test the date modification <code>dateadd(wk, datediff(wk, -8, getdate() ), -2)</code>, we can use the following query statement. </p>
<div class="highlight"><pre><span></span><code><span class="k">declare</span><span class="w"> </span><span class="nv">@calendardate</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="nc">datetime</span><span class="w"></span>
<span class="k">set</span><span class="w"> </span><span class="nv">@calendardate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="err">{</span><span class="n">ts</span><span class="w"> </span><span class="s1">' 2018-10-01 12:00:00.000'</span><span class="err">}</span><span class="w"></span>
<span class="k">while</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="nv">@calendardate</span><span class="p">)</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nf">getdate</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="w"> </span>
<span class="k">begin</span><span class="w"></span>
<span class="w"> </span><span class="k">set</span><span class="w"> </span><span class="nv">@calendardate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="n">d</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nv">@calendardate</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">select</span><span class="w"> </span><span class="nf">datename</span><span class="p">(</span><span class="n">dw</span><span class="p">,</span><span class="w"> </span><span class="nv">@calendardate</span><span class="p">),</span><span class="w"> </span><span class="nv">@calendardate</span><span class="p">,</span><span class="w"> </span>
<span class="w"> </span><span class="nf">dateadd</span><span class="p">(</span><span class="n">wk</span><span class="p">,</span><span class="w"> </span><span class="nf">datediff</span><span class="p">(</span><span class="n">wk</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">8</span><span class="p">,</span><span class="w"> </span><span class="nv">@calendardate</span><span class="p">),</span><span class="w"> </span><span class="o">-</span><span class="mi">2</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="k">select</span><span class="w"> </span><span class="nv">@calendardate</span><span class="p">)</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="nf">getdate</span><span class="p">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">7</span><span class="w"></span>
<span class="w"> </span><span class="k">break</span><span class="w"> </span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span>
<span class="w"> </span><span class="k">continue</span><span class="w"> </span>
<span class="k">end</span><span class="w"></span>
</code></pre></div>
<p>Now I can change 1 line out of this statement in the future to test other rolling date queries. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:551881">
<p>Look for more on why in an upcoming post. <a class="footnote-backref" href="#fnref:551881" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>The day I knew tech journalism was dead2018-09-06T12:08:34-05:002018-09-06T12:08:34-05:00Jason Verlytag:mygeekdaddy.net,2018-09-06:/2018/09/06/the-day-i-knew-tech-journalism-was-dead/<p>One area I've loved since my AOL days was getting better information on computers and tech gadgets from online sources. Sure the articles in PC Magazine and Macworld were great, but the time gap between print and online media was already evident back then. The online reviews were typically written …</p><p>One area I've loved since my AOL days was getting better information on computers and tech gadgets from online sources. Sure the articles in PC Magazine and Macworld were great, but the time gap between print and online media was already evident back then. The online reviews were typically written by tech journalists who <em>actually</em> used these gadgets. You got the geeky details on a product that only the perspective of another geek would provide you. </p>
<p>Recently the speaker setup I used in my garage died. <sup id="fnref:323472"><a class="footnote-ref" href="#fn:323472">1</a></sup> So I've been looking around for a new speaker and I saw an article in my RSS feed about a new Anker speaker. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2018-08-30_at_8.42.30_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2018-08-30_at_8.42.30_AM.png" style="border: 1px solid black; display:block; margin-left: auto; margin-right:auto; margin-bottom:2px; width:500px;" /></img></a></figure>
<p>Reading through the announcement I was underwhelmed by the details and noticed the article had 3 links. The links in the article didn't add any additional details about the announced speaker, they links went to:</p>
<ol>
<li>Amazon.com for the Anker brand group.</li>
<li>Amazon.com for a different Anker BT speaker.</li>
<li>Amazon.com for the previous generation Soundcore speaker.</li>
</ol>
<p>All 3 links had an affiliate tag on them and <em>no</em> notice about the kickback the review site would get. I closed the browser tab out of annoyance because none of the information included in the "announcement" actually included any real details on the new speaker - estimated playtime, size, weight, speaker power, etc.</p>
<p>At this point I closed the tab, looked out my window, and yelled at the neighbor kids to get off my lawn. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:323472">
<p>May you rest in piece my faithful Airport Express. <a class="footnote-backref" href="#fnref:323472" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Geek Household MCU Movie Viewing Order2018-07-14T15:19:21-05:002018-07-14T15:19:21-05:00Jason Verlytag:mygeekdaddy.net,2018-07-14:/2018/07/14/geek-household-mcu-movie-viewing-order/<p>To say our household is a Marvel household, you only have to look at the serious discussions we have around the dinner table.<sup id="fnref:652742"><a class="footnote-ref" href="#fn:652742">1</a></sup> The most recent discussion was:</p>
<blockquote>
<p>What it would take to see see the entire Marvel Cinematic Universe in the fewest movies possible?</p>
</blockquote>
<p>We realized that before …</p><p>To say our household is a Marvel household, you only have to look at the serious discussions we have around the dinner table.<sup id="fnref:652742"><a class="footnote-ref" href="#fn:652742">1</a></sup> The most recent discussion was:</p>
<blockquote>
<p>What it would take to see see the entire Marvel Cinematic Universe in the fewest movies possible?</p>
</blockquote>
<p>We realized that before we decide the moviews we needed to set the order of all the Marvel Cinematic Universe(MCU) movies that are currently available all the way through next summer's Avengers 4 movie. </p>
<p>After a few discussions on long walks with the dog, we set the MCU order as:</p>
<ol>
<li>Captain America: The First Avenger</li>
<li>Iron Man</li>
<li>Iron Man 2</li>
<li>Thor</li>
<li>The Avengers</li>
<li>Iron Man 3</li>
<li>Guardians of the Galaxy, Vol 1</li>
<li>Captain America: The Winter Soldier</li>
<li>Guardians of the Galaxy, Vol. 2</li>
<li>The Avengers: Age of Ultron</li>
<li>Ant-Man</li>
<li>Captain America: Civil War</li>
<li>Doctor Strange</li>
<li>Black Panther</li>
<li>Spider-Man: Homecoming</li>
<li>Ant-Man and the Wasp</li>
<li>Thor: Ragnarok</li>
<li>Avengers: Infinity War</li>
<li>Captain Marvel</li>
<li>Avengers 4</li>
</ol>
<p>As you look at that list, I can just hear someone typing in the comments below, 'Umm, what happened to The Incredible Hulk and Thor 3?'. Just like <em>Star Wars -The Phantom Menace</em> and <em>Indiana Jones - The Crystal Skull</em>, we've decided to delete Hulk and Thor 3 from our movie timeline. </p>
<h4>Core MCU Storyline</h4>
<p>So the next next order of business was to figure out what was critical and what was fluff. This was probably the most heated discussion since we debated whether or not Captain Rex fell under Order 66 while watching the <em>Star Wars - The Clone Wars</em> series.<sup id="fnref:449581"><a class="footnote-ref" href="#fn:449581">2</a></sup></p>
<ol>
<li>Captain America: The First Avenger</li>
<li>Iron Man</li>
<li>The Avengers</li>
<li>Captain America: The Winter Soldier</li>
<li>The Avengers: Age of Ultron</li>
<li>Captain America: Civil War</li>
<li>Black Panther</li>
<li>Avengers: Infinity War</li>
<li>Avengers 4</li>
</ol>
<p>Looking at the timeline graphically, we see all the movies we didn't list as supporting films to the core MCU storyline. </p>
<figure><a href="http://share.mygeekdaddy.net/mgd_mcu_order.png"><img src="http://share.mygeekdaddy.net/mgd_mcu_order.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This should help you get your cousin Bob up to speed in the MCU as he finally gives up the fantasy that the DC movie universe will ever catch up.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:652742">
<p>Ok... my kids and I have around the dinner table. <a class="footnote-backref" href="#fnref:652742" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:449581">
<p>FYI, He doesn't. <a class="footnote-backref" href="#fnref:449581" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Replicating Spare Part Lists with Maximo BIRT & MIF2018-06-26T09:27:28-05:002018-06-26T09:27:28-05:00Jason Verlytag:mygeekdaddy.net,2018-06-26:/2018/06/26/replicating-spare-part-lists-with-maximo-birt-mif/<p>One of the complaints of using a software platform for a long time is you eventually say, </p>
<blockquote>
<p>I wish we had this feature when we got started.</p>
</blockquote>
<p>Right now that feature is <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21496990">Asset Templates</a>. I'm starting to load several hundred assets into Maximo due a large capital project at one …</p><p>One of the complaints of using a software platform for a long time is you eventually say, </p>
<blockquote>
<p>I wish we had this feature when we got started.</p>
</blockquote>
<p>Right now that feature is <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21496990">Asset Templates</a>. I'm starting to load several hundred assets into Maximo due a large capital project at one of our plants. The spare part lists for these assets will be so much easier because we're going to use Asset Templates for common assets. As we started to load templates for the new assets, the question came up on how can we apply a spare parts list to our existing assets. </p>
<p>For example, we have an asset with 18 spare parts already assigned to the record:</p>
<figure><a href="http://share.mygeekdaddy.net/Assets_spare_part_list.jpg"><img src="http://share.mygeekdaddy.net/Assets_spare_part_list.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>We needed a solution to re-apply those 18 parts to other assets in the plant. After some testing I finally came up with a method to utilize a custom BIRT report and data loading via the MIF. </p>
<h4>Spare part data loading</h4>
<p>The overall process works like this:</p>
<ol>
<li>Locate the asset that you want to apply the spare parts list to and note the asset number.</li>
<li>Locate the asset that has the spare parts list you want to duplicate. </li>
<li>Run a report to export the spare parts list that has a parameter to enter the asset number from step #1.</li>
<li>Export the report as an XLS file. <sup id="fnref:698894"><a class="footnote-ref" href="#fn:698894">1</a></sup></li>
<li>Open the file in Excel and export to CSV.</li>
<li>Open the CSV file and remove a few of the extra <code>'</code> from the XLS to CSV conversion.</li>
<li>Open Integration > External Systems to select the Data system.</li>
<li>In the Data system, open the Enterprise Services Tab.</li>
<li>Select the Object Structure related to <code>ASSET</code>. <sup id="fnref:559947"><a class="footnote-ref" href="#fn:559947">2</a></sup></li>
<li>Click on the Data Import button and select the Flat File option.</li>
</ol>
<p>Once the file is imported, the spare parts list will be applied to the designated asset. </p>
<h4>Setting up the Object Structure</h4>
<p>The first part of this step is to setup an Object Structure against the Asset table. The basic setup would include the parent <code>ASSET</code> table and the child <code>SPAREPART</code> table.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2018-06-26_at_8_58_28_AM.jpg"><img src="http://share.mygeekdaddy.net/Screen_Shot_2018-06-26_at_8_58_28_AM.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Make sure to update the aliases for <code>SITEID</code> and <code>ORGID</code> on the <code>SPAREPART</code> object because these overlap from the parent <code>ASSET</code> table. If you don't add an alias for these two fields the data import will fail. </p>
<figure><a href="http://share.mygeekdaddy.net/Object_Structures_2018-06-26.jpg"><img src="http://share.mygeekdaddy.net/Object_Structures_2018-06-26.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>MIF Data Load Form</h4>
<p>To aid in the export of an existing spare part list, I created a simple report that would export the <code>ASSETNUM</code>, <code>ITEMNUM</code>, <code>QUANTITY</code>, <code>SITEID</code>, and <code>ORGID</code>. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2018-06-25_at_4.22.58_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2018-06-25_at_4.22.58_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This is the basic outline of the <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21982225">CSV file needed</a> to be loaded into Maximo via the MIF. The report will ask the user to enter the asset number that spare parts list will be applied to. </p>
<figure><a href="http://share.mygeekdaddy.net/1_Screen_Shot_2018-06-25_at_3.37.55_PM.png"><img src="http://share.mygeekdaddy.net/1_Screen_Shot_2018-06-25_at_3.37.55_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Once the report is run, we can see how the CSV file will look like for the flat file data load.</p>
<figure><a href="http://share.mygeekdaddy.net/3_Screen_Shot_2018-06-25_at_3.53.40_PM.png"><img src="http://share.mygeekdaddy.net/3_Screen_Shot_2018-06-25_at_3.53.40_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Export the the report results to Excel.</p>
<figure><a href="http://share.mygeekdaddy.net/2_Screen_Shot_2018-06-25_at_3.39.19_PM.png"><img src="http://share.mygeekdaddy.net/2_Screen_Shot_2018-06-25_at_3.39.19_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>From here the file can be exported to a CSV file <sup id="fnref:478856"><a class="footnote-ref" href="#fn:478856">3</a></sup> and cleaned up. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2018-06-26_at_9.25.33_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2018-06-26_at_9.25.33_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>In the example above, we need to remove the <code>"</code> and the extra <code>,</code> on the very first line. Save the file and it will be ready to load into Maximo.</p>
<h4>Maximo MIF Date Format</h4>
<p>As you experiment with other MIF data loading features, you may come across the need to import DATE or DATETIME data fields. The date format needs to be the following for each data type:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Data Type</th>
<th style="text-align: center;">Date Format</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">DATE</td>
<td style="text-align: center;">yyyy-mm-dd</td>
</tr>
<tr>
<td style="text-align: center;">DATETIME</td>
<td style="text-align: center;">yyyy-dd-mm hh:mm:ss</td>
</tr>
</tbody>
</table>
<h4>Maximo MIF Flat File Action Properties</h4>
<p>The other part of the data load process is setting up the CSV file header. In the example above we used a value in the CSV head to denote what kind of action the MIF data load should take on the ASSET table. In our case for the spare parts list, we needed to <em>change</em> the asset record because the asset we wanted to apply the spare parts list to already exists. There are <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21445760">other actions that can be taken</a>, depending on how you intend to load records into Maximo. </p>
<table>
<thead>
<tr>
<th style="text-align: center;">Value</th>
<th style="text-align: left;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Add</td>
<td style="text-align: left;">Add records to database in receiving system</td>
</tr>
<tr>
<td style="text-align: center;">AddChange</td>
<td style="text-align: left;">Add or update existing records in the database in the receiving system</td>
</tr>
<tr>
<td style="text-align: center;">Change</td>
<td style="text-align: left;">Update existing records in the database in the receiving system</td>
</tr>
<tr>
<td style="text-align: center;">Delete</td>
<td style="text-align: left;">Delete records from the database in the receiving system</td>
</tr>
<tr>
<td style="text-align: center;">Replace</td>
<td style="text-align: left;">Substitute existing records in the database in the receiving system</td>
</tr>
<tr>
<td style="text-align: center;">Null</td>
<td style="text-align: left;">Add records or replace records in the database in the receiving system depending on whether the primary record exists in the database.</td>
</tr>
</tbody>
</table>
<p>For <code>NULL</code> action:</p>
<ul>
<li>If the primary record does NOT exist in the database, the system performs an Add action.</li>
<li>If the primary record DOES exist in the database, the system performs a Replace action.</li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn:698894">
<p>This would be so much simpler if Maximo had a direct CSV export option. <a class="footnote-backref" href="#fnref:698894" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:559947">
<p>You may need to create a custom Object Structure for Asset and Spare Part. <a class="footnote-backref" href="#fnref:559947" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:478856">
<p>Yes... I really do want to lose all the formatting so please just save the bloody file. <a class="footnote-backref" href="#fnref:478856" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Using Keyboard Maestro to drive Marked 22018-05-29T11:22:52-05:002018-05-29T11:22:52-05:00Jason Verlytag:mygeekdaddy.net,2018-05-29:/2018/05/29/using-keyboard-maestro-to-drive-marked-2/<p>My writing tools are varied based on where/how I'm writing - laptop vs iPad vs iPhone. But the final review process almost always ends up on my Mac in <a href="http://marked2app.com">Marked 2</a>. Marked 2 is a peculiarly wonderful app in that it doesn't <em>directly</em> create anything. Marked 2 is just for …</p><p>My writing tools are varied based on where/how I'm writing - laptop vs iPad vs iPhone. But the final review process almost always ends up on my Mac in <a href="http://marked2app.com">Marked 2</a>. Marked 2 is a peculiarly wonderful app in that it doesn't <em>directly</em> create anything. Marked 2 is just for viewing Markdown text files.<sup id="fnref:488522"><a class="footnote-ref" href="#fn:488522">2</a></sup> So when I view my content in Marked 2, I can see the content using the same CSS styling as I use on my site. </p>
<p>Normally when I run Marked 2, I will open a folder from Dropbox that holds all of my Markdown (MD) notes. Marked 2 has the ability to open a folder and then change what document it being previewed based on what file has had the most recent revision. This makes my writing time so much more effective because I can make changes to one post, updates notes in another file, come back to a 3rd document - and I don't have to change anything in Marked 2. </p>
<p>Brett Terpstra (<a href="http://twitter.com/ttscoff">@ttscoff</a>), the creator of Marked 2 wrote in a <a href="http://brettterpstra.com/2018/05/28/marked-2-dot-5-12-13-14-15-16-dot-dot-dot/">recent blog post</a> about using URL handlers in Marked 2. I looked a while back on using the URL handlers<sup id="fnref:803070"><a class="footnote-ref" href="#fn:803070">1</a></sup> and the format is pretty simply. Basically you can open a MD file in Marked 2 from either a link or from Terminal command. For example: </p>
<div class="highlight"><pre><span></span><code>open -g 'x-marked://open?file=filename.md&raise=true'
</code></pre></div>
<p>The problem I had with the URL handlers in the past was the it required an actual filename. I don't always know the full file name when I open Marked 2 because I want it to open my MD folder, not a specific file. What I wanted out of the URL handler was something equivalent to this:</p>
<div class="highlight"><pre><span></span><code>open -g 'x-marked://open?file=~/Dropbox/MDFolder&raise=true'
</code></pre></div>
<p>Since Marked 2 didn't have the option to open a folder, I looked at creating a macro in <a href="https://www.keyboardmaestro.com/main/">Keyboard Maestro</a>. The goal was to create a keyboard short cut to open Marked 2 and have it open my normal MD file folder. </p>
<figure><a href="http://share.mygeekdaddy.net/marked_open_md_file_folder.png"><img src="http://share.mygeekdaddy.net/marked_open_md_file_folder.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>With this macro, Marked 2 is opened and then will open my MD file folder.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:803070">
<p>Or <code>x-callback-url</code> for iOS reference. <a class="footnote-backref" href="#fnref:803070" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:488522">
<p>Brett got a Marked 2 revision kicked back because the Apple reviewer couldn't create a file. RTFM... ;-) <a class="footnote-backref" href="#fnref:488522" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Incorporating Location Hierarchy on WO Print2018-05-18T00:00:00-05:002018-05-18T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2018-05-18:/2018/05/18/incorporating-location-hierarchy-on-wo-print/<p>My company has recently been challenged with how we're using Maximo. On one front we're deploying Maximo to new sites that are transitioning off of another EAM platform. On the other front we have a facility that's <em>tripling</em> the size of the installed asset count. Both sites are dealing with …</p><p>My company has recently been challenged with how we're using Maximo. On one front we're deploying Maximo to new sites that are transitioning off of another EAM platform. On the other front we have a facility that's <em>tripling</em> the size of the installed asset count. Both sites are dealing with information overload and we wanted to find a way to help our technicians more easily identify where equipment is located in the facility. </p>
<p>As I was doing training at one facility they asked why don't we print the Location hierachy on work orders. An example of the Location hierarchy in Maximo is:</p>
<figure><a href="http://share.mygeekdaddy.net/acme_loc_hierarchy.png"><img src="http://share.mygeekdaddy.net/acme_loc_hierarchy.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I said the hierarchy can get quite complex and to have the waterfalled version you see above would take up too much room on a work order. The maintenance manager was adamant that this should be included as a go live requirement because the system they were moving off had a similar drilldown on the location hierachy on the work order.</p>
<p>I looked back out our project charter and in my own words, </p>
<blockquote>
<p>"Ensure parity functionality between \<Prod-X> and Maximo." </p>
</blockquote>
<p>Seeing I needed to meet this request I started looking at how I've queried on the Location Hiearchy in the past. Normally when the Loc Hiearchy has been selected the results would be multiple rows.</p>
<figure><a href="http://share.mygeekdaddy.net/normal_loc_ances_result.png"><img src="http://share.mygeekdaddy.net/normal_loc_ances_result.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I knew I could suppress the duplicate <code>location</code> field, but that wouldn't work because of the space it would take up on the work order print. Doing some research I found a SQL statement that could concatenate row results into a single line: <code>for xml path</code>. <sup id="fnref:346841"><a class="footnote-ref" href="#fn:346841">1</a></sup></p>
<p>The concept of the <code>for xml path</code> statement is take the result rows from a <code>select</code> statement and essentially transpose the results in to a single field. <sup id="fnref:600923"><a class="footnote-ref" href="#fn:600923">2</a></sup> After playing around with the <code>for XML path</code> function I got a statement that would return the location hierarchy in a single result row.</p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">stuff</span><span class="ss">((</span><span class="nv">select</span><span class="w"> </span><span class="s1">' / '</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">a</span>.<span class="nv">ancestor</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">' ('</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">b</span>.<span class="nv">description</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">')'</span><span class="w"></span>
<span class="nv">from</span><span class="w"> </span><span class="nv">locancestor</span><span class="w"> </span><span class="nv">a</span><span class="w"></span>
<span class="nv">join</span><span class="w"> </span><span class="nv">locations</span><span class="w"> </span><span class="nv">b</span><span class="w"> </span><span class="nv">on</span><span class="w"> </span><span class="nv">b</span>.<span class="nv">location</span><span class="o">=</span><span class="nv">a</span>.<span class="nv">ancestor</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">b</span>.<span class="nv">siteid</span><span class="o">=</span><span class="nv">a</span>.<span class="nv">siteid</span><span class="w"></span>
<span class="nv">where</span><span class="w"> </span><span class="nv">a</span>.<span class="nv">location</span><span class="o">=</span><span class="s1">'burner_3_2'</span><span class="w"> </span><span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">a</span>.<span class="nv">locancestorid</span><span class="w"> </span><span class="nv">desc</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nv">xml</span><span class="w"> </span><span class="nv">path</span><span class="w"> </span><span class="ss">(</span><span class="s1">''</span><span class="ss">))</span>,<span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="s1">''</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p>This worked and gave me the results in a single line:</p>
<figure><a href="http://share.mygeekdaddy.net/xml_path_sample_results.png"><img src="http://share.mygeekdaddy.net/xml_path_sample_results.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I added the <code>select</code> statement into our WO print report and added an addition reference back to the work order's original location:</p>
<div class="highlight"><pre><span></span><code><span class="o">+</span><span class="w"> </span><span class="s2">" workorder.location, locations.description as locdesc, workorder.istask, workorder.orgid, workorder.cinum, locations.lo1, "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" (select stuff((select ' / ' + a.ancestor + ' (' + b.description + ')' "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" from locancestor a join locations b on b.location=a.ancestor and b.siteid=a.siteid "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" where a.location=workorder.location order by a.locancestorid desc "</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="s2">" for xml path ('')), 1, 1, '')) as loc_path, "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="err">" ...</span><span class="w"></span>
</code></pre></div>
<p>So now when the WO is printed, there is a Location Hierarchy list that technicians can use to identify where they should be working.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2018-05-11_at_2_28_46_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2018-05-11_at_2_28_46_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The caveat to this function is:</p>
<ol>
<li>If the work order is not charged against a Location, the hierarchy will be empty. <sup id="fnref:602876"><a class="footnote-ref" href="#fn:602876">3</a></sup></li>
<li>If the work order is charged against an orphaned location, the hierarchy will be empty.</li>
</ol>
<p>An orphaned location is that the location has been added to Maximo, but it was not associated with a System and does not have a parent. Since an orphaned location does not have a parent it won't be on the <code>locancestor</code>, and therefore would return zero results in our new <code>select</code> statement. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:346841">
<p>I'm amazed how I ever got stuff down without <a href="https://stackoverflow.com/questions/31211506/how-stuff-and-for-xml-path-work-in-sql-server">stack overflow</a>. <a class="footnote-backref" href="#fnref:346841" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:600923">
<p>Similar to pasting rows with transpose in Excel. <a class="footnote-backref" href="#fnref:600923" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:602876">
<p>Duh... <a class="footnote-backref" href="#fnref:602876" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Setting PM to 1st Day of the Month2018-01-16T08:53:27-06:002018-01-16T08:53:27-06:00Jason Verlytag:mygeekdaddy.net,2018-01-16:/2018/01/16/setting-pm-to-1st-day-of-the-month/<p>First off, shout out to Bruno Portaluri (<a href="https://twitter.com/bportaluri">@bportaluri</a>) for this tip. He summarized an answer to a question I had just received a few days earlier from one of my Planners. This Planner asked if we could schedule a PM to come out the first Friday of each month. At …</p><p>First off, shout out to Bruno Portaluri (<a href="https://twitter.com/bportaluri">@bportaluri</a>) for this tip. He summarized an answer to a question I had just received a few days earlier from one of my Planners. This Planner asked if we could schedule a PM to come out the first Friday of each month. At the time I said no we couldn't, but then Bruno comes up with this.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/hashtag/Maximo?src=hash&ref_src=twsrc%5Etfw">#Maximo</a> tip<br>Did you know that by creating a PM with a frequency of 1 day, an ‘Active Date’ window for each month, from 1-7, and setting the ‘Active Days’ to Monday, you’ll get a PM on the first Monday of each month?</p>— Bruno Portaluri (@bportaluri) <a href="https://twitter.com/bportaluri/status/951912427519606785?ref_src=twsrc%5Etfw">January 12, 2018</a></blockquote>
<p>Pure gold. </p>
<p>This post is to capture what Bruno put in his tweet in a format I can reference back to in the future. </p>
<h4>PM Setup</h4>
<p>Bruno laid out how to get a PM setup to generate the first Monday of each month.<sup id="fnref:523744"><a class="footnote-ref" href="#fn:523744">1</a></sup> The setup is pretty simple after you see it in action.</p>
<ol>
<li>Create a PM and associate the Asset, Location, Job Plan, Lead, Supervisor, etc. data.</li>
<li>Set the PM Frequency to <code>1 DAYS</code>.
<figure><a href="http://share.mygeekdaddy.net/PM_1stday_freq.png"><img src="http://share.mygeekdaddy.net/PM_1stday_freq.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
<li>Create an active window for the 1st thru the 7th of each month.
<figure><a href="http://share.mygeekdaddy.net/pm_1stday_seasonaldates.png"><img src="http://share.mygeekdaddy.net/pm_1stday_seasonaldates.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
<li>Set the PM to <code>ACTIVE</code>.</li>
<li>Generate the PM workorder. </li>
</ol>
<p>After the PM work orders are generated, I got 12 work orders each with a Target Start date of the 1st Monday of the month. </p>
<figure><a href="http://share.mygeekdaddy.net/report_list_1st_day_Wo.png"><img src="http://share.mygeekdaddy.net/report_list_1st_day_Wo.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>For me, all I would have to do is set the <em>Active Days</em> from Monday to Friday. </p>
<p>Grazie Bruno!</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:523744">
<p>I know I wanted Fridays, but we're going to run with what Bruno tweeted. <a class="footnote-backref" href="#fnref:523744" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Maximo's Built In Sharing Service2018-01-07T20:55:23-06:002018-01-07T20:55:23-06:00Jason Verlytag:mygeekdaddy.net,2018-01-07:/2018/01/07/maximos-built-in-sharing-service/<p>One of the challenges in my Maximo environment is an efficient way to keep and store 'living documents'. A lot of us have Dropbox, Box, SharePoint, etc., but most of those services are either restricted from widespread access (Dropbox) or have a versioning system (SharePoint) that <em>can</em> make keeping living …</p><p>One of the challenges in my Maximo environment is an efficient way to keep and store 'living documents'. A lot of us have Dropbox, Box, SharePoint, etc., but most of those services are either restricted from widespread access (Dropbox) or have a versioning system (SharePoint) that <em>can</em> make keeping living documents an extra challenge.<sup id="fnref:592691"><a class="footnote-ref" href="#fn:592691">1</a></sup> The problem I was trying to solve was a very specific issue for new Maximo users. When a new user account is created in Maximo, the default method is to send the user an email with their account credentials, temporary password, and a link to log into Maximo. </p>
<figure><a href="http://share.mygeekdaddy.net/IMG_0149_2018-01-02.jpg"><img src="http://share.mygeekdaddy.net/IMG_0149_2018-01-02.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>I wanted to modify the communication template to include a URL for A PDF document for the user to open/download to give them an overview of Maximo for their reference. Maximo has a library function that allows for document linking, but that link requires the user to authenticate to Maximo first to view/open the document. I wanted a URL that linked to the overview document, but didn't require the user to have logged into Maximo yet. </p>
<p>I was looking for a sharing solution that met the following criteria:</p>
<ul>
<li>A sharing service that would work for anyone who would be using Maximo.</li>
<li>Allow document updates to be made without changing or modifying the URL.</li>
<li>Didn't require an IT admin to manage or administer document changes. </li>
</ul>
<p>I was working migrating some documents from a legacy WordPress site when it hit me. I just needed to have a web server and I could use that to serve up the documents. I didn't the framework of WordPress, just the distribution a web server could provide. But where could I find a web server that I knew all Maximo users could access and I had access to as an admin? Hmmm... </p>
<p>Duh.</p>
<p>Maximo has a pretty good web server and I had access to the server as an admin. </p>
<h4>Maximo Sharing Service</h4>
<p>Web servers are a lot like your desktop computer. They store files and use folders to separate documents. So the setup for my new file sharing service was pretty straight forward. </p>
<ol>
<li>Create a folder. </li>
<li>Copy over documents.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2017-12-31_at_11.57.21_AM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-12-31_at_11.57.21_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The folder <code>share</code> was just a generic name I choose, so there was nothing special in the folder name. To access the folder using our Maximo url was simply adding <code>/share</code> to the URL path. So if your normal URL to access Maximo is <code>maximo.acme.com</code>, the new file sharing folder would be <code>maximo.acme.com/share</code>.</p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2017-12-31_at_12.02.22_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-12-31_at_12.02.22_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So if I wanted to use the URL in a message. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2017-12-31_at_12.07.18_PM.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-12-31_at_12.07.18_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>At this point I can now update the file in the <code>share</code> folder and users will always have the latest and greatest version. </p>
<p>I already know there is one big arugurement against this : <em>The Maximo Library/Attached Docuents functionality</em>. Yes, Maximo does have a built in library and those can be attached to a Comm Template, but this caused a few problems for me. </p>
<ol>
<li>It required outbound emails to have an attachment for each new account or password reset. We have an internal IT policy to reference a document vs attaching when possible to minimize mailbox storage. </li>
<li>Even if I ignored the IT policy, I had the potential to have out of date documents being saved by someone and then have conflicting information as patches, versions, or configuration changes occurred. </li>
<li>Using a link to the Maximo Library requires a user to authenticate first. So a new user couldn’t see the document without having to login first, but we wanted the document available to the user before they login. <sup id="fnref:18_01_07_21_08_33"><a class="footnote-ref" href="#fn:18_01_07_21_08_33">2</a></sup></li>
</ol>
<p>Every now and them I will stumble on a solution just waiting for a problem to solve. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:592691">
<p>I'm not going to debate the merits of SharePoint. ;-) <a class="footnote-backref" href="#fnref:592691" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:18_01_07_21_08_33">
<p>Chicken meet egg, egg meet chicken. <a class="footnote-backref" href="#fnref:18_01_07_21_08_33" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>The Division for Destiny Players (Pt 3)2018-01-03T12:15:33-06:002018-01-03T12:15:33-06:00Jason Verlytag:mygeekdaddy.net,2018-01-03:/2018/01/03/the-division-for-destiny-players-pt-3/<p>First and foremost, The Division is a looter shooter. Your character pewpews the bad guys and the bad guys drop new loot. In previous posts I went over how your loot <a href="http://mygeekdaddy.net/2017/12/28/the-division-for-destiny-players-pt-1/">affects your stats and abilities</a> and <a href="http://mygeekdaddy.net/2018/01/01/the-division-for-destiny-players-pt-2/">how your loot creates a class for your character</a>. These two explanation now …</p><p>First and foremost, The Division is a looter shooter. Your character pewpews the bad guys and the bad guys drop new loot. In previous posts I went over how your loot <a href="http://mygeekdaddy.net/2017/12/28/the-division-for-destiny-players-pt-1/">affects your stats and abilities</a> and <a href="http://mygeekdaddy.net/2018/01/01/the-division-for-destiny-players-pt-2/">how your loot creates a class for your character</a>. These two explanation now build on how to look at the shooter side of the game... your weapons. </p>
<p style="border: #1863a1 1px solid; border-radius: 10px; padding: 10px; margin: 0px 25px 25px 25px; background-color: rgb(251,239,153);">98% of what is discussed below applies to PVE. This includes clearing landmarks in the DZ, which just happens to be in a PVP area.[^479613] So don't expect to go toe to toe with DZ Fun Police and think you'll walk away.</p>
<p>The weapons in The Division (TD) are similar to the weapon types in Destiny/Destiny 2 (D1).<sup id="fnref:479374"><a class="footnote-ref" href="#fn:479374">1</a></sup> In D1 there are 13 types of weapons, but there are only 6 weapon types in TD. So in TD there are a few weapons that overlap with a different weapon type in D1 or simply doesn't have the equivalent to a D1 weapon. </p>
<table>
<thead>
<tr>
<th style="text-align: center;">Destiny Weapon</th>
<th style="text-align: center;">The Division Weapon</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Auto Rifle</td>
<td style="text-align: center;">Assault Rifle</td>
</tr>
<tr>
<td style="text-align: center;">Hand Cannon</td>
<td style="text-align: center;">Pistol</td>
</tr>
<tr>
<td style="text-align: center;">Side Arm</td>
<td style="text-align: center;">Pistol</td>
</tr>
<tr>
<td style="text-align: center;">Fusion Rifle</td>
<td style="text-align: center;">-</td>
</tr>
<tr>
<td style="text-align: center;">Grenade Launcher</td>
<td style="text-align: center;">-</td>
</tr>
<tr>
<td style="text-align: center;">Pulse Rifle</td>
<td style="text-align: center;">Submachine Gun</td>
</tr>
<tr>
<td style="text-align: center;">Rocket Launcher</td>
<td style="text-align: center;">-</td>
</tr>
<tr>
<td style="text-align: center;">Scout Rifle</td>
<td style="text-align: center;">-<sup id="fnref:224461"><a class="footnote-ref" href="#fn:224461">2</a></sup></td>
</tr>
<tr>
<td style="text-align: center;">Shotgun</td>
<td style="text-align: center;">Shotgun</td>
</tr>
<tr>
<td style="text-align: center;">Sniper</td>
<td style="text-align: center;">Marksman Rifle</td>
</tr>
<tr>
<td style="text-align: center;">Sword</td>
<td style="text-align: center;">-</td>
</tr>
<tr>
<td style="text-align: center;">Submachine Gun</td>
<td style="text-align: center;">Submachine Gun</td>
</tr>
<tr>
<td style="text-align: center;">Heavy MG</td>
<td style="text-align: center;">Light Machine Gun</td>
</tr>
</tbody>
</table>
<p>Each weapon has 3 primary stats:</p>
<ul>
<li>DPS Stats</li>
<li>Attribute Stats</li>
<li>Intrinsic Perks</li>
</ul>
<p>These are <a href="http://share.mygeekdaddy.net/TD_Base_Weapon_Damage.pdf">stats that are in the base weapon</a> and have not been modified or altered due to a weapon mod or Gear Set perk.</p>
<h4>DPS Stats</h4>
<p>The strength of a weapon is primarily defined by the following 3 characteristics,</p>
<ul>
<li>DMG: How much is the weapon capable of doing per shot.<sup id="fnref:32119"><a class="footnote-ref" href="#fn:32119">9</a></sup></li>
<li>RPM: How fast your weapon fires.</li>
<li>MAG: How many rounds can be fired before you need to reload.</li>
</ul>
<p>The DMG stat has a random roll range for each weapon type, but RPM and MAG are fixed by each weapon. RPM and MAG can be adjusted with weapon mods (see below). </p>
<h4>Attribute Stats</h4>
<p>There are 4 attributes to a weapon that affects how the weapon handles. </p>
<ul>
<li>Accuracy: How fast the reticle for this weapon changes size when fired. <sup id="fnref:866844"><a class="footnote-ref" href="#fn:866844">3</a></sup></li>
<li>Reload Speed: How quickly the weapon can be reloaded.</li>
<li>Range: Max distance (Optimal Range) before the weapon is no longer effective. <sup id="fnref:763141"><a class="footnote-ref" href="#fn:763141">4</a></sup></li>
<li>Stability: How hard the weapon is to control when firing for a prolonged period.</li>
</ul>
<p>These are set based on the type of weapon and the weapon model. Again, there are mods, weapon perks and Gear Set perks that can affect each of these weapon stats (see below).</p>
<h4>Types of Weapon Damage</h4>
<p>Before we get too far into weapon perks and what they mean, there is an important detail to cover:</p>
<blockquote>
<p>Critical Hit Damage and Head Shot Damage are two different numbers.</p>
</blockquote>
<p>In TD you have a chance to apply damage to your enemy in one of four ways:</p>
<ul>
<li>Normal weapon damage: You shoot the toe of an NPC and you'll inflict normal damage</li>
<li>Critical hit damage: There is an RNG factor that calculates if your bullet can inflict additional damage called critical hit damage.</li>
<li>Headshot damage: There is a target box on an NPC that will trigger headshot damage.</li>
<li>Critical hit headshot damage: This is combination of triggering the critical hit damage as well as the headshot damage. </li>
</ul>
<p>There are perks that can help boost your damage numbers based on weapon type, weapon mods, and Gear Set bonuses. </p>
<p>Side note: One thing to look back on in your gear build is the perk rolls on your Gloves. Gloves can roll with a weapon damage modifier that is multiplicative<sup id="fnref:585101"><a class="footnote-ref" href="#fn:585101">6</a></sup> to other damage bonuses. So if you normally run with an Assault Rife, either look for Glove with an additional Assault Rifle damage or re-roll/recalibrate your Glove to have an Assault Damage damage bonus.</p>
<h4>Intrinsic Weapon Perks</h4>
<p>Each TD weapon has built-in perk that affects the type of damage the weapon will inflict. The percentage amount for the perk is an RNG range that is rolled when the weapon was picked up, purchased or crafted. </p>
<table>
<thead>
<tr>
<th style="text-align: center;">Weapon Type</th>
<th style="text-align: center;">Intrinsic Perk</th>
<th style="text-align: center;">Range Increase</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Assault Rifle</td>
<td style="text-align: center;">Enemy Armor Damage (EAD)</td>
<td style="text-align: center;">17.5% - 24.0%</td>
</tr>
<tr>
<td style="text-align: center;">SMG</td>
<td style="text-align: center;">Critical Hit Chance (CHC)</td>
<td style="text-align: center;">18.0% - 22.5%</td>
</tr>
<tr>
<td style="text-align: center;">LMG</td>
<td style="text-align: center;">Out of Cover Damage (OOC)</td>
<td style="text-align: center;">18.0% - 22.0%</td>
</tr>
<tr>
<td style="text-align: center;">Marksman Rifle</td>
<td style="text-align: center;">Head Shot Damage (HSD)</td>
<td style="text-align: center;">141% - 172%</td>
</tr>
<tr>
<td style="text-align: center;">Shotgun</td>
<td style="text-align: center;">Stagger</td>
<td style="text-align: center;">296% - 362%</td>
</tr>
</tbody>
</table>
<ul>
<li>Enemy Armor Damage (EAD): For the PVE events you'd normally run on WT5, every NPC you'll face has armor. Typically Elites have 2x the armor points as they do health points, so getting the armor broken down matters most in PVE. </li>
<li>Critical Hit Damage (CHD): The boost to normal damage your weapon has if the critical hit damage is triggered. </li>
<li>Critical Hit Chance (CHC): A multiplier that increases your chance of applying CHD to your target.</li>
<li>Head Shot Damage (HSD): A multiplier of the base damage your weapon has if headshot damage is triggered.</li>
<li>Out of Cover (OOC): Damage multiplier when hitting enemies/NPC's not in cover. </li>
<li>Stagger: How much/how long an enemy will be unresponsive due to getting shot. </li>
</ul>
<p>For PVE (even for DZ landmarks), EAD is the best damage type to look for. This also means Assault Rifles are typically the strongest type of weapon for PVE encounters.</p>
<h4>Weapon Talents</h4>
<p>After the stats and intrinsic perks are accounted for, the most visible item a weapon has are its weapon three talents. As previously stated, end game content is on World Tier (WT5), so only <span style="color:#d6900e; font-weight: 700">High-End</span> and <span style="color:#ea5c40; font-weight: 700">Exotic</span> weapons should be kept and reviewed. Lower tiered weapons will either have lower scaled DPS or few talent perks. </p>
<p>Each weapon will have 3 random talents<sup id="fnref:681000"><a class="footnote-ref" href="#fn:681000">7</a></sup> that affect how the gun performs. </p>
<p>However, to use certain weapon talents your character may have to have certain stat numbers to unlock a weapon talent. Listed below is each weapon talent and the stat numbers to unlock the talent. </p>
<table>
<thead>
<tr>
<th style="text-align: center;">Talent</th>
<th style="text-align: center;">Effect</th>
<th style="text-align: center;">Firearm</th>
<th style="text-align: center;">Stamina</th>
<th style="text-align: center;">Electronics</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Accurate</td>
<td style="text-align: center;">Accuracy is increased by x%</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Adept</td>
<td style="text-align: center;">Skill increases your critical hits chance by 3% for y seconds</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Balanced</td>
<td style="text-align: center;">Weapon acquires maximum accuracy faster when shouldered</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Brutal</td>
<td style="text-align: center;">Headshot damage is increased by x% when using this weapon</td>
<td style="text-align: center;">4790</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Capable</td>
<td style="text-align: center;">Using a skill improves the handling of your weapon for x seconds</td>
<td style="text-align: center;">4790</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Commanding</td>
<td style="text-align: center;">Every kill performed while the signature skill is active extends its duration by x%</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Competent</td>
<td style="text-align: center;">Weapon damage is increased by x% for y seconds after using a skill</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Coolheaded</td>
<td style="text-align: center;">Performing a headshot reduces all skill cooldowns by x%</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Deadly</td>
<td style="text-align: center;">Critical hit damage is increased by x%</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Destructive</td>
<td style="text-align: center;">Armor destruction value is increased by x% when using this weapon</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Determined</td>
<td style="text-align: center;">Killing a target reduces skill cooldowns by x%</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">4790</td>
</tr>
<tr>
<td style="text-align: center;">Disciplined</td>
<td style="text-align: center;">Killing a target will make your next shot with the weapon be an automatic critical hit</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Dominant</td>
<td style="text-align: center;">Every kill while your signature skill is active reduces the cooldown of your other skills by x%</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Expert</td>
<td style="text-align: center;">This weapon deals x% more damage when the target is below y% health</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Ferocious</td>
<td style="text-align: center;">Damage against elite and named enemies is increased by x%</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Fierce</td>
<td style="text-align: center;">Critical hit chance is increased by x% when using this weapon</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Focus</td>
<td style="text-align: center;">When no skills are on cooldown, your weapon damage is increased by 10%</td>
<td style="text-align: center;">4790</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Harmful</td>
<td style="text-align: center;">Each hit has a x% chance to apply the ‘bleed’ status effect</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Hurried</td>
<td style="text-align: center;">Critical hits increase reload speed by 10% to a minimum of 1 seconds reload time</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Intense</td>
<td style="text-align: center;">The first bullet of a magazine has a x% chance to apply the ‘on fire’ status effect</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">4790</td>
</tr>
<tr>
<td style="text-align: center;">Meticulous</td>
<td style="text-align: center;">Killing a traget has a x% chance to instantly refill the magazine</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">2874</td>
</tr>
<tr>
<td style="text-align: center;">Predatory</td>
<td style="text-align: center;">Killing a target regenerates x% health over y seconds</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">4790</td>
<td style="text-align: center;">2874</td>
</tr>
<tr>
<td style="text-align: center;">Prepared</td>
<td style="text-align: center;">Damage is increased by x%when more than 40 meters from the target</td>
<td style="text-align: center;">4790</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Proficient</td>
<td style="text-align: center;">The first bullet shot when out of combat has a x% chance to result in a critical hit</td>
<td style="text-align: center;">4790</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Provident</td>
<td style="text-align: center;">The last bullet in your magazine deals x% bonus damage</td>
<td style="text-align: center;">4790</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Responsive</td>
<td style="text-align: center;">Damage is increased by 5% when closer than 10 meters to the target</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Restored</td>
<td style="text-align: center;">Killing a target with this weapon removes all negative status effects</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Self-preserved</td>
<td style="text-align: center;">Critical hits with this weapon heal the user for x% of damage dealt</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">4790</td>
</tr>
<tr>
<td style="text-align: center;">Skilled</td>
<td style="text-align: center;">Headshot kills with this weapon increase signature skill resources by x%</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Stable</td>
<td style="text-align: center;">Stability is improved by x%</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Sustained</td>
<td style="text-align: center;">Killing a target increases your health by x%</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Swift</td>
<td style="text-align: center;">Reloading is x% faster</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">4790</td>
</tr>
<tr>
<td style="text-align: center;">Talented</td>
<td style="text-align: center;">Killing a target with this weapon increases skill power by x% for y seconds</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Toxic</td>
<td style="text-align: center;">Headshots with this weapon have a x% chance to apply the ‘blind’ status effect</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">3832</td>
</tr>
<tr>
<td style="text-align: center;">Trained</td>
<td style="text-align: center;">Critical hits increase signature skill resources by 0.01%</td>
<td style="text-align: center;">2874</td>
<td style="text-align: center;">0</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Unforgiving</td>
<td style="text-align: center;">Missing health segments increases your damage by x%</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">4790</td>
<td style="text-align: center;">0</td>
</tr>
<tr>
<td style="text-align: center;">Vicious</td>
<td style="text-align: center;">Critical hit chance is increased by x% while at full health.</td>
<td style="text-align: center;">3832</td>
<td style="text-align: center;">4790</td>
<td style="text-align: center;">0</td>
</tr>
</tbody>
</table>
<p>Here's an image showing all the talents, the stat requirements and talents, even Exotic weapons </p>
<figure><a href="http://share.mygeekdaddy.net/TD_18_weapon_perks.png"><img src="http://share.mygeekdaddy.net/TD_18_weapon_perks.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Since most of the PVE enemies are Elites (gold bar), the best perks to look for on your weapon would be:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Talent</th>
<th style="text-align: center;">Effect</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Brutal</td>
<td style="text-align: center;">Headshot damage is increased by x% when using this weapon</td>
</tr>
<tr>
<td style="text-align: center;">Competent *</td>
<td style="text-align: center;">Weapon damage is increased by x% for y seconds after using a skill</td>
</tr>
<tr>
<td style="text-align: center;">Deadly</td>
<td style="text-align: center;">Critical hit damage is increased by x%</td>
</tr>
<tr>
<td style="text-align: center;">Destructive *</td>
<td style="text-align: center;">Armor destruction value is increased by x% when using this weapon</td>
</tr>
<tr>
<td style="text-align: center;">Determined</td>
<td style="text-align: center;">Killing a target reduces skill cooldowns by x%</td>
</tr>
<tr>
<td style="text-align: center;">Ferocious *</td>
<td style="text-align: center;">Damage against elite and named enemies is increased by x%</td>
</tr>
<tr>
<td style="text-align: center;">Responsive</td>
<td style="text-align: center;">Damage is increased by 5% when closer than 10 meters to the target</td>
</tr>
<tr>
<td style="text-align: center;">Talented</td>
<td style="text-align: center;">Killing a target with this weapon increases skill power by x% for y seconds</td>
</tr>
</tbody>
</table>
<ul>
<li>= Preferred</li>
</ul>
<p>As previously mentioned, each weapon has three talent slots that will randomly be filled from the list above. The third weapon talent slot is called the free talent. This means that no matter what your character stats are the weapon talent in the 3rd slot will always be available. This is something to think about when you get duplicate weapon and want to think about which one to keep.</p>
<p>For example: I have a weapon that drops with Determined, Destructive, and Ferocious. </p>
<ul>
<li>If I get a weapon with the talents in that order, Ferocious is in the 3rd slot so I don't need to meet the any stat requirements to unlock the perk. </li>
<li>If I get a weapon with the talents in order of Ferocious, Destructive, Determined, I don't need to meet the 4790 Electronics requirement to unlock the Determined perk. </li>
</ul>
<p>This can be a big deal if you're character is focused on Firearms (Striker) or Stamina(Predator) stats for your Gear Set and may not meet the a requirement to unlock a specific weapon perk. For example:</p>
<figure><a href="http://share.mygeekdaddy.net/no_ferocious_talent.jpg"><img src="http://share.mygeekdaddy.net/no_ferocious_talent.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>On this Predator build, my focus was to get as much Stamina as possible to trigger a specific Gear Set perk. This required sacrificing my Electronics and not triggering Ferocious perk on this weapon. </p>
<figure><a href="http://share.mygeekdaddy.net/yes_ferocious_talent.jpg"><img src="http://share.mygeekdaddy.net/yes_ferocious_talent.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Same weapon model, but in this case Ferocious was in the 3rd slot. So even though I don't have enough Electronics to proc the Ferocious talent, because it landed in the 3rd/free slot I'll proc the talent on this weapon.</p>
<h4>Weapon Mods</h4>
<p>Just like your gear, weapons can modded with attachments to increase damage and handling stats. The 5 normal weapon mods slots available are:</p>
<ul>
<li>Weapon skin (cosmetic only)</li>
<li>Optics</li>
<li>Magazine</li>
<li>Muzzle</li>
<li>Barrel/Grip</li>
</ul>
<p>Not all weapons have all 5 weapon mod slots. For example, SMG's will typically not have a Barrel/Grip slot. </p>
<figure><a href="http://share.mygeekdaddy.net/pp-19_smg_image.jpg"><img src="http://share.mygeekdaddy.net/pp-19_smg_image.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Weapon mods will modify 7 attributes of a weapon:<sup id="fnref:571142"><a class="footnote-ref" href="#fn:571142">10</a></sup></p>
<ul>
<li>DMG (e.g. increase critical hit damage)</li>
<li>RPM (e.g. magazine will increase rate of fire)</li>
<li>MAG (e.g. magazine will increase number of rounds)</li>
<li>Accuracy (e.g. scope will shorten reticle time)</li>
<li>Reload (e.g. grip will increase reload speed)</li>
<li>Range (e.g. scope will increase effective range)</li>
<li>Stability (e.g. muzzle will increase weapon stability)</li>
</ul>
<p>Possible ranges weapon mod perks and the different types of weapon mods shown below:<sup id="fnref:214124"><a class="footnote-ref" href="#fn:214124">8</a></sup></p>
<figure><a href="http://share.mygeekdaddy.net/The_Division_Gear_Attribute_Sheet_1.8.jpg"><img src="http://share.mygeekdaddy.net/The_Division_Gear_Attribute_Sheet_1.8.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>You can grab a PDF of the image here: <a href="http://share.mygeekdaddy.net/The_Division_Gear_Attribute_Sheet_1.8.pdf">Division 1.8 Weapon Mod List</a>.</p>
<p>Now using the same SMG from before, you can see how the PP-19 is affected by the weapons mod attachments. </p>
<figure><a href="http://share.mygeekdaddy.net/weapon_mod_comparison_pp19.jpeg"><img src="http://share.mygeekdaddy.net/weapon_mod_comparison_pp19.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>By applying 3 mod attachments, the mods modified the weapon with:</p>
<ul>
<li>4.9% RPM increase</li>
<li>120% magazine increase</li>
<li>7.5% CHC increase</li>
<li>2.5% stability increase</li>
<li>4% CHD increase</li>
</ul>
<p>These attribute changes combine to an overall 37.7% DPS increase. </p>
<p> </p>
<p>Part 4 will cover end game content, Commendations, Global Events, and Gear Scores. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:479374">
<p>I'll use the shortcut D1 to mean the Destiny franchise as a whole. <a class="footnote-backref" href="#fnref:479374" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:224461">
<p>There's an Exotic weapon, Urban MDR, that fits the Scout Rifle but is the only one that does. <a class="footnote-backref" href="#fnref:224461" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:866844">
<p>This is <em>bloom</em> from D1. As the reticle gets smaller, you have smaller bullet bloom. The smaller the reticle, the more accurate the shot. <a class="footnote-backref" href="#fnref:866844" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:763141">
<p>The damage applied to enemies at greater distances is lower. <a class="footnote-backref" href="#fnref:763141" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:479613">
<p>Just imagine if Destiny had a zone like that... <a class="footnote-backref" href="#fnref:479613" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:585101">
<p>Damage can be calculated by adding or multiplying bonuses. Multiplied bonuses yield a higher number. <a class="footnote-backref" href="#fnref:585101" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
<li id="fn:681000">
<p>You can recalibrate a weapon and re-roll one perk on a weapon. <a class="footnote-backref" href="#fnref:681000" title="Jump back to footnote 7 in the text">↩</a></p>
</li>
<li id="fn:214124">
<p>Credit @spydr101#5067 and Gear Guide (https://goo.gl/ZaL5An) <a class="footnote-backref" href="#fnref:214124" title="Jump back to footnote 8 in the text">↩</a></p>
</li>
<li id="fn:32119">
<p>This number will scale up/down based on your Firearms stat. <a class="footnote-backref" href="#fnref:32119" title="Jump back to footnote 9 in the text">↩</a></p>
</li>
<li id="fn:571142">
<p>Look back to the first part of the post to see what each attribute is. <a class="footnote-backref" href="#fnref:571142" title="Jump back to footnote 10 in the text">↩</a></p>
</li>
</ol>
</div>The Division for Destiny Players (Pt 2)2018-01-01T11:48:02-06:002018-01-01T11:48:02-06:00Jason Verlytag:mygeekdaddy.net,2018-01-01:/2018/01/01/the-division-for-destiny-players-pt-2/<p>One of the big differences between The Division and Destiny is your character in The Division (TD) starts out "classless". In Destiny (D1) your first choice was whether you want to be Titan, Hunter, or Warlock.<sup id="fnref:112235"><a class="footnote-ref" href="#fn:112235">2</a></sup> Then as you progressed with your character in D1 you gained talents specific …</p><p>One of the big differences between The Division and Destiny is your character in The Division (TD) starts out "classless". In Destiny (D1) your first choice was whether you want to be Titan, Hunter, or Warlock.<sup id="fnref:112235"><a class="footnote-ref" href="#fn:112235">2</a></sup> Then as you progressed with your character in D1 you gained talents specific to your D1 class. In TD, your character starts out as an Agent with no unique abilities as it relates to a D1 class/sub-class. </p>
<p>So how do you customize your TD character?</p>
<p>In my <a href="http://mygeekdaddy.net/2017/12/28/the-division-for-destiny-players-pt-1/">previous post</a> I went over the stats and abilities your character has in The Division. All of your stats come from the equipment you put on your TD character. Gear will drop with different colors, representing the rarity and power the item is:</p>
<ul>
<li><span style="color:#5378f3; font-weight: 700">Specialized</span> (blue) </li>
<li><span style="color:#c15d9e; font-weight: 700">Superior</span> (purple) </li>
<li><span style="color:#d6900e; font-weight: 700">High-End</span> (yellow) </li>
<li><span style="color:#ea5c40; font-weight: 700">Exotic</span> (red) </li>
<li><span style="color:#42895f; font-weight: 700">Gear Set</span> (teal) </li>
<li><span style="color:#42895f; font-weight: 700">Classified Gear Set</span> (teal) </li>
</ul>
<p>Once you hit L30 and playing on WT5, you'll be focused on <span style="color:#ea5c40; font-weight: 700">Exotic</span>, normal <span style="color:#42895f; font-weight: 700">Gear Set</span>, and <span style="color:#42895f; font-weight: 700">Classified Gear Set</span> loot. All other loot will have reduced perks or mod slots, so sell them or dismantle them if you happen to get any. </p>
<h4>Agent Gear Loadouts</h4>
<p>In TD, you character has 6 pieces of gear to wear: </p>
<ul>
<li>Backpack</li>
<li>Body Armor</li>
<li>Mask</li>
<li>Gloves</li>
<li>Knee Pads</li>
<li>Holsters</li>
</ul>
<p>Each piece of gear can be mixed and matched from various Gear Sets. Gear Sets are specialized pieces of gear that give your character additional abilities that are unlocked based on the number and type that is being worn. </p>
<figure><a href="http://share.mygeekdaddy.net/predator_classified_2017-12-31.jpg"><img src="http://share.mygeekdaddy.net/predator_classified_2017-12-31.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>There are currently 14 different types of Gear Sets available in the game. </p>
<table>
<thead>
<tr>
<th style="text-align: center;">Gear Set Name</th>
<th style="text-align: center;">Talent Focus</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">AlphaBridge</td>
<td style="text-align: center;">Solo/Survival</td>
</tr>
<tr>
<td style="text-align: center;">Banshee</td>
<td style="text-align: center;">DZ PVP</td>
</tr>
<tr>
<td style="text-align: center;">D3-FNC</td>
<td style="text-align: center;">Hybrid/Tank</td>
</tr>
<tr>
<td style="text-align: center;">DeadEYE</td>
<td style="text-align: center;">Sniper</td>
</tr>
<tr>
<td style="text-align: center;">Final Measure</td>
<td style="text-align: center;">Specialized</td>
</tr>
<tr>
<td style="text-align: center;">FireCrest</td>
<td style="text-align: center;">DPS/Offensive</td>
</tr>
<tr>
<td style="text-align: center;">Hunter’s Faith</td>
<td style="text-align: center;">Long Range</td>
</tr>
<tr>
<td style="text-align: center;">Lone Star</td>
<td style="text-align: center;">High DPS</td>
</tr>
<tr>
<td style="text-align: center;">Path of the Nomad</td>
<td style="text-align: center;">DZ PVP</td>
</tr>
<tr>
<td style="text-align: center;">Predator’s Mark</td>
<td style="text-align: center;">Support/DPS</td>
</tr>
<tr>
<td style="text-align: center;">Reclaimer</td>
<td style="text-align: center;">Support/Healer</td>
</tr>
<tr>
<td style="text-align: center;">Sentry’s Call</td>
<td style="text-align: center;">Consistent Precision</td>
</tr>
<tr>
<td style="text-align: center;">Striker’s Battlegear</td>
<td style="text-align: center;">Assault-Focused</td>
</tr>
<tr>
<td style="text-align: center;">Tactician’s Authority</td>
<td style="text-align: center;">Support/Skills</td>
</tr>
</tbody>
</table>
<p>The "class" abilities of your character are unlocked when you equip multiple pieces of gear and trigger the intrinsic perks of a Gear Set. You can see all the Gear Set bonuses here - <a href="https://www.reddit.com/r/thedivision/wiki/gear_sets">Reddit Gear Set Bonus List</a> or a <a href="http://mygeekdaddy.net/share/TD_Gear_Set_Perks.pdf">PDF Gear Set List</a>. </p>
<figure><a href="http://share.mygeekdaddy.net/td_gear_set_perk_list.png"><img src="http://share.mygeekdaddy.net/td_gear_set_perk_list.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>You'll see Gear Sets having stacking perks when wearing 4 pieces of <span style="text-decoration: underline">the same</span> Gear Set or 6 pieces of <span style="text-decoration: underline">the same Classified Gear Sets</span>. To unlock the 6 piece Gear Set perks, you need to have <span style="text-decoration: underline">all 6 pieces</span> be a Classified Gear Set. Note: You can mix/match normal and Classified to still get the max 4 piece perk to activate - e.g. 2 pieces of normal Lone Star and 2 pieces of Classified Lone Star will unlock the the 2, 3, and 4 piece perks. </p>
<p>There are a couple of differences between a normal Gear Set and a Classified Gear set:</p>
<ul>
<li>Normal Gear sets have a stat point range of 1114 - 1272. </li>
<li>Classified Gear Sets can have stat points that range from 1274 - 1401 points.<sup id="fnref:732004"><a class="footnote-ref" href="#fn:732004">6</a></sup></li>
<li>Only Classified Gear Sets can unlock the 5th and 6th piece perks.</li>
</ul>
<p style="border: #1863a1 1px solid; border-radius: 10px; padding: 10px; margin: 0px 25px 25px 25px; background-color: rgb(251,239,153);">There is an Exotic backpack, the Ninja Messenger Bag, that has the unique perk of triggering Gear Set perks. If you have one Gear Set piece on, the Ninja Messenger Bag will trigger the 2nd piece perk on that Gear Set. This ramps up to wearing 3 pieces of Gear Set, but activating the 4th piece perk. The Ninja Messenger Bag <span style="text-decoration: underline">does not</span> enable Classified Gear Set perks.</p>
<p>The primary benefit of having normal or Classified Gear Set pieces, say over high end (gold) equipment, is that you can mix and match the number of pieces you have on to tweak the perks your character has activated. For example, with 2 pieces of Lone Star gear you unlock the <em>'+100% Ammo Capacity'</em> perk. So now you could mix 2 pieces of Lone Star with 4 pieces of Striker gear and have the following perks active on your Character:</p>
<ul>
<li>+100% Ammo Capacity (Lone Star 2 Piece)</li>
<li>+20% Stability (Striker 2 Piece)</li>
<li>+10% Enemy Armor Damage (Striker 3 Piece)</li>
<li>Every consecutive hit deals 1% more damage. Stacks up to 100%. Missing shots drops bonus by 2%. Bonus is reduced by 1% every second. (Striker 4 Piece)</li>
</ul>
<p>So even if you don't have a full set of Classified Gear Set, you can get some pretty interesting perks enabled for your character. </p>
<p>At of the time of this post, the top Gear Sets in the game are:</p>
<ul>
<li>Path of the Nomad (PVP) </li>
<li>Preditor (PVP/Solo)</li>
<li>Striker (PVE/Solo)</li>
<li>Reclaimer (when on a team)</li>
</ul>
<p>You'll normally see people playing the following activities because they have the highest chance of dropping normal and Classified Gear Set pieces:</p>
<ul>
<li>Global Event Exotic cache (best chance)</li>
<li>Exotic caches (Legendary level missions)</li>
<li>Weekly Assignment Caches</li>
<li>Named bosses in the LZ or DZ</li>
<li>Named HVT targets - 3% drop rate</li>
<li>Key Chests in DZ</li>
<li>Teal Gear Set caches (DZ)</li>
<li>Rank 40+ in Last Stand/Skirmish</li>
</ul>
<h4>Gear Mod Slots</h4>
<p>In addition to the perks you have with the Gear Set pieces, different pieces of gear can have different modifications (mods) applied. There are 2 types of mods that can be applied: </p>
<ul>
<li>Stat Mods: Boosts the stat points for Firearms, Stamina, or Electronics.</li>
<li>Performance Mods: Enhance the performance of your skills. </li>
</ul>
<p>The number and types of mods that can be applied depends on the piece of gear. Here's each gear piece with the type and number of mods that can be applied.</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Gear Piece</th>
<th style="text-align: center;">Stat Mod</th>
<th style="text-align: center;">Performance Mod</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Backpack</td>
<td style="text-align: center;">2</td>
<td style="text-align: center;">1</td>
</tr>
<tr>
<td style="text-align: center;">Body Armor</td>
<td style="text-align: center;">2</td>
<td style="text-align: center;"></td>
</tr>
<tr>
<td style="text-align: center;">Masks</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">-</td>
</tr>
<tr>
<td style="text-align: center;">Gloves</td>
<td style="text-align: center;">-</td>
<td style="text-align: center;">-</td>
</tr>
<tr>
<td style="text-align: center;">Knee Pads</td>
<td style="text-align: center;">1</td>
<td style="text-align: center;">1</td>
</tr>
<tr>
<td style="text-align: center;">Holsters</td>
<td style="text-align: center;">-</td>
<td style="text-align: center;">1</td>
</tr>
</tbody>
</table>
<h4>Stat Mods</h4>
<p>As explained earlier, Stat Mods boost your characters raw stat numbers: Firearms, Stamina, or Electronics. Applying a Stat Mod to your gear will raise a specific Stat 'x' points. </p>
<figure><a href="http://share.mygeekdaddy.net/stat_mod_2018-01-01.jpg"><img src="http://share.mygeekdaddy.net/stat_mod_2018-01-01.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>In the image above, I'm applying an Electronics Stat Mod to my gear that will add <em>+263 Electronics</em> points to my stats, which equates to 7,890 Skill Power (SP) points. You will apply Stat Mods to raise a certain stat to unlock Gear Set perks (e.g. 9000 stamina for 6 piece Predator) or unlock weapons perks (more on that in Part 3). Stat mods have a range of 228-267 points for WT5/L34 mods, so dismantle/sell anything below 260 points. </p>
<p>Stat Mods normally have another perk that gets applied when the mod is applied to a piece of gear. This mod affects your resilience to damage or adds a buff to your stat numbers. </p>
<table>
<thead>
<tr>
<th style="text-align: center;">Stat Mod Perk</th>
<th style="text-align: center;">Mod Detail</th>
<th style="text-align: center;">Mod Range</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Critical Hit Chance</td>
<td style="text-align: center;">Additional chance to inflect critical hit damage</td>
<td style="text-align: center;">1.0%</td>
</tr>
<tr>
<td style="text-align: center;">Health</td>
<td style="text-align: center;">Points added to Health Point pool</td>
<td style="text-align: center;">2837 - 3335</td>
</tr>
<tr>
<td style="text-align: center;">Exotic Damage Resistance</td>
<td style="text-align: center;">Resistance to damage from burning, bleed, explosion, etc.<sup id="fnref:789383"><a class="footnote-ref" href="#fn:789383">5</a></sup></td>
<td style="text-align: center;">1.0% - 2.0%</td>
</tr>
<tr>
<td style="text-align: center;">All Resistance</td>
<td style="text-align: center;">Resistance to status effects from gas, blindness, etc</td>
<td style="text-align: center;">1.0 - 2.0%</td>
</tr>
<tr>
<td style="text-align: center;">Skill Haste</td>
<td style="text-align: center;">Decreases regen time for skills</td>
<td style="text-align: center;">2.0% - 3.0%</td>
</tr>
<tr>
<td style="text-align: center;">Skill Power</td>
<td style="text-align: center;">Increase points for Skill Power</td>
<td style="text-align: center;">2837 - 3335</td>
</tr>
<tr>
<td style="text-align: center;">Signature Resource Gain</td>
<td style="text-align: center;">Decreases regen time for Signature Skill</td>
<td style="text-align: center;">3.0% - 4.0%</td>
</tr>
</tbody>
</table>
<p>If you have multiple mods with the same perk, e.g. 2 mods that both have Skill Haste, those will stack and reduce you skill regen time by the sum of the percentages. </p>
<h4>Performance Mods</h4>
<p>Applying a Performance Mod will modify one your abilities. These mods help elevate the power of the ability that you've selected for your character. For example, I pulled off all the mods on my character and the stats for my fire turret are:</p>
<figure><a href="http://share.mygeekdaddy.net/turrent_base_stat.jpg"><img src="http://share.mygeekdaddy.net/turrent_base_stat.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<table>
<thead>
<tr>
<th style="text-align: center;">Attribue</th>
<th style="text-align: center;">Base</th>
<th style="text-align: center;">Total</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Damage</td>
<td style="text-align: center;">982 HP</td>
<td style="text-align: center;">1802 HP</td>
</tr>
<tr>
<td style="text-align: center;">Range</td>
<td style="text-align: center;">12.0m</td>
<td style="text-align: center;">12.0m</td>
</tr>
<tr>
<td style="text-align: center;">Lifetime</td>
<td style="text-align: center;">45.0s</td>
<td style="text-align: center;">45.0s</td>
</tr>
<tr>
<td style="text-align: center;">Health</td>
<td style="text-align: center;">77,158 HP</td>
<td style="text-align: center;">102,888 HP</td>
</tr>
<tr>
<td style="text-align: center;">Cooldown</td>
<td style="text-align: center;">67.50s</td>
<td style="text-align: center;">58.40s</td>
</tr>
</tbody>
</table>
<p>Now in my inventory I found a Performance mod that will increase the duration of a turret by 7%:</p>
<figure><a href="http://share.mygeekdaddy.net/performance_turrent_mod.jpg"><img src="http://share.mygeekdaddy.net/performance_turrent_mod.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I applied the Performance mod onto a piece of my equipped gear. </p>
<figure><a href="http://share.mygeekdaddy.net/turrent_mod_stat.jpg"><img src="http://share.mygeekdaddy.net/turrent_mod_stat.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<table>
<thead>
<tr>
<th style="text-align: center;">Attribue</th>
<th style="text-align: center;">Base</th>
<th style="text-align: center;">Total</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Damage</td>
<td style="text-align: center;">982 HP</td>
<td style="text-align: center;">1802 HP</td>
</tr>
<tr>
<td style="text-align: center;">Range</td>
<td style="text-align: center;">12.0m</td>
<td style="text-align: center;">12.0m</td>
</tr>
<tr>
<td style="text-align: center;">Lifetime</td>
<td style="text-align: center;">45.0s</td>
<td style="text-align: center;">48.2s</td>
</tr>
<tr>
<td style="text-align: center;">Health</td>
<td style="text-align: center;">77,158 HP</td>
<td style="text-align: center;">102,888 HP</td>
</tr>
<tr>
<td style="text-align: center;">Cooldown</td>
<td style="text-align: center;">67.50s</td>
<td style="text-align: center;">58.40s</td>
</tr>
</tbody>
</table>
<p>Now after applying that mod to one of my pieces of gear, I can see the Lifetime/Duration<sup id="fnref:679697"><a class="footnote-ref" href="#fn:679697">3</a></sup> of my turret went up 7%.<sup id="fnref:322288"><a class="footnote-ref" href="#fn:322288">4</a></sup> Note none of the other stats were affected by the mod. There are other mods that could have affected my turret's health or damage output. </p>
<p>The current list of Performance Mod and the range of mod could have:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Performance Mod Perk</th>
<th style="text-align: center;">Mod Range</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">First Aid Ally Heal</td>
<td style="text-align: center;">5% - 6%</td>
</tr>
<tr>
<td style="text-align: center;">First Aid Self Heal</td>
<td style="text-align: center;">5% - 6%</td>
</tr>
<tr>
<td style="text-align: center;">Mobile Cover Blast Resilience</td>
<td style="text-align: center;">3% - 4%</td>
</tr>
<tr>
<td style="text-align: center;">Mobile Cover Health</td>
<td style="text-align: center;">6% - 7.5%</td>
</tr>
<tr>
<td style="text-align: center;">Pulse Critical Hit Chance</td>
<td style="text-align: center;">2% - 2%</td>
</tr>
<tr>
<td style="text-align: center;">Pulse Critical Hit Damage</td>
<td style="text-align: center;">2% - 2%</td>
</tr>
<tr>
<td style="text-align: center;">Pulse Lifetime</td>
<td style="text-align: center;">4% - 5%</td>
</tr>
<tr>
<td style="text-align: center;">Riot shield Damage Resist</td>
<td style="text-align: center;">4% - 5%</td>
</tr>
<tr>
<td style="text-align: center;">Riot shield Damage</td>
<td style="text-align: center;">3% - 4%</td>
</tr>
<tr>
<td style="text-align: center;">Riot shield Health</td>
<td style="text-align: center;">6% - 7.5%</td>
</tr>
<tr>
<td style="text-align: center;">Seeker Mine Explosion Damage</td>
<td style="text-align: center;">3% - 4%</td>
</tr>
<tr>
<td style="text-align: center;">Seeker Mine Explosion Range</td>
<td style="text-align: center;">6% - 7.5%</td>
</tr>
<tr>
<td style="text-align: center;">Smart Cover Damage Resist</td>
<td style="text-align: center;">2% - 3%</td>
</tr>
<tr>
<td style="text-align: center;">Smart Cover Lifetime</td>
<td style="text-align: center;">4% - 5%</td>
</tr>
<tr>
<td style="text-align: center;">Sticky Bomb Explosion Damage</td>
<td style="text-align: center;">3% - 4%</td>
</tr>
<tr>
<td style="text-align: center;">Sticky Bomb Explosion Range</td>
<td style="text-align: center;">5% - 6%</td>
</tr>
<tr>
<td style="text-align: center;">Support Station Healing Rate</td>
<td style="text-align: center;">4% - 5%</td>
</tr>
<tr>
<td style="text-align: center;">Support Station Lifetime</td>
<td style="text-align: center;">6% - 7.5%</td>
</tr>
<tr>
<td style="text-align: center;">Support Station Range</td>
<td style="text-align: center;">6% - 7.5%</td>
</tr>
<tr>
<td style="text-align: center;">Turret Damage</td>
<td style="text-align: center;">3% - 4%</td>
</tr>
<tr>
<td style="text-align: center;">Turret Duration</td>
<td style="text-align: center;">6% - 7.5%</td>
</tr>
<tr>
<td style="text-align: center;">Turret Health</td>
<td style="text-align: center;">6% - 7.5%</td>
</tr>
</tbody>
</table>
<p>Like Stat Mods, Performance Mods can stack. So if you applied 2 mods for Turret Damage, the overall effect would be the sum of the 2 mod percentages. </p>
<p> </p>
<p>Part 3 will discuss weapons in The Division and how weapon perks work. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:741402">
<p>Elite and Named NPC's (gold bar enemies) can drop gear above the normal range for a WT. For example, Elite NPC's can drop 271 GS gear on WT5. <a class="footnote-backref" href="#fnref:741402" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:112235">
<p>But there was only one class you really needed to pick... Titan. <a class="footnote-backref" href="#fnref:112235" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:679697">
<p>I wish I knew why mods say 'Duration' and the Ability says 'Lifetime'. <a class="footnote-backref" href="#fnref:679697" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:322288">
<p>45.0 * 1.07 = 48.2 <a class="footnote-backref" href="#fnref:322288" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:789383">
<p>Basically any other damage you can receive except bullets. <a class="footnote-backref" href="#fnref:789383" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:732004">
<p>This means the crappiest Classified Gear Set piece will always be better than any normal Gear Set pieces on a stat point vs stat point basis. <a class="footnote-backref" href="#fnref:732004" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
</ol>
</div>The Division for Destiny Players (Pt 1)2017-12-28T12:16:45-06:002017-12-28T12:16:45-06:00Jason Verlytag:mygeekdaddy.net,2017-12-28:/2017/12/28/the-division-for-destiny-players-pt-1/<p>A lot of my gaming friends<sup id="fnref:144004"><a class="footnote-ref" href="#fn:144004">2</a></sup> picked up The Division when it first came out and then dropped off when the game became a bit of a mess. The Division recently got an update patch that added some new content and fixed some long time plaguing issues. These fixes …</p><p>A lot of my gaming friends<sup id="fnref:144004"><a class="footnote-ref" href="#fn:144004">2</a></sup> picked up The Division when it first came out and then dropped off when the game became a bit of a mess. The Division recently got an update patch that added some new content and fixed some long time plaguing issues. These fixes have started to bring back players and a lot of them are asking "I haven’t played in a long time, what loot is good now? I’m not sure how to set up my characters anymore." The loot drops are a continuous flow in The Division, so much so that sometimes it's hard to understand what you should keep, hold on for later, and dismantle/sell now for resources. I'll be using Destiny (D1) as a comparison to information a player will see in The Division (TD) since that's the audience I'm trying to speak to. </p>
<blockquote>
<p><strong>Everything</strong> I'm about to talk about assumes your Agent is L30, you have completely unlocked the Base of Operations (BoO)<sup id="fnref:758582"><a class="footnote-ref" href="#fn:758582">1</a></sup>, and can play on World Tier 5 (WT5). If you don't meet these requirements, find a friend that is and power level<sup id="fnref:931771"><a class="footnote-ref" href="#fn:931771">3</a></sup> until you get all 3 completed. </p>
</blockquote>
<h3>Character Stats Overview</h3>
<p>Let's get the hardest topic out of the way first... Agent ability stats and attributes. In TD your Agent also has 3 main stats:</p>
<ul>
<li>Firearms: Higher stat will improve the damage output from your Agent.</li>
<li>Stamina: Higher stat will improve the damage your Agent can receive.</li>
<li>Electronics: Higher stat affects how effective your Skills are (see below).</li>
</ul>
<p>The easiest way to think about your characters stats in TD is in D1 your character had 3 main stats: Int / Dis / Str. Those stats dictated how fast you would get your grenade to recharge, how long it took to fill your super, etc. While the stats between D1 and TD don't match up one to one, it should set the tone of how they work in TD. The detail that was <strong>never</strong> fully explained as I played TD was how these stats interact with other the related attributes: DPS / Health / Skill Power. </p>
<table>
<thead>
<tr>
<th style="text-align: center;">Icon</th>
<th style="text-align: center;">Stat</th>
<th style="text-align: center;">Modifier</th>
<th style="text-align: center;">Attribute</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;"><img src="http://share.mygeekdaddy.net/firearms-icon.png" style="display:block; background: #000; margin-left: auto; margin-right:auto; margin-bottom:2px; width:18px;" /></img></td>
<td style="text-align: center;">Firearms</td>
<td style="text-align: center;">1 Firearms point increases weapon damage (DPS) by 1%</td>
<td style="text-align: center;">DPS</td>
</tr>
<tr>
<td style="text-align: center;"><img src="http://share.mygeekdaddy.net/stamina-icon.png" style="display:block; background: #000; margin-left: auto; margin-right:auto; margin-bottom:2px; width:18px;" /></img></td>
<td style="text-align: center;">Stamina</td>
<td style="text-align: center;">1 Stamina point increases Health by 30 pts</td>
<td style="text-align: center;">Health (HP)</td>
</tr>
<tr>
<td style="text-align: center;"><img src="http://share.mygeekdaddy.net/electronics-icon.png" style="display:block; background: #000; margin-left: auto; margin-right:auto; margin-bottom:2px; width:18px;" /></img></td>
<td style="text-align: center;">Electronics</td>
<td style="text-align: center;">1 Electronics point increases Skill Power by 30 pts</td>
<td style="text-align: center;">Skill Power (SP)</td>
</tr>
</tbody>
</table>
<p>These numbers are just as important as your base stats because the attribute numbers dictate how your character interacts with the gaming environment. </p>
<p>Just like in D1, your primary stats in TD come from the gear you equip on your Agent. As more powerful gear (chest, backpack, holster, etc) is equipped, your stats will go up and/or change. You can adjust your stats even further with weapon mods and addition attributes on your equipment. More on weapon mods later. </p>
<h3>Agent Ability Tree</h3>
<p>The aspects of your character that are selectable are your abilities that enhance your Agent's strength and gameplay style. There are 3 types of abilities your Agent possesses:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Name</th>
<th style="text-align: center;">Division Descr</th>
<th style="text-align: center;">Destiny Equivalent</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Skills</td>
<td style="text-align: center;">Offensive or defensive abilities that have a cool down.</td>
<td style="text-align: center;">Grenade type / Melee effect</td>
</tr>
<tr>
<td style="text-align: center;">Talents</td>
<td style="text-align: center;">Combat enhancement perks triggered by certain actions</td>
<td style="text-align: center;">Auto reload behind shield wall</td>
</tr>
<tr>
<td style="text-align: center;">Perks</td>
<td style="text-align: center;">Passive abilities that affect character without any actions</td>
<td style="text-align: center;">Titan Codex I/II/III</td>
</tr>
</tbody>
</table>
<p>This list is what you're working on when you unlock the BoO. As you unlock the BoO, you will be given access to new Skills, Talents and Perks. This is why I recommend having your BoO 100% unlocked before moving on. </p>
<h4>Skills</h4>
<p>Skills are a set of abilities in TD that are the closest equivalent to D1's grenade/melee/super cool downs. The Skills your Agent can use are grouped into 2 normal skills and 1 signature skill. The 2 normal skills have a cool down equivalent to D1's grenade and melee cool down. Your signature skill is more powerful, like your D1 super, and therefore has a longer cool down. All skills are grouped by the talent resources in the BoO: Medical, Tech, and Security. </p>
<figure><a href="http://share.mygeekdaddy.net/Screen_Shot_2017-12-18_abilities.png"><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-12-18_abilities.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<table>
<thead>
<tr>
<th style="text-align: center;">Normal Skill</th>
<th style="text-align: center;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Pulse</td>
<td style="text-align: center;">Sends out recon pulse that marks hostiles and allies through walls and covers.</td>
</tr>
<tr>
<td style="text-align: center;">First Aid</td>
<td style="text-align: center;">Launches a localized device that heals all allies within a small radius.</td>
</tr>
<tr>
<td style="text-align: center;">Support Station</td>
<td style="text-align: center;">Drops a support station that heals allies and can be used to revive downed allies.</td>
</tr>
<tr>
<td style="text-align: center;">Sticky Bomb </td>
<td style="text-align: center;">Fires a bomb that sticks to most surfaces and explodes when detonated remotely.</td>
</tr>
<tr>
<td style="text-align: center;">Turret</td>
<td style="text-align: center;">Deploys a stationary turret that attacks nearby hostiles until it is destroyed or its battery runs out.</td>
</tr>
<tr>
<td style="text-align: center;">Seeker Mine</td>
<td style="text-align: center;">Releases an automated mine that seeks out hotile targets before exploding on proximity.</td>
</tr>
<tr>
<td style="text-align: center;">Ballistic Shield</td>
<td style="text-align: center;">Equips a portal Ballistic Shield that absorbs damage.<sup id="fnref:514832"><a class="footnote-ref" href="#fn:514832">4</a></sup></td>
</tr>
<tr>
<td style="text-align: center;">Smart Cover</td>
<td style="text-align: center;">Reinforces a cover, increasing the user’s damage and decreasing the incoming damage for all allies behind it.</td>
</tr>
<tr>
<td style="text-align: center;">Mobile Cover</td>
<td style="text-align: center;">Creates a temporary cover for one person, which provides standard cover protection until destroyed.</td>
</tr>
</tbody>
</table>
<table>
<thead>
<tr>
<th style="text-align: center;">Signature Skill</th>
<th style="text-align: center;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Recovery Link</td>
<td style="text-align: center;">Heals and cures the users and nearby allies. Revives downed allies within range.</td>
</tr>
<tr>
<td style="text-align: center;">Survivor Link </td>
<td style="text-align: center;">Increases damage resistance and speed for the users and nearby allies.</td>
</tr>
<tr>
<td style="text-align: center;">Tactical Link </td>
<td style="text-align: center;">Increases damage and critical hit chance to user and all nearby allies.</td>
</tr>
</tbody>
</table>
<h4>Talents</h4>
<p>Talents give your character some special abilities during gameplay to enhance the way you play. Your character can select 4 talents once the BoO is completely unlocked. <sup id="fnref:858440"><a class="footnote-ref" href="#fn:858440">5</a></sup></p>
<figure><a href="http://share.mygeekdaddy.net/talents_tree_td_2017-12-28.png"><img src="http://share.mygeekdaddy.net/talents_tree_td_2017-12-28.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<table>
<thead>
<tr>
<th style="text-align: center;">Talent</th>
<th style="text-align: center;">Description</th>
<th style="text-align: center;">Unlocked By</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Medical Wing</td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
</tr>
<tr>
<td style="text-align: center;">Adrenaline</td>
<td style="text-align: center;">Medkit gives 7s of immunity from status effects.</td>
<td style="text-align: center;">Decontamination Unit</td>
</tr>
<tr>
<td style="text-align: center;">Triage</td>
<td style="text-align: center;">Heal an ally with a skill to reduce skill cool downs by 15%.</td>
<td style="text-align: center;">Decontamination Unit</td>
</tr>
<tr>
<td style="text-align: center;">Shock and Awe</td>
<td style="text-align: center;">Suppress a hostile to increase movement speed by 25% for 10 seconds.</td>
<td style="text-align: center;">Pharmacy</td>
</tr>
<tr>
<td style="text-align: center;">Battle Buddy</td>
<td style="text-align: center;">Revive a downed agent to reduce incoming damage by 30% for 10 seconds for both players.</td>
<td style="text-align: center;">Pharmacy</td>
</tr>
<tr>
<td style="text-align: center;">Critical Save</td>
<td style="text-align: center;">Use a medkit during low health to increase damage resistance by 20% for 10 seconds.</td>
<td style="text-align: center;">Counseling</td>
</tr>
<tr>
<td style="text-align: center;">Shrapnel</td>
<td style="text-align: center;">Applying Bleed to any target triggers a 30% chance to apply the effect to all targets within 10m.</td>
<td style="text-align: center;">Counseling</td>
</tr>
<tr>
<td style="text-align: center;">Combat Medic</td>
<td style="text-align: center;">Use a medkit near allies to heal group members and proxies within 20m by 40%</td>
<td style="text-align: center;">Recharge Center</td>
</tr>
<tr>
<td style="text-align: center;">Strike Back</td>
<td style="text-align: center;">Reach low health to reduce active skill cool downs by 20%</td>
<td style="text-align: center;">Recharge Center</td>
</tr>
<tr>
<td style="text-align: center;">Tech Wing</td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
</tr>
<tr>
<td style="text-align: center;">Tactical Advance</td>
<td style="text-align: center;">Complete a cover to cover move to increase weapon damage by 2% per meter covered for 5s, max 30%.</td>
<td style="text-align: center;">Central Heating</td>
</tr>
<tr>
<td style="text-align: center;">Demolition Expert</td>
<td style="text-align: center;">Kill a hostile with an explosion to increase explosion damage by 20% for 15s.</td>
<td style="text-align: center;">Central Heating</td>
</tr>
<tr>
<td style="text-align: center;">Police Up</td>
<td style="text-align: center;">Kill a hostile with any skill for a 10% chance of auto-refilling all ammo types to capacity.</td>
<td style="text-align: center;">SatComms</td>
</tr>
<tr>
<td style="text-align: center;">Fear Tactics</td>
<td style="text-align: center;">Applying Shock to any target triggers a 30% chance to apply the effect to all targets within 10m.</td>
<td style="text-align: center;">SatComms</td>
</tr>
<tr>
<td style="text-align: center;">Evasive Action</td>
<td style="text-align: center;">During a cover to cover move incoming damage is reduced by 30%.</td>
<td style="text-align: center;">Recalibration</td>
</tr>
<tr>
<td style="text-align: center;">Tech Support</td>
<td style="text-align: center;">Kill a hostile while any skill is deployed to extended any active skills duration by 10%.</td>
<td style="text-align: center;">Recalibration</td>
</tr>
<tr>
<td style="text-align: center;">Wildfire</td>
<td style="text-align: center;">Applying Burn to any target triggers a 30% chance to apply the effect to all targets within 10m.</td>
<td style="text-align: center;">Recharge Center</td>
</tr>
<tr>
<td style="text-align: center;">Death by Proxy</td>
<td style="text-align: center;">Destroy a hostile’s deployed skill to increase skill power by 20% for 30s.</td>
<td style="text-align: center;">Recharge Center</td>
</tr>
<tr>
<td style="text-align: center;">Security Wing</td>
<td style="text-align: center;"></td>
<td style="text-align: center;"></td>
</tr>
<tr>
<td style="text-align: center;">Steady Hands</td>
<td style="text-align: center;">Enter any cover to reduce recoil by 25% for 10s.</td>
<td style="text-align: center;">Procurement Team</td>
</tr>
<tr>
<td style="text-align: center;">On the Move</td>
<td style="text-align: center;">Kill a hostile while moving to reduce incoming damage by 15% for 10s.</td>
<td style="text-align: center;">Guard Posts</td>
</tr>
<tr>
<td style="text-align: center;">Precision</td>
<td style="text-align: center;">Headshot a hostile to pulse them for 10s.</td>
<td style="text-align: center;">Guard Posts</td>
</tr>
<tr>
<td style="text-align: center;">Chain Reaction</td>
<td style="text-align: center;">Damage multiple hostiles with an explosion to apply 20% more damage from the blast.</td>
<td style="text-align: center;">Guard Posts</td>
</tr>
<tr>
<td style="text-align: center;">Desperate Times</td>
<td style="text-align: center;">Reach low health to increase blind fire accuracy by 20%.</td>
<td style="text-align: center;">Shooting Range</td>
</tr>
<tr>
<td style="text-align: center;">Stopping Power</td>
<td style="text-align: center;">Suppress a hostile to increase headshot damage by 25% for 10s.</td>
<td style="text-align: center;">Shooting Range</td>
</tr>
<tr>
<td style="text-align: center;">Repo Reaper</td>
<td style="text-align: center;">Kill a hostile with the sidearm to receive 30 rounds for your primary weapon.</td>
<td style="text-align: center;">Canine Unit</td>
</tr>
<tr>
<td style="text-align: center;">One is None</td>
<td style="text-align: center;">Headshot a hostile to have a 50% chance of not consuming the bullet.</td>
<td style="text-align: center;">Canine Unit</td>
</tr>
</tbody>
</table>
<p>My personal recommendations for a solo PVE player:</p>
<ul>
<li>Critical Save: Use a medkit during low health to increase damage resistance by 40% for 10 seconds.</li>
<li>Tech Support: Kill a hostile while any skill is deployed to extended any active skills duration by 10%.</li>
<li>On the Move: Kill a hostile while moving to reduce incoming damage by 30% for 10s.</li>
<li>One is None: Headshot a hostile to have a 50% chance of not consuming the bullet. </li>
</ul>
<p>Once you move into a group or PVP, the talent selection would change based on the type of gear and character you're playing - healer, tank, DPS, sniper, etc. </p>
<h4>Perks</h4>
<p>These are passive abilities that don't require any interaction or selection by you for your character. These are just additional <em>perks</em> your character has as your Agent levels up.</p>
<figure><a href="http://share.mygeekdaddy.net/perks_tree_td_2017-12-28.png"><img src="http://share.mygeekdaddy.net/perks_tree_td_2017-12-28.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<table>
<thead>
<tr>
<th style="text-align: center;">Perk Name</th>
<th style="text-align: center;">Description</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Medical Wing</td>
<td style="text-align: center;"></td>
</tr>
<tr>
<td style="text-align: center;">Medkits</td>
<td style="text-align: center;">Increases Medkit inventory by 1 slot.</td>
</tr>
<tr>
<td style="text-align: center;">Protective Measures</td>
<td style="text-align: center;">Increases Virus Protection by 1.</td>
</tr>
<tr>
<td style="text-align: center;">Supplier</td>
<td style="text-align: center;">Collect canned food, water, energy bar and soda in the Supply Line once per hour.</td>
</tr>
<tr>
<td style="text-align: center;">Contamination Intel</td>
<td style="text-align: center;">Reveal all contaminated areas on the map.</td>
</tr>
<tr>
<td style="text-align: center;">Hazardous Materials</td>
<td style="text-align: center;">Increases Dark Zone inventory by 1 slot.</td>
</tr>
<tr>
<td style="text-align: center;">Rigger</td>
<td style="text-align: center;">Collect fabric (crafting materials) in the Medical Wing once per hour.</td>
</tr>
<tr>
<td style="text-align: center;">Credit</td>
<td style="text-align: center;">Increase credit gains by 10%.</td>
</tr>
<tr>
<td style="text-align: center;">Tech Wing</td>
<td style="text-align: center;"></td>
</tr>
<tr>
<td style="text-align: center;">Inventory</td>
<td style="text-align: center;">Increase inventory by 10 slots.</td>
</tr>
<tr>
<td style="text-align: center;">Hazardous Materials</td>
<td style="text-align: center;">Increases Dark Zone inventory by 1 slot.</td>
</tr>
<tr>
<td style="text-align: center;">Division Tech Materials</td>
<td style="text-align: center;">Convert Division Tech crafting materials into other materials at the crafting station.</td>
</tr>
<tr>
<td style="text-align: center;">Engineer</td>
<td style="text-align: center;">Collect electronics (crafting materials) in the Tech Wing once per hour.</td>
</tr>
<tr>
<td style="text-align: center;">Soda</td>
<td style="text-align: center;">Increase Soda consumable effect duration by 10s.</td>
</tr>
<tr>
<td style="text-align: center;">Water</td>
<td style="text-align: center;">Increase Water consumable effect duration by 10s.</td>
</tr>
<tr>
<td style="text-align: center;">Craftsman</td>
<td style="text-align: center;">Collect tools (crafting materials) in the Tech Wing once per hour.</td>
</tr>
<tr>
<td style="text-align: center;">Energy Bar</td>
<td style="text-align: center;">Increase energy bar effect duration by 5s.</td>
</tr>
<tr>
<td style="text-align: center;">Resource Assessment</td>
<td style="text-align: center;">Reveal all Division Tech crafting nodes on the Dark Zone map.</td>
</tr>
<tr>
<td style="text-align: center;">Stat Switch</td>
<td style="text-align: center;">Unlock item stat switching at the Recalibration Station.</td>
</tr>
<tr>
<td style="text-align: center;">Dark Zone Funds</td>
<td style="text-align: center;">Increase looted Dark Zone fund gains by 10%.</td>
</tr>
<tr>
<td style="text-align: center;">Stash</td>
<td style="text-align: center;">Increase stash by 10 slots.</td>
</tr>
<tr>
<td style="text-align: center;">Security</td>
<td style="text-align: center;"></td>
</tr>
<tr>
<td style="text-align: center;">Experienced Agent</td>
<td style="text-align: center;">Increase XP gained from all activities by 10%.</td>
</tr>
<tr>
<td style="text-align: center;">Grenades</td>
<td style="text-align: center;">Increase the grenade inventory by 1 slot.</td>
</tr>
<tr>
<td style="text-align: center;">Advanced Weaponry</td>
<td style="text-align: center;">Unlock advanced weapons vendor in the Security Wing.</td>
</tr>
<tr>
<td style="text-align: center;">Combat Veteran</td>
<td style="text-align: center;">Increase XP gained from accolades by 25%.</td>
</tr>
<tr>
<td style="text-align: center;">Hazardous Materials</td>
<td style="text-align: center;">Increases Dark Zone inventory by 1 slot.</td>
</tr>
<tr>
<td style="text-align: center;">Black Market Vendor</td>
<td style="text-align: center;">Unlock Dark Zone fund purchases in the Base of Operations.</td>
</tr>
<tr>
<td style="text-align: center;">Clothes Vendor</td>
<td style="text-align: center;">Unlock a clothes vendor in the Base of Operations.</td>
</tr>
<tr>
<td style="text-align: center;">Explosive Bullets</td>
<td style="text-align: center;">Increase Explosive Bullets effect duration by 10s.</td>
</tr>
<tr>
<td style="text-align: center;">Gunsmith</td>
<td style="text-align: center;">Collect weapon parts (crafting materials) in the Security Wing once per hour.</td>
</tr>
<tr>
<td style="text-align: center;">Scavenger</td>
<td style="text-align: center;">Collect items from the scavenger box in the Security Wing once per hour.</td>
</tr>
<tr>
<td style="text-align: center;">Incendiary Bullets</td>
<td style="text-align: center;">Increase Incendiary Bullets effect duration by 10s.</td>
</tr>
<tr>
<td style="text-align: center;">Special Ammo</td>
<td style="text-align: center;">Collect incendiary and explosive bullets (ammo) in the Supply Line once per hour.</td>
</tr>
<tr>
<td style="text-align: center;">Shooting Range</td>
<td style="text-align: center;">Train in Marksmanship at the Shooting Range.</td>
</tr>
<tr>
<td style="text-align: center;">Intel Discovery</td>
<td style="text-align: center;">Completing Side Missions & Encounters, reveal all undiscovered Intel on the map in that zone.</td>
</tr>
<tr>
<td style="text-align: center;">Collector</td>
<td style="text-align: center;">Increases Scavenging by 15%.</td>
</tr>
</tbody>
</table>
<p>Next post, understanding how your equipment and gear influence your character.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:758582">
<p>When you will hear some of the NPC's in the game say <em>boo</em> , they meant BoO. <a class="footnote-backref" href="#fnref:758582" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:144004">
<p>Shout out <a href="https://www.bungie.net/en/ClanV2/Chat?groupId=1961061">Sparklepony</a>. <a class="footnote-backref" href="#fnref:144004" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:931771">
<p>Have your friend be team leader, go do things on the highest level you can play, and let them carry you through missions until your L30, BoO is unlocked, and you can play on WT5. <a class="footnote-backref" href="#fnref:931771" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:514832">
<p>The user can only use their sidearm while the shield is active. <a class="footnote-backref" href="#fnref:514832" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:858440">
<p>These are the Talent numbers as of patch 1.8. <a class="footnote-backref" href="#fnref:858440" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>Using Conditions for Tab Hiding2017-10-26T13:18:48-05:002017-10-26T13:18:48-05:00Jason Verlytag:mygeekdaddy.net,2017-10-26:/2017/10/26/using-conditions-for-tab-hiding/<p>My company recently migrated from Maximo 7.5 to 7.6. <sup id="fnref:783489"><a class="footnote-ref" href="#fn:783489">1</a></sup> One of the challenges an administrator has with a new version of Maximo is adjusting screens that come over as part of the upgrade. In our case we got a couple of new tabs because of new functionality …</p><p>My company recently migrated from Maximo 7.5 to 7.6. <sup id="fnref:783489"><a class="footnote-ref" href="#fn:783489">1</a></sup> One of the challenges an administrator has with a new version of Maximo is adjusting screens that come over as part of the upgrade. In our case we got a couple of new tabs because of new functionality in Maximo 7.6. For example, in WO Tracking we gained two new tabs for <em>Service Address</em> and <em>Map</em>. </p>
<figure><a href="http://share.mygeekdaddy.net/_MX_address_map_tab.jpg"><img src="http://share.mygeekdaddy.net/_MX_address_map_tab.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>While these are out of the box tabs, I don't necessarily want users to either be confused or have false expectations of what the tabs may do for them. On the flip side, I don't want to go into Application Designer and delete all that content, only to have to go back in and recreate it at a later date. So here's a way to hide information from a end users, while keeping the code in the app design. </p>
<h4>Setting the stage with a new Sig Option</h4>
<p>Go into Application Designer and open the app that has the extra tabs. In this example I'll be using WO Tracking after a Maixmo 7.6 upgrade. The goal will be to remove/hide the <code>Service Address</code> and <code>Map</code> tabs. </p>
<figure><img src="http://share.mygeekdaddy.net/_MX_address_map_tab.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Create a new Signature Option for the app. This is what will be used to setup the condition to hide a tab or field in the application. Hit 'Ok' to create the new signature option. </p>
<figure><img src="http://share.mygeekdaddy.net/_mx_signature_opt_wotrack.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>If you go to a group that normally has access to WO Tracking, you'll see the new Signature Option listed. By default we'll leave this blank so the tab/field will be hidden. </p>
<figure><img src="http://share.mygeekdaddy.net/_mx_security_setting_sig_opt.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<h4>Hide Tabs Without Permanent Changes</h4>
<p>Right click on the tab you want to hide and open the object's property. When the tab property dialog box opens, enter the <code>HIDE</code> sig option in the Advanced tab.</p>
<figure><img src="http://share.mygeekdaddy.net/_mx_tab_signature_sec_opt.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Continue with the same steps on the <code>MAPS</code> tab and any other sections you want to hide. </p>
<p>Save the changes to the application design file to apply the signature options on the tabs. </p>
<h4>Final Result</h4>
<p>Log out of Maximo and back in. The tabs in WO Tracking will now be hidden from a normal user. </p>
<figure><img src="http://share.mygeekdaddy.net/Work_Order_Tracking_2017-10-26.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>If your work processes eventually require the tabs to be visible to user, the signature option can be enabled in the Security Group and the tabs will be visible again. </p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-10-26_at_1.15.03_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>When you open WO Tracking with the signature option, the previously hidden tabs will now be visible. </p>
<figure><img src="http://share.mygeekdaddy.net/Work_Order_Tracking_2017-10-26_132423.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<div class="footnote">
<hr>
<ol>
<li id="fn:783489">
<p>Yes, I'm late to the party. ;-) <a class="footnote-backref" href="#fnref:783489" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Add Conditional Security to prevent WO Cancellation2017-10-12T08:30:20-05:002017-10-12T08:30:20-05:00Jason Verlytag:mygeekdaddy.net,2017-10-12:/2017/10/12/add-conditional-security-to-prevent-wo-cancellation/<p>A recent <a href="https://twitter.com/IBMIoTSupport/status/918411218746036224">tweet from IBM</a> on Maximo was technote about how a <a href="http://www-01.ibm.com/support/docview.wss?uid=swg22009519">work order could be cancelled</a>, even if materials were charged against the WO and recorded in the Actuals tab. For most long time Maximo users, the immediate reaction was, 'Pfffttt....that isn't possible.' IBM documented with 2 scenarios …</p><p>A recent <a href="https://twitter.com/IBMIoTSupport/status/918411218746036224">tweet from IBM</a> on Maximo was technote about how a <a href="http://www-01.ibm.com/support/docview.wss?uid=swg22009519">work order could be cancelled</a>, even if materials were charged against the WO and recorded in the Actuals tab. For most long time Maximo users, the immediate reaction was, 'Pfffttt....that isn't possible.' IBM documented with 2 scenarios in the technote and confirmed that if the actual cost of the materials charged were $0.00, the WO could be cancelled. </p>
<blockquote>
<p>The product design team have confirmed that a user is able to cancel a Work Order as long as the Material has a zero cost associated to it.</p>
</blockquote>
<p>Looking at this scenario, I looked back in our WO history and found a handful of jobs that were cancelled even though the WO had actuals recorded - albeit at $0.00.</p>
<p>The analogy I've used for a long time is that Maximo is like a large ball of clay. It takes time, patience and practice to mold Maximo into the application you really want it to be. So fortunately there's an easy work option to set up Maximo to prevent WO's from getting cancelled when $0.00 charges are accrued against a WO. Maximo allows administrators to place conditions on when a domain value can be selected. Work order status are domain values, so we can add a condition on when the CAN status can be selected by users. </p>
<h4>Step 1: Create Conditional Expression</h4>
<p>The base of our prevention plan will be a Conditional Expression that checks a WO for any transactions against the Actuals table (MATUSETRANS). The goal is to verify that the work order doesn't have any charges on the <code>MATUSETRANS</code> table. </p>
<p><code>not exists(select null from matusetrans where refwo = :wonum and tositeid = :siteid) and :historyflag=0 and :istask=0</code></p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-10-12_at_8.50.19_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<p>This condition is looking at the <code>MATUSETRANS</code> table and making sure a transaction for a work <em>does not</em> exist. That's the same logic we want to use for allowing/preventing the CAN status from showing up. </p>
<h4>Step 2: Location WO Status Domain</h4>
<p>The choice of statuses for a work order are controlled by a Domain labeled <code>WOSTATUS</code>. The Domain application can be found by going to: System Configuration → Platform Configuration → Domains</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-10-12_at_8.54.53_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<p>Once in the Domains app, search for the <code>WOSTATUS</code> domain. </p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-10-12_at_8.56.39_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Open the Domain and locate the 'CAN' domain value. Click the Detail arrow and then click 'View/Modify Conditions'.</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-10-12_at_8_58_55_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>This will open a new 'View/Modify Conditions' dialog box.</p>
<h4>Step 3: Create Condition on WO Status Domain</h4>
<p>Once the 'View/Modify Conditions' dialog box pop, click 'New Row' to add a new Condition to the CAN work order status. <sup id="fnref:195201"><a class="footnote-ref" href="#fn:195201">1</a></sup></p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-10-12_at_9.03.06_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></figure>
<p>Click 'OK' to apply the condition to the WO status domain value. </p>
<h4>Validate Condition</h4>
<p>I created a WO and issued a part that had a $0.00 value. This caused the WO to now have a record on the Actuals table. </p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-10-12_at_9.09.12_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>And now when I try to change the status, the CAN status is not an option:</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-10-12_at_9.10.28_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<p>At this point, the WO cannot be cancelled because of the Actuals entry and will have to follow normal WO closure process. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:195201">
<p>Note: depending on your system, you may have existing conditions on the CAN status. <a class="footnote-backref" href="#fnref:195201" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Getting ISO Date & Day of Week in BIRT2017-10-11T10:13:18-05:002017-10-11T10:13:18-05:00Jason Verlytag:mygeekdaddy.net,2017-10-11:/2017/10/11/getting-iso-date-day-of-week-in-birt/<p>I was recently asked a very specific request from an end user about a date format in a report. The requirement was to have the the date in the report come out as <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 860 date format</a> <em>and</em> include the day of the week in parenthesis. So if the date …</p><p>I was recently asked a very specific request from an end user about a date format in a report. The requirement was to have the the date in the report come out as <a href="https://en.wikipedia.org/wiki/ISO_8601">ISO 860 date format</a> <em>and</em> include the day of the week in parenthesis. So if the date on the report was Oct, 25, 2017, it should appear as <code>2017-10-25 (Wed)</code>. This is relatively easy to with the date formatting on just a date field and setting it to a custom date function of <code>yyyy-MM-dd</code>. <sup id="fnref:944413"><a class="footnote-ref" href="#fn:944413">1</a></sup> However, to get a mix of dates and days of the week, I knew this would be a dynamic text field. And the problem with dynamic text fields is you have to prep date formatting with the confines of javascript or BIRT variables. </p>
<p>Getting the ISO 8601 date format is pretty straight forward in a dynamic text field. You must take the date and break it down into 3 parts using the built in BIRT functions:</p>
<ul>
<li><code>BirtDateTime.year( BirtDateTime.today() )</code> for the year</li>
<li><code>BirtDateTime.month( BirtDateTime.today()</code> for the month</li>
<li><code>BirtDateTime.day( BirtDateTime.today()</code> for the day</li>
</ul>
<p>So I crated an <code>if \ else</code> statement to get the day of the week from the date. <sup id="fnref:612296"><a class="footnote-ref" href="#fn:612296">2</a></sup></p>
<p><code>if (BirtDateTime.weekDay( BirtDateTime.today() ) == 1)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Sun)'}</code>
<code>if (BirtDateTime.weekDay( BirtDateTime.today() ) == 2)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Mon)'}</code>
<code>if (BirtDateTime.weekDay( BirtDateTime.today() ) == 3)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Tue)'}</code>
<code>if (BirtDateTime.weekDay( BirtDateTime.today() ) == 4)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Wed)'}</code>
<code>if (BirtDateTime.weekDay( BirtDateTime.today() ) == 5)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Thu)'}</code>
<code>if (BirtDateTime.weekDay( BirtDateTime.today() ) == 6)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Fri)'}</code>
<code>if (BirtDateTime.weekDay( BirtDateTime.today() ) == 7)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Sat)'}</code></p>
<p>So the output of the of dynamic text for Oct 15, 2017 would be <code>2017-10-15 (Sun)</code>. </p>
<p>Perfect right?</p>
<p>Yeah, I thought it was too easy too. BIRT by default suppresses the leading zero for the <code>BirtDateTime.day()</code> function. So if the date was Nov 5, 2017, the output would actually be <code>2017-11-5 (Sun)</code>. That makes for an inconsistent presentation for ISO date format. The next trick was to use a child <code>if \ else</code> statement to check if the <code>BirtDateTime.day()</code> function was going to return a value between 1 and 9 or a value greater than 9. </p>
<p><code>if (BirtDateTime.weekDay( BirtDateTime.today() ) == 1)</code>
<code>if (BirtDateTime.day( BirtDateTime.today() ) <= 9)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '- 0' + BirtDateTime.day( BirtDateTime.today() ) + ' (Sun)' }</code>
<code>else { BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Sun)'}</code>
<code>else if (BirtDateTime.weekDay( BirtDateTime.today() ) == 2)</code>
<code>if (BirtDateTime.day( BirtDateTime.today() ) <= 9)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '- 0' + BirtDateTime.day( BirtDateTime.today() ) + ' (Mon)' }</code>
<code>else { BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Mon)'}</code>
<code>else if (BirtDateTime.weekDay( BirtDateTime.today() ) == 3)</code>
<code>if (BirtDateTime.day( BirtDateTime.today() ) <= 9)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '- 0' + BirtDateTime.day( BirtDateTime.today() ) + ' (Tue)' }</code>
<code>else { BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Tue)'}</code>
<code>else if (BirtDateTime.weekDay( BirtDateTime.today() ) == 4)</code>
<code>if (BirtDateTime.day( BirtDateTime.today() ) <= 9)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '- 0' + BirtDateTime.day( BirtDateTime.today() ) + ' (Wed)' }</code>
<code>else { BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Wed)'}</code>
<code>else if (BirtDateTime.weekDay( BirtDateTime.today() ) == 5)</code>
<code>if (BirtDateTime.day( BirtDateTime.today() ) <= 9)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '- 0' + BirtDateTime.day( BirtDateTime.today() ) + ' (Thu)' }</code>
<code>else { BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Thu)'}</code>
<code>else if (BirtDateTime.weekDay( BirtDateTime.today() ) == 6)</code>
<code>if (BirtDateTime.day( BirtDateTime.today() ) <= 9)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '- 0' + BirtDateTime.day( BirtDateTime.today() ) + ' (Fri)' }</code>
<code>else { BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Fri)'}</code>
<code>else if (BirtDateTime.weekDay( BirtDateTime.today() ) == 7)</code>
<code>if (BirtDateTime.day( BirtDateTime.today() ) <= 9)</code>
<code>{ BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '- 0' + BirtDateTime.day( BirtDateTime.today() ) + ' (Sat)' }</code>
<code>else { BirtDateTime.year( BirtDateTime.today() ) + '-' + BirtDateTime.month( BirtDateTime.today() ) + '-' + BirtDateTime.day( BirtDateTime.today() ) + ' (Sat)'}</code></p>
<p>So now I have a canned function that will return an ISO 8601 date format with the day of the week. </p>
<hr>
<p>Side note: In BIRT, the days of the week are as follows:</p>
<ul>
<li>1 = Sun</li>
<li>2 = Mon</li>
<li>3 = Tue </li>
<li>4 = Wed</li>
<li>5 = Thu</li>
<li>6 = Fri</li>
<li>7 = Sat</li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn:944413">
<p>Don't use <code>mm</code> because that's actually minutes in BIRT. <a class="footnote-backref" href="#fnref:944413" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:612296">
<p>Note the use of <code>BirtDateTime.today()</code> makes the date selection independent of database type (SQL, ORA, DB2). <a class="footnote-backref" href="#fnref:612296" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:150474">
<p>150474 <a class="footnote-backref" href="#fnref:150474" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Using Keyboard Maestro for Split View on macOS2017-10-04T21:27:29-05:002017-10-04T21:27:29-05:00Jason Verlytag:mygeekdaddy.net,2017-10-04:/2017/10/04/using-keyboard-maestro-for-split-view-on-macos/<p>With iOS 11 now out, a lot of my fellow geeks have been going on about the drag and drop features with split view on iPad. <sup id="fnref:748859"><a class="footnote-ref" href="#fn:748859">1</a></sup> iMore recently <a href="https://www.imore.com/wishing-better-split-view-management-macos">had a post</a> about using Split View on macOS. While I've known about the split view feature for a while, I've …</p><p>With iOS 11 now out, a lot of my fellow geeks have been going on about the drag and drop features with split view on iPad. <sup id="fnref:748859"><a class="footnote-ref" href="#fn:748859">1</a></sup> iMore recently <a href="https://www.imore.com/wishing-better-split-view-management-macos">had a post</a> about using Split View on macOS. While I've known about the split view feature for a while, I've never found it very functional. The biggest issue I have with Split View is the function locks the applications into their own <a href="https://support.apple.com/kb/PH25574?locale=en_US">Space</a>. So if you need a focused work area on two apps, <a href="https://support.apple.com/en-us/HT204948">Split View</a> is great, but normally I'm bouncing between multiple apps on dual monitors. </p>
<p>For a while I've been doing a lot of my macOS automation with <a href="https://www.keyboardmaestro.com/main/">Keyboard Maestro</a>.<sup id="fnref:30988"><a class="footnote-ref" href="#fn:30988">3</a></sup> The benefit of Keyboard Maestro (KM) are the system variables you can get from the application.</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-10-04_at_9.22.50_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<p>Now using the built in token from KM, I can create macros to manipulate application windows. </p>
<p>Right now I have 8 macros I use for window management:</p>
<ul>
<li>Move window to left side of 1st monitor</li>
<li>Move window to right side of 1st monitor</li>
<li>Move window to left side of 2nd monitor</li>
<li>Move window to right side of 2nd monitor</li>
<li>Full size on 1st monitor</li>
<li>Full size on 2nd monitor</li>
<li>Make window 1024x768 <sup id="fnref:804086"><a class="footnote-ref" href="#fn:804086">2</a></sup></li>
<li>Minimize window</li>
</ul>
<p>Here are the macro recipes for each. </p>
<h4>Move App Window to Left Side of 1st Monitor</h4>
<figure><img src="http://share.mygeekdaddy.net/_KM_leftside_1st.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; margin-top:10px; width:600px;" /></img></figure>
<h4>Move App Window to Left Side of 2nd Monitor</h4>
<figure><img src="http://share.mygeekdaddy.net/_KM_leftside_2nd.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; margin-top:10px; width:600px;" /></img></figure>
<h4>Move App Window to Right Side of 1st Monitor</h4>
<figure><img src="http://share.mygeekdaddy.net/_KM_rightside_1st.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; margin-top:10px; width:600px;" /></img></figure>
<h4>Move App Window to Right Side of 2nd Monitor</h4>
<figure><img src="http://share.mygeekdaddy.net/_KM_rightside_2nd.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; margin-top:10px; width:600px;" /></img></figure>
<h4>Move App Window to Full Screen of 1st Monitor</h4>
<figure><img src="http://share.mygeekdaddy.net/_KM_full_size_window.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; margin-top:10px; width:600px;" /></img></figure>
<h4>Move App Window to Full Screen of 2nd Monitor</h4>
<figure><img src="http://share.mygeekdaddy.net/_KM_full_size_2nd.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; margin-top:10px; width:600px;" /></img></figure>
<h4>Move App Window to 1024x768 size</h4>
<figure><img src="http://share.mygeekdaddy.net/_KM_1024_window.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; margin-top:10px; width:600px;" /></img></figure>
<h4>Minimize App Window</h4>
<figure><img src="http://share.mygeekdaddy.net/_KM_minimize_window.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; margin-top:10px; width:600px;" /></img></figure>
<h4>Download all 8 macros</h4>
<p>I've made a library of all eight macros that you can download and import into Keyboard Maestro: <a href="http://share.mygeekdaddy.net/Screen_Macros_Macros.kmlibrary">Window Management KB Macros</a></p>
<div class="footnote">
<hr>
<ol>
<li id="fn:748859">
<p>There should be a split view for iPhone too for file management, but that's just me. <a class="footnote-backref" href="#fnref:748859" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:804086">
<p>Useful for screen shots with Cmd-Shift-4 and then Spacebar. <a class="footnote-backref" href="#fnref:804086" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:30988">
<p>Finally saying bye-bye to Text Expander this week. <a class="footnote-backref" href="#fnref:30988" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>A conference that turned into a community2017-08-03T17:06:41-05:002017-08-03T17:06:41-05:00Jason Verlytag:mygeekdaddy.net,2017-08-03:/2017/08/03/a-conference-that-turned-into-a-community/<p><em>Community</em></p>
<p>It’s not normally the word you’d think of when describing your experiences at a conference. A conference is supposed to be about travel hassles, hotel reservations, PowerPoint slide decks, and bad diet choices. But this conference felt different before I even arrived. MaximoWorld 2017 was held at …</p><p><em>Community</em></p>
<p>It’s not normally the word you’d think of when describing your experiences at a conference. A conference is supposed to be about travel hassles, hotel reservations, PowerPoint slide decks, and bad diet choices. But this conference felt different before I even arrived. MaximoWorld 2017 was held at the Disney Swan & Dolphin, which happened to be the location of the last MaximoWorld conference back in 2007. So this already gave MaximoWorld 2017 a different vibe. </p>
<p>The conference was supposed to start on Tuesday, so I flew in the day before. I had been traveling for a good part of the day, so I checked in and got my things to my room. I needed to get a bite to eat and stretch my legs so I headed out to find something to eat. As I walked around I started to bump into people I had met over the years attending other conferences. But I wasn’t just chatting with fellow Maximo users, I was also getting to meet their spouses, their kids, and their grandkids. The vibe for the conference continued to change. </p>
<p>I finished dinner and headed back to the hotel to go over the slide deck and agenda for the Maximo Manufacturing & Life Sciences User Group (<a href="https://www.imwuc.org/mmug">MMUG</a>) session Tuesday morning. I thought this was going to be an amazing MMUG session. I spent 2 weeks putting a slide deck together for a very technical track session about automating work execution and utilizing scripting in BIRT reports. I pulled open my laptop, started looking at the slide deck, and made a few last minute changes. I went through the slide deck over and over, each time the content felt less right for the conference. </p>
<p>So I started to rewrite the <em>entire</em> agenda from <strong>scratch</strong>.</p>
<p>It was now 10:20pm the night before the conference and I was rewriting the agenda and the slide deck. When I had walked around earlier that night I started to think about how much things had changed - both personally and professionally - over the past 10 years since the last MaximoWorld. As I started to pull together ideas about the new agenda the content I was putting into the slide deck just began to flow. As I was making the changes it felt like this was what I should have done the first time. I wrapped up with the new slide deck and agenda around 2am. The conference was going to open in 6 hours and I had just changed everything I had planned to discuss. I’d never felt better about a presentation before.</p>
<p>The MMUG session opened at 8am and the room was packed. Everyone there was excited about the potential of the next 3 days. So we kicked off the session and it went better than I could have imagined. I had 3 great Maximo community members support me in the MMUG session - Dave Reiber (MMUG session co-chair), Brian Baird, and Paul Crocker. Each of them were tasked to add some content to the MMUG session because a speaker I had planned to participate could not make it at the last minute. So not only did I change what I was going to present, we now needed to ad hoc fill another hour of content because of the speaker we lost. I don’t believe the session could have gone any better. As Dave, Brian and Paul spoke they would discuss the content they wanted to bring to the MMUG session and as they closed their discussion it would just magically lead back into a topic I had in the slide deck - all without ANY rehearsal. I don’t believe I’ve ever had a session track feel so in tune as I did with this one. </p>
<p>As the conference continued I saw Maximo users talking their recent technical triumphs and upcoming project plans. I also saw Maximo users catching up with each other about their families, following up on recipe exchanges, and reminiscing about the last time they saw each other. I got to meet people in person that I’ve been communicating with on forums, email, or Twitter for years. We would just pick up on conversations as if we’d just saw each other last week. </p>
<p>As the conference was winding down, I started to put together my notes for this post. I knew I had experienced something more than a just a conference. On the last day of the conference there was a closing reception for attendees. I was lucky enough to stand next to Terrence O’Hanson, the CEO of Reliability Web, at the closing reception and he had a smile from ear to ear that was about as big as mine. We chatted about how we felt the conference flowed, how everyone was leaving with such a positive attitude, and what we could do next year. As we chatted we realized the size of the group hadn’t really diminished. The conference was over and everyone wanted to stay and keep chatting. Terry and I looked at each other, and like my unrehearsed opening session, we came to the same word... Community. </p>
<p>So yeah.... Community is the right word to describe MaximoWorld 2017.</p>My 10 years with the iPhone2017-06-29T13:11:54-05:002017-06-29T13:11:54-05:00Jason Verlytag:mygeekdaddy.net,2017-06-29:/2017/06/29/my-10-years-with-the-iphone/<p>So it was 10y ago today <sup id="fnref:17_06_29_13_48_30"><a class="footnote-ref" href="#fn:17_06_29_13_48_30">3</a></sup> that I got my first iPhone. Seems weird that a cell phone with a glass screen has affected my life so much. At first it was the anticipation of getting the original iPhone for the first time. I spent an entire 3 hour …</p><p>So it was 10y ago today <sup id="fnref:17_06_29_13_48_30"><a class="footnote-ref" href="#fn:17_06_29_13_48_30">3</a></sup> that I got my first iPhone. Seems weird that a cell phone with a glass screen has affected my life so much. At first it was the anticipation of getting the original iPhone for the first time. I spent an entire 3 hour flight on the day of the release planning and thinking on where would be the best place to go to get one. <sup id="fnref:17_06_29_13_21_23"><a class="footnote-ref" href="#fn:17_06_29_13_21_23">1</a></sup> I sat at my parent’s home, using their, wifi to connect and set up the iPhone for the first time. I was a recent convert to the Mac and seeing the devices work together, over everything else I had used to date, was like space magic. </p>
<p><img src="http://share.mygeekdaddy.net/IMG_0091.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></p>
<p>As new versions were released, there continued to be excitement around how Steve Jobs & Co. have evolved the iPhone. I was pre-ordered the 2nd iPhone because I had a full tilt case of "gotta have it" fever. This continued for a couple more iterations because the glow of the new screen and functionality was too enticing to pass up. <sup id="fnref:17_06_29_13_54_35"><a class="footnote-ref" href="#fn:17_06_29_13_54_35">4</a></sup></p>
<p>Then around the iPhone 4 things took a subtle change. This little device had now become part of my life. I used it at work and at home to keep my life organized. Disrupting this flow now poised to be an obstacle on the upgrade merry-go-round cycle I had been on for the past 4 years.</p>
<p>So I got off.</p>
<p>I stopped doing the annual upgrade each year. I started on the <em>'s'</em> upgrade cycle.<sup id="fnref:17_06_29_13_25_42"><a class="footnote-ref" href="#fn:17_06_29_13_25_42">2</a></sup> The slower pace felt less disruptive and the innovational changes from device to device felt more like the updates you got from the original iPhone to the iPhone 2 and onto the iPhone 3, etc. Right now I’m still rocking an iPhone 6s and feel less and less stressed about missing the annual trip the Apple store and the sizable hit to my bank account. </p>
<p>What has changed has been how I get my work done and versatility this little black box<sup id="fnref:17_06_29_13_57_36"><a class="footnote-ref" href="#fn:17_06_29_13_57_36">5</a></sup> has on my day to day activities. I can now dictate mental notes when my hands aren’t free, I can chat with my parents half way across the country, and I can run programs nearly on par to those on my Mac. </p>
<p>So as the 10 year anniversary draws closer, and everyone starts peaking at their calendar for Apple’s presumed September release, rumors continue to build up on what we’ll see. Even if the next iPhone includes all that’s been flying around the interwebs is true - full screen display, behind the glass finger print reader, wireless charging, etc. - it will never live up to the moment you opened the box on the original iPhone and saw that screen light up for the first time. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:17_06_29_13_21_23">
<p>Ended up being the Mall of America - walked right in and was done in 10 min. <a class="footnote-backref" href="#fnref:17_06_29_13_21_23" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:17_06_29_13_25_42">
<p>The upgrade from my 4s to 5s was the worst move I ever made. I loved the 4s size. <a class="footnote-backref" href="#fnref:17_06_29_13_25_42" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:17_06_29_13_48_30">
<p>If you don’t hear Sgt Pepper’s in that sentence there’s something wrong with you. <a class="footnote-backref" href="#fnref:17_06_29_13_48_30" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:17_06_29_13_54_35">
<p>And stickers... could never resist the Apple logo stickers. <a class="footnote-backref" href="#fnref:17_06_29_13_54_35" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:17_06_29_13_57_36">
<p>Because the phone bezel should always be black. <a class="footnote-backref" href="#fnref:17_06_29_13_57_36" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>Using multiple Conditional UI statements on 'READ' sigoption2017-06-02T11:22:10-05:002017-06-02T11:22:10-05:00Jason Verlytag:mygeekdaddy.net,2017-06-02:/2017/06/02/using-multiple-conditional-ui-statements-on-read-sigoption/<p>One of the best features in Maximo is to give users dynamic feedback on a record using the <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21614103">Conditional UI functionality in Maximo 7.x</a>. The goal of a Conditional UI statement in Maximo is to be able to look at a field and show an exception to that field's …</p><p>One of the best features in Maximo is to give users dynamic feedback on a record using the <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21614103">Conditional UI functionality in Maximo 7.x</a>. The goal of a Conditional UI statement in Maximo is to be able to look at a field and show an exception to that field's value is occurring because of a change to the default presentation (background color, field alignment, text size, etc). You can review the basics of setting up a conditional UI statements from existing IBM documentation - <a href="https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/IBM%20Maximo%20Asset%20Management/page/Conditionally%20changing%20user%20interface%20properties">Changing UI Properties</a> and <a href="https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/IBM%20Maximo%20Asset%20Management/page/Stylize%20a%20label%20or%20text%20control%20to%20draw%20attention%20to%20a%20field%20or%20value">Maximo CSS style options</a>.</p>
<p>An issue I ran into recently was setting up different conditional UI statements within a single application. The intent was to change the field color of the <code>PO.VENDOR</code> field if the vendor was disqualified and change the field color on the <code>POLINE.RECEIPTSCOMPLETE</code> field if all of the items on a PO line hadn't been received yet. </p>
<p>What I found was if using conditional UI on multiple fields against the 'READ' sigoption, you can run into overlapping conditions. The condition on the top is to verify if the vendor on the PO is disqualified. The condition on the bottom is to highlight if a PO line is not completely received. </p>
<figure><img src="http://share.mygeekdaddy.net/File_Jun_02_10_34_39_AM.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></figure>
<p>The original conditional UI statements were setup as:</p>
<ul>
<li>Vendor Disqualified: The original conditional expression was set as <code>:RECEIPTSCOMPLETE = 1</code> and the conditional statement would change a receipts complete field background field to yellow if the condition was false. </li>
<li>PO Line Receipts: The original conditional expression was set as <code>:vendor = (select COMPANY from companies where orgid = :orgid and company = :vendor and disabled = 1)</code> and the conditional statement would change the background color on the Vendor field on the PO main tab to red if the condition was true. </li>
</ul>
<p>This worked great for the PO Line Receipts, but caused every PO to show the Vendor field to be highlighted as well. <sup id="fnref:17_06_02_12_28_38"><a class="footnote-ref" href="#fn:17_06_02_12_28_38">2</a></sup> The solution was to apply the conditional UI statement to only be triggered when a condition was true. The conditional UI statements were updated so they would only be triggered if the condition was true:</p>
<ul>
<li>Vendor Disqualified: The original conditional expression was set as <code>:RECEIPTSCOMPLETE = 0</code> <sup id="fnref:84910"><a class="footnote-ref" href="#fn:84910">1</a></sup> and the conditional statement would change the formatting if the condition was true. </li>
<li>PO Line Receipts: The original conditional expression was set as <code>:vendor = (select COMPANY from companies where orgid = :orgid and company = :vendor and disabled = 1)</code> and the conditional statement would change the formatting if the condition was true. </li>
</ul>
<p>By making the adjustment to the conditional expression, we now want to change the UI when the PO line has not been fully received. This matches the intent of the other condition to highlight the PO vendor in the event the vendor was set to disqualified because <span style="text-decoration: underline;">both</span> conditional UI statements are triggered when the conditional expression is true. </p>
<p><strong>Bottom Line:</strong> If you're putting multiple conditions on the same sigoption, like <code>READ</code>, make sure to have all of the UI choices be against the same condition tab - e.g. all against 'Condition is True'. This will allow your formatting to show up only when you want the condition to be triggered. Otherwise you will get false positives on some of the other fields you've applied a conditional UI statement too. </p>
<hr>
<p><em>Side note:</em> One option to work around the situation above is to create a new sigoption and then use one sigoption for the first field and another sigoption for the second field. While this is technically a better solution, there are times where a Maximo administrator may have access to Application Designer, but not have access to User Group security. The solution above was given to work in most Maximo environments. </p>
<hr>
<p>Add a comment below if you have any other options to trigger different conditional UI statements in an application. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:84910">
<p>Note the change in the conditional expression. <a class="footnote-backref" href="#fnref:84910" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:17_06_02_12_28_38">
<p>Because a vendor shouldn't be disqualified on an open PO. ;-) <a class="footnote-backref" href="#fnref:17_06_02_12_28_38" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Reliability lessons from DevOps2017-05-15T21:10:00-05:002017-05-15T21:10:00-05:00Jason Verlytag:mygeekdaddy.net,2017-05-15:/2017/05/15/reliability-lessons-from-devops/<p>Over the years I've learned to pick up ideas and advice from wherever I can find it. I recently came across a tweet from <a href="https://twitter.com/ThePracticalDev">@ThePracticalDev</a> on <a href="https://dev.to/steliosvoskos/the-obligation-of-a-software-developer">the obligation of a software developer</a>. The article was originally written by Stelios Voskos (<a href="https://twitter.com/steliosvs91">@steliosvs91</a>) on the 5 rules a developer should follow. </p>
<figure><img src="http://share.mygeekdaddy.net/5_rules_for_devops_2017-05-15.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<p>What …</p><p>Over the years I've learned to pick up ideas and advice from wherever I can find it. I recently came across a tweet from <a href="https://twitter.com/ThePracticalDev">@ThePracticalDev</a> on <a href="https://dev.to/steliosvoskos/the-obligation-of-a-software-developer">the obligation of a software developer</a>. The article was originally written by Stelios Voskos (<a href="https://twitter.com/steliosvs91">@steliosvs91</a>) on the 5 rules a developer should follow. </p>
<figure><img src="http://share.mygeekdaddy.net/5_rules_for_devops_2017-05-15.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<p>What struck me funny was these were the same types of rules anyone concerned about their plant reliability should focus on as well. Here's how I took these 5 rules and applied them to maintenance and reliability. </p>
<h4>1. Find the best solution and not a solution</h4>
<p>This should be a universal mandate for anyone that works in reliability, maintenance or engineering. How many times have walked into a situation to hear, "Well Bob took a look at this yesterday and said he fixed it." <sup id="fnref:755839"><a class="footnote-ref" href="#fn:755839">1</a></sup> We all have a lot of pressure from Operations to <em>fix</em> whatever is wrong and get the plant running again. What we fall short of doing most of the time is to look at the situation and work towards a solution to <em>repair</em> the problem. Using bailing wire and duct tape, why effective when you have no other choice, is not the best solution to address problems in our plants. Alway try to bring options to the table the looks at the long term benefits to the equipment and the company. </p>
<h4>2. Do not write code you do not trust</h4>
<p>Most of us in the maintenance and reliability areas don't write code.<sup id="fnref:684353"><a class="footnote-ref" href="#fn:684353">2</a></sup> While we might not write code, we do have people in our groups that write the equivalent to code - job plans. Computer code is just a set of instructions to carry out specific tasks. The same can be said for job plans. Planners write down the steps a mechanic or technician will need to take to successfully complete the task they are assigned. But a job plan needs to be written in a way that builds trust between what the Planner envisioned needing to be done and how the mechanic understood the message.<sup id="fnref:996632"><a class="footnote-ref" href="#fn:996632">3</a></sup> If the Planner takes short cuts in the job plans and work details, technicians will begin to overlook the work details and eventually fail to do the task at hand. This can lead to premature failure, bad quality in your product, or injure someone. </p>
<h4>3. Learn how to say No. But also learn to negotiate.</h4>
<p>This one should be number one in my opinion. The work place can be a minefield of office politics, unknown agendas, and half truths. <em>OR</em>... the work place can be some where you communicate openly, people are held accountable, and project agendas are shared. Actually I bet you work somewhere in between those two extremes. But the one thing we can do to shift things for the better is to be honest about the limits we have in our day and just say no. Too many times we say yes just to appease the person in front of us or on the phone, when you know deep down there is no way we can keep the commitment you just made. The compromise to work towards is not a flat out <em>NO</em>, but respond back with "No, not now, but when?" No, I can't do what you're asking of me right this minute, but here's what I can do and how does that work with your schedule.<sup id="fnref:921744"><a class="footnote-ref" href="#fn:921744">4</a></sup> This type of communication opens the door to negotiating what you can get done, when someone really needs it done, and what we might have to change to meet everyone's needs.</p>
<h4>4. Respect your team members</h4>
<p>People drawn to a career in maintenance and reliability have a uniqueness about themselves. They are generally a technically minded person who understands the intricacies of equipment and processes. They are also generally not afraid to tell that you are wrong, why they are right, and why whoever worked on this piece of equipment last should be fired. <sup id="fnref:64418"><a class="footnote-ref" href="#fn:64418">5</a></sup> The challenge is that maintenance personnel are hard wired to think a certain way and don't always realize there are others that don't see the world with same perspective. We spend 8-10 hours a day, 5 days a week with our team members. There's some weeks where you will literally see the people at work more than you do your family and friends. So what kind of work place do we want to come to if we can't show respect to what is essentially your second family? <sup id="fnref:726043"><a class="footnote-ref" href="#fn:726043">6</a></sup> This one will probably take more practice and patience to adopt than any of the other rules. Why? We're not trying to change the way they think or act, but we're trying to open someone else's eyes to a new perspective on the world. That kind of change takes time to take root. </p>
<h4>5. Enhance an implementation. Do not criticize it.</h4>
<p>Rarely do we get to into a greenfield plant and layout the framework for a brand new maintenance program. Normally we come to a company that has an established department with its own set of policies and procedures. The least effective thing we can do is sit around and complain about how crazy the inventory restocking policy is. If its that crazy, take a few minutes to look at what could be changed. Look at what or how the department, or company, gain from making changes to the process. Does it increase work record accuracy? Does it minimize the number of purchases orders issued in a week? Does it make the department personnel less anxious about their jobs? Presenting an idea that enhances a existing procedure shows we're willing to adapt and build on the existing structure, not tear down or denigrate what others have done before you.</p>
<p>So what changes are you going to try to make in your department?</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:755839">
<p>My apologies to everyone named Bob. Maybe Sam looked at instead. <a class="footnote-backref" href="#fnref:755839" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:684353">
<p>But it's getting more and more common these days. <a class="footnote-backref" href="#fnref:684353" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:996632">
<p><a href="https://www.manager-tools.com/docs/Horstmans_Laws.pdf">Rule #2.</a> <a class="footnote-backref" href="#fnref:996632" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:921744">
<p>If the plant is down, it's down and you get to it. But if the plant is down everytime they come to you... you've got bigger problems to worry about. <a class="footnote-backref" href="#fnref:921744" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:64418">
<p>Generally speaking of course. <a class="footnote-backref" href="#fnref:64418" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:726043">
<p>We don't always get to pick our family members, but we can chose how we treat them. <a class="footnote-backref" href="#fnref:726043" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
</ol>
</div>What's wrong with the TouchBar MBP2017-04-05T14:26:27-05:002017-04-05T14:26:27-05:00Jason Verlytag:mygeekdaddy.net,2017-04-05:/2017/04/05/whats-wrong-with-the-touchbar-mbp/<p>Back in October, Apple released a new version of the MacBook Pro (MBP). </p>
<p><img src="http://share.mygeekdaddy.net/refurb-mbp15touchbar-space-gallery.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></p>
<p>Looking at the October released MBP, it's a gorgeous laptop. What's not to love. And timing couldn't have been better, because my MBP logic board on my 2012 model had just died and I was already looking …</p><p>Back in October, Apple released a new version of the MacBook Pro (MBP). </p>
<p><img src="http://share.mygeekdaddy.net/refurb-mbp15touchbar-space-gallery.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></p>
<p>Looking at the October released MBP, it's a gorgeous laptop. What's not to love. And timing couldn't have been better, because my MBP logic board on my 2012 model had just died and I was already looking for an upgrade. Apple announced the changes and my immediate reaction was this isn't the laptop I was hoping for. The larger trackpad, <sup id="fnref:641818"><a class="footnote-ref" href="#fn:641818">1</a></sup> the lack of ports, <sup id="fnref:523498"><a class="footnote-ref" href="#fn:523498">2</a></sup> or the thinness of power mantra <sup id="fnref:632253"><a class="footnote-ref" href="#fn:632253">3</a></sup> just didn't resonate with me. </p>
<p>When you compare the two laptops, the striking difference everyone notices is in the ports. </p>
<div>
<div>
<figure>
<img src="http://share.mygeekdaddy.net/SP704-ports_hero.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width: 300px;" /></img>
</figure>
</div>
<div>
<figure>
<img src="http://share.mygeekdaddy.net/mbp15touch-space-gallery1-201610.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img>
</figure>
</div>
</div>
<p>The 2015 MBP had a variety of ports - Thunderbolt, USB 3, SD Card, HDMI, etc. The 2016 MBP had 4 identical ports - USB C. As I kept looking at the new MBP, I still had this gut feeling that the new MBP was a step backwards. The trackpad and the power were there, but that wasn't the core issue. The ports were an issue, but that wasn't it alone.</p>
<p>Something struck me when I was sitting at my desk going over some pictures from a recent vacation. <sup id="fnref:747539"><a class="footnote-ref" href="#fn:747539">4</a></sup></p>
<figure><img src="http://share.mygeekdaddy.net/IMG_3053_001.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></figure>
<p>My normal workflow for post processing of pictures is:</p>
<ul>
<li>Collect photo's from SD cards.</li>
<li>Import photo's into Lightroom.</li>
<li>Tag and sort photo's.</li>
<li>Post process photos.</li>
<li>Create albums. </li>
</ul>
<p>With the TouchBar MBP, there would be a slight difference:</p>
<ul>
<li>Get SD Card dongle.</li>
<li>Collect photo's from SD cards.</li>
<li>Import photo's into Lightroom.</li>
<li>Tag and sort photo's.</li>
<li>Post process photos.</li>
<li>Create albums. </li>
</ul>
<p>It's the first step that changes <em>everything</em>. I'm not focused on my post-processing, I'm focused on making sure I have the right dongle to start the process. The new MBP shifts the focus on how I'd have to do my work. The focus is <strong>decentralized</strong> from my workflow and from my tool... the MBP. The whole purpose of a MBP is to have a mobile work experience. Needing to remember if I have the right dongles with makes me lose focus on what I'm working on. Is that a subtle point, yes. But any distraction from the work I want to do is still a distraction that makes me less effective in the work I want to get done. </p>
<p>And that subtle shift in focus is a very big problem for creative and professional users. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:641818">
<p>Because I already had problems bumping it while typing on my work MBP. <a class="footnote-backref" href="#fnref:641818" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:523498">
<p>Because I already had a bag full of dongles. <a class="footnote-backref" href="#fnref:523498" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:632253">
<p>Because I still run out of power on my "ultra long" battery. <a class="footnote-backref" href="#fnref:632253" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:747539">
<p>This is what an adult looks like when he's giggling like a 6y old. <a class="footnote-backref" href="#fnref:747539" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Cheese your way to 50 extra motes of light2017-03-31T08:54:22-05:002017-03-31T08:54:22-05:00Jason Verlytag:mygeekdaddy.net,2017-03-31:/2017/03/31/cheese-your-way-to-50-extra-motes-of-light/<p>With Age of Triumph comes the revival of some old time favorite weapons. The first one Bungie revealed is the Nechrochasm. This exotic auto rifle is obtainable by finding a weapon drop, called Husk of the Pit, from certain Hive enemies. Once this happens you begin a quest line to …</p><p>With Age of Triumph comes the revival of some old time favorite weapons. The first one Bungie revealed is the Nechrochasm. This exotic auto rifle is obtainable by finding a weapon drop, called Husk of the Pit, from certain Hive enemies. Once this happens you begin a quest line to get the full exotic AR. One of the steps in this process is you upgrade the Husk of the Pit to a legendary version of the AR called the Eidolon Ally. When transform the AR into the Eidolon Ally, you're directed to go talk to The Speaker. The Speaker will give you 25 motes of light to full upgrade the legendary AR. </p>
<p>There's a way to repeat this step fairly quickly on your alt characters to get an additional 50 motes of light for free.</p>
<ol>
<li>All the steps assume you have an Eidolon Ally on your main character. This means you've filled out your Husk of the Pit and have already spoken to The Speaker to get your first 25 motes of light. </li>
<li>On your first alt character, make sure you've run to the tower and have opened the Age of Triumph book. </li>
<li>On your first alt character, go into the the NF this week (3/28) and farm the Ogres in the very first section for a 2nd Husk of the Pit for your alt. Keep farming until you get one. Pick it up and get the first step of the quest line for the Necrochasm. </li>
<li>Go to orbit, and using DIM/Ishtar, transfer the Husk of the Pit to your vault and transfer your Eidolon Ally to your alt character. If you don't have an item manager, you'll need to switch characters to place the Husk in the vault and switch around the Eidolon Ally. </li>
<li>Once you put the Eidolon Ally in your Primary weapon list, the quest line for the Necrochasm will now update and say you need to talk to the The Speaker. </li>
<li>Go to the Tower and get your 25 motes of light from The Speaker. </li>
<li>Switch characters and repeat steps 2-6.</li>
</ol>
<p>You now have an extra 50 motes of light. </p>The lost art of the discerning eye2017-03-29T11:03:13-05:002017-03-29T11:03:13-05:00Jason Verlytag:mygeekdaddy.net,2017-03-29:/2017/03/29/the-lost-art-of-the-discerning-eye/<p>In the world of email and tweets, you sometimes can get some interesting information from some unusual places. I recently lost my iPad and a friend my knew that. A couple weeks ago I got an email about an article I should read because he knew I had lost my …</p><p>In the world of email and tweets, you sometimes can get some interesting information from some unusual places. I recently lost my iPad and a friend my knew that. A couple weeks ago I got an email about an article I should read because he knew I had lost my iPad. The post was from Brian Krebs(<a href="https://www.twitter.com/briankrebs">@briankrebs</a>), a security blogger, but not someone I thought my friend would normally read. The blog post was about how a group of scammers were tricking people who had lost an iOS device into clicking a malicious link - <a href="https://krebsonsecurity.com/2017/03/if-your-iphone-is-stolen-these-guys-may-try-to-iphish-you/">If Your iPhone is Stolen, These Guys May Try to iPhish You</a>.</p>
<p>The post was already in my RSS feed<sup id="fnref:404194"><a class="footnote-ref" href="#fn:404194">1</a></sup> and so I was ready to ready through Brian's post. As I read through the post I was more alarmed about some of the misleading statements than the actual phishing scam. Brian led the post with a clarification statement </p>
<blockquote>
<p>That security professional source — referred to as “John” for simplicity’s sake — declined to be named or credited in this story because some of the actions he took to gain the knowledge presented here may run afoul of U.S. computer fraud and abuse laws.</p>
</blockquote>
<p>Cool. For the non-IT security professional that means "John" <em>hacked</em> the scammers back to figure out what they were doing. And by hacked, I mean "John" did things that could get him arrested. The post continues with a summary of how "John" back traced the steps and methods the scammers were taking. Part of this process required "John" to access servers or accounts held by the scammers. From Brian's post:</p>
<blockquote>
<p>John said he was able to guess the passwords for at least six other accounts on the iCloud phishing service, including one particularly...</p>
</blockquote>
<p>Not cool. When my friend followed up on his email about reading the post, his first question was, 'How did he guess those guy's passwords?' "John" didn't sit at his computer and magically guess the password like we see on TV, he used very specific tools and techniques to extract the passwords from the scammer's accounts. The article completely glossed over how "John" got into the scammer's accounts and would lead an average person to think "John" had magical powers. </p>
<p>Then this morning it happened again - different friend, same panic note. My friend was alarmed about how scammers were locking people out of their iPhones. I looked at the link he forwarded me and again <a href="https://www.grahamcluley.com/scareware-scammers-lock-ios-safari-to-extort-ransom-from-users/">I knew the post in question</a> because it was a security blogger Graham Culey (<a href="https://twitter.com/gcluley">@gcluley</a>), who was also in my RSS feed. I also knew Apple had fixed this in a the <a href="http://appleinsider.com/articles/17/03/27/apples-ios-103-patches-mobile-safari-bug-used-in-ransomware-campaign">recent 10.3 iOS update</a>. </p>
<p>Sadly my RSS feed showed this: </p>
<figure><img src="http://share.mygeekdaddy.net/rss_feed_image_2017-03-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<p>And when I opened the actual article, it looked like this:</p>
<figure><img src="http://share.mygeekdaddy.net/ios_ransom_screenshot_2017-03-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<p>Wow. There's a by-line that states this is fixed, but if you read the head line and the first part of the article it reads like this is something that can happen today and there is nothing you can do about it. At the point in the article the general reader would be freaking out, the article mentions the steps to fix the problem and then mentions Apple actually fixed it. </p>
<p>I don't mean to pick on Brian or Graham and the great work they do, but I'm using these posts as an example of what I've been seeing more and more from technical journalists <sup id="fnref:373794"><a class="footnote-ref" href="#fn:373794">2</a></sup> - the glossing over of details or misleading those not informed about a topic. I'm frustrated that we're seeing more "click bait" type headlines or articles from people we have trusted to explain technical and complex topics to the general public. </p>
<p>We get upset about news outlets that spin information we can get from multiple sources, we should be infuriated when it happens to our much narrower information channels. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:404194">
<p>Get off my lawn. ;-) <a class="footnote-backref" href="#fnref:404194" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:373794">
<p>Someone who reports on a topic that has technical or scientific aspect not well understood by the general population. <a class="footnote-backref" href="#fnref:373794" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Knowing your Python scripting environment2017-03-02T09:01:14-06:002017-03-02T09:01:14-06:00Jason Verlytag:mygeekdaddy.net,2017-03-02:/2017/03/02/knowing-your-python-scripting-environment/<p>My preferred learning method is to get a good example of how to do something and work on extending the example to do what I <em>really</em> want it to do. One of my favorite blogs I follow that let's me do this is <a href="https://www.twitter.com/drdrang">@DrDrang</a>'s blog - <a href="http://leancrew.com/all-this/">And now it’s …</a></p><p>My preferred learning method is to get a good example of how to do something and work on extending the example to do what I <em>really</em> want it to do. One of my favorite blogs I follow that let's me do this is <a href="https://www.twitter.com/drdrang">@DrDrang</a>'s blog - <a href="http://leancrew.com/all-this/">And now it’s all this</a>. Dr Drang has a recent series of posts on some of his screenshot automation methods (<a href="http://leancrew.com/all-this/2017/02/screenshots-with-snapclip/">SnanClip</a> / <a href="http://leancrew.com/all-this/2017/02/screenshots-with-snapscp/">ScanSCP</a>) along with a great primer on <a href="http://leancrew.com/all-this/2017/02/ssh-keys/">SSH keys</a> to load screenshot images to his website.</p>
<p style="border: #1863a1 1px solid; border-radius: 10px; padding: 10px; margin: 0px 25px 25px 25px; background-color: rgb(251,239,153);">Caveat: The good Dr Drang again <a href="http://leancrew.com/all-this/2017/03/the-keyboard-maestro-scripting-environment/">beat me to the publish button</a> on this exact topic.</p>
<p>So earlier this week I was working through his post on ScanClip and trying to replicate the process on my Mac. In a tweet that was way too late in the day,<sup id="fnref:71639"><a class="footnote-ref" href="#fn:71639">1</a></sup> I asked in a frustrated tone about the <code>Pashua</code> module he used in his scripts.</p>
<blockquote><a href="https://twitter.com/drdrang">@drdrang</a> Pls add a footnote on how to get the Pashua module to load. Nothing I do can get Python to load the Pashua module.</p>— Jason Verly (@mygeekdaddy) <a href="https://twitter.com/mygeekdaddy/status/836483471665147904">February 28, 2017</a></blockquote>
<p>I could run a test script from Terminal and load the <code>Pashua</code> module without any issues. Attempting the same test script in Keyboard Maestro would end up with an error similar to this:</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-03-02_at_9.26.22_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Grrr.... so why does Terminal load the module and Keyboard Maestro won't?</p>
<p>After sleeping on the problem,<sup id="fnref:304741"><a class="footnote-ref" href="#fn:304741">2</a></sup> I remembered that I actually have two versions of Python on my MBP. Apple has been notorious for not updating their built-in scripting environments in a timely manner.<sup id="fnref:33940"><a class="footnote-ref" href="#fn:33940">3</a></sup> So I have been using a version of Python via <a href="https://brew.sh">Homebrew</a>. So when I had to copy the <code>Pashua.py</code> module to my local Python environment, I copied it to my Homebrew version of Python. After realizing I had two versions of Python, I needed to see what version Terminal and Keyboard Maestro were using. </p>
<p>As expected, Terminal returned with the version of Python from Homebrew:</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-03-02_at_9.19.15_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>But looking at the environment from Keyboard Maestro, it returned this:</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-03-02_at_10.13.30_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Bingo! Keyboard Maestro was using the default macOS version of Python. Since the Python version Keyboard Maestro was trying to use didn't have the <code>Pashua.py</code> module installed, the KM snippet borked out on my test script. After this discovery, I updated the script from Dr Drang and forced the KM snippet to use the Homebrew version of Python. The differences between the two scripts are startling.<sup id="fnref:524997"><a class="footnote-ref" href="#fn:524997">4</a></sup></p>
<p>Dr Drang original script (top 15 lines):</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/bin/python</span>
<span class="kn">import</span> <span class="nn">Pashua</span>
<span class="kn">import</span> <span class="nn">tempfile</span>
<span class="kn">import</span> <span class="nn">Image</span>
<span class="kn">import</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">subprocess</span>
<span class="kn">import</span> <span class="nn">urllib</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">date</span>
<span class="c1"># Parameters</span>
<span class="n">dstring</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span>
<span class="nb">type</span> <span class="o">=</span> <span class="s2">"png"</span>
<span class="n">localdir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'HOME'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"/Pictures/Screenshots"</span>
<span class="o">....</span>
</code></pre></div></td></tr></table></div>
<p>MyGeekDaddy updated script (top 15 lines):</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal"> 1</span>
<span class="normal"> 2</span>
<span class="normal"> 3</span>
<span class="normal"> 4</span>
<span class="normal"> 5</span>
<span class="normal"> 6</span>
<span class="normal"> 7</span>
<span class="normal"> 8</span>
<span class="normal"> 9</span>
<span class="normal">10</span>
<span class="normal">11</span>
<span class="normal">12</span>
<span class="normal">13</span>
<span class="normal">14</span>
<span class="normal">15</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/usr/local/bin/python</span>
<span class="kn">import</span> <span class="nn">Pashua</span>
<span class="kn">import</span> <span class="nn">tempfile</span>
<span class="kn">import</span> <span class="nn">Image</span>
<span class="kn">import</span> <span class="nn">sys</span><span class="o">,</span> <span class="nn">os</span><span class="o">,</span> <span class="nn">os.path</span>
<span class="kn">import</span> <span class="nn">subprocess</span>
<span class="kn">import</span> <span class="nn">urllib</span>
<span class="kn">from</span> <span class="nn">datetime</span> <span class="kn">import</span> <span class="n">date</span>
<span class="c1"># Parameters</span>
<span class="n">dstring</span> <span class="o">=</span> <span class="n">date</span><span class="o">.</span><span class="n">today</span><span class="p">()</span><span class="o">.</span><span class="n">strftime</span><span class="p">(</span><span class="s1">'%Y%m</span><span class="si">%d</span><span class="s1">'</span><span class="p">)</span>
<span class="nb">type</span> <span class="o">=</span> <span class="s2">"png"</span>
<span class="n">localdir</span> <span class="o">=</span> <span class="n">os</span><span class="o">.</span><span class="n">environ</span><span class="p">[</span><span class="s1">'HOME'</span><span class="p">]</span> <span class="o">+</span> <span class="s2">"/Pictures/Screenshots"</span>
<span class="o">....</span>
</code></pre></div></td></tr></table></div>
<p>Simply changing the first line from <code>#!/usr/bin/python</code> to <code>#!/usr/local/bin/python</code> solved all my issues.</p>
<hr>
<p><strong>Update:</strong> In the scripts Dr Drang uses for his two KM snippets, ScanSCP uses a hard coded reference on what Python interpreter to use and ScanClip used the <code>!#/usr/bin/env python</code>. This was originally part of the problem I was struggling with because the script I <em>originally</em> started to look at was the ScanClip version. I switched over to the ScanSCP because I liked the idea of using <code>scp</code> to copy the clipped image to a folder on my website. </p>
<p>Dr Drang followed up on this post and pointed out:</p>
<blockquote><a href="https://twitter.com/mygeekdaddy">@mygeekdaddy</a> I will only add that if you use<br><br>#!/usr/bin/env python<br><br>you’ll also get /usr/bin/python in KM.</p>— Dr. Drang (@drdrang) <a href="https://twitter.com/drdrang/status/837366271800983553">March 2, 2017</a></blockquote>
<p>This point wasn't obvious in my findings. The <a href="http://stackoverflow.com/questions/2429511/why-do-people-write-usr-bin-env-python-on-the-first-line-of-a-python-script">best practice</a> is to use <code>#!/usr/bin/env python</code> in a Python script. However when you're scripting from inside Keyboard Maestro, using that statement to set your environment will refer back to the macOS default Python instance, and not the Homebrew version I'm normally using. </p>
<hr>
<h4>Keyboard Maestro</h4>
<p>The KM snippet that I used to test the Python environment was:</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-03-02_at_10.26.21_AM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>KM will then use the built in notification tools in macOS to display the text.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:71639">
<p>Or way too early. Hard to tell at 1:49am. <a class="footnote-backref" href="#fnref:71639" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:304741">
<p>Which is what I should have done in the first place. <a class="footnote-backref" href="#fnref:304741" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:33940">
<p>As of today, out of the box Python on macOS is 2.7.10, not the current 2.7.13. <a class="footnote-backref" href="#fnref:33940" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:524997">
<p>Ok... not so startling. <a class="footnote-backref" href="#fnref:524997" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>iOS Photo Merge for Pythonista 32017-02-27T11:57:58-06:002017-02-27T11:57:58-06:00Jason Verlytag:mygeekdaddy.net,2017-02-27:/2017/02/27/ios-photo-merge-for-pythonista-3/<p>One of the changes I've been <em>trying</em> to adopt with shifting more of my <a href="http://mygeekdaddy.net/2017/02/06/the-case-of-the-ipad-experiment/">workflows to my iPad</a> has been to also move to my scripting from <a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&uo=4" title="Pythonista">Pythonista</a> to <a href="https://itunes.apple.com/us/app/pythonista-3/id1085978097?mt=8&uo=4" title="Pythonista">Pythonista 3</a>. The key here is the original Pythonista app used Python 2 as the core language, while Pythonista 3 uses …</p><p>One of the changes I've been <em>trying</em> to adopt with shifting more of my <a href="http://mygeekdaddy.net/2017/02/06/the-case-of-the-ipad-experiment/">workflows to my iPad</a> has been to also move to my scripting from <a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&uo=4" title="Pythonista">Pythonista</a> to <a href="https://itunes.apple.com/us/app/pythonista-3/id1085978097?mt=8&uo=4" title="Pythonista">Pythonista 3</a>. The key here is the original Pythonista app used Python 2 as the core language, while Pythonista 3 uses Python 3. The move to Python 3 has been tougher road to hoe than I originally thought it was going to be. Beyond the syntax changes in Python 3, some of the underlying libraries in Pythonista 3 have also been updated as well. </p>
<p>For example, in one of the most common iOS automation scripts I use is merging two images, applying a background border, and saving the merged image as a new file. The script pops up a dialog box and asks me to select an image from my photo library. </p>
<p>In the original Pythonista app this was two lines of code:</p>
<div class="highlight"><pre><span></span><code>console.alert("Pick first image", "", "Select")
im1 = photos.pick_image(show_albums=True)
</code></pre></div>
<p>Pythonista updated it's libraries and that same line of code looks like this now:</p>
<div class="highlight"><pre><span></span><code>console.alert("Pick first image", "", "Select")
im1 = photos.pick_asset()
</code></pre></div>
<p>In Pythonista 3, this required an additional step to assign the selected image to a variable:</p>
<div class="highlight"><pre><span></span><code>console.alert("Pick first image", "", "Select")
img1 = photos.pick_asset()
img1 = img1.get_image()
</code></pre></div>
<p>After spending sometime over the weekend I finally got my photo merge script updated for Pythonista 3. </p>
<div class="highlight"><pre><span></span><code><span class="kn">import</span> <span class="nn">clipboard</span>
<span class="kn">from</span> <span class="nn">PIL</span> <span class="kn">import</span> <span class="n">Image</span>
<span class="kn">import</span> <span class="nn">console</span>
<span class="kn">import</span> <span class="nn">photos</span>
<span class="n">console</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">console</span><span class="o">.</span><span class="n">alert</span><span class="p">(</span><span class="s2">"Pick first image"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">"Select"</span><span class="p">)</span>
<span class="n">img1</span> <span class="o">=</span> <span class="n">photos</span><span class="o">.</span><span class="n">pick_asset</span><span class="p">()</span>
<span class="n">img1</span> <span class="o">=</span> <span class="n">img1</span><span class="o">.</span><span class="n">get_image</span><span class="p">()</span>
<span class="n">console</span><span class="o">.</span><span class="n">alert</span><span class="p">(</span><span class="s2">"Pick second image"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">"Select"</span><span class="p">)</span>
<span class="n">img2</span> <span class="o">=</span> <span class="n">photos</span><span class="o">.</span><span class="n">pick_asset</span><span class="p">()</span>
<span class="n">img2</span> <span class="o">=</span> <span class="n">img2</span><span class="o">.</span><span class="n">get_image</span><span class="p">()</span>
<span class="n">console</span><span class="o">.</span><span class="n">show_activity</span><span class="p">()</span>
<span class="n">w1</span><span class="p">,</span> <span class="n">h1</span> <span class="o">=</span> <span class="n">img1</span><span class="o">.</span><span class="n">size</span>
<span class="n">w2</span><span class="p">,</span> <span class="n">h2</span> <span class="o">=</span> <span class="n">img2</span><span class="o">.</span><span class="n">size</span>
<span class="c1"># Set the width and height of each image</span>
<span class="n">img1_w</span> <span class="o">=</span> <span class="n">img1</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">img1_h</span> <span class="o">=</span> <span class="n">img1</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">img2_w</span> <span class="o">=</span> <span class="n">img2</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">img2_h</span> <span class="o">=</span> <span class="n">img1</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">image_merge</span><span class="p">(</span><span class="n">img</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">img1_w</span> <span class="o">*</span> <span class="mf">1.0</span><span class="p">)</span> <span class="o">/</span> <span class="n">img1_h</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
<span class="c1"># Landscape screenshot</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Landscape screenshot..."</span><span class="p">)</span>
<span class="n">background</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">'RGB'</span><span class="p">,</span> <span class="p">((</span><span class="n">img1_w</span><span class="o">+</span><span class="mi">20</span><span class="p">),</span> <span class="p">((</span><span class="n">img1_h</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span><span class="o">+</span><span class="mi">30</span><span class="p">)),</span> <span class="p">(</span><span class="mi">88</span><span class="p">,</span><span class="mi">88</span><span class="p">,</span><span class="mi">88</span><span class="p">))</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">"Generating image..."</span><span class="p">)</span>
<span class="n">background</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">img1</span><span class="p">,(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="n">background</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">img2</span><span class="p">,(</span><span class="mi">10</span><span class="p">,(</span><span class="n">img1_h</span><span class="o">+</span><span class="mi">20</span><span class="p">)))</span>
<span class="n">photos</span><span class="o">.</span><span class="n">save_image</span><span class="p">(</span><span class="n">background</span><span class="p">)</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">"Image saved"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="c1">#Portrait screenshot</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">"Portrait screenshot..."</span><span class="p">)</span>
<span class="n">background</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">'RGB'</span><span class="p">,</span> <span class="p">(((</span><span class="n">img1_w</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span><span class="o">+</span><span class="mi">30</span><span class="p">),(</span><span class="n">img1_h</span><span class="o">+</span><span class="mi">20</span><span class="p">)),</span> <span class="p">(</span><span class="mi">88</span><span class="p">,</span> <span class="mi">88</span><span class="p">,</span> <span class="mi">88</span><span class="p">))</span>
<span class="nb">print</span> <span class="p">(</span><span class="s2">"Generating image..."</span><span class="p">)</span>
<span class="n">background</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">img1</span><span class="p">,(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="n">background</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">img2</span><span class="p">,((</span><span class="n">img1_w</span><span class="o">+</span><span class="mi">20</span><span class="p">),</span><span class="mi">10</span><span class="p">))</span>
<span class="n">photos</span><span class="o">.</span><span class="n">save_image</span><span class="p">(</span><span class="n">background</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Image saved"</span><span class="p">)</span>
<span class="k">if</span> <span class="n">img1_w</span> <span class="o">==</span> <span class="n">img2_w</span><span class="p">:</span>
<span class="n">image_merge</span><span class="p">(</span><span class="n">img1</span><span class="p">)</span>
<span class="nb">print</span><span class="p">(</span><span class="s2">"Done..."</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">console</span><span class="o">.</span><span class="n">alert</span><span class="p">(</span><span class="s2">"Incorrect image ratio"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">"Ok"</span><span class="p">)</span>
</code></pre></div>
<p>Here's a GitHub Gist for easier downloading: <a href="https://gist.github.com/mygeekdaddy/d1c7a1059ac51d802830f6bf46d785a4">photo_merge_p3.py</a></p>
<p>As I've looked at some of my key iOS Pythonista scripts I'm finding more subtle changes. I'll continue to point out some of the discoveries I make in my move to Pythonista 3/Python 3. </p>View Footer/Header in Word 20162017-02-20T14:14:04-06:002017-02-20T14:14:04-06:00Jason Verlytag:mygeekdaddy.net,2017-02-20:/2017/02/20/view-footerheader-in-word-2016/<p>This post is more for me to have a public reference point when I have this problem again. <sup id="fnref:311971"><a class="footnote-ref" href="#fn:311971">1</a></sup> Out of the box, Word 2016 for macOS has a problem of not showing the header or footer when you create a new document. </p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-02-20_at_2.17.10_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>For the longest time I was trying …</p><p>This post is more for me to have a public reference point when I have this problem again. <sup id="fnref:311971"><a class="footnote-ref" href="#fn:311971">1</a></sup> Out of the box, Word 2016 for macOS has a problem of not showing the header or footer when you create a new document. </p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-02-20_at_2.17.10_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>For the longest time I was trying to find a way to make sure I could see these sections any time I created a new document. Finally after playing around in settings I found it (Word > Preferences > View): </p>
<figure><img src="http://share.mygeekdaddy.net/View_and_Document1.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Yeah... I didn't think it was that obvious either. But now when I create a new document the header/footer sections are visible, even though the menu option doesn't register the setting change.</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2017-02-20_at_2.22.26_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Not the most intuitive solution, but I'm just happy it works. ;-)</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:311971">
<p>I think it shows how much I'm set in my ways too. <a class="footnote-backref" href="#fnref:311971" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>iPad vs Mac (for the power user)2017-02-07T10:16:01-06:002017-02-07T10:16:01-06:00Jason Verlytag:mygeekdaddy.net,2017-02-07:/2017/02/07/ipad-vs-mac-for-the-power-user/<p>Sometimes a great idea isn't your own. And lately another engineer has been beating me to the punch on <em>my</em> ideas. Dr. Drang (<a href="https://twitter.com/drdrang">@DrDrang</a>) has <a href="http://leancrew.com/all-this/2017/02/ipad-and-mac-the-early-years/">a recent post</a> that covers the next area I was looking at in <a href="http://mygeekdaddy.net/2017/02/04/accidental-ipad-experiment/">my iPad experiment</a> - the power of the iPad vs the Mac. In …</p><p>Sometimes a great idea isn't your own. And lately another engineer has been beating me to the punch on <em>my</em> ideas. Dr. Drang (<a href="https://twitter.com/drdrang">@DrDrang</a>) has <a href="http://leancrew.com/all-this/2017/02/ipad-and-mac-the-early-years/">a recent post</a> that covers the next area I was looking at in <a href="http://mygeekdaddy.net/2017/02/04/accidental-ipad-experiment/">my iPad experiment</a> - the power of the iPad vs the Mac. In Dr. Drang's post, he refers back to another post by David Sparks (<a href="https://twitter.com/MacSparky">@MacSparky</a>) on David's <a href="https://www.macsparky.com/blog/2017/2/a-few-thoughts-about-ipad">thoughts about the iPad</a>. </p>
<p>Dr. Drang commented on a relevant point from MacSparky's post that I'm currently working through as I migrate my workflows to my iPad:</p>
<blockquote>
<p>But David’s point still holds: productivity tools on the iPad just aren’t up to the Mac standard. Editorial is no BBEdit. And no combination of Workflow and x-callback-urls can compare with shell scripting, AppleScript, Keyboard Maestro, Hazel, et al.</p>
</blockquote>
<p>Sorry Apple, but <em>THAT'S</em> the bar that you've set for us to consider the iPad an alternative to our Macs. I've mentioned before that I kept using a Mac because of some very specific software that does not exist on the iPad. I've chosen to take on the idea of using an iPad as my computer because I believe I have the patience and skills to make it work. But when I look at my family and friends, I don't see how Apple can expect the normal consumer to make this leap. </p>
<p>Currently this is where I see the iPad sitting in terms of functionality between macOS and iOS.</p>
<p><img src="http://share.mygeekdaddy.net/IMG_0035.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></p>
<p>That's narrow band of functionality, but there's a lot of power in that intersection. I gain the intuitive interface of my iPhone and the underlying horsepower of a Mac, which is what I believe Apple is trying to make us believe on why the iPad is so great. The struggle with looking at the iPad as a laptop replacement is the extent a power user has to go to make it as <em>nearly</em> efficient as one or the other. I can thumb type on my iPhone, but can't on my iPad. So the logical choice is to use a keyboard with my iPad. <sup id="fnref:20170207095514"><a class="footnote-ref" href="#fn:20170207095514">2</a></sup> </p>
<figure><img src="http://share.mygeekdaddy.net/mbp_ipp_sidebyside.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Look familiar? <sup id="fnref:20170207095850"><a class="footnote-ref" href="#fn:20170207095850">3</a></sup></p>
<p>When I switch between my MBP and my iPad, I cannot tell you how many times I've tried to move my cursor on my MBP by touching the screen or thinking there's a trackpad when I'm using my iPad. So when Apple came out with the recent revamp to the MBP, and said Macs don't need touch screens<sup id="fnref:45792"><a class="footnote-ref" href="#fn:45792">1</a></sup>, I have to wonder if Apple's design teams are using the same tools as me. </p>
<p>The Microsoft Surface tablet is the best example of where I think Apple should be looking at how to evolve the iPad. The Surface has become the most requested computer in my company. Why? Because it has the functionality of Windows and the portability of a tablet. If a user wants to use a mouse & keyboard, they can. If they want to use the smart keyboard cover and pen, they can. It's the flexibility to cross over between how a user interacts with the device and giving them the standard environment that makes the Surface so appealing. </p>
<p>If Apple wants the iPad to be a real option as someone's main computer,<sup id="fnref:20170207100748"><a class="footnote-ref" href="#fn:20170207100748">4</a></sup> the functionality diagram will need to look more like this:</p>
<p><img src="http://share.mygeekdaddy.net/IMG_0036.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></p>
<p>That means eating into the sales of both the Mac <strong>and</strong> iPhone line. Functional features on the iPad need to <a href="https://www.cnet.com/news/the-ipad-of-the-future-is-apples-biggest-missing-link/">include trackpad support, better window/app management</a>, and have split view be <strong>required</strong> for any iPad app. </p>
<p>As usual, Dr. Drang sums it up best:</p>
<blockquote>
<p>The biggest problem for the iPad is Apple’s unwillingness to let it become its own thing. Development of iOS is driven by the iPhone, which probably shouldn’t have the tools of a regular computer. But the iPad needs at least some of those tools if it’s to fulfill Apple’s promise to be a laptop replacement. Being yoked to the iPhone is holding it back.</p>
</blockquote>
<p>Here's to hoping Apple unleashes what the iPad could be with iOS 11. 🍻</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:45792">
<p><a href="https://www.cnet.com/news/the-ipad-of-the-future-is-apples-biggest-missing-link/">That thinking explains why Apple “many, many years ago” decided against adding touchscreens to the Mac, even as rivals dressed up Windows tablets and PCs with multitouch displays.</a> <a class="footnote-backref" href="#fnref:45792" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:20170207095514">
<p>Spock would be so proud of me right now. <a class="footnote-backref" href="#fnref:20170207095514" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:20170207095850">
<p>Who doesn't see an iPad Air in that picture besides me. <a class="footnote-backref" href="#fnref:20170207095850" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:20170207100748">
<p>And not just for geeks like me. <a class="footnote-backref" href="#fnref:20170207100748" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>The Case of the iPad Experiment2017-02-06T13:22:02-06:002017-02-06T13:22:02-06:00Jason Verlytag:mygeekdaddy.net,2017-02-06:/2017/02/06/the-case-of-the-ipad-experiment/<p>When I started thinking about going iPad only, I knew typing only on the screen keyboard was not going to be an option. My previous iPad was a Clam Case keyboard case and I knew I wanted something similar again. While the first Clam Case took it's share of beatings …</p><p>When I started thinking about going iPad only, I knew typing only on the screen keyboard was not going to be an option. My previous iPad was a Clam Case keyboard case and I knew I wanted something similar again. While the first Clam Case took it's share of beatings,<sup id="fnref:20170206135206"><a class="footnote-ref" href="#fn:20170206135206">3</a></sup> the battery eventually borked, and it had a few flaws I didn't want to work around again.</p>
<p>When I bought the iPad I looked at the available hard sided keyboard cases. The first one I tried was the <a href="https://www.amazon.com/ZAGG-Hinged-Backlit-Bluetooth-Keyboard/dp/B01CVOL9WU/ref=sr_1_1?ie=UTF8&qid=1486062868&sr=8-1-spons&keywords=zagg+folio+ipad+pro+9.7&psc=1">Zagg Folio</a>. </p>
<p><img src="http://share.mygeekdaddy.net/FullSizeRender.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></p>
<p>The keyboard was nice, but the case didn't balance very well when it was opened on my desk. Worse was I could never get my fingers down low enough to get the iOS control panel to pull up from the bottom due to the case hinge. After 2 days of trying to use the Zagg Folio I decided this wasn't going to work. </p>
<p>The next case was the <a href="http://www.apple.com/shop/product/MM2L2AM/A/smart-keyboard-for-97-inch-ipad-pro-us-english?fnode=9a&fs=f%3Dkeyboardfolio%26fh%3D4583%252B4604">Apple Smart Keyboard</a>. This one lasted so short I didn't even get a picture of my iPad on it. The keys felt soft compared to the Zagg and my previous Clam Shell. The folio style didn't work well unless I was sitting at a comfortable table/desk. I liked the connector that the Smart Keyboard uses, but that wasn't enough for me to keep it.</p>
<p>After looking at my next choice I went back to see what Incipio had done to update their case for the iPad Pro. I wanted to make sure they had fixed the 3 biggest issues I had with the Clam Case:</p>
<ol>
<li>The iPad lock key on keyboard was in a bad spot.</li>
<li>The headphone jack only worked with Apple's earbud headphones. </li>
<li>The charging port only worked with a specific set of Apple Lightning cables.</li>
</ol>
<p>On the original Clam Case it was located right next to the delete, so I would constantly be overreaching the delete key and lock my iPad. Incipio appears to have learned from their previous generation Clam Case because the moved the key to a better laid out function key row. </p>
<p><img src="http://share.mygeekdaddy.net/IMG_2311.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></p>
<p>The other two issues I had were with the openings of the head phone and charging ports. The original Clam Case must have used the Apple accessory spec sheet to size the openings because only the Apple EarPods and the original charging cable would fit. <sup id="fnref:20170206133532"><a class="footnote-ref" href="#fn:20170206133532">1</a></sup></p>
<p><img src="http://share.mygeekdaddy.net/5351AFB8-619F-47CE-94E3-B14F6E4A63B2.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></p>
<p><img src="http://share.mygeekdaddy.net/442B6CD9-5DFC-4F5C-81BB-93E026AA29C6.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></p>
<p>The updated <a href="https://www.amazon.com/Clamcase-Incipio-ClamCase-Bluetooth-Keyboard/dp/B01JMK7EF2/ref=sr_1_1?ie=UTF8&qid=1486062983&sr=8-1&keywords=clamcase+ipad+pro+9.7">Clam Case</a> has been very comfortable and an easy transition from my last one.<sup id="fnref:20170206134828"><a class="footnote-ref" href="#fn:20170206134828">2</a></sup> The charging port access is big enough to accept a variety of charging cable sizes and I haven't run into any pair of headphones I currently own that don't fit. The backlit keyboard has also been great for typing in low light. </p>
<p>Next up... updating my iOS automation workflows. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:20170206133532">
<p>In fact I had to drill out both ports to use my preferred headphones and any 3rd party charging cords. <a class="footnote-backref" href="#fnref:20170206133532" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:20170206134828">
<p>It was great this weekend while traveling to family event where I had to work from my lap through out the day. <a class="footnote-backref" href="#fnref:20170206134828" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:20170206135206">
<p>That case saved my iPad more than once, which is primarily why I wanted a hard case again. <a class="footnote-backref" href="#fnref:20170206135206" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Accidental iPad Experiment2017-02-04T10:01:46-06:002017-02-04T10:01:46-06:00Jason Verlytag:mygeekdaddy.net,2017-02-04:/2017/02/04/accidental-ipad-experiment/<p>Sometimes you go out to try something new. Other times you're backed into a corner to adapt to a changing situation. A couple of months ago my MBP died. I didnt' panic<sup id="fnref:123234"><a class="footnote-ref" href="#fn:123234">1</a></sup> about not having a computer because I still had my iPad and my work MBP. My iPad …</p><p>Sometimes you go out to try something new. Other times you're backed into a corner to adapt to a changing situation. A couple of months ago my MBP died. I didnt' panic<sup id="fnref:123234"><a class="footnote-ref" href="#fn:123234">1</a></sup> about not having a computer because I still had my iPad and my work MBP. My iPad was set up to do about 90% of what I could do on my MBP. The only thing major item was missing were some of the extensions I use for my photo editing in Lightroom. That was easily fixed by exporting my photo catalog to an external drive and connect it to my work MBP when I needed to edit photos. </p>
<p>Fast forward to last Friday when I lost my iPad. <sup id="fnref:201702010045"><a class="footnote-ref" href="#fn:201702010045">2</a></sup> </p>
<p>Now I knew I needed to do something. As nice as it was to have my work MBP as a backup, I didn't want to cross a boundary where my personal data was on a computer that I really didn't own. <sup id="fnref:firewirewin"><a class="footnote-ref" href="#fn:firewirewin">3</a></sup> As I weighed my options<sup id="fnref:checkbook"><a class="footnote-ref" href="#fn:checkbook">5</a></sup> on what I was going to do, I examined what I really needed over the next year:</p>
<ul>
<li>Something that could keep me up to date on tasks, email, calendar, etc.</li>
<li>Something I could capture notes and ideas.</li>
<li>Something to watch my favorite shows and content. </li>
<li>Something to write with.</li>
</ul>
<p>While a new MBP could do all of this, I knew an iPad could too. The math in my head also worked out too... I can 90% of the tasks I need to do with only 50% of the investment. So going with a new iPad was a no brainer at this point.</p>
<p>My final choice was a 128GB cellular iPad Pro 9.7". This was a near replacement to my previous iPad. </p>
<h4>Setup Changes</h4>
<p>I knew if this was going to be my primary computer, I'd need to set things up a little differently from my previous iPad. Going forward my screens were going to be arranged in Mullet order.<sup id="fnref:mulletorder"><a class="footnote-ref" href="#fn:mulletorder">6</a></sup> </p>
<p>Some of the key changes I made were:</p>
<ul>
<li>Email: While I will use my iPad for home and work, it means I wanted stronger segregation of those two worlds as much as possible. So going forward I'll have to use separate mail apps for home vs work. <ul>
<li>Outlook for iOS: I can use this for my work mail and calendar events. I like this option because it doesn't require me to enter work credentials in iOS Settings. </li>
<li>?????: I'm still playing around with the mail app I'll use for my personal email. The default Mail.App is off the table. </li>
</ul>
</li>
<li>iOS Automation: Shifting to iOS means I've lost some of the core automation tools I've come to rely on - Hazel, Keyboard Maestro, Apple Script, etc. So I'm looking to adopt some new or updated automation tools for iOS.<ul>
<li>Pythonista: This was one of <em>the</em> primary tools I used for iOS automation on my previous iPad. I made the decision with this iPad that I'll take the plunge and move my scripting over to Python 3.</li>
<li>Workflow: I had basic workflows before, but I can see the need for better automation options to balance the loss of my macOS tools.</li>
<li>Text Expander: While this has been retired from my MBP, I haven't found an equivalent that is as integrated into iOS apps as Text Expander. </li>
</ul>
</li>
<li>MBP Eqiuvalency: Some apps I've relied upon on my MBP do have mixed iOS counterparts. So part of this experiment will be to transition off the following app:<ul>
<li>Lightroom: This was <strong>the</strong> app that kept my MBP relevant. The plugins I had for editing in Lightroom will be hard to replace. </li>
<li>Parallels: While I worked from a MBP, it's still a Windows world for most industrial settings. So I'll be looking at migrating apps from my Windows VM to remote systems.</li>
<li>MS Office: Like above, I work in a Microsoft centric office, so I'll need to see how much functionality I lose from macOS to iOS. </li>
</ul>
</li>
</ul>
<h4>Concerns with iOS</h4>
<p>One of the critical apps I have on any MBP I work on is <a href="https://www.obdev.at/products/littlesnitch/index.html">Little Snitch</a>. Normally Little Snitch is used to keep the bad guys getting in. Lately I've been using it to keep the chatty apps from talking to everyone on the interwebs. <sup id="fnref:chromehome"><a class="footnote-ref" href="#fn:chromehome">4</a></sup> So far I haven't found a way to prevent app trackers calling home or other network connections.<sup id="fnref:20170204130921"><a class="footnote-ref" href="#fn:20170204130921">7</a></sup></p>
<p>So we'll see if I can make the switch like <a href="https://mobile.twitter.com/viticci">@viticci</a> or if I eventually breakdown and go back to a MBP.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:123234">
<p>Ok... I panicked. <a class="footnote-backref" href="#fnref:123234" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:201702010045">
<p>Now I really panicked. <a class="footnote-backref" href="#fnref:201702010045" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:firewirewin">
<p>Closest I come to that is using my work MBP in host mode to run a copy of my personal MBP HD. <a class="footnote-backref" href="#fnref:firewirewin" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:chromehome">
<p>Google Chrome has to be the chattiest app on macOS. <a class="footnote-backref" href="#fnref:chromehome" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:checkbook">
<p>And my bank account balance. <a class="footnote-backref" href="#fnref:checkbook" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:mulletorder">
<p>Business in the front / party in the back. <a class="footnote-backref" href="#fnref:mulletorder" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
<li id="fn:20170204130921">
<p>Unless they're stopped at my wifi router. And how many of you go to that extent? Me neither. <a class="footnote-backref" href="#fnref:20170204130921" title="Jump back to footnote 7 in the text">↩</a></p>
</li>
</ol>
</div>24 Days of Reading2016-12-02T00:00:00-06:002016-12-02T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2016-12-02:/2016/12/02/24-days-of-reading/<p>The great folks at Fastmail are at it again and they are running their annual Advent blog again this year. For the past two years (<a href="https://blog.fastmail.com/2014/12/01/fastmail-advent-2014/">2014</a> / <a href="https://blog.fastmail.com/2015/12/01/fastmail-advent-2015/">2015</a>) Fastmail has had an Advent blog series with 24 blog posts running up to Christmas. </p>
<p>Some of the blog posts are helpful tips …</p><p>The great folks at Fastmail are at it again and they are running their annual Advent blog again this year. For the past two years (<a href="https://blog.fastmail.com/2014/12/01/fastmail-advent-2014/">2014</a> / <a href="https://blog.fastmail.com/2015/12/01/fastmail-advent-2015/">2015</a>) Fastmail has had an Advent blog series with 24 blog posts running up to Christmas. </p>
<p>Some of the blog posts are helpful tips/tricks to get the most of Fastmail account. Most of them are not company focused<sup id="fnref:776597"><a class="footnote-ref" href="#fn:776597">1</a></sup> and include a variety of techno-porn you can read while drinking your morning coffee. </p>
<p><a href="https://blog.fastmail.com/2016/12/01/fastmail-advent-2016/">Fastmail Advent 2016 Blog</a></p>
<p>Happy Holidays! </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:776597">
<p>They will be focused on email & security. <a class="footnote-backref" href="#fnref:776597" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Getting back in the groove2016-11-28T00:00:00-06:002016-11-28T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2016-11-28:/2016/11/28/getting-back-in-the-groove/<p>Something has been wrong in my world for a while now. You know that nagging feeling you have that something is <em>off</em>, but you can never put your finger on it. Well I finally figured it out.</p>
<blockquote>
<p>I got lazy. </p>
</blockquote>
<p>I don't mean the literal sense where I stopped getting …</p><p>Something has been wrong in my world for a while now. You know that nagging feeling you have that something is <em>off</em>, but you can never put your finger on it. Well I finally figured it out.</p>
<blockquote>
<p>I got lazy. </p>
</blockquote>
<p>I don't mean the literal sense where I stopped getting anything done. I was still getting things marked off on my checklists and being "productive", but when I looked back on what I actually got done it was a bunch of busy work. I would answer emails, follow up on phone calls, sit in meetings, etc.<sup id="fnref:16_11_28_14_05_06"><a class="footnote-ref" href="#fn:16_11_28_14_05_06">2</a></sup> So urgent items were covered, but the important <sup id="fnref:686663"><a class="footnote-ref" href="#fn:686663">4</a></sup> things I needed to move forward on had stagnated. </p>
<p>It's taken some time to see there is a relationship to my productivity to other activities in my life. <sup id="fnref:16_11_28_14_28_59"><a class="footnote-ref" href="#fn:16_11_28_14_28_59">3</a></sup> This site was ground zero to my previous personal success. If I'm writing on my site it means I'm being creative and looking up. For the past several months I've <sup id="fnref:16_11_28_13_55_53"><a class="footnote-ref" href="#fn:16_11_28_13_55_53">1</a></sup> been coasting and keeping my head down. </p>
<p>So I've started to work to get my creativity back on track. The last couple of weeks have felt like a cliché movie plot. The warrior is at the top of his game and becomes too at ease with his success. Pretty soon the warrior is getting slower and sloppier in his skills. Some plot twist occurs and he wakes up and realizes he isn't the person he thought he was. Now our star is challenged to start training to regain his former self. </p>
<p>The one part that hasn't been a cliché is how hard it's been getting a my productive routine going again. Just like the warrior star struggling to do sit ups, I've been struggling with focusing on the work I should be getting done. I <strike>hope</strike> plan to use the time over the holidays to get my groove back.</p>
<p>I look forward to reconnecting with everyone in 2017... including my former self. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:16_11_28_13_55_53">
<p>Autocorrect is drunk... I replaced "I've" 4x because it kept coming up as "I'be". <a class="footnote-backref" href="#fnref:16_11_28_13_55_53" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:16_11_28_14_05_06">
<p>All filler, no substance. <a class="footnote-backref" href="#fnref:16_11_28_14_05_06" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:16_11_28_14_28_59">
<p>Funny how the obvious can be so oblivious. <a class="footnote-backref" href="#fnref:16_11_28_14_28_59" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:686663">
<p>Review <a href="http://5by5.tv/b2w/17-brick-building-full-of-lies">'Urgent vs Important'</a> <a class="footnote-backref" href="#fnref:686663" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Rethinking my investment in Apple2016-11-21T00:00:00-06:002016-11-21T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2016-11-21:/2016/11/21/rethinking-my-investment-in-apple/<p>If you're an Apple fanboy, the last couple of months have been pretty hard to take. The fall Mac event was the cornerstone of the shifting focus for Apple. The first part the fall event was actually the conclusion the announcement that Apple was discontinuing the <a href="http://www.macrumors.com/2016/06/23/apple-discontinues-thunderbolt-display/">production of stand along …</a></p><p>If you're an Apple fanboy, the last couple of months have been pretty hard to take. The fall Mac event was the cornerstone of the shifting focus for Apple. The first part the fall event was actually the conclusion the announcement that Apple was discontinuing the <a href="http://www.macrumors.com/2016/06/23/apple-discontinues-thunderbolt-display/">production of stand along displays</a>. As part of the fall event, Apple revealed its <em>thinnest and lightest Mac Book Pro they've ever produced</em>.<sup id="fnref:904465"><a class="footnote-ref" href="#fn:904465">4</a></sup> What was missing in this event was a Mac option I can use in my day to day work. Everything I need to connect to my MBP has either a USB, FireWire, or comes on an SD Card. The new MBP has dongles... lots of dongles. </p>
<p>Next was the news of the elimination of Sal Soghoian's position as Product Manager of Automation Technologies. <sup id="fnref:963325"><a class="footnote-ref" href="#fn:963325">2</a></sup> Just about everything Sal touched is what originally brought me over to OS X from Windows. The ability to automate the administrative tasks on my laptop made my life so much easier. Pull emails from Outlook into OmniFocus. Generate a daily to do list from OmniFocus. Automatically push files to my website. And despite what <a href="http://www.libertypages.com/clarktech/?p=765">some people think</a>, I still use Automator. </p>
<p>And now with the leaked news from this morning, we can clearly see the direction Apple is taking. </p>
<blockquote>
<p>Apple Inc. has disbanded its division that develops wireless routers, another move to try to sharpen the company’s focus on consumer products that generate the bulk of its revenue, according to people familiar with the matter. <sup id="fnref:35209"><a class="footnote-ref" href="#fn:35209">1</a></sup></p>
</blockquote>
<p>It was never the individual technologies that brought me to Apple's products, it was the ecology that was created when you used them together. Automator and Applescript alone are not amazing technologies.<sup id="fnref:488103"><a class="footnote-ref" href="#fn:488103">5</a></sup> Couple those pieces with a Mac and your workflows you use to get stuff done, that's when get a process that has your colleagues asking, "How the hell did you do that?". Or plugging in an AirPort Express in my garage and use it to stream music from my Mac and control the music from my iPhone. Apple's ability to glue their products together with these background gadgets and technology is why I kept coming back. </p>
<blockquote>
<p>Sadly Apple appears to be taking out the bits and pieces that made using their products rise above the mediocrity of their competitors. </p>
</blockquote>
<p>I believe the past few months have given us a clear indication of Apple's direction to drop most of their peripheral businesses. Which means Apple is moving away from being a technology company and to a consumer appliance company. <sup id="fnref:353417"><a class="footnote-ref" href="#fn:353417">3</a></sup> The iPhone, iPad, Beats headphones, Apple Watch, all these are meant for end user consumption. While there are people who are actively creating and pushing the boundaries on these devices, they are the exception not the rule. </p>
<p>Sorry Apple... just about everyone else looks pretty interesting in 2017. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:35209">
<p>https://www.bloomberg.com/news/articles/2016-11-21/apple-said-to-abandon-development-of-wireless-routers-ivs0ssec <a class="footnote-backref" href="#fnref:35209" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:963325">
<p>https://macosxautomation.com/about.html <a class="footnote-backref" href="#fnref:963325" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:353417">
<p>The MBP is about as customizable as my refrigerator or toaster. <a class="footnote-backref" href="#fnref:353417" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:904465">
<p>What Tim and Jony didn't show us was the exciting line of dongle bags that Apple will be selling over the holidays. <a class="footnote-backref" href="#fnref:904465" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:488103">
<p>Applescript is one of the most convoluted scripting languages you'll ever find. <a class="footnote-backref" href="#fnref:488103" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>Using Maximo to help train users on queries2016-10-24T00:00:00-05:002016-10-24T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2016-10-24:/2016/10/24/using-maximo-to-help-train-users-on-queries/<p>One of the challenges Maximo administrators face is getting a good user to get to the next level of experience in using Maximo. The biggest gain I think a power use can make is being able to transition from searches using the List Tab/Advanced Search to modifying searches in …</p><p>One of the challenges Maximo administrators face is getting a good user to get to the next level of experience in using Maximo. The biggest gain I think a power use can make is being able to transition from searches using the List Tab/Advanced Search to modifying searches in the Where Clause directly. Learning this skill opens the door to what a power user can search for within the Maximo application and what reports can be generated using the built in QBR reporting feature. </p>
<h4>Learning <code>EXISTS</code> SQL statements</h4>
<p>The most powerful SQL statement a Maximo user can learn is the <code>EXISTS</code> statement. <sup id="fnref:330051"><a class="footnote-ref" href="#fn:330051">1</a></sup> What the <code>EXISTS</code> statement does is check to see if a selection statement for the existence of rows. If there are, then the reset of the <code>where</code> clause will also return results. The biggest challenge that comes from learning SQL inside Maximo is learning and seeing when an error took place. For example, the following query appears to be correct:</p>
<div class="highlight"><pre><span></span><code>(historyflag = 0 and siteid = 'ACME') and (exists (select 1 from dbo.poline where ((reportedby = 'STARKT01')) and (ponum=po.ponum and revisionnum=po.revisionnum and siteid=po.siteid)))
</code></pre></div>
<p>Running this query will result in the following error message:</p>
<figure><img src="http://share.mygeekdaddy.net/where_clause_error_msg.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></figure>
<p>Yeah... that's not very helpful. </p>
<p>The correct syntax should replace the <code>reportedby</code> with <code>requestedby</code>. </p>
<div class="highlight"><pre><span></span><code>(historyflag = 0 and siteid = 'ACME') and (exists (select 1 from dbo.poline where ((reportedby = 'STARKT01')) and (ponum=po.ponum and revisionnum=po.revisionnum and siteid=po.siteid)))
</code></pre></div>
<h4>Teaching points in Maximo</h4>
<p>Learning <code>EXISTS</code> statements from inside Maximo can be done using several applications. All of the examples below were generated from entering information entered into the Advanced Search screen. Maximo then generated the SQL queries that can be viewed from the 'Where Clause' dialog box, including the <code>EXISTS</code> statements. These are being shown to demonstrate where a user can see and learn how to write a more complex SQL query. </p>
<p><strong>Inventory: Item Description</strong> The Inventory application is setup where several fields are actually on other database tables. For example, the <code>INVENTORY</code> table does not directly store the Description of a part, that comes as a reference from the <code>ITEM</code> table. When you open Inventory, you can enter text into the Description field and the actual SQL query looks like this:</p>
<div class="highlight"><pre><span></span><code>(status != 'OBSOLETE' and siteid = 'ACME') and (exists (select 1 from dbo.item where ((description like '%BEARING%')) and (itemnum = inventory.itemnum and itemsetid = inventory.itemsetid)))
</code></pre></div>
<p>Maximo already knew that the <code>INVENTORY.DESCRIPTION</code> field came from the <code>ITEM</code> table, so Maximo created the <code>EXISTS</code> statement to find any record that included the word <code>bearing</code> in the description. </p>
<p><strong>Purchase Order: PO Line Details</strong> Purchase order history is one of the best places a power user can shine. Finding that one PO the facility did 2 years ago for that widget they bought can make a Maintenance Manger's day. But finding that one purchase order most likely includes search for details from a PO Line, not the PO itself. In this example the Advanced Search fields included a description of the part and who requested the part.</p>
<p>(siteid = 'ACME' and totalcost > 1000000.0) and (exists (select 1 from dbo.poline where ((description like '%WIDGET%' and requestedby = 'PYMMH01')) and (ponum=po.ponum and revisionnum=po.revisionnum and siteid=po.siteid))) </p>
<p>This query includes multiple items in the <code>EXISTS</code> statement to search for. </p>
<p><strong>Work Order: Location Hierarchy</strong> Work orders have a lot of referential information. One of the strongest search features in WO Tracking is finding work orders based on a Location Hierarchy. </p>
<div class="highlight"><pre><span></span><code>((woclass = 'WORKORDER' or woclass = 'ACTIVITY') and historyflag = 0 and siteid = 'ACME' and istask = 0) and (exists (select 1 from dbo.multiassetlocci where (exists (select 1 from dbo.locancestor where ((ancestor = 'ILIAD')) and (location =multiassetlocci.location and systemid = ( select systemid from locsystem where primarysystem = 1 and siteid =multiassetlocci.siteid) and siteid=multiassetlocci.siteid))) and (recordkey=workorder.wonum and recordclass=workorder.woclass and worksiteid=workorder.siteid)))
</code></pre></div>
<p>Whoa! This one has an <code>EXISTS</code> statement inside of another <code>EXISTS</code> statement. This is a great query to break down and show how sub-selections can work for your Maximo users. </p>
<h4>Breaking down an <code>EXISTS</code> statement</h4>
<p>While the examples above show what can generated from the Advanced Search tab, understanding the syntax of the queries created is how a power user can learn to adapt. The best approach is look at one of the simpler queries that utilizes an <code>EXISTS</code>. Let's use the query we first saw. </p>
<div class="highlight"><pre><span></span><code>(historyflag = 0 and siteid = 'ACME') and (exists (select 1 from dbo.poline where ((reportedby = 'STARKT01')) and (ponum=po.ponum and revisionnum=po.revisionnum and siteid=po.siteid)))
</code></pre></div>
<p>Maximo will break Advanced Search queries down into parts. In this case we have two parts:</p>
<div class="highlight"><pre><span></span><code>(historyflag = 0 and siteid = 'ACME')
</code></pre></div>
<p>and </p>
<div class="highlight"><pre><span></span><code>(exists (select 1 from dbo.poline where ((reportedby = 'STARKT01')) and (ponum=po.ponum and revisionnum=po.revisionnum and siteid=po.siteid)))
</code></pre></div>
<p>The first part of the query looking for any purchase order that is not in history (<code>historyflag=0</code>) and was issued from the ACME site (<code>siteid='ACME</code>). There's a good chance this would return quite a few records. So the <code>EXISTS</code> statement puts a qualifier on what information is return to the Maximo user. The <code>EXISTS</code> statement looks to see of the rows that would be returned, which ones had a <code>reportedby='STARKT01'</code>. The results returned to a Maximo user would only include the purchase orders that were requested by user 'STARKT01'. </p>
<p>You can do the reverse of this by including a <code>NOT</code> modifier in front of the <code>EXISTS</code> statement. So using the same query, we can modify it like this:</p>
<div class="highlight"><pre><span></span><code>(historyflag = 0 and siteid = 'ACME') and ( not exists (select 1 from dbo.poline where ((reportedby = 'PARKERP01')) and (ponum=po.ponum and revisionnum=po.revisionnum and siteid=po.siteid)))
</code></pre></div>
<p>In this example, Maximo would return any open purchase order, for the 'ACME' site, that was <span style="text-decoration: underline">not</span> requested by user 'PARKERP01'. </p>
<h4>Understanding information relationships</h4>
<p>Beyond the examples Maximo can generate itself, a power user will want to be able to understand how other tables are related to each other - e.g. PM to Job Plan, Work Order to Planned Materials, etc. The Database Configuration app has a tab that includes the steps Maximo uses to understand the relationship between different tables. Shown below is a sample of how Maximo would relate information from a parent Asset record to a child record. </p>
<figure><img src="http://share.mygeekdaddy.net/max_relation_rpt_.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<p>The formatting of the 'Relationship Clause' is pretty straight forward. </p>
<div class="highlight"><pre><span></span><code>ponum=:ponum and revisionnum=:revisionnum and siteid=:siteid
</code></pre></div>
<p>To use that relationship sequence, all of the <code>:</code> characters have to be changed to match the parent table that is being referred to. In this case the relationship sequence is referring back to the <code>PO</code> parent. So the relationship sequence would have to be written as:</p>
<div class="highlight"><pre><span></span><code>ponum=po.ponum and revisionnum=po.revisionnum and siteid=po.siteid
</code></pre></div>
<p>Note how all of the <code>:</code> characters were replaced with <code>po.</code>. So using the advanced search in the Purchasing app, we can use an example search to create a starting block of code:</p>
<div class="highlight"><pre><span></span><code>(historyflag = 0 and siteid = 'ACME') and (exists (select 1 from dbo.poline where ((requestedby = 'STARKT01')) and (ponum=po.ponum and revisionnum=po.revisionnum and siteid=po.siteid)))
</code></pre></div>
<p>So a Maximo user could start adding on other pieces of information that aren't present in the Advanced Search dialog box, but is present on the PO Line. </p>
<div class="highlight"><pre><span></span><code>(historyflag = 0 and siteid = 'ACME') and (exists (select 1 from dbo.poline where ((requestedby = 'STARKT01' and catalogcode='MARK 42' and origid != 'SHIELD')) and (ponum=po.ponum and revisionnum=po.revisionnum and siteid=po.siteid)))
</code></pre></div>
<p>Out of the box, <code>catalogcode</code> and <code>orgid</code> are not visible in Advanced Search or in the PO Line detail section. </p>
<h4>Relationship Data Report</h4>
<p>I've included two versions of the relationships in Maximo. The <em>Primary</em> version only includes the main table/apps - WO, PO, Asset, Inventory, etc. The <em>Extended</em> version includes every relationship in the Database Configuration tab. </p>
<p><a href="http://share.mygeekdaddy.net/maximo_data_relationships_primary.pdf">Primary Maximo Data Relationship PDF</a> </p>
<p><a href="http://share.mygeekdaddy.net/maximo_data_relationships_extended.pdf">Extended Maximo Data Relationship PDF</a> </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:330051">
<p><a href="https://msdn.microsoft.com/en-us/library/ms188336.aspx" target="_blank">MSDN Entry on <code>EXISTS</code></a> <a class="footnote-backref" href="#fnref:330051" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Why I chose [blank] as my next gaming console2016-09-08T00:00:00-05:002016-09-08T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2016-09-08:/2016/09/08/why-i-chose-blank-as-my-next-gaming-console/<p>I've been holding off on buying a 2nd PS4 for sometime now. My oldest kid is starting to have friends that play online, so he and I have had small <em>discussions</em> on who gets to game. <sup id="fnref:128123"><a class="footnote-ref" href="#fn:128123">1</a></sup> So when word was starting to leak out that Sony was releasing a …</p><p>I've been holding off on buying a 2nd PS4 for sometime now. My oldest kid is starting to have friends that play online, so he and I have had small <em>discussions</em> on who gets to game. <sup id="fnref:128123"><a class="footnote-ref" href="#fn:128123">1</a></sup> So when word was starting to leak out that Sony was releasing a mid-cycle update to the PS4, I hesitated on buying anything... until yesterday.</p>
<p>I saw the highlights of Sony's product announcement yesterday and knew exactly what I was going to do...</p>
<blockquote>
<p>Buy another original PS4. </p>
</blockquote>
<p>Yep. After all the hype from Sony's stream yesterday, I got another original PS4. Why? Because after all the excitement passed, I took a look at the 3 versions and saw the middle of the road PS4 was still the best value in my mind. </p>
<p>Here's a comparison of the specs of each of the PS4 systems now available:</p>
<table>
<thead>
<tr>
<th style="text-align: center;"></th>
<th style="text-align: center;">PLAYSTATION 4 PRO</th>
<th style="text-align: center;">PLAYSTATION 4 SLIM</th>
<th style="text-align: center;">PLAYSTATION 4 (2013)</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">Price</td>
<td style="text-align: center;">$399</td>
<td style="text-align: center;">$299</td>
<td style="text-align: center;">$349</td>
</tr>
<tr>
<td style="text-align: center;">Resolution</td>
<td style="text-align: center;">480p, 720p, 1080i, 1080p, 4K (select titles), HDR</td>
<td style="text-align: center;">480p, 720p, 1080i, 1080p, 4K (video only), HDR</td>
<td style="text-align: center;">480p, 720p, 1080i, 1080p, 4K (video only), HDR</td>
</tr>
<tr>
<td style="text-align: center;">CPU</td>
<td style="text-align: center;">AMD Jaguar x86-64, 8-core</td>
<td style="text-align: center;">AMD Jaguar x86-64, 8-core</td>
<td style="text-align: center;">AMD Jaguar x86-64, 8-core</td>
</tr>
<tr>
<td style="text-align: center;">GPU</td>
<td style="text-align: center;">AMD Radeon, 4.20 TFLOP</td>
<td style="text-align: center;">AMD Radeon, 1.84 TFLOP</td>
<td style="text-align: center;">AMD Radeon, 1.84 TFLOP</td>
</tr>
<tr>
<td style="text-align: center;">RAM</td>
<td style="text-align: center;">8GB</td>
<td style="text-align: center;">8GB</td>
<td style="text-align: center;">8GB</td>
</tr>
<tr>
<td style="text-align: center;">Storage</td>
<td style="text-align: center;">1TB</td>
<td style="text-align: center;">500GB / 1TB</td>
<td style="text-align: center;">500GB / 1TB</td>
</tr>
<tr>
<td style="text-align: center;">Media</td>
<td style="text-align: center;">BR/DVD</td>
<td style="text-align: center;">BR/DVD</td>
<td style="text-align: center;">BR/DVD</td>
</tr>
<tr>
<td style="text-align: center;">WiFi</td>
<td style="text-align: center;">802.11 a/b/g/n/ac</td>
<td style="text-align: center;">802.11 a/b/g/n/ac</td>
<td style="text-align: center;">802.11 b/g/n</td>
</tr>
<tr>
<td style="text-align: center;">Ethernet</td>
<td style="text-align: center;">10/100/1000</td>
<td style="text-align: center;">10/100/1000</td>
<td style="text-align: center;">10/100/1000</td>
</tr>
<tr>
<td style="text-align: center;">Bluetooth</td>
<td style="text-align: center;">v4.0</td>
<td style="text-align: center;">v4.0</td>
<td style="text-align: center;">v2.1</td>
</tr>
<tr>
<td style="text-align: center;">Ports</td>
<td style="text-align: center;">USB 3.0 (x3), HDMI 2.0a, S/PDIF</td>
<td style="text-align: center;">USB 3.0 (x2), HDMI 2.0a</td>
<td style="text-align: center;">USB 3.0 (x2), HDMI 1.4, S/PDIF</td>
</tr>
</tbody>
</table>
<p>On paper, the PS4 Pro looks promising - more storage, better GPU, and can output 4k video for some game titles. But when it was all said and done, the original PS4 still looks the best in my mind. Here's my reasoning:</p>
<ol>
<li>The PS4 Pro doesn't play 4k Blu-Ray. If the PS4 Pro won't play the media format Sony's movie division has been touting, then I'll wait for the next gen console that does. </li>
<li>The output resolution between the PS4 Slim and the Original PS4 are identical. </li>
<li>The WiFi upgrade is irrelevant because I <strong>always</strong> have a hard wire connection to my console. </li>
<li>The PS4 Slim is lost its optical out port (S/PDIF), this means my headphone setup won't work with the PS4 slim. <sup id="fnref:868200"><a class="footnote-ref" href="#fn:868200">2</a></sup></li>
</ol>
<p>If the PS4 Pro had any either a bump in RAM or played 4k Blu-Ray, then the choice would have been a no brainer. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:128123">
<p>I do, I bought it. ;-) <a class="footnote-backref" href="#fnref:128123" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:868200">
<p>This was the deal breaker. <a class="footnote-backref" href="#fnref:868200" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Protecting Maximo from inbound emails2016-07-20T13:26:56-05:002016-07-20T13:26:56-05:00Jason Verlytag:mygeekdaddy.net,2016-07-20:/2016/07/20/protecting-maximo-from-inbound-emails/<p>I've been using Maximo's email listener to help shift requests getting emailed directly to the Maintenance Manager and Supervisors and into an inbox that can be managed by the entire maintenance department. Maximo has an out of the box workflow <sup id="fnref:480778"><a class="footnote-ref" href="#fn:480778">1</a></sup> to handle inbound emails from an email listener. There …</p><p>I've been using Maximo's email listener to help shift requests getting emailed directly to the Maintenance Manager and Supervisors and into an inbox that can be managed by the entire maintenance department. Maximo has an out of the box workflow <sup id="fnref:480778"><a class="footnote-ref" href="#fn:480778">1</a></sup> to handle inbound emails from an email listener. There are several help documents on <a href="https://www.ibm.com/developerworks/community/blogs/e25892f0-20f7-46ff-bbe9-c7c03fb3036f/entry/useful_tiny_little_things_setting_up_email_listener?lang=en">IBM developerWorks</a>, <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21308414">IBM Maximo Help</a>, and an <a href="https://www.ibm.com/developerworks/community/blogs/e25892f0-20f7-46ff-bbe9-c7c03fb3036f/entry/useful_tiny_little_things_setting_up_email_listener?lang=en">IBM developerWorks PDF download</a>.</p>
<p>One of the problems I've had with this transition was the occasional employee adding the request email address into a email thread so whatever issued would get added as a request into Maximo. This caused two problems. First, the email that came into Maximo did nothing to direct a Planner on what the issue was because of the long discussion thread. Second, we started getting error alerts like this:</p>
<div class="highlight"><pre><span></span><code>Psdi.util.MXApplicationException BMXAA4049E – The value specified ….. exceeds the maximum field length.
at psdi.util.MaxType.checkLength(MaxType.java 517)
at psdi.util.MaxType.setvalue(MaxType.java 439)
at psdi.umbo.MboValue._setvalue(MboValue.java 439)
at psdi.mbo.MboValue.setValue(MboValue.java 1171)
</code></pre></div>
<p>What I found was the 'cc' recipient list was too big for the <code>INBOUNDCOMM.CC</code> field. IBM has a <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21500491">tech note</a> on how to fix, but that still left us with problem number - garbage getting into the request process. </p>
<p>My original thought was to modify the LSNRBP workflow to bounce messages that had a large <em>'to'</em> or <em>'cc'</em> recipient list - say more than 100 characters to indicate multiple email addresses. As I researched the issue I realized this wouldn't work because I'd still get the <code>Psdi.util.MXApplicationException BMXAA4049E</code> error. </p>
<p><strong>Why?</strong></p>
<p>Workflow will only take actions on records already in the Maximo database. So to limit/bounce an email that was too chatty meant that the record had to be on the INBOUNDCOMM table. This meant I needed to expand the <code>INBOUNDCOMM.CC</code> and <code>INBOUNDCOMM.BCC</code> fields to 1000 characters like the KB document recommended.</p>
<h4>Bounce email listener messages</h4>
<p>So now all emails will get written to the <code>INBOUNDCOMM</code> table, but I still wanted the <em>chatty</em> messages to not get processed by the <code>LSNRBP</code> workflow. When you look at the original workflow, the inbound communication record is checked to see if it has formatted actions in the <code>ACTIONNULL</code> step. This steps checks for the preprocessor characters like <code>##</code>. If the message does, it will be pushed into other sections of the workflow. We don't use the preprocessor characters - yet. </p>
<figure><img src="http://share.mygeekdaddy.net/workflow_lsnr_orig_2016-07-20.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>So to bounce messages, I added a new conditional check before the <code>ACTIONNULL</code> condition step.</p>
<figure><img src="http://share.mygeekdaddy.net/workflow_mod_lsnrbp_2016-07-20.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>The condition node has the following properties.</p>
<figure><img src="http://share.mygeekdaddy.net/condition_node_detail_2016-07-20.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;"></img></figure>
<p>The concept here is to bounce any message that has more than one <code>sendto</code>, one <code>cc</code> or one <code>bcc</code> recipients. </p>
<div class="highlight"><pre><span></span><code>len(:sendto) > 35 or len(:cc) > 40 or len(:bcc) > 40
</code></pre></div>
<p>This will check the new <code>INBOUNDCOMM</code> record and look at the length of the 'to', 'cc', and 'bcc' fields. If any of the fields are exceeded, the workflow will divert the record and send out an email using the following template. <sup id="fnref:555814"><a class="footnote-ref" href="#fn:555814">2</a></sup></p>
<figure><a href="http://share.mygeekdaddy.net/comm_template_notice_2016-07-20.png"><img src="http://share.mygeekdaddy.net/comm_template_notice_2016-07-20.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now when someone essentially spams the email request address, they'll get this reply back.</p>
<figure><img src="http://share.mygeekdaddy.net/email_msg_2016-07-20.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>So do you have any other ways to protect your email listeners? Feel free to share your ideas in comments below.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:480778">
<p>The LSNRBP workflow process. <a class="footnote-backref" href="#fnref:480778" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:555814">
<p>Pro tip - include the commtemplate ID number in the footer of a message when possible, so you can easily find it again for future editing. <a class="footnote-backref" href="#fnref:555814" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Thoughts on Father's Day2016-06-19T19:16:20-05:002016-06-19T19:16:20-05:00Jason Verlytag:mygeekdaddy.net,2016-06-19:/2016/06/19/thoughts-on-fathers-day/<p>There are only a few things in this world that really get under my skin. The person who thinks they need to take up two parking places right next to a store entrance. Someone who cuts in line because they're in a bigger hurry than everyone else. The idea of …</p><p>There are only a few things in this world that really get under my skin. The person who thinks they need to take up two parking places right next to a store entrance. Someone who cuts in line because they're in a bigger hurry than everyone else. The idea of Mandarin oranges. <sup id="fnref:16_06_20_13_00_43"><a class="footnote-ref" href="#fn:16_06_20_13_00_43">1</a></sup>. And this word...</p>
<blockquote>
<p>Never</p>
</blockquote>
<p>There's a finality to that word that I just don't think most people can live up to. I know I can't.</p>
<p>The reason why I bring up this word and Father's Day is from a standing tradition of my family letting me go on a meandering bike ride on Father's Day. On this day I have no time constraint for my bike ride. I don't have to be back at a certain time so I can carry-on my parental duties. I just get to go out and come home when I'm ready. As I was riding, my mind wandered from thought to thought as it normally does. This time my mind connected the dots back to all the the things I told myself I'd do <em>never</em> do when I was a dad someday.</p>
<blockquote>
<p>I'll never make my kids eat food they don't like. <br>
I'll never spank my kids. <br>
I'll never yell at my kids. </p>
</blockquote>
<p>As I ran these proclamations I made in my youth through my head, I realized I used the exact word that makes my skin crawl. I also saw the futility in trying to live up to what I said I wasn't going to do to my kids. As I continued my ride I thought about how I could rephrase some of my parenting goals into something more achievable.</p>
<blockquote>
<p>I'll try to understand the different taste my kids have. <br>
I'll try to restrain myself from impulsive punishments. <br>
I'll try to talk to my kids about things. </p>
</blockquote>
<p>I can always try to be a better parent, but I can't expect to be a perfect parent. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:16_06_20_13_00_43">
<p>They're pickled oranges in my book. <a class="footnote-backref" href="#fnref:16_06_20_13_00_43" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Fixing Safari Setting for Keyboard Maestro2016-06-16T09:47:04-05:002016-06-16T09:47:04-05:00Jason Verlytag:mygeekdaddy.net,2016-06-16:/2016/06/16/fixing-safari-setting-for-keyboard-maestro/<p>Back in April there was quite a kerfuffle over Smile Software's move to a <a href="https://textexpander.com/pricing/">subscription based payment</a> for <a href="https://textexpander.com">Text Expander</a>. Dr Drang <a href="https://twitter.com/drdrang">(@drdrang)</a> has <a href="http://leancrew.com/all-this/2016/06/final-thoughts-on-switching-from-textexpander/">written a follow up</a> to <a href="http://leancrew.com/all-this/2016/04/the-new-textexpander/">his earlier thoughts</a> on the shift by Smile Software and moving his snippets to <a href="https://www.keyboardmaestro.com/main/">Keyboard Maestro</a>. I've been making the same …</p><p>Back in April there was quite a kerfuffle over Smile Software's move to a <a href="https://textexpander.com/pricing/">subscription based payment</a> for <a href="https://textexpander.com">Text Expander</a>. Dr Drang <a href="https://twitter.com/drdrang">(@drdrang)</a> has <a href="http://leancrew.com/all-this/2016/06/final-thoughts-on-switching-from-textexpander/">written a follow up</a> to <a href="http://leancrew.com/all-this/2016/04/the-new-textexpander/">his earlier thoughts</a> on the shift by Smile Software and moving his snippets to <a href="https://www.keyboardmaestro.com/main/">Keyboard Maestro</a>. I've been making the same transition as well and hit my first road bump earlier this week. </p>
<p>One of my favorite KM macros is to use a keyboard short cut to clip information from a web page so I can put it into <a href="http://brettterpstra.com/projects/nvalt/">nvAlt</a> for future reference. I recently ran across some information for <a href="https://discordapp.com">Discord</a> <sup id="fnref:493133"><a class="footnote-ref" href="#fn:493133">1</a></sup> that I wanted to save. So I did my keyboard short cut and...</p>
<p><em>Pfffttt</em></p>
<p>Nothing. Nothing copied and no error occurred. I looked at the macro to see if something changed with the recent update to Keyboard Maestro. I couldn't find any problems with the macro.</p>
<figure><img src="http://share.mygeekdaddy.net/screen_clip_km_macro.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>The script for the macro is:</p>
<div class="highlight"><pre><span></span><code><span class="nv">tell</span><span class="w"> </span><span class="nv">application</span><span class="w"> </span><span class="s2">"Safari"</span><span class="w"></span>
<span class="w"> </span><span class="nv">activate</span><span class="w"></span>
<span class="w"> </span><span class="nv">set</span><span class="w"> </span><span class="nv">theURL</span><span class="w"> </span><span class="nv">to</span><span class="w"> </span><span class="nv">URL</span><span class="w"> </span><span class="nv">of</span><span class="w"> </span><span class="nv">front</span><span class="w"> </span><span class="nv">document</span><span class="w"></span>
<span class="w"> </span><span class="nv">set</span><span class="w"> </span><span class="nv">selectedText</span><span class="w"> </span><span class="nv">to</span><span class="w"> </span><span class="ss">(</span><span class="k">do</span><span class="w"> </span><span class="nv">JavaScript</span><span class="w"> </span><span class="s2">"(''+getSelection())"</span><span class="w"> </span><span class="nv">in</span><span class="w"> </span><span class="nv">document</span><span class="w"> </span><span class="mi">1</span><span class="ss">)</span><span class="w"></span>
<span class="w"> </span><span class="nv">set</span><span class="w"> </span><span class="nv">theTitle</span><span class="w"> </span><span class="nv">to</span><span class="w"> </span><span class="nv">name</span><span class="w"> </span><span class="nv">of</span><span class="w"> </span><span class="nv">front</span><span class="w"> </span><span class="nv">document</span><span class="w"></span>
<span class="w"> </span><span class="nv">set</span><span class="w"> </span><span class="nv">theDate</span><span class="w"> </span><span class="nv">to</span><span class="w"> </span><span class="k">do</span><span class="w"> </span><span class="nv">shell</span><span class="w"> </span><span class="nv">script</span><span class="w"> </span><span class="s2">"date +'%Y-%m-%d'"</span><span class="w"></span>
<span class="w"> </span><span class="nv">set</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">clipboard</span><span class="w"> </span><span class="nv">to</span><span class="w"> </span><span class="nv">theTitle</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="nv">theURL</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="nv">selectedText</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="nv">theDate</span><span class="w"> </span><span class="nv">as</span><span class="w"> </span><span class="nv">string</span><span class="w"></span>
<span class="k">end</span><span class="w"> </span><span class="nv">tell</span><span class="w"></span>
</code></pre></div>
<p>I fired up Script Editor to run the Applescript natively and boom... there was the error.</p>
<figure><img src="http://share.mygeekdaddy.net/km_macro_in_script_edit.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Looking into the problem it looks like a recent update reset some of Safari's safety features. You'll need to <a href="http://osxdaily.com/2011/11/03/enable-the-develop-menu-in-safari/">enable the Develop menu</a> to get access to the setting. The setting to change is on the Develop menu:</p>
<figure><img src="http://share.mygeekdaddy.net/allow_java_script_in_safari.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>You'll also be asked to confirm the change.</p>
<figure><img src="http://share.mygeekdaddy.net/allow_script_edit_dialog.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>When I was done, I was able to get the clipping shortcut to work again. </p>
<div class="highlight"><pre><span></span><code><span class="nv">Markdown</span><span class="w"> </span><span class="nv">Text</span><span class="w"> </span><span class="mi">101</span><span class="w"> </span><span class="ss">(</span><span class="nv">Chat</span><span class="w"> </span><span class="nv">Formatting</span>:<span class="w"> </span><span class="nv">Bold</span>,<span class="w"> </span><span class="nv">Italic</span>,<span class="w"> </span><span class="nv">Underline</span><span class="ss">)</span><span class="w"> </span>–<span class="w"> </span><span class="nv">Discord</span><span class="w"></span>
<span class="nv">https</span>:<span class="o">//</span><span class="nv">support</span>.<span class="nv">discordapp</span>.<span class="nv">com</span><span class="o">/</span><span class="nv">hc</span><span class="o">/</span><span class="nv">en</span><span class="o">-</span><span class="nv">us</span><span class="o">/</span><span class="nv">articles</span><span class="o">/</span><span class="mi">210298617</span><span class="o">-</span><span class="nv">Markdown</span><span class="o">-</span><span class="nv">Text</span><span class="o">-</span><span class="mi">101</span><span class="o">-</span><span class="nv">Chat</span><span class="o">-</span><span class="nv">Formatting</span><span class="o">-</span><span class="nv">Bold</span><span class="o">-</span><span class="nv">Italic</span><span class="o">-</span><span class="nv">Underline</span><span class="o">-</span><span class="w"></span>
<span class="nv">Want</span><span class="w"> </span><span class="nv">to</span><span class="w"> </span><span class="nv">inject</span><span class="w"> </span><span class="nv">some</span><span class="w"> </span><span class="nv">flavor</span><span class="w"> </span><span class="nv">into</span><span class="w"> </span><span class="nv">your</span><span class="w"> </span><span class="nv">everyday</span><span class="w"> </span><span class="nv">text</span><span class="w"> </span><span class="nv">chat</span>?<span class="w"> </span><span class="nv">You</span><span class="s1">'re in luck! Discord uses Markdown, a simple plain text formatting system that'</span><span class="nv">ll</span><span class="w"> </span><span class="nv">help</span><span class="w"> </span><span class="nv">you</span><span class="w"> </span><span class="nv">make</span><span class="w"> </span><span class="nv">your</span><span class="w"> </span><span class="nv">sentences</span><span class="w"> </span><span class="nv">stand</span><span class="w"> </span><span class="nv">out</span>.<span class="w"> </span><span class="nv">Here</span><span class="err">'s how to do it!</span>
<span class="nv">Just</span><span class="w"> </span><span class="nv">add</span><span class="w"> </span><span class="nv">a</span><span class="w"> </span><span class="nv">few</span><span class="w"> </span><span class="nv">characters</span><span class="w"> </span><span class="nv">before</span><span class="w"> </span><span class="o">&</span><span class="w"> </span><span class="nv">after</span><span class="w"> </span><span class="nv">your</span><span class="w"> </span><span class="nv">desired</span><span class="w"> </span><span class="nv">text</span><span class="w"> </span><span class="nv">to</span><span class="w"> </span><span class="nv">change</span><span class="w"> </span><span class="nv">your</span><span class="w"> </span><span class="nv">text</span><span class="o">!</span><span class="w"> </span><span class="nv">I</span><span class="err">'ll show you some examples:</span>
<span class="err">italics = *italics*</span>
<span class="err">bold = **bold**</span>
<span class="err">bold italics = ***bold italics***</span>
<span class="err">strikeout = ~~strikeout~~</span>
<span class="err">underline = __underline__</span>
<span class="err">underline italics = __*underline italics*__</span>
<span class="err">underline bold = __**underline bold**__</span>
<span class="err">underline bold italics = __***underline bold italics***__</span><span class="w"></span>
<span class="nv">Don</span><span class="s1">'t want to use markdown? You can slap a backslash in front of your statement, and it'</span><span class="nv">ll</span><span class="w"> </span><span class="nv">escape</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">markdown</span><span class="w"> </span><span class="nv">formatting</span>.<span class="w"> </span><span class="nv">You</span><span class="s1">'ll see those asterisks as you'</span><span class="nv">d</span><span class="w"> </span><span class="nv">like</span><span class="o">!</span><span class="w"> </span><span class="nv">Just</span><span class="w"> </span><span class="nv">keep</span><span class="w"> </span><span class="nv">in</span><span class="w"> </span><span class="nv">mind</span>,<span class="w"> </span><span class="nv">it</span><span class="w"> </span><span class="nv">doesn</span><span class="err">'t work in messages with edits or underscores.</span>
<span class="err">2016-06-16</span><span class="w"></span>
</code></pre></div>
<p>See... everyone uses Markdown now. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:493133">
<p>Titans rule | Warlocks drool. <a class="footnote-backref" href="#fnref:493133" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Rise of Iron Bungie Stream2016-06-09T12:59:09-05:002016-06-09T12:59:09-05:00Jason Verlytag:mygeekdaddy.net,2016-06-09:/2016/06/09/rise-of-iron-bungie-stream/<p>Bungie originally released Destiny on Sep 9, 2014. The first downloadable content (DLC) for Destiny was The Dark Below expansion pack on Dec 9, 2014. The 2nd DLC released was House of Wolves on May 19, 2015. The Destiny calendar turned to Year 2 with the release of the The …</p><p>Bungie originally released Destiny on Sep 9, 2014. The first downloadable content (DLC) for Destiny was The Dark Below expansion pack on Dec 9, 2014. The 2nd DLC released was House of Wolves on May 19, 2015. The Destiny calendar turned to Year 2 with the release of the The Taken King on Sep 15, 2015. </p>
<p>Today we learned about Bungie's latest release - Rise of Iron.</p>
<figure><img src="http://share.mygeekdaddy.net/Rise_Of_Iron_Logo.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></figure>
<p>Bungie held a reveal stream on<a href="http://twitch.tv/Bungie">Twitch</a> today to talk about <em>Rise of Iron</em>. The new DLC will be released on Sep 20, 2016 and will be $30 USD. One of the biggest surprises that came within the first few minutes of the stream was this DLC will <strong>only</strong> be available for current generation systems (PS4/XB1). Players on last generation consoles (PS3/XB 360) are left with the content from the <a href="http://mygeekdaddy.net/2016/03/30/destiny-stream-new-things-to-earn/">April Update</a>. </p>
<p>Bungie promised they'd gave us an overview of the content coming in Rise of Iron in today's stream, with DeeJ specifically saying more would be revealed over the summer.</p>
<h4>Rise of Iron</h4>
<p>Bungie led off the stream with a trailer for the Rise of Iron. </p>
<iframe width="600" height="338" src="https://www.youtube-nocookie.com/embed/EFTn6jQk338?rel=0" frameborder="0" allowfullscreen></iframe>
<p>After the trailer Bungie jumped right into what is coming with the Rise of Iron DLC.</p>
<figure><img src="http://share.mygeekdaddy.net/rise_of_iron_content_slide_ROI.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>The storyline for Rise of Iron is taking Guardians back into some of the Destiny lore about the Iron Lords. Lord Saladin, master of the Iron Banner tournament, is the last of the Iron Lords. The Iron Temple - an outpost on earth - lies at the top of Fellwinters Peak.</p>
<figure><img src="http://share.mygeekdaddy.net/iron_lord_mausoleum_ROI.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>This memorial is for the Iron Lords that stopped Civa, a technological plague, and locked it away in a bunker in an area called the Plaguelands.</p>
<figure><img src="http://share.mygeekdaddy.net/The_Plaguelands_-_ROI.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>But Fallen have infiltrated that bunker and used the corrupted technology to augment their bodies. </p>
<figure><img src="http://share.mygeekdaddy.net/mutated_fallen_army_-_RoI.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>It's up to the Guardians to go back into Old Russia and stop the spread of these corrupted Fallen. </p>
<h4>New Gear | Old Gear</h4>
<p>With every Destiny update, there is always new gear to look forward too, and this DLC is no exception. </p>
<figure><img src="http://share.mygeekdaddy.net/newgear_newloot_RoI.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Bungie didn't go into detail on all of the weapons or armor, except to give us some insight on the <em>flavor</em> of the content. Since we're dealing with the Iron Lords, one set of armor appears to be honed and polished in a fashion similar to other Iron Banner gear players have seen to date. Another set of armor looks more geometric and is fashioned after the warmind technology Guardians will face. The last one appears to be related to some of the new PVP content coming in the DLC and will give out similar to Trial of Osiris gear. </p>
<p>Bungie stated that Guardians will see a 'significant light increase', but the final number was stated to be revealed later this summer. </p>
<p>One of two weapons Bungie did talk about was the flaming axe<sup id="fnref:499077"><a class="footnote-ref" href="#fn:499077">1</a></sup> we've seen in some previously leaked images. </p>
<figure><img src="http://share.mygeekdaddy.net/titan_flame_axe.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>The axe will be a temporary booster - similar to the scorch cannon in PoE/CotE - that Guardians can pick up as an encounter specific weapon. </p>
<p>The other reveal was...</p>
<figure><img src="http://share.mygeekdaddy.net/gjallahorn_its_back.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>and...</p>
<figure><img src="http://share.mygeekdaddy.net/gjallahorn_in_black.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Yes, Bungie is bringing back the most wanted rocket launcher to Y2... The Gjallahorn. Bungie noted that the Black Gjallahorn will be available for anyone who pre-orders the <em>Rise of Iron</em> DLC. The Y2 version of Gjallahorn will be available to all Guardians via a quest line to forge their own version. </p>
<h4>What we didn't hear</h4>
<p>DeeJ and the crew from Bungie specifically stated they were not going to reveal everything about the Rise of Iron in today's stream. In their earlier slide, Bungie showed us some information about the new raid, new strike, and new crucible content. All of this content was said to be revealed in other streams over the summer. </p>
<p>So we still don't know, or can't confirm is:</p>
<ul>
<li>Are we getting custom PVP matches?</li>
<li><span style="text-decoration: line-through;">Are PS4 players getting any other exclusive content?</span>Activision has made a disclaimer about some PS4 exclusive content.</li>
<li>Are there any new exotics as part of the DLC?</li>
<li>What is the raid boss? Closest we got was a death zamboni comment in the stream.</li>
</ul>
<p>Fingers are crossed that we hear a little more on this in the coming weeks. </p>
<h4>Wrap Up</h4>
<p>As Bungie wrapped up their stream<sup id="fnref:594340"><a class="footnote-ref" href="#fn:594340">2</a></sup> - it was just about 30 min long - DeeJ confirmed that a few Bungie employees will be attending E3. At best, this means we might still get some update or nibble of information related to Destiny 2. At worst, we get to see more of the DLC in a couple of weeks. </p>
<p>And that's not a bad deal at all... stay safe Guardians. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:499077">
<p>Yes, it's an axe, not a hammer. <a class="footnote-backref" href="#fnref:499077" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:594340">
<p>At the stream's peak, Bungie had over 254,000 viewers. <a class="footnote-backref" href="#fnref:594340" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Getting multiple records to show inline in BIRT2016-05-19T00:13:00-05:002016-05-19T00:13:00-05:00Jason Verlytag:mygeekdaddy.net,2016-05-19:/2016/05/19/getting-multiple-records-to-show-inline-in-birt/<p>One of the first rules I learned when creating reports was to get your report's <code>select</code> statement to do as much of the work for you. When the <code>select</code> statement is properly formatted, the statement can do a lot of the functional work you'd have to setup in BIRT. This …</p><p>One of the first rules I learned when creating reports was to get your report's <code>select</code> statement to do as much of the work for you. When the <code>select</code> statement is properly formatted, the statement can do a lot of the functional work you'd have to setup in BIRT. This can be a more foolproof way to ensure you get consistent reporting results because if the raw data looks correct in you SQL query tool, you can be assured it will look good in your report too. </p>
<p>A common <code>select</code> statement for a report would be for the data to have a parent record and multiple child records. </p>
<div class="highlight"><pre><span></span><code>select workorder.wonum, wplabor.laborcode
from workorder
join wplabor on workorder.wonum=wplabor.wonum and workorder.siteid=wplabor.siteid
</code></pre></div>
<p>In this example statement, normally when you have multiple child records to a parent record, SQL will return the results in individual rows. So if you had information about a WO number and the planned labor on the job, the results would like this:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">WONUM</th>
<th style="text-align: center;">LABORCODE</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">32563</td>
<td style="text-align: center;">RHODEJ01</td>
</tr>
<tr>
<td style="text-align: center;">32563</td>
<td style="text-align: center;">ROMANN01</td>
</tr>
<tr>
<td style="text-align: center;">32563</td>
<td style="text-align: center;">STARKT01</td>
</tr>
<tr>
<td style="text-align: center;">32646</td>
<td style="text-align: center;">BARTOC01</td>
</tr>
<tr>
<td style="text-align: center;">32646</td>
<td style="text-align: center;">ROGERS01</td>
</tr>
<tr>
<td style="text-align: center;">32646</td>
<td style="text-align: center;">BARNEB01</td>
</tr>
</tbody>
</table>
<p>Pulling that information into a BIRT report would cause every LABORCODE record to show up like this: </p>
<ul>
<li>32563<ul>
<li>RHODESJ01</li>
<li>ROMANN01</li>
<li>STARKT01</li>
</ul>
</li>
<li>32646<ul>
<li>BARTOC01</li>
<li>ROGERS01</li>
<li>BARNEB01</li>
</ul>
</li>
</ul>
<p>But for information like planned labor lists, most supervisors want to see the information as a single list, not multiple rows. There are some BIRT report tricks you can get records to show inline, but it's always better to get the raw data in the format you want first.</p>
<h4><code>stuff</code> function</h4>
<p>SQL Server has a function called <code>stuff</code> that can be used to pull multiple records into a single field. The formal definition of the function from Microsoft is: <sup id="fnref:16_04_28_13_09_03"><a class="footnote-ref" href="#fn:16_04_28_13_09_03">1</a></sup></p>
<blockquote>
<p>The STUFF function inserts a string into another string. It deletes a specified length of characters in the first string at the start position and then inserts the second string into the first string at the start position. </p>
</blockquote>
<p>The <code>stuff</code> command basically is a fancy <code>concatenate</code> function for SQL results. A basic <code>stuff</code> example would be: <sup id="fnref:234255"><a class="footnote-ref" href="#fn:234255">2</a></sup></p>
<div class="highlight"><pre><span></span><code>select stuff('abcdef', 2, 3, 'ijklmn');
</code></pre></div>
<p>This would return the result of:</p>
<div class="highlight"><pre><span></span><code>aijklmnef
</code></pre></div>
<p>The <code>stuff</code> function has 4 arguments: </p>
<div class="highlight"><pre><span></span><code>stuff ( character_expression , start , length , replaceWith_expression )
</code></pre></div>
<ol>
<li><em>character_expression</em>: Is an expression of character data. character_expression can be a constant, variable, or column of either character or binary data.</li>
<li><em>start</em>: Is an integer value that specifies the location to start deletion and insertion. If start or length is negative, a null string is returned. If start is longer than the first character_expression, a null string is returned. start can be of type bigint.</li>
<li><em>length</em>: Is an integer that specifies the number of characters to delete. If length is longer than the first character_expression, deletion occurs up to the last character in the last character_expression. length can be of type bigint.</li>
<li><em>replaceWith_expression</em>: Is an expression of character data. character_expression can be a constant, variable, or column of either character or binary data. This expression will replace length characters of character_expression beginning at start.</li>
</ol>
<h4>Making the magic</h4>
<p>While the <code>stuff</code> function gets things rolling, it's a second function - <code>for xml path</code> - that makes some real magic. Using this function, with a sub-select statement, can transpose multiple records into a single result. The second function is actually two parts - the <code>for xml</code> function and the <code>path</code> mode modifier. The <code>for xml</code> is used to transpose a queries result into XML format. The <code>path</code> modifier can be used to modify a wrapper in the generated XML. </p>
<p>The <code>stuff</code> function is iterative, but in conjunction with the <code>for xml path</code>, when multiple records are returned from a selection, the sub-select statement will continue to concatenate the results. Pulling all of this together gives us a select statement like this:</p>
<div class="highlight"><pre><span></span><code><span class="k">select</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">wonum</span><span class="p">,</span><span class="w"> </span><span class="nf">stuff</span><span class="p">((</span><span class="k">select</span><span class="w"> </span><span class="s1">', '</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">laborcode</span><span class="w"> </span><span class="k">from</span><span class="w"> </span><span class="n">wplabor</span><span class="w"> </span>
<span class="w"> </span><span class="k">where</span><span class="w"> </span><span class="n">wplabor</span><span class="p">.</span><span class="n">wonum</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">wonum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">wplabor</span><span class="p">.</span><span class="n">siteid</span><span class="o">=</span><span class="n">workorder</span><span class="p">.</span><span class="n">siteid</span><span class="w"> </span>
<span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nc">xml</span><span class="w"> </span><span class="k">path</span><span class="p">(</span><span class="s1">''</span><span class="p">)),</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="s1">''</span><span class="p">)</span><span class="w"> </span><span class="k">as</span><span class="w"> </span><span class="o">[</span><span class="n">labor_code</span><span class="o">]</span><span class="w"></span>
<span class="k">from</span><span class="w"> </span><span class="n">workorder</span><span class="w"></span>
<span class="k">where</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">historyflag</span><span class="o">=</span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">workorder</span><span class="p">.</span><span class="n">istask</span><span class="o">=</span><span class="mi">0</span><span class="w"></span>
</code></pre></div>
<p>In the statement above, the entire sub-select statement (including the <code>for xml path</code>) is the first part of the <em>character_expression</em> section. Setting the <em>start</em> and <em>length</em> to 1 allows the concatenate to appear to string itself together. The final <em>replaceWith_expression</em> is set to <code>''</code> so the iterative process won't rewrite over itself. </p>
<p>The previous select statement will return the following results:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">WONUM</th>
<th style="text-align: center;">LABOR_CODE</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">32563</td>
<td style="text-align: center;">RHODEJ01, ROMANN01, STARKT01</td>
</tr>
<tr>
<td style="text-align: center;">32646</td>
<td style="text-align: center;">BARTOC01, ROGERS01, BARNEB01</td>
</tr>
</tbody>
</table>
<p>So now using the <code>stuff</code> modifier in your report will keep all of the planned labor names inline.</p>
<ul>
<li>32563 | RHODEJ01, ROMANN01, STARKT01</li>
<li>32646 | BARTOC01, ROGERS01, BARNEB01</li>
</ul>
<p>So now you can use the <code>stuff</code> and <code>for xml path</code> functions to allow your select statement to transpose multiple records into a single line. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:16_04_28_13_09_03">
<p>https://msdn.microsoft.com/en-us/library/ms188043.aspx <a class="footnote-backref" href="#fnref:16_04_28_13_09_03" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:234255">
<p>Example from <a href="https://msdn.microsoft.com/en-us/library/ms188043.aspx">MSDN Library</a> <a class="footnote-backref" href="#fnref:234255" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Destiny Stream - Sandbox & Crucible2016-04-07T15:05:21-05:002016-04-07T15:05:21-05:00Jason Verlytag:mygeekdaddy.net,2016-04-07:/2016/04/07/destiny-stream-sandbox-crucible/<p>Bungie held their 3rd and final Twitch stream <sup id="fnref:165465"><a class="footnote-ref" href="#fn:165465">1</a></sup> before the April Update drops. This stream focused on changes to the core game play (Sandbox) and updates to the Crucible and Crucible related events (Trials of Osiris, Iron Banner, etc). This stream had a lot of information, albeit sometimes without …</p><p>Bungie held their 3rd and final Twitch stream <sup id="fnref:165465"><a class="footnote-ref" href="#fn:165465">1</a></sup> before the April Update drops. This stream focused on changes to the core game play (Sandbox) and updates to the Crucible and Crucible related events (Trials of Osiris, Iron Banner, etc). This stream had a lot of information, albeit sometimes without the detail Guardians would have hoped for. </p>
<ul>
<li><a href="http://mygeekdaddy.net/2016/03/23/destiny-april-update-preview/">Destiny Stream - New Things To Do</a></li>
<li><a href="http://mygeekdaddy.net/2016/03/30/destiny-stream-new-things-to-earn/">Destiny Stream - New Things To Earn</a></li>
</ul>
<p>The stream started with DeeJ showcasing a group of Warlocks in a Crucible match and explaining they'd be using the this match to demonstrate some of the changes. And boy were there a lot of changes to cover. </p>
<blockquote>
<p>"Destiny is about to become a more rewarding game." ~DeeJ</p>
</blockquote>
<h4>Crucible & Sandbox</h4>
<p>A common theme to all of the update streams was Bungie's goal to give players more ways to achieve a higher light level and get better gear. Up to now the only solid ways to get light level (LL) 320 gear was either Trials of Osiris or the King's Fall raid in hard mode. Going forward Bungie wanted to make sure <em>all</em> players had a way to achieve higher LL gear. In the first stream we saw the new L41 Prison of Elders (POE) and L42 Challenge of the Elders (CotE) were new avenues for players to get increased LL gear. Bungie now wants to make the Crucible another way for players to get better gear too. So starting with the April Update here's a breakdown of where and what you can expected to get from Destiny gameplay:</p>
<ul>
<li>Up to LL 320 Gear<ul>
<li>L41 Prison of Elders</li>
<li>Normal mode King's Fall raid</li>
<li>Rank 3 Iron Banner package (Artifact and Ghost)</li>
<li>Crucible end game rewards (Clash, Control, Skirmish, etc)</li>
</ul>
</li>
<li>Up to LL 330 Gear<ul>
<li>Trials of Osiris (ToO) bounties</li>
<li>Vanguard and Crucible reputation packages</li>
</ul>
</li>
<li>Up to LL 335 Gear<ul>
<li>L42 Prison of Elders</li>
<li>Hard mode King's Fall raid <sup id="fnref:104432"><a class="footnote-ref" href="#fn:104432">2</a></sup></li>
<li>Rank 5 Iron Banner package</li>
<li>Trials of Osiris Lighthouse Chest (now includes armor & weapon)</li>
<li>Shaxx Weekly Bounties</li>
<li>Court of Oryx (Artifacts)</li>
</ul>
</li>
</ul>
<h4>Game play changes</h4>
<p>There was a flurry of updates in the first segment and here's a highlight of the changes coming on 4/12 by Lars Bakken:</p>
<ul>
<li>Revive Changes: The sprint revive is gone. The proximity you can revive a team mate is much closer and the time to revive a player will take longer - even with exotic revive armor (e.g. Crest of Alpha Lupi). </li>
<li>ToO Revive Changes: There were specific revive changes to Trials of Osiris. In addition to the overall Crucible revive changes, ToO revives will have a 7s timer before a team mate can be revived. On top this, there is a compounding timer for each death and revive. So if a player dies a 2nd time, it will be an additional 7s before a team mate can revive a player, or 14s before they can be revived a 2nd time. Die a 3rd time in the match? Your team mates will need to wait 21s. Die a 4th time? That's an uncomfortable discussion between you and your fire team on your engagement decisions. </li>
<li>Overshield Diminished: The over shield will be weakened a bit. Final change values will be listed in the patch notes. </li>
<li>Special Ammo: When entering a Crucible match, including 3v3 modes, players will spawn in with special ammo at the beginning. Since players will spawn in with special ammo, the first special ammo drop will be 3 min into the match and then another 2 min later. The goal is have players think more strategically on their use of special ammo. Mayhem will not be altered. </li>
<li>Heavy Ammo: Heavy ammo is being limited to a larger degree in PVP. In PVP, heavy ammo comes in at the 5 min mark and only drops once. In ToO, heavy ammo will show up after a team has 3 wins and after 5 minutes. Mayhem will not be altered. </li>
<li>Crucible Drops: Legendary drops will be increased for end game rewards for Crucible events - Control, Skirmish, Clash, etc. </li>
<li>Iron Banner Drops: Legendary drops will be removed from end game rewards and replaced with Iron Banner items. Iron Banner bounty change of getting '2500 points and a win' will be reduced to '1500 points and a match completion'.</li>
<li>ToO Bounty: The bounty, His Eye Upon You, will be playable daily during ToO.</li>
</ul>
<p>More details in the patch notes. </p>
<h4>Weapons</h4>
<p>Next up came DeeJ with John Wisniewski on the weapon changes coming on 4/12:</p>
<p><strong>General Weapon Type Changes:</strong> Changes being made to general weapon categories.</p>
<ul>
<li>Auto Rifles: <ul>
<li>High ROF: Base damage down (DoP/Arminius) </li>
<li>Low ROF: Base damage up (Suros Regime)</li>
</ul>
</li>
<li>Pulse Rifles: <ul>
<li>Low ROF: Base damage up (Spare Change)</li>
</ul>
</li>
<li>Hand Cannon:
All HC's: Increasing ammo inventory carry, not magazine size.</li>
<li>Fusion Rifles:
All FR's: Blanket stability increase and tighter discharge cone. </li>
<li>Sniper Rifles: Meta has changes on how snipers are being used. A lot more close quarter combat has been seen - even seen in stream game play. <ul>
<li>All SR's: Zoom distance pushed up, so distance pushed out to adjust close range encounters. </li>
<li>Added 2 frames for zoom time from hip to looking down scope. </li>
<li>Snapshot aiming reduced bonus from 30% to 20%. </li>
<li>Lower total inventory that can be held. (Increased brick drops in PVP)</li>
<li>Reduced stability across the board. Two shots to the body will be harder to pull off.</li>
</ul>
</li>
<li>Side Arms:<ul>
<li>All: Switching from Side Arm to other special weapon will result in loss of special ammo. </li>
<li>All: Lower inventory that can be held.</li>
</ul>
</li>
<li>Shotguns:<ul>
<li>All: Lower inventory that can be held.</li>
</ul>
</li>
<li>Machine Guns:<ul>
<li>All: Lower inventory that can be held.</li>
</ul>
</li>
</ul>
<p><strong>Specific Weapon Changes:</strong> Changes being made to specific weapons. </p>
<ul>
<li>Mida Multitool: Mida is one of the most popular PVP weapon after the Dec 2015 update. Plan will be to remove the intrinsic perk of high caliber rounds. Unclear in the stream was how the flinching perk will be affected. This could be a big deal for PVE players if the flinching perk is altered. </li>
<li>Suros Regime: Getting the same buff for AR's as mentioned above. The spin up perk occurs later - 4 bullets later. Focus fire perk gets a range buff. </li>
<li>Hawkmoon: Range and accuracy increase. </li>
<li>The Last Work: Damage nerf for hip fire precision shots on the TLW perk. Too many players got good enough to do a 2 shot kill using hip fire and the TLW perk. A damage adjustment moves it to a 3 shot precision kill from hip fire with TWL perk.</li>
<li>Thorn: Still Y1 weapon. Damage over time and damage pulses reduced from 6 to 4. Screen change when tagged will not be as intense. </li>
<li>Ice Breaker: Still Y1 weapon. If you switch away from ice breaker you will lose special any built up special. Increased zoom like other sniper rifles. </li>
<li>Dreg's Promise: Shots track better when aiming down sights. </li>
<li>Telesto: Rounds will now see if player is a team mate or not. You can now shoot a team mate and prime them as a void bomb. This includes a Ward of Dawn. </li>
<li>1000 Yard Stare: 1KYS is <em>the</em> most equipped weapon in the history of the game to date. It's the #1 weapon in PVP kills. All sniper changes will affect 1KYS and will have even lower ammo inventory than the sniper rifle ammo nerf. </li>
<li>Qullim's Terminus: Both versions will be affected by machine gun ammo change and an additional ammo inventory reduction. </li>
<li>All KF Raid Weapons: Small boost to reload speed. </li>
</ul>
<p>Side question that DeeJ and John discussed is why does Bungie balance PVP and PVE the same. The philosophy is your Guardian is your Guardian and Bungie wants a consistent feel and muscle memory of the weapons you use. So when you use a weapon, you have a consistent experience whether you're in a raid/strike or running Trials. </p>
<p>A full write up will be on Bungie's site later this week. </p>
<h4>Warlock Class Changes</h4>
<p>The third segment had DeeJ and Grant Mackay go over class and subclass changes. The focus of the April Update will be tuning the Warlock class. The actual changes mentioned on the stream :</p>
<p>Sunsinger:</p>
<ul>
<li>Lowered the amount of flame shield for Sunsingers and the frequency Sunsingers will get a flame shield. </li>
<li>Brimstone will get damage increase for PVE. </li>
<li>No change to firebolt damage. </li>
</ul>
<p>Stormcaller:</p>
<ul>
<li>Perk to extend Stormtrance adjusted and requires some more thought on perk selection.</li>
<li>Landfall will no longer destroy a Ward of Dawn or blind opponent longer. </li>
</ul>
<p>Voidwalker: </p>
<ul>
<li>Tweaks to amount of energy drained based on perks selected.</li>
<li>Melee and grenade cool downs adjusted.</li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn:165465">
<p>Sponsored by Room Temperature Water <a class="footnote-backref" href="#fnref:165465" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:104432">
<p>HM KF Raid will be 330 on 4/12. A post patch will bump up gear in HM to 335. <a class="footnote-backref" href="#fnref:104432" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>New RSS Feed2016-04-07T09:03:53-05:002016-04-07T09:03:53-05:00Jason Verlytag:mygeekdaddy.net,2016-04-07:/2016/04/07/new-rss-feed/<p>Just a quick housekeeping note, but I've moved my RSS feed off of FeedBurner and will now generate the feed myself. </p>
<p>The new feed link is: <a href="http://mygeekdaddy.net/feeds/all.atom.xml">http://mygeekdaddy.net/feeds/all.atom.xml</a> </p>
<p>I'll keep the FeedBurner feed going<sup id="fnref:367404"><a class="footnote-ref" href="#fn:367404">1</a></sup> for now, but will probably delete it when I get …</p><p>Just a quick housekeeping note, but I've moved my RSS feed off of FeedBurner and will now generate the feed myself. </p>
<p>The new feed link is: <a href="http://mygeekdaddy.net/feeds/all.atom.xml">http://mygeekdaddy.net/feeds/all.atom.xml</a> </p>
<p>I'll keep the FeedBurner feed going<sup id="fnref:367404"><a class="footnote-ref" href="#fn:367404">1</a></sup> for now, but will probably delete it when I get a few more tweets about it being broken. </p>
<p>HT to <a href="https://twitter.com/macdrifter">@macdrifter</a> and <a href="https://twitter.com/pslobo">@pslobo</a> for making me finally fix this once and for all.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:367404">
<p>Until Google kills FeedBurner. <a class="footnote-backref" href="#fnref:367404" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Asking the right questions about your metrics2016-03-31T12:16:23-05:002016-03-31T12:16:23-05:00Jason Verlytag:mygeekdaddy.net,2016-03-31:/2016/03/31/asking-the-right-questions-about-your-metrics/<p>One task a reliability team should do on a regular basis is sitting down to discuss the trends of any metrics or scorecards being kept on their program. Blasting out reports, and then not talking about the contents of the reports, is just a waste of time and email space …</p><p>One task a reliability team should do on a regular basis is sitting down to discuss the trends of any metrics or scorecards being kept on their program. Blasting out reports, and then not talking about the contents of the reports, is just a waste of time and email space. But when you get your team together to go over your metrics, asking the right questions can set the tone for the entire meeting. </p>
<p>There are three questions you should ask yourself, and your team, when discussing your metrics and looking at how you can evolve your maintenance and reliability programs:</p>
<ol>
<li>What did we do well?</li>
<li>Where can we improve?</li>
<li>What can we do different?</li>
</ol>
<p>The way these questions are structured allow for a discussion to occur, rather than a witch hunt. When you get your team together it's too easy to start commiserating and slip into the negative side of things. </p>
<ul>
<li>Our completion numbers went way down because Jim wouldn't give us that line like we wanted.</li>
<li>If the Plant Manager would have just listened to us, that bearing would't have failed at 2am on Saturday night. </li>
<li>We've told that operator a hundred times to stop running the line like that. No wonder we're over there 3 times a week. </li>
</ul>
<p>See how easy it is to have the conversation lead to negative comments. Trust me, I've been there and made comments almost identical to the examples above. But if we use the three questions above, we can guide the conversation to something that is pro-active and positive. When using these questions in your team meeting, you reinforce the idea of a positive attitude and look for positive changes in our reliability program.</p>
<ol>
<li><em>What did we do well</em>: This looks at anything that was done in a positive or correct manner. It allows the team to go over the small wins they had in the previous report period. The stress of customer service in a reliability and maintenance organization can take a toll on your team over time. Spending a few minutes to point out the small wins and what his worked can go along way to keeping the positive momentum going in your reliability evolution.</li>
<li><em>Where can we improve</em>: This is the part of the discussion where we want to make sure the path we take is a positive one. It gives the team an opportunity to look at from the small wins where can we get the <strong>next</strong> win. We want to focus the discussion on what small changes can be made and what can be done to continually get ball moving forward for our reliability program.</li>
<li><em>What can we do different</em>: This is where we can define actionable steps that can evolve the program. Again, some effort will need to be made to keep the discussion positive so that it's not dream list of things the team wants to change within the organization. Suddenly asking for production to attend a new planning and scheduling meeting three days a week, when you aren't doing any at the moment, it's not a realistic actionable item. Think of simple actions your team can take to get another set of small wins. Small actions that yield small wins you can control are the neutral game of your reliability program. </li>
</ol>
<p>Evolving your maintenance and reliability programs is something that takes time. Shifting the nature of your discussions from the commiseration and the negative feedback loop is something that will take time as well. Work on staying positive and outcomes and actions from that positivity positivity will start to compound on each other and yield some amazing results. </p>
<p>See ya next time guardians!</p>Destiny Stream - New Things to Earn2016-03-30T14:11:35-05:002016-03-30T14:11:35-05:00Jason Verlytag:mygeekdaddy.net,2016-03-30:/2016/03/30/destiny-stream-new-things-to-earn/<figure><img src="http://share.mygeekdaddy.net/destiny_2.2.0_upate_splash_part_2.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Bungie had its 2nd of the 3 Twitch streams related to the upcoming <a href="https://www.bungie.net/en/pub/AprilUpdate">April Update</a>. In the <a href="https://youtu.be/2LRS0YqIJvA">1st stream</a>, Bungie took us on a tour of the some of the upcoming content in the April Update. Today's stream covered "New Things to Earn". And <a href="https://twitter.com/deej_bng">DeeJ</a> did not disappoint.</p>
<p>The opening …</p><figure><img src="http://share.mygeekdaddy.net/destiny_2.2.0_upate_splash_part_2.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Bungie had its 2nd of the 3 Twitch streams related to the upcoming <a href="https://www.bungie.net/en/pub/AprilUpdate">April Update</a>. In the <a href="https://youtu.be/2LRS0YqIJvA">1st stream</a>, Bungie took us on a tour of the some of the upcoming content in the April Update. Today's stream covered "New Things to Earn". And <a href="https://twitter.com/deej_bng">DeeJ</a> did not disappoint.</p>
<p>The opening 30 seconds of the stream was a torrent of clips and pictures of what's coming in the April Update. After the opening montage, DeeJ appeared on screen with two other Bungie employees - Keith Bachman and Brenton Woodrow. They discussed their contributions to the April update and what they did to <em>Takenize</em> the new Destiny content. Bungie again made a point to stress that the April Update will give players "16 weeks of new content" to play. <sup id="fnref:330903"><a class="footnote-ref" href="#fn:330903">4</a></sup> The walk through began with a trip back to the Reef.</p>
<h4>New Armor</h4>
<p>The new content reveal was kicked off with a little bit of a fashion show. Each faction is getting a full set of new armor for each character class. The height of the fashion show was when DeeJ revealed two new armor types. </p>
<p><strong>Spektar</strong> This is a new line of armor and is style of armor we saw on the Titan in the pre-release images from Bungie. The armor has smoother, more modern lines and is accentuated by the glowing outlines Bungie called <em>chroma</em>. There's more detail on the new chroma feature below.</p>
<figure><img src="http://share.mygeekdaddy.net/Titan_chest_spektar.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<figure><img src="http://share.mygeekdaddy.net/Titan_spektar_gauntlets.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p><strong>Desolute</strong> This is the new line of armor that makes your Guardian look like they were Takenized. This <strong>is not</strong> a shader as a lot of us speculated. To gain the full Taken effect your character will have to have a full set of Desolute armor. Having a full set of Desolute armor will also unlock a new emote - Jitter - which makes your Guardian move more like its a Taken enemy.</p>
<figure><img src="http://share.mygeekdaddy.net/destiny_april_update_desolate_armor.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Side note: I can just imagine having a fire team running a King's Fall Raid in Desolute armor. </p>
<h4>The Red Buttons</h4>
<p>In the previous Twitch stream we saw some red buttons on one of the weapons the Bungie fire team won in the Challenge of the Elders. This week DeeJ and crew explained what these are and how they work in the stream. New weapons and armor that drop as part of the April Update will include a new chroma perk tree. Think of it as the glowing lights on objects in Tron. <sup id="fnref:39428"><a class="footnote-ref" href="#fn:39428">1</a></sup></p>
<figure><img src="http://share.mygeekdaddy.net/spektar_chroma_0.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Items that drop as part of the update will have the new perk tree slot to enable the chroma feature. To enable the chroma feature you need to obtain a consumable item to enable the feature. <sup id="fnref:219526"><a class="footnote-ref" href="#fn:219526">2</a></sup> </p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-30_at_11.21.51_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>New items with this feature will drop with one of four chroma colors. </p>
<ul>
<li>White</li>
<li>Yellow</li>
<li>Blue</li>
<li>Red</li>
</ul>
<p>To enable the chroma you use a consumable chroma material and it will essentially light up the armor piece. </p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-30_at_11.06.04_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-30_at_9.46.12_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>You can change the color of item by re-rolling the chroma perk for 100 glimmer. The new color selection is completely random so you may need to re-roll it a couple of times to get your choice of color. If the item previous had the chroma feature enabled, re-rolling a chroma color will also discard the previous chroma material. </p>
<figure><img src="http://share.mygeekdaddy.net/spektar_chroma_1.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>The chroma effect will work similarly for weapons included in the April Update. </p>
<h4>Sterling Treasure</h4>
<p>The two new armor styles, Spektar and Desolation, come from a new source called a Sterling Treasure box.</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-30_at_9.56.45_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>For those who are impatient, you can purchase a Sterling Treasure box for 200 Silver. For those who are on a tighter budget or can wait, each week you can get a Sterling Treasure boxes from the following sources:</p>
<ul>
<li>Post Master: Each week Guardians will get one new Sterling Treasure box from the Postmaster. </li>
<li>Lord Shaxx: Competing in the weekly crucible will award your Guardian a Sterling Treasure box. </li>
<li>Variks: Completing at lease one L41 Prison of Elders run each week.. </li>
</ul>
<p>One item that is an optional drop from a Sterling Treasure box is a reputation booster pack. These packs will allow you to more rapidly boost your Vanguard, Crucible or House Judgement rank for you and your team for 2 hours.</p>
<h4>New Weapons</h4>
<p>Bungie briefly went over some Y1 weapons that coming forward. A <a href="https://www.reddit.com/r/DestinyTheGame/comments/4cmw25/revealed_updated_year_1_guns_and_their_modern/">Destiny Reddit</a> thread has a breakdown of what weapons are getting pulled into Y2:</p>
<ul>
<li>Shadow Price</li>
<li>Badger CCL</li>
<li>Lord High Fixer</li>
<li>Grim Citizen III</li>
<li>The Saterienne Rapier</li>
<li>The Devil You Know</li>
<li>The Swarm</li>
<li>Zombie Apocalypse WF47</li>
<li>LDR 5001</li>
<li>Y-09 Longbow Synthesis</li>
<li>The Comedian</li>
<li>Two to the Morgue</li>
</ul>
<p>Images of some of the updated weapons coming in April:</p>
<figure><img src="http://share.mygeekdaddy.net/april_update_item_updates_img.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<figure><img src="http://share.mygeekdaddy.net/april_update_weapon1.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Note the colored sigil markings on the weapons are part of the chroma package for the weapon. </p>
<figure><img src="http://share.mygeekdaddy.net/april_update_weapon3j5uTX9B.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Side comments made in the stream make it sound like Taken weapons will only drop from the new Winter's Run strike.</p>
<figure><img src="http://share.mygeekdaddy.net/taken_shotgun_update.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>A new Taken sword was also shown off and details on how to get the sword were not strictly laid out in the stream. </p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-30_at_1.47.31_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<h4>Updated Exotics</h4>
<p>One part of the April Update that Bungie didn't show on the stream was the Y1 exotics that are coming to Y2. The current list revealed by Bungie includes:</p>
<ul>
<li>Helmets<ul>
<li>The Glasshouse</li>
<li>ATS/8 Arachnid</li>
<li>Eternal Warrior</li>
</ul>
</li>
<li>Chest Piece<ul>
<li>Lucky Raspberry</li>
<li>Purifier Robes</li>
</ul>
</li>
<li>Gauntlets<ul>
<li>Sunbreakers</li>
<li>Khepri's Sting</li>
</ul>
</li>
<li>Weapons<ul>
<li>Queenbreaker's Bow</li>
<li>Patience and Time</li>
<li>Universal Remote</li>
<li>Lord of Wolves</li>
<li>Dreg's Promise</li>
</ul>
</li>
</ul>
<p>Out of all the Y1 → Y2 releases, <em>Patience and Time</em> and <em>Universal Remote</em> appear to be the most interesting. Patience and Time is a sniper rifle that grants ~10 seconds of invisibility to the Guardian when crouched and looking down the sights. Universal Remote looks promising due to the increased range and precision when looking down sights. Both of these weapons could disrupt the current gameplay in the Crucible and Trials of Osiris. </p>
<p>There was also a sigh of relief (and disappointment) that it appears we won't see Thorn or Gjallarhorn get Y2 updates. </p>
<h4>Infusion Mode</h4>
<p>Probably the biggest change that hadn't been previously revealed was Bungie's change to how gear infusion will work. After the April Update, infused gear will get a 1:1 Light Level (LL) upgrade. So if you have a piece of Spektar armor, which drops at LL 3 by the way, and have a piece of LL 298. You can infuse the LL 298 gear into the LL 3 Spektar item and walk away with a piece of LL 298 Spektar armor.</p>
<h4>Other new items</h4>
<p>After all the other goodies that DeeJ and the gang showed us, they let us know there are few other new goodies to work towards:</p>
<ul>
<li>
<p>Ships: 3 new ships, one of which is Takenized will be available in the Sterling Treasure boxes. <figure><img src="http://share.mygeekdaddy.net/april_update_ship_taken.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></p>
</li>
<li>
<p>Sparrows: New sparrows that include the chroma bling will be available from various sources - one specifically mentioned was your faction. <sup id="fnref:695350"><a class="footnote-ref" href="#fn:695350">3</a></sup> <figure><img src="http://share.mygeekdaddy.net/april_update_sparrow.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></p>
</li>
<li>
<p>New ghost: A new ghost will drop in the new Prison of Elders PVE content. <figure><img src="http://share.mygeekdaddy.net/april_update_ghost.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></p>
</li>
<li>
<p>Emotes: Several new emotes will be available from the Eververse Trading Company. <figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-30_at_11.32.46_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure> <figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-30_at_11.34.29_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></p>
</li>
</ul>
<h4>Where to get new gear</h4>
<p>So now that we know about all the new stuff coming on April 12, where can you get it? Here are the player activities that Guardians can do to get some of the new goodies.</p>
<p>Items up to LL 320 Gear:</p>
<ul>
<li>Normal PVE Content - Strikes/Patrol</li>
<li>New L41 Prison of Elders</li>
<li>Normal Mode King's Fall Raid</li>
<li>Weekly Heroic Strike</li>
</ul>
<p>Item up to LL 335 Gear:</p>
<ul>
<li>Challenge of the Elders (L42 POE)</li>
<li>Hard Mode King's Fall Raid</li>
<li>Iron Banner</li>
<li>Trials of Osiris</li>
<li>Exotic Engrams</li>
<li>Court of Oryx (Artifacts only)</li>
</ul>
<h4>Expanded Vault Space</h4>
<p>Bungie heard our cries and they have added an additional page of vault space for all items - Weapons, Armor, and General. This will be updated after you download and apply the patch to your console. </p>
<h4>Minor Housekeeping</h4>
<p>In the first stream, Bungie stated that Hard Mode King's Fall (Oryx Raid) will drop LL 330 gear. Bungie stated a small post patch will made to bring drops in MH King's Fall will be up to LL 335. This will not be available on April 12. The date for the post patch was not revealed. </p>
<h4>Next week - Sandbox & Crucible Updates</h4>
<p>Bungie has one final Twitch stream before the April Update drops. Next week Bungie will cover </p>
<ul>
<li>Crucible - Changes and content updates related to Crucible and PVP.</li>
<li>Sandbox - Changes to the core Destiny game.</li>
<li>Subclasses - Overview of subclass changes/tweaks.</li>
<li>Weapons - Updates on buffs or nerfs to weapons. </li>
</ul>
<p>The next stream will be Wednesday, April 6th at 11am PT. </p>
<p><br></p>
<p>See you next week Guardians!</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:39428">
<p>If that doesn't register for you, please stop reading right now. <a class="footnote-backref" href="#fnref:39428" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:219526">
<p>Kind of like a lightbulb. <a class="footnote-backref" href="#fnref:219526" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:695350">
<p>Hopefully a hint that SRL is coming back. <a class="footnote-backref" href="#fnref:695350" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:330903">
<p>Predicting next update is dropping July 19. <a class="footnote-backref" href="#fnref:330903" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Hello iPhone 5 SE2016-03-23T20:04:32-05:002016-03-23T20:04:32-05:00Jason Verlytag:mygeekdaddy.net,2016-03-23:/2016/03/23/hello-iphone-5-se/<p>The bane and beauty of the Internet is that you can turn one corner and find someone <a href="http://daringfireball.net/2016/03/thoughts_and_observations_loop_you_in">who thinks just like you</a> and then turn another corner to find <a href="http://leancrew.com/all-this/2016/03/iphone-se/">someone in your opposing corner</a>. In this case we're talking about Apple's revamped <a href="http://www.apple.com/iphone-se/">iPhone 5 SE</a>. I've had an iPhone 6S …</p><p>The bane and beauty of the Internet is that you can turn one corner and find someone <a href="http://daringfireball.net/2016/03/thoughts_and_observations_loop_you_in">who thinks just like you</a> and then turn another corner to find <a href="http://leancrew.com/all-this/2016/03/iphone-se/">someone in your opposing corner</a>. In this case we're talking about Apple's revamped <a href="http://www.apple.com/iphone-se/">iPhone 5 SE</a>. I've had an iPhone 6S for about 3 weeks now and I can honestly say I miss the size and handling of my iPhone 5s. So when Apple confirmed the details of the iPhone 5 SE early this week, I'm considering returning this glass screen giant. Here's why:</p>
<ul>
<li>Five rows of apps (excluding the Dock) instead of six? Perfect. If it's not on my front screen it's not something I <em>need</em> to see. That's what Search is for.</li>
<li>The tiny vertical space for text in Drafts above the keyboard, the suggestions, and the extended keyboard row? iPhone 6s doesn't offer any extra buttons Drafts, just bigger buttons. </li>
<li>The mishits in PCalc because the key size in my preferred layout is just a skosh too small for my diminished fine motor skills? I still play video games, so my motor skills are fine.</li>
<li>The loss of thumb typing in portrait mode, which I was never able to do on the narrower phone? iPhone 6s cannot be single thumbed typed. I rocked that on my 5s. </li>
<li>The constant need to pinch and scroll in Mobile Safari because badly designed sites (i.e., most sites) have text that’s just a bit smaller than my comfort zone? That's what my iPad is for. </li>
<li>The power button is so much nicer on the side. Said no one ever. </li>
</ul>
<p>Now I don't mean to jest at Dr Drang's expense.<sup id="fnref:16_03_23_20_29_00"><a class="footnote-ref" href="#fn:16_03_23_20_29_00">1</a></sup> But I think the important point is that Apple is recognizing that one device doesn't fit the needs of all their customers. There was a contingent of iPhone users that wanted a larger phone - aka 6s and 6s Plus. There was also a contingent that loved the size of the 5s - aka me. <sup id="fnref:16_03_23_20_33_46"><a class="footnote-ref" href="#fn:16_03_23_20_33_46">2</a></sup> </p>
<p>Thank you Tim for moving past Steve's mantra of one device for everyone. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:16_03_23_20_29_00">
<p>Ok I do, but I jest with love. ;-) <a class="footnote-backref" href="#fnref:16_03_23_20_29_00" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:16_03_23_20_33_46">
<p>To be honest I still love the iPhone 4 even more. <a class="footnote-backref" href="#fnref:16_03_23_20_33_46" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Destiny April Update Preview2016-03-23T18:52:19-05:002016-03-23T18:52:19-05:00Jason Verlytag:mygeekdaddy.net,2016-03-23:/2016/03/23/destiny-april-update-preview/<figure><img src="http://share.mygeekdaddy.net/destiny_2.2.0_upate_splash.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>If you're a Destiny fan, you've probably already heard the news that Bungie is releasing an update on 4/12 for <em>Destiny - The Taken King</em>. If you haven't... hold on to your scout rifle Guardian. Bungie held the first of three Twitch streams today to reveal some of the new …</p><figure><img src="http://share.mygeekdaddy.net/destiny_2.2.0_upate_splash.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>If you're a Destiny fan, you've probably already heard the news that Bungie is releasing an update on 4/12 for <em>Destiny - The Taken King</em>. If you haven't... hold on to your scout rifle Guardian. Bungie held the first of three Twitch streams today to reveal some of the new content coming in the <a href="https://www.bungie.net/en/pub/AprilUpdate">April Update</a>.<sup id="fnref:547330"><a class="footnote-ref" href="#fn:547330">4</a></sup> Today's update was covering "New Things To Do". </p>
<p>The Twitch stream opened with a slew of tidbits and updates on the changes coming in the April update. The first was that this is a <strong>free</strong> update to anyone that owns The Taken King DLC. <sup id="fnref:828967"><a class="footnote-ref" href="#fn:828967">1</a></sup> This update is being brought out by the Destiny Live Team and is the biggest project the Live Team has done to date. I've broken down the biggest points <a href="https://twitter.com/deej_bng">DeeJ</a> and Bungie revealed in today's stream.</p>
<h4>Light Level Upgrade</h4>
<p>One of the previously announced changes with the April Update was an increase in the maximum Light Level you could achieve with your Guardian. The Taken King update brought the maximum Light Level (LL) up to 320. The April Update will bring the max LL to 335. The April Update will have a new ways for a Guardian to increase their LL. This will include:</p>
<ul>
<li>New and updated bounties.</li>
<li>New missions.</li>
<li>New quests.</li>
<li>New strike.</li>
</ul>
<p>The update includes changes to the existing content as well:</p>
<ul>
<li>Kingsfall Raid normal drops increased to LL 320. </li>
<li>Kingsfall Raid hard drops increased to LL 330. </li>
<li>Court of Oryx artifact drops increased to LL 335.</li>
</ul>
<p>Not all of the new content was discussed in today's stream, but DeeJ and the folks at Bungie said all of the new content will be discussed over the three Twitch streams. They did make one thing clear... all of the <strong>new</strong> content is focused on what's been happening in The Reef.</p>
<h4>The Reef & Prison of Elders</h4>
<p>The Reef was initially released as part of the <em><a href="https://www.bungie.net/en/pub/houseofwolves">House of Wolves</a></em> expansion pack. The April Update brings The Reef and Prison of Elders into Y2. During the discussion of what's coming in the new update, Bungie revealed that the Taken are not gone, but have a new power leading them - Malok.</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-23_at_1.17.12_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>The other new baddie (or is he?) is that the Archon Priest is now Taken as well. This led to DeeJ revealing that the new strike will be a version of <a href="http://destiny.wikia.com/wiki/Winter's_Run">Winter's Run</a> with Taken in it. Beyond the new content DeeJ discussed, one of the most recognizable changes will be the map of The Reef itself.</p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-23_at_1.25.26_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>As you can see there are some new and updated places to visit in The Reef:</p>
<ul>
<li>Vestian Outpost: The Vestian Outpost will be the central hub for the content in the April Update. Variks and Petra have continued their war on the Taken and most of the new content revolves around this storyline. Some of the new things at the Vestian Outpost include:<ul>
<li>The Eververse Trading Company now has a spot in the Reef. </li>
<li>Variks has a two new quests: "Pretender to the Throne" and "Return to the Prison". He also has a new weekly passage called the <em>Elder's Sigil</em> - see below for more detail. This passage, similar to the Trials Passage sold by Brother Vance, will allow a Guardian access to new content called "The Challenge of the Elders". Variks also has new <em>weekly</em> bounties to gain House Judgement rank. <sup id="fnref:157456"><a class="footnote-ref" href="#fn:157456">2</a></sup></li>
<li>Petra has a new quest line (not revealed in the stream) and updated bounties as well. </li>
</ul>
</li>
<li>Level 41 Arena - Prison of Elders: This is a updated version of the Prison of Elders (POE) for Guardians to use PVE content to raise their LL. Like the L28 POE arena, the L41 arena will consist of a fire team of three guardians and it <strong>will</strong> have matchmaking available. The <em>Sterling Treasure</em> seen in the screenshot above was specifically mentioned, but as DeeJ said - "...will be revealed in next week's stream." The L41 Arena includes 4 new bosses, all of which are Taken. You have a 50/50 chance of getting one of the original bosses or getting one of the new Taken bosses at the end of your POE run. Bungie said that a treasure key was no longer needed on the L41 arena. So once you make it through, you'll be able to open up the treasure chest at the end. Up to LL 320 gear will drop in this arena. <sup id="fnref:694814"><a class="footnote-ref" href="#fn:694814">3</a></sup></li>
<li>Level 42 Arena - Challenge of the Elders: This is one of the new content pieces coming in the April Update. Challenge of the Elders will be the PVE equivalent to Trials of Osiris. There is a passage card, called an Elder's Sigil, that can be purchased from Variks for 100 Glimmer to allow entry into the Challenge of the Elders. Just like Trials of Osiris, you need to have a fire team of 3 and there is <strong>no matchmaking</strong>. Up to LL 335 gear will drop in this arena. </li>
</ul>
<h4>Play Through of "Challenge of the Elders"</h4>
<p>The stream was wrapped up with a team of Bungie employees (including Cozmo) playing through a session of Challenge of the Elders (CotE). Some of the highlights discussed or shown during the CotE game play were:</p>
<ul>
<li>The Elder's Sigil passage is purchased from Variks and will have challenges to meet each week. The card is valid for one week and expires at the weekly reset. The example in the game play during Bungie's stream was to hit a specific high score and getting an overall set of points. Achieve these items and you will receive a guaranteed item from Variks.<ul>
<li>1st challenge = guaranteed weapon (up to LL 335)</li>
<li>2nd challenge = guaranteed armor (up to LL 335)</li>
</ul>
</li>
<li>The CotE does not have a Treasure Room like the new L41 arena or the existing POE arenas. Awards are based at the end of each match (like Crucible matches) or based on the points collected on a player's Elder's Sigil passage card.</li>
<li>The CotE point system is similar to Crucible scoring, get a kill or an assist to score points. Unlike the Crucible, a player can get points for both offensive (kills/assists) and defensive (generate orbs) actions. These points are collected for the entire fire team. </li>
<li>There will be weekly modifiers on the CotE, similar to the Weekly Nightfall. These modifiers include bonuses for point collection - e.g. precision kills, melee kills, etc. </li>
<li>Activities in the CotE are timed, so if you take too much time to clear adds while working on the boss, Variks will start to deduct points off of your overall team score. </li>
<li>Engrams will drop like in regular PVE content. In the stream there were 3 or 4 new armor engrams that dropped, but no comments were made about the contents in the engrams. </li>
<li>Kills made in CotE will count against daily and weekly bounties from Xander 99-40, Petra, etc. </li>
<li>Each player is ranked at the end of each boss level, similar to Crucible or Iron Banner scoring. </li>
<li>Wiping on a level will reset that level and your score to your previous point. This means you can't go into CotE, clear 90% of a level, wipe, and expect to keep all of the points. </li>
<li>After the final boss is killed, Variks will congratulate you and tell you to come to Vestian Outpost to collect any rewards you have obtained on your Elder's Sigil. </li>
</ul>
<p>According to Bungie, based on the boss rotation and new/updated modifiers, a Guardian will have <em>4 months</em> of fresh content to play in CotE. Here are some screenshots of the play through Bungie showed. </p>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-23_at_1.41.51_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-23_at_1.41.38_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-23_at_1.51.46_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-23_at_1.52.11_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-23_at_1.52.03_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Yes, there is a new perk tree on the weapon and Bungie said that will be discussed next week. </p>
<h4>Miscellaneous Update Points</h4>
<p>There were a few odds and ends revealed through out Bungie's stream today. Deej and the gang didn't go in to any detail, but they were put out there publicly none the less.</p>
<ul>
<li>Subtle changes to character subclasses are coming. More of this will be discussed in the stream on 4/6. </li>
<li>There is new treasure in the updated POE and that will be discussed next week. </li>
<li>There is new armor and weapons as part of the update. Details on the Taken armor and/or shader will be discussed in a future stream as well. </li>
</ul>
<figure><img src="http://share.mygeekdaddy.net/Screen_Shot_2016-03-23_at_1.19.42_PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<h4>Next Twitch Streams</h4>
<p>Bungie has two more streaming dates set to reveal additional content in the April Update:</p>
<ul>
<li>New Things to Earn | 3/30 @ 2pm ET/11am PT</li>
<li>Sandbox and Crucible Updates | 4/6 @ 2pm ET/11am PT</li>
</ul>
<p>Both of the updates will be on Bungie's Twitch channel: <a href="http://twitch.tv/bungie">twitch.tv/bungie</a></p>
<p></br>
See you all on April 12 Guardians!</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:828967">
<p>Which is probably everyone reading this article. ;-) <a class="footnote-backref" href="#fnref:828967" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:157456">
<p>So we can all finally use our Tokens of Judgement, Flight, and Identity. <a class="footnote-backref" href="#fnref:157456" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:694814">
<p>It wasn't specifically stated if a Guardian can move up to L41 to coincide with new LL 335. <a class="footnote-backref" href="#fnref:694814" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:547330">
<p>I'm assuming they fixed the "Geek RNG" glitch too. <a class="footnote-backref" href="#fnref:547330" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Reviewing Arms Days Packages2016-03-16T19:22:01-05:002016-03-16T19:22:01-05:00Jason Verlytag:mygeekdaddy.net,2016-03-16:/2016/03/16/reviewing-arms-days-packages/<p>Traveling and gaming don't always mix well together. If you play Destiny, you probably know that Wednesday is Arms Day. In the past when I was traveling, I would typically have to wait until I got home or how someone on Reddit posted some details about a package I haven't …</p><p>Traveling and gaming don't always mix well together. If you play Destiny, you probably know that Wednesday is Arms Day. In the past when I was traveling, I would typically have to wait until I got home or how someone on Reddit posted some details about a package I haven't redeemed yet. I finally found a way to look at my Arms Day packages without having to log into my gaming console. <sup id="fnref:16_03_16_20_10_10"><a class="footnote-ref" href="#fn:16_03_16_20_10_10">1</a></sup> </p>
<p>Here's how to look at your Arms Day packages:</p>
<ol>
<li>Open <a href="https://www.bungie.net">Bungie.net</a> and sign in using your PSN or XBL account. </li>
<li>Click on your account and select <code>Profile</code>.</li>
<li>This will open your Destiny account and show any characters you have created that are is associated with your PSN or XBL account. <figure><img src="http://share.mygeekdaddy.me/IMG_0589.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></li>
<li>Click on the character that has the open Arms Day order package. </li>
<li>In the upper left, click on the 'My Legend' menu item and select Vendors. This will start to feel very similar if you've ever used the <a href="https://itunes.apple.com/us/app/destiny-companion/id441444902?mt=8&uo=4" title="destiny">Destiny companion app</a>. <figure><img src="http://share.mygeekdaddy.me/IMG_0590.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></li>
<li>Just like in the Destiny app, you start with Eververse Trading Company. Click on 'Tower' in the middle of the screen to see all of the Tower vendors. <figure><img src="http://share.mygeekdaddy.me/IMG_0598.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></li>
<li>On the left side of the screen you'll see a list of the Tower vendors. Just scroll down and click on Gunsmith. <figure><img src="http://share.mygeekdaddy.me/IMG_0599.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></li>
<li>After you click on Gunsmith, you'll see a screen of the items Banshee-44 has for sale. Scroll to the bottom of the screen and you'll see any Arms Days packages that haven't been redeemed. <figure><img src="http://share.mygeekdaddy.me/IMG_0592.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></li>
<li>Click on a package once to get a summary of the weapon and perks on the package.<figure><img src="http://share.mygeekdaddy.me/IMG_0595.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></li>
<li>Click on the package again and you get a pop up box that shows a detail of the perks rolled for the package. <figure><img src="http://share.mygeekdaddy.me/IMG_0596.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure></li>
</ol>
<p>So now you can check the perk rolls on your Arms Day packages with out having to log onto your console. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:16_03_16_20_10_10">
<p>PSN: MyGeekDaddy <a class="footnote-backref" href="#fnref:16_03_16_20_10_10" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Making the move to Python 32016-03-01T14:34:26-06:002016-03-01T14:34:26-06:00Jason Verlytag:mygeekdaddy.net,2016-03-01:/2016/03/01/making-the-move-to-python-3/<p>A couple of weeks ago, Ole Zorn tweeted out something very interesting. </p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">So... this is something else I'm working on. <a href="https://twitter.com/hashtag/python3?src=hash">#python3</a> <a href="https://t.co/nXc7I7F134">pic.twitter.com/nXc7I7F134</a></p>— Ole Zorn (@olemoritz) <a href="https://twitter.com/olemoritz/status/699737328777093120">February 16, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>I followed up with.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">This is what will finally make me switch to Python 3. 😉 <a href="https://t.co/RlTviCaxaj">https://t.co …</a></p></blockquote><p>A couple of weeks ago, Ole Zorn tweeted out something very interesting. </p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">So... this is something else I'm working on. <a href="https://twitter.com/hashtag/python3?src=hash">#python3</a> <a href="https://t.co/nXc7I7F134">pic.twitter.com/nXc7I7F134</a></p>— Ole Zorn (@olemoritz) <a href="https://twitter.com/olemoritz/status/699737328777093120">February 16, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>I followed up with.</p>
<blockquote class="twitter-tweet" data-lang="en"><p lang="en" dir="ltr">This is what will finally make me switch to Python 3. 😉 <a href="https://t.co/RlTviCaxaj">https://t.co/RlTviCaxaj</a></p>— Jason Verly (@mygeekdaddy) <a href="https://twitter.com/mygeekdaddy/status/699748753507540992">February 17, 2016</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>The Python community has sort of forked <sup id="fnref:56018"><a class="footnote-ref" href="#fn:56018">1</a></sup> between users sticking with Python 2 <sup id="fnref:148545"><a class="footnote-ref" href="#fn:148545">2</a></sup> and those moving on to Python 3. <sup id="fnref:974267"><a class="footnote-ref" href="#fn:974267">3</a></sup> Even though the maintainers of Python <a href="http://legacy.python.org/dev/peps/pep-0373/">extended the life of Python 2</a>, the writing is on the wall that we should be thinking about the move to Python 3. All of this got me thinking about <em>how</em> to move from Python 2 to 3, without disrupting existing scripts on my Mac and iPad. I wanted a way to learn the differences in the two versions and have a place to test most of my scripts before moving completely over to Python 3. <sup id="fnref:212577"><a class="footnote-ref" href="#fn:212577">5</a></sup></p>
<p>I got my answer over the weekend with the Raspberry Pi Foundation's announcement of the <a href="https://www.raspberrypi.org/blog/raspberry-pi-3-on-sale/">Raspberry Pi 3</a>. I've done a few projects with the Raspberry Pi, but this update looks like it will make my Python training even easier. The updated board includes:</p>
<ul>
<li>1.2GHz 64-bit quad-core ARM Cortex-A53 CPU</li>
<li>1 GB of RAM at 900 MHz</li>
<li>Integrated 802.11n wireless LAN </li>
<li>Integrated Bluetooth 4.1</li>
<li>Same form factor as Raspberry Pi 2</li>
</ul>
<p>The best part? The board is still only $35! <sup id="fnref:494128"><a class="footnote-ref" href="#fn:494128">4</a></sup></p>
<p>The integrated WiFi and Bluetooth is what is making this so much more appealing. I've been using a bunch of dongles in the past to make my Raspberry Pi more portable. Now I can have a small setup with a full Unix environment, running Python 3, and not have the hassle of dongles everywhere. </p>
<figure><img src="http://share.mygeekdaddy.net/File_Mar_01_2_29_43_PM.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>So when Ole releases the update to Pythonista ( and hopefully Editorial too), I'll be able to take advantage of the newer features of Python 3 sooner rather than later. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:56018">
<p>Ok not kind of... we are really forked. <a class="footnote-backref" href="#fnref:56018" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:148545">
<p>Because it still works REALLY good. <a class="footnote-backref" href="#fnref:148545" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:974267">
<p>Because they were smart enough to move on. <a class="footnote-backref" href="#fnref:974267" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:494128">
<p>Assuming you can still find one on sale. <a class="footnote-backref" href="#fnref:494128" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:212577">
<p>Some stuff in Pythonista can only be tested on an iOS device. <a class="footnote-backref" href="#fnref:212577" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>Change Finder Sort Order for OS X El Capitan2016-02-29T00:00:00-06:002016-02-29T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2016-02-29:/2016/02/29/change-finder-sort-order-for-os-x-el-capitan/<p>Normally I have this help document up shortly after Apple updates OS X. This one took a little while longer because the answer was already posted in the comments for the post on how to change the <a href="http://mygeekdaddy.net/2014/10/16/change-yosemite-finder-app-sort-order/">sort order for Yosemite</a>. The biggest change we've seen in El Capitan is …</p><p>Normally I have this help document up shortly after Apple updates OS X. This one took a little while longer because the answer was already posted in the comments for the post on how to change the <a href="http://mygeekdaddy.net/2014/10/16/change-yosemite-finder-app-sort-order/">sort order for Yosemite</a>. The biggest change we've seen in El Capitan is OS X's <a href="https://support.apple.com/en-us/HT204899">System Integrity Protection</a>. This new feature helps protect your Mac from malicious software. It also makes some common customization steps a little trickier. </p>
<p>Here's how to change Finder.app sort order in OS X El Capitan. </p>
<h4>Required Tools:</h4>
<ul>
<li>BBEdit - My go to file editor. ($)</li>
<li>Plist Editor - Part of Apple's Xcode tool set.</li>
<li>A recent back-up. <sup id="fnref:backup"><a class="footnote-ref" href="#fn:backup">1</a></sup></li>
</ul>
<p><strong>Note:</strong> Some posts have stated Text Wrangler (kind of a BBEdit lite) will work. My testing has shown Text Wrangle <em>does not</em> work to edit <code>plist</code> files. Use BBEdit or the Xcode tool. Anything else and you risk corrupting the <code>plist</code> file and borking your Finder.app settings. </p>
<h4>Update Steps:</h4>
<p>Before beginning, <strong>please-please-please</strong> back up your Mac. One of the common issues I've had with this process is helping people fix a corrupted <code>InfoPlist.strings</code> file after trying to make the changes. </p>
<ol>
<li>From the desktop, click the menu and select 'Restart...'.</li>
<li>As soon as your Mac starts to restart, hold down the Cmd-R keys to boot into Recovery mode. </li>
<li>Click the 'Utilities' menu and select the Terminal command.</li>
<li>Enter the following command in the Terminal windows: <code>csrutil disable</code>. You will be alerted that your Mac needs to restart for the change to take effect. </li>
<li>Click on menu again and select Restart.</li>
<li>After you Mac restarts, open Finder and navigate to <code>/System/Library/Coreservices</code> folder and locate the Finder application. Use Shift-Cmd-G in Finder.app and enter the path above to easily locate the right spot.</li>
<li>Once the folder is open, right click on the Finder.app file and click on ‘Show Package Contents’. </li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/show_package_contents_2014-09-03.png"><img src="http://share.mygeekdaddy.net/show_package_contents_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>The package contents of the Finder.app will open like it was a folder and show additional folders and files that make up the Finder.app application.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/finder_contents_as_folder_2014-10-16_2014-10-16.png"><img src="http://share.mygeekdaddy.net/finder_contents_as_folder_2014-10-16_2014-10-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Once the package contents are opened, navigate to “Contents/Resources/English.lproj” folder. <sup id="fnref:895827"><a class="footnote-ref" href="#fn:895827">2</a></sup></li>
<li>Locate the file <code>InfoPlist.strings</code> file. This is the file that contains the structure on how Finder.app sorts records.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/infoplist_file_found_2014-09-03.png"><img src="http://share.mygeekdaddy.net/infoplist_file_found_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Assuming you're using BBEdit, right click on the file and select BBEdit to edit the file. Note you may get a warning when you attempt to edit the <em>Folder</em> tag.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/BBEdit_warning_2014-09-03.png"><img src="http://share.mygeekdaddy.net/BBEdit_warning_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Locate the "Folder" entry in the <code>InfoPlist.strings</code> file and add a space to Folder <em>string</em> key.</li>
</ol>
<p>Before:</p>
<figure><a href="http://share.mygeekdaddy.net/finderapp_plist_before_2014-10-16.png"><img src="http://share.mygeekdaddy.net/finderapp_plist_before_2014-10-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>After:</p>
<figure><a href="http://share.mygeekdaddy.net/finderapp_plist_after_2014-10-16.png"><img src="http://share.mygeekdaddy.net/finderapp_plist_after_2014-10-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Save the changes to the <code>InfoPlist.strings</code> file and close BBEdit/Xcode tool.</li>
<li>Now to re-enable SIP, click the menu and select 'Restart...'</li>
<li>As soon as your Mac starts to restart, hold down the Cmd-R keys to boot into Recovery mode. </li>
<li>Click the 'Utilities' menu and select the Terminal command.</li>
<li>Enter the following command in the Terminal windows: <code>csrutil enable</code>. You will again be alerted that your Mac needs to restart for the change to take effect. </li>
<li>Click on menu again and select Restart.</li>
<li>Allow the system to restart and log back in as normal.</li>
</ol>
<p>Now after your Mac reboots, Finder.app will sort any Folders to come first when you sort by <em>Kind</em>. <sup id="fnref:558191"><a class="footnote-ref" href="#fn:558191">3</a></sup></p>
<figure><a href="http://share.mygeekdaddy.net/after_folder_sort_2014-09-03.png"><img src="http://share.mygeekdaddy.net/after_folder_sort_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Caveat on Sort Order:</h4>
<p>In my previous post on <a href="http://mygeekdaddy.net/2013/10/24/change-mavericks-finder-app-sort-order/">updating Finder.app for OS Mavericks</a>, I added an <a href="http://mygeekdaddy.net/2013/11/25/caveat-to-finder-app-sort-order/">addendum on a problem a small percentage users</a> were having with the steps above. </p>
<p>To ensure the sort order by 'Kind' will show Folders first, make sure the default Arrange By order should be <em>None</em>. The tags for other Arrange By sorts orders override the file tag changed in the steps above.</p>
<figure><a href="http://share.mygeekdaddy.net/default_sort_order_2014-09-03.png"><img src="http://share.mygeekdaddy.net/default_sort_order_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<div class="footnote">
<hr>
<ol>
<li id="fn:backup">
<p>The changes discussed here <em>shouldn't</em> mess up your system, but wouldn't you feel better knowing you can just make a quick restore? <a class="footnote-backref" href="#fnref:backup" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:895827">
<p>This is the default for systems using English as the primary language. Look around for the correct folder if English is not the default. <a class="footnote-backref" href="#fnref:895827" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:558191">
<p>Yes these are the same images from Yosemite, but that's because results are the same too. ;-) <a class="footnote-backref" href="#fnref:558191" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Creating a Row Number in a Grouped Detail2016-01-25T12:46:52-06:002016-01-25T12:46:52-06:00Jason Verlytag:mygeekdaddy.net,2016-01-25:/2016/01/25/creating-a-row-number-in-a-grouped-detail/<p>I've been working on a way to review with my power users how they've setup their Start Centers. The goal was to ensure suggested Start Center setups were in place and to see if any custom setups should be shared with other sites. This required getting a snapshot of what …</p><p>I've been working on a way to review with my power users how they've setup their Start Centers. The goal was to ensure suggested Start Center setups were in place and to see if any custom setups should be shared with other sites. This required getting a snapshot of what they setup in their Start Center before meeting with them. The hard way was asking for everyone to take a screenshot of their Start Center. The easy way was creating a report to show what was in a user's Start Center. </p>
<p>I got the report drafted up fairly quickly and it looks like this:</p>
<figure><img src="http://share.mygeekdaddy.net/startcenter_rpt_2016-1-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>A problem I ran into was a text label I wanted to use - "Fields in Result Set" - in the detail row. The idea was to insert a text element and then suppress it after the first row. The problem was the text label is in a detail row of a grouped field (the gray background/white text sections) and the row numbers reset on the table, not the group, in BIRT. </p>
<h4>Setting up the report</h4>
<p>The report needed the ability to have the equivalent of the <code>row.__rownum</code> function, but count and reset on each Group heading. Once the row count function was working, I could use it suppress the extra text labels. In the end this report demonstrated a unique combination of two setups: </p>
<ol>
<li>Creating a row count under a Grouped field. </li>
<li>Using the new functionality to suppress information in the report.</li>
</ol>
<h4>Set variable on <code>initialize</code> script</h4>
<p>The first step is to declare the variable for the detail row number. To do this you need to add the variable on the overall report <code>initialize</code> script page. In this case the the variable declared is: <code>rowCount = 0;</code>.</p>
<figure><img src="http://share.mygeekdaddy.net/Screen%20Shot%202016-01-21%20at%203.14.06%20PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<h4>Set the variable on Group <code>onCreate</code> script method</h4>
<p>The next step is to place the variable on the group. This doesn't actually set the variable, but resets the value of the <code>rowCount</code> variable back to zero (0) for each group. If this isn't set on the Group, the <code>rowCount</code> variable would continue to increment like the native <code>row.__rownum</code> function.</p>
<figure><img src="http://share.mygeekdaddy.net/Screen%20Shot%202016-01-21%20at%203.15.51%20PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<h4>Increment the <code>rowCount</code> on Detail <code>onCreate</code> script method</h4>
<p>The next step is to place an increment operator on the <code>rowCount</code> variable to ratchet up the counter for each detail record. Add the <code>rowCount</code> the variable on the Detail <code>onCreate</code> script method using the <code>++</code> operator.</p>
<figure><img src="http://share.mygeekdaddy.net/Screen%20Shot%202016-01-21%20at%203.16.11%20PM.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<h4>Verify the <code>rowCount</code> function is working</h4>
<p>After doing the previous steps, double check that the <code>rowCount</code> variable is incrementing as planned. Insert a <code>Dynamic Text</code> element and inside the element enter the <code>rowCount</code> variable.</p>
<figure><img src="http://share.mygeekdaddy.net/row_count_dyn_text_2016-01-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>Now do a preview to see if the row count is resetting for each group. </p>
<figure><img src="http://share.mygeekdaddy.net/row_count_display_2016-01-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<h4>Set Visibility on the text element</h4>
<p>With the row counting working as planned, use the variable on the visibility of the text label. Open the Properties of the text element and set the visibility to <code>rowCount > 1</code>.</p>
<figure><img src="http://share.mygeekdaddy.net/setup_row_visible_2016-01-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<h4>Final Results</h4>
<p>With everything in place, the final results look like this:</p>
<figure><img src="http://share.mygeekdaddy.net/suppressed_label_2016-01-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></figure>
<p>The text element will now show up only on the first line in the detail row. </p>Capture and merge photos with Pythonista2016-01-12T12:33:25-06:002016-01-12T12:33:25-06:00Jason Verlytag:mygeekdaddy.net,2016-01-12:/2016/01/12/capture-and-merge-photos-with-pythonista/<p>A common task I have with my job is to do a post project inspection and create a report on my findings. This process involves looking at equipment that's been installed as part of a project, document how well the equipment is working, or investigate why the equipment isn't performing …</p><p>A common task I have with my job is to do a post project inspection and create a report on my findings. This process involves looking at equipment that's been installed as part of a project, document how well the equipment is working, or investigate why the equipment isn't performing as expected. The reports I write need to be understood in the future, so parts of the report will be photos of the equipment that was installed. A problem I was running into was I would typically get an image and comment in the report that looked like this:</p>
<figure><img src="http://share.mygeekdaddy.net/IMG_0012_2016-1-12.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /><p>Sanitary valve on end of tank.</p></img></figure>
<p>This worked great for the first week or two after I had taken the picture and the report information was fresh in my head. However I once had to go back to a report from about 6 years prior and I couldn't make heads or tails on what a couple of photos were taken of. After this head scratcher I started using two pictures to give some context of where/what a photo was taken. </p>
<figure><img src="http://share.mygeekdaddy.net/IMG_0013_2016-1-12.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /><p>Sanitary valve on end of tank.</p></img></figure>
<p>Previously doing this merge would require time in a photo editor to get a single image. About a year ago I <a href="http://mygeekdaddy.net/2014/10/14/updated-image-merge-script/">moved this process over to Pythonista</a>. The script would allow me to pick two images and merge them into a single image. After doing this repeatedly, I finally put a script together to do all the heavy lifting of taking the two pictures <strong>and</strong> then merging them together. </p>
<h4>Mix and merge</h4>
<p>The script runs in Pythonista <sup id="fnref:977789"><a class="footnote-ref" href="#fn:977789">1</a></sup> and does three quick steps:</p>
<ol>
<li>Asks you to take the first photo.
<figure><img src="http://share.mygeekdaddy.net/IMG_0009_2016-01-12.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure></li>
<li>Asks you to take the second image.
<figure><img src="http://share.mygeekdaddy.net/IMG_0015_2016-1-12.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure></li>
<li>Then it merges the two images together.
<figure><img src="http://share.mygeekdaddy.net/IMG_0016_2016-1-12.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure></li>
</ol>
<p>The final result looks like this.</p>
<figure><img src="http://share.mygeekdaddy.net/IMG_0008_2016-01-12.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<h4>Photo error handling</h4>
<p>In the event I accidentally took one image in landscape and the other in portrait, the script will alert me to the error and not save anything so my camera roll isn't filled with badly merged images. <sup id="fnref:467127"><a class="footnote-ref" href="#fn:467127">2</a></sup></p>
<figure><img src="http://share.mygeekdaddy.net/IMG_0010_2016-01-12.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<figure><img src="http://share.mygeekdaddy.net/IMG_0011_2016-01-12.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<h4>Photo capture script</h4>
<div class="highlight"><pre><span></span><code><span class="c1"># Prompts user to take 2 pictures and merges the two images together </span>
<span class="kn">import</span> <span class="nn">clipboard</span>
<span class="kn">import</span> <span class="nn">Image</span>
<span class="kn">import</span> <span class="nn">console</span>
<span class="kn">import</span> <span class="nn">photos</span>
<span class="n">console</span><span class="o">.</span><span class="n">clear</span><span class="p">()</span>
<span class="n">console</span><span class="o">.</span><span class="n">alert</span><span class="p">(</span><span class="s2">"Take first image"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">"Ok"</span><span class="p">)</span>
<span class="n">img1</span><span class="o">=</span><span class="n">photos</span><span class="o">.</span><span class="n">capture_image</span><span class="p">()</span>
<span class="n">console</span><span class="o">.</span><span class="n">alert</span><span class="p">(</span><span class="s2">"Take second image"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">"Ok"</span><span class="p">)</span>
<span class="n">img2</span><span class="o">=</span><span class="n">photos</span><span class="o">.</span><span class="n">capture_image</span><span class="p">()</span>
<span class="n">console</span><span class="o">.</span><span class="n">show_activity</span><span class="p">()</span>
<span class="n">w1</span><span class="p">,</span><span class="n">h1</span> <span class="o">=</span> <span class="n">img1</span><span class="o">.</span><span class="n">size</span>
<span class="n">w2</span><span class="p">,</span><span class="n">h2</span> <span class="o">=</span> <span class="n">img2</span><span class="o">.</span><span class="n">size</span>
<span class="c1"># Set the width and height of each image</span>
<span class="n">img1_w</span> <span class="o">=</span> <span class="n">img1</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">img1_h</span> <span class="o">=</span> <span class="n">img1</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="n">img2_w</span> <span class="o">=</span> <span class="n">img2</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
<span class="n">img2_h</span> <span class="o">=</span> <span class="n">img1</span><span class="o">.</span><span class="n">size</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">image_merge</span><span class="p">(</span><span class="n">img</span><span class="p">):</span>
<span class="k">if</span> <span class="p">(</span><span class="n">img1_w</span><span class="o">*</span><span class="mf">1.0</span><span class="p">)</span><span class="o">/</span><span class="n">img1_h</span> <span class="o">></span> <span class="mi">1</span><span class="p">:</span>
<span class="nb">print</span> <span class="s1">'Landscape screenshot...'</span>
<span class="n">background</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">'RGB'</span><span class="p">,</span> <span class="p">((</span><span class="n">img1_w</span><span class="o">+</span><span class="mi">20</span><span class="p">),</span> <span class="p">((</span><span class="n">img1_h</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span><span class="o">+</span><span class="mi">30</span><span class="p">)),</span> <span class="p">(</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">,</span><span class="mi">255</span><span class="p">))</span>
<span class="nb">print</span> <span class="s2">"Generating image..."</span>
<span class="n">background</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">img1</span><span class="p">,(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="n">background</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">img2</span><span class="p">,(</span><span class="mi">10</span><span class="p">,(</span><span class="n">img1_h</span><span class="o">+</span><span class="mi">20</span><span class="p">)))</span>
<span class="n">photos</span><span class="o">.</span><span class="n">save_image</span><span class="p">(</span><span class="n">background</span><span class="p">)</span>
<span class="nb">print</span> <span class="s2">"Image saved"</span>
<span class="k">else</span><span class="p">:</span>
<span class="nb">print</span> <span class="s1">'Portrait screenshot...'</span>
<span class="n">background</span> <span class="o">=</span> <span class="n">Image</span><span class="o">.</span><span class="n">new</span><span class="p">(</span><span class="s1">'RGB'</span><span class="p">,</span> <span class="p">(((</span><span class="n">img1_w</span><span class="o">*</span><span class="mi">2</span><span class="p">)</span><span class="o">+</span><span class="mi">30</span><span class="p">),(</span><span class="n">img1_h</span><span class="o">+</span><span class="mi">20</span><span class="p">)),</span> <span class="p">(</span><span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">255</span><span class="p">))</span>
<span class="nb">print</span> <span class="s2">"Generating image..."</span>
<span class="n">background</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">img1</span><span class="p">,(</span><span class="mi">10</span><span class="p">,</span><span class="mi">10</span><span class="p">))</span>
<span class="n">background</span><span class="o">.</span><span class="n">paste</span><span class="p">(</span><span class="n">img2</span><span class="p">,((</span><span class="n">img1_w</span><span class="o">+</span><span class="mi">20</span><span class="p">),</span><span class="mi">10</span><span class="p">))</span>
<span class="n">photos</span><span class="o">.</span><span class="n">save_image</span><span class="p">(</span><span class="n">background</span><span class="p">)</span>
<span class="nb">print</span> <span class="s2">"Image saved"</span>
<span class="k">if</span> <span class="n">img1_w</span> <span class="o">==</span> <span class="n">img2_w</span><span class="p">:</span>
<span class="n">image_merge</span><span class="p">(</span><span class="n">img1</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
<span class="n">console</span><span class="o">.</span><span class="n">alert</span><span class="p">(</span><span class="s2">"Incorrect image ratio"</span><span class="p">,</span> <span class="s2">""</span><span class="p">,</span> <span class="s2">"Ok"</span><span class="p">)</span>
</code></pre></div>
<p>When the script is done it leaves you at the console in Pythonista. There are plenty of options of where you can take it from there - open Photos, sftp image, etc. </p>
<h4>Script options</h4>
<p>You can edit the RGB setting to change the color of the merged image border. The default setting is to have a white (RGB 255, 255, 255) background.</p>
<div class="highlight"><pre><span></span><code>background = Image.new('RGB', ((img1_w+20), ((img1_h*2)+30)), (255,255,255))
</code></pre></div>
<p>You can change this to something simple like <code>(0,0,0)</code> to make the background black.</p>
<div class="highlight"><pre><span></span><code>background = Image.new('RGB', ((img1_w+20), ((img1_h*2)+30)), (0,0,0))
</code></pre></div>
<p>Now the merged images have a small black border around them.</p>
<figure><img src="http://share.mygeekdaddy.net/IMG_0014_2016-1-12.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></figure>
<div class="footnote">
<hr>
<ol>
<li id="fn:977789">
<p>I'll eventually get around to adding as an icon or using an application launcher. <a class="footnote-backref" href="#fnref:977789" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:467127">
<p>I have a note to update the script to then delete the previous two photos from the camera roll so the mis-orientated images aren't saved either. <a class="footnote-backref" href="#fnref:467127" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Solutions for a minor mid-life crisis2015-12-13T16:10:10-06:002015-12-13T16:10:10-06:00Jason Verlytag:mygeekdaddy.net,2015-12-13:/2015/12/13/solutions-for-a-minor-mid-life-crisis/<p>It happens.</p>
<p>You get to an age where family, life, and work are finally at a point that you don't say <em>"holy shit"</em> every time something unexpected happens. I'm starting to get to that point. </p>
<p>So what do most guys do? They get a car, a boat, a motorcycle. All …</p><p>It happens.</p>
<p>You get to an age where family, life, and work are finally at a point that you don't say <em>"holy shit"</em> every time something unexpected happens. I'm starting to get to that point. </p>
<p>So what do most guys do? They get a car, a boat, a motorcycle. All great solutions to add some unexpected complexity to your life. Me? I started gaming again. The game that got me started again was Destiny. <sup id="fnref:833371"><a class="footnote-ref" href="#fn:833371">1</a></sup> I've dabbled in the Call of Duty games, and they would intrigue me for two weeks over the holidays, but the story premise and game action just didn't grip me. Destiny seemed to click on all levels for me. So I started playing. <em>A lot.</em> </p>
<p>Now the PS4 controllers are notorious for their lack of battery capacity and it was something I learned the hard way one night when I was in the middle of a fire fight and I suddenly get disconnected from the game. I hurried up and switched controllers to get back in the game. I finished off the fight and went to my <em>box of cables</em> <sup id="fnref:844718"><a class="footnote-ref" href="#fn:844718">2</a></sup> to find a longer USB micro cable. I found one that was 6' long, but when my wife saw me sitting 6' from the TV she said I looked like a 5y old watching Saturday morning cartoons. </p>
<p>Doing a little searching I found the solution on Monoprice.com - <a href="http://www.monoprice.com/product?p_id=5460">15' USB 2.0 Micro B Cable</a>. This was perfect. I could reach from the PS4 to the couch with no worries. </p>
<p>Mid-life crisis fixed for $1.95. <sup id="fnref:443814"><a class="footnote-ref" href="#fn:443814">3</a></sup></p>
<div class="footnote">
<hr>
<ol>
<li id="fn:833371">
<p>PSN: mygeekdaddy. Look me up! ;-) <a class="footnote-backref" href="#fnref:833371" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:844718">
<p>Because every geek worth their salt has one. <a class="footnote-backref" href="#fnref:844718" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:443814">
<p>Ok... I still want a motorcycle. <a class="footnote-backref" href="#fnref:443814" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Can you find the Maximo security risk?2015-11-16T11:10:55-06:002015-11-16T11:10:55-06:00Jason Verlytag:mygeekdaddy.net,2015-11-16:/2015/11/16/can-you-find-the-maximo-security-risk/<p>Play out the following scenario for your company:</p>
<blockquote>
<p>It's Wednesday afternoon and a bunch of boxes have been dropped off at the loading dock from one of your suppliers. An employee comes down to inspect the boxes and packing slips. Looking over the boxes and packing slips, everything matches, so …</p></blockquote><p>Play out the following scenario for your company:</p>
<blockquote>
<p>It's Wednesday afternoon and a bunch of boxes have been dropped off at the loading dock from one of your suppliers. An employee comes down to inspect the boxes and packing slips. Looking over the boxes and packing slips, everything matches, so they load them up and take them to central storeroom to electronic receive the items into Maximo. Since this delivery is from one of your primary vendors, the delivery includes items from multiple purchases orders, there are some orders that are partial receipts. A couple of times the vendor will ship an extra item by mistake and this time they did. The extra item is over received and the paperwork is filed away. </p>
<p>A few weeks later the invoice comes in and is processed for payment. The A/P Dept notices that the invoice doesn't match the original purchase order. They call the vendor stating they over billed for an item and need the invoice corrected. The vendor states they got a revision to the PO and forward a copy of it back to the A/P Dept. The employee writes it off as another glitch in the integration between Maximo and ERP, so a miscellaneous voucher charge is made to get the invoice processed.</p>
</blockquote>
<p>Could that happen at your company? Maybe, maybe not. But the situation above played out <strong>exactly</strong> at a company recently. As the company began the investigation, the company identified several gaps in their purchasing, receiving, and invoice payment processes, but the one they couldn't get around was the revised purchase order. </p>
<p>The Maximo admin and I were catching up and she gave the details of the situation and asked if I had any ideas on where the leak was coming from. I asked a few questions and she gave me the following:</p>
<ul>
<li>The vendors they contacted were able to provide a copy of the revised PO with all the correct information.</li>
<li>The revised PO layout (field position, font, etc) matched the company's office PO print report. </li>
<li>The revised purchase orders were generally made towards the end of the week. </li>
<li>The items being stolen were generally modestly priced ($200-$500) and were commonly used by the plant. </li>
<li>There was no indication that the revision was being deleted/removed at the database level. </li>
<li>All the vendors used in the scheme had an automated method to process orders. </li>
</ul>
<p>After about 2 months of investigating, they found the spot where the leak was occurring. </p>
<p>Can you guess how the employee(s) were creating the revised purchase order and what method they were using to steal the items from their company?</p>Differences in password management2015-11-13T13:34:41-06:002015-11-13T13:34:41-06:00Jason Verlytag:mygeekdaddy.net,2015-11-13:/2015/11/13/differences-in-password-management/<p>A while back there was a book to help couples understand each other called '<a href="http://www.marsvenus.com/p/men-are-from-mars-women-are-from-venus-hardcover">Men are from Mars, Women are from Venus</a>'. <sup id="fnref:15_11_13_13_39_10"><a class="footnote-ref" href="#fn:15_11_13_13_39_10">1</a></sup> I had a flash back to the book the other night when my wife and I had the following conversation:</p>
<blockquote>
<p>Wife: Hey, before you go out, can …</p></blockquote><p>A while back there was a book to help couples understand each other called '<a href="http://www.marsvenus.com/p/men-are-from-mars-women-are-from-venus-hardcover">Men are from Mars, Women are from Venus</a>'. <sup id="fnref:15_11_13_13_39_10"><a class="footnote-ref" href="#fn:15_11_13_13_39_10">1</a></sup> I had a flash back to the book the other night when my wife and I had the following conversation:</p>
<blockquote>
<p>Wife: Hey, before you go out, can you write down a couple of passwords for me? <br>
Me: Sure. Which ones? <br>
Wife: (shows me a list) <br>
Me: Umm... I'm not really comfortable just writing these down and leaving them on a post it note. <br>
Wife: That's ok... you can just email them to me. </p>
</blockquote>
<p>I then gently asked if I could gift her a password manager app so I'd feel more comfortable about how they're being stored. I showed how easy <a href="https://itunes.apple.com/us/app/1password-password-manager/id443987910?mt=12&uo=4" title="1Password">1Password</a> is to use and she seemed open to the idea.</p>
<p>Until she saw the price. </p>
<p>At that point I was reminded a whole stack of post-it notes is 99 cents. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:15_11_13_13_39_10">
<p>I did the hard part and Googled it for you. ;-) <a class="footnote-backref" href="#fnref:15_11_13_13_39_10" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Taking a Step Back to Improve Your Reliability Program2015-10-29T15:01:07-05:002015-10-29T15:01:07-05:00Jason Verlytag:mygeekdaddy.net,2015-10-29:/2015/10/29/taking-a-step-back-to-improve-your-reliability-program/<p>I'm normally not one to latch onto to catch phrases or mission statements. My focus has normally been project orientated - what's the goal, what are the tasks, when do we have to be completed, etc. At a recent martial arts class, the instructor shared an inspirational quote with the class …</p><p>I'm normally not one to latch onto to catch phrases or mission statements. My focus has normally been project orientated - what's the goal, what are the tasks, when do we have to be completed, etc. At a recent martial arts class, the instructor shared an inspirational quote with the class.</p>
<blockquote>
<p>It's not the daily increase but daily decrease. <br>
Hack away at the unessential. </p>
</blockquote>
<p>The quote was from Bruce Lee<sup id="fnref:15_09_26_10_00_45"><a class="footnote-ref" href="#fn:15_09_26_10_00_45">2</a></sup> and it resonated with me on a couple of things that had been on my mind that week. We're in the middle of bringing on some new personnel, so we've had to do refresher training on top of adopting new workflow processes. I was consumed about making sure we could keep everything we already had going on plus take on the new tasks we had in front of us. </p>
<p>As I laid in bed one night, the quote was still bouncing in my head when I realized we don't need to keep doing everything, we just need to stop doing what doesn't matter. I spent the next couple of days thinking about what we were currently doing with our reliability programs and looked at how we could <em>hack away at the unessential</em>. </p>
<h4>What's on your screen</h4>
<p>When I conduct training for new Maximo users, I tell them Maximo is like a large lump of clay - it can be used for a variety of reasons, but requires someone to mold the application into the way you want to use it. After our recent upgrade to Maximo 7.5, we took a harder look at the screens in our most used applications - WO Tracking, Purchasing, Inventory, etc. The first thing I looked at was what fields were visible on the screens versus what fields did we <em>need</em> to have visible on the screens. </p>
<blockquote>
<p>Require as many fields on the screen as you need to complete the work order. <br>
Remove as many fields on the screen as you can to still complete the work order.</p>
</blockquote>
<p>This thought process allowed us to look at the screens as something moldable and fluid, versus static and rigid. The ultimate goal was to get everything a planner or scheduler needed to see on the Main tab without having to scroll up/down or side to side.</p>
<p>Take a look at the out of the box WO Tracking screen:</p>
<figure><a href="http://share.mygeekdaddy.net/default_wo_tracking_screen_2015-10-28.png"><img src="http://share.mygeekdaddy.net/default_wo_tracking_screen_2015-10-28.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now when we sat back, looked at the WO Tracking screen, and asked ourselves how we can make the screen more effective, we moved <em>a lot</em> of stuff around:</p>
<figure><a href="http://share.mygeekdaddy.net/new_wo_tracking_screen_2015-10-28.png"><img src="http://share.mygeekdaddy.net/new_wo_tracking_screen_2015-10-28.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>And guess what? We don't have anyone having to vertically scroll on the main tab in WO Tracking anymore. </p>
<h4>What are you collecting</h4>
<p>I started with looking at what information were we able to collect versus the information we <em>needed</em> to collect. Starting from here, I was able to start working back on what changes we needed to make to several of our work management processes. I started to look at our processes and tried to asked ourselves:</p>
<ul>
<li>What information are we collecting on our records against the KPI's or metrics we are you running?</li>
<li>Are our <em>critical</em> KPI's or metrics supporting the goals of the department and organization?</li>
<li>Between these two, what can we <em>stop</em> doing to focus on what we <em>should</em> be doing?</li>
</ul>
<p>Looking at what we are collecting helped drive changes with those who were directly responsible for our asset health. We removed nearly a dozen metrics from our progress review meetings and focused on 4 specific metrics. This allowed us to start focusing on what workflow and procedural changes we needed to do to make a positive change on our critical metrics. </p>
<h4>What do have to get done</h4>
<p>Rarely do we get to walk into a green field plant and literally build up a maintenance team from the ground up. Normally we walk into an already established environment and we're tasked with making what we already have better. That means there are habits and polices engrained into the employees who have been working there for a number of years. This ended up being the hardest step take and may require someone from outside your organization to help. </p>
<p>To cut away at processes that don't add value to the work you're trying to get done you need to take a step back and ask:</p>
<blockquote>
<p>Why are we doing it this way and do we <em>really</em> need to continue doing it this way? </p>
</blockquote>
<p>Sometimes the answer is yes. You have legal obligations (FDA, internal quality, financial reporting, etc) to continue with a given process or procedure. I'm betting that if you really dig into <em>how</em> you get things done, you'd find some steps that just don't need to be done anymore. Here's a couple of ideas on where to get started:</p>
<ul>
<li>How many people have to 'touch' the work order before the job is considered complete? </li>
<li>How much effort does a craft employee have to expend to get a part from inventory?</li>
<li>How much time does a craft employee have to expend to get a job set up before they 'turn a wrench'?</li>
</ul>
<p>If a workflow process is not helping with the bottom line, why keep it?</p>
<h4>Conclusion</h4>
<p>A lot of the work to make your reliability program grow is to cut away at what you don't need to do anymore. This can be a challenging process when some of the steps or processes you want to get rid of have become more of habit than procedure. </p>
<p>Sometimes taking a step back and looking at the big picture can give you the perspective to make some amazing changes. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:40114">
<p>Which re-enforces the previous metric. <a class="footnote-backref" href="#fnref:40114" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:15_09_26_10_00_45">
<p>I hope you already know who Bruce Lee is. <a class="footnote-backref" href="#fnref:15_09_26_10_00_45" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Wait for El Cap 10.11.1 if you use Office 20162015-10-15T10:27:34-05:002015-10-15T10:27:34-05:00Jason Verlytag:mygeekdaddy.net,2015-10-15:/2015/10/15/wait-for-el-cap-10111-if-you-use-office-2016/<p>Guess Office 2016 users have to wait until El Cap 10.11.1 is released if they still want to be productive. According to <a href="http://www.macworld.com/article/2993132/software-productivity/office-2016-for-mac-update-doesnt-include-fix-for-crashes-under-os-x-el-capitan.html">Macworld</a> the update released earlier this week does not address crashes with Office apps on OS X 10.11. An <a href="https://support.office.com/en-us/article/Update-on-Office-2016-for-Mac-El-Capitan-4dc92cb5-57d1-43d3-aec7-6076b0da547f?ui=en-US&rs=en-US&ad=US&fromAR=1">update note from Microsoft</a> stated:</p>
<blockquote>
<p>On …</p></blockquote><p>Guess Office 2016 users have to wait until El Cap 10.11.1 is released if they still want to be productive. According to <a href="http://www.macworld.com/article/2993132/software-productivity/office-2016-for-mac-update-doesnt-include-fix-for-crashes-under-os-x-el-capitan.html">Macworld</a> the update released earlier this week does not address crashes with Office apps on OS X 10.11. An <a href="https://support.office.com/en-us/article/Update-on-Office-2016-for-Mac-El-Capitan-4dc92cb5-57d1-43d3-aec7-6076b0da547f?ui=en-US&rs=en-US&ad=US&fromAR=1">update note from Microsoft</a> stated:</p>
<blockquote>
<p>On October 13, 2015, we released an update to Office 2016 for Mac containing great new features, security fixes, and stability improvements. This update doesn’t address the issues experienced by Office customers with OS X 10.11 El Capitan. We are actively working with Apple to ensure resolution with the next update of OS X 10.11 El Capitan.</p>
</blockquote>
<p>So for now some of use are still waiting to see what El Capitan has to offer. The update mentioned in the note can be found here - <a href="https://support.microsoft.com/en-us/kb/3097264">MS15-110 Update for Office 2016 for Mac</a>.</p>New Raspbian Configuration Option2015-10-01T09:16:55-05:002015-10-01T09:16:55-05:00Jason Verlytag:mygeekdaddy.net,2015-10-01:/2015/10/01/new-raspbian-configuration-option/<p>Looks like the fine folks at the <a href="https://www.raspberrypi.org">Raspberry Pi foundation</a> have a nice little surprise for Raspberry Pi users. They've added some new features to their boot configuration utility <code>raspi-config</code>. From the summary at <a href="http://www.raspberrypi-spy.co.uk/2015/09/raspbian-configuration-utility-and-new-boot-options/">Raspberry Pi Spy</a>, there are four new boot options in the <code>raspi-config</code> settings:</p>
<blockquote>
<p>It will allow …</p></blockquote><p>Looks like the fine folks at the <a href="https://www.raspberrypi.org">Raspberry Pi foundation</a> have a nice little surprise for Raspberry Pi users. They've added some new features to their boot configuration utility <code>raspi-config</code>. From the summary at <a href="http://www.raspberrypi-spy.co.uk/2015/09/raspbian-configuration-utility-and-new-boot-options/">Raspberry Pi Spy</a>, there are four new boot options in the <code>raspi-config</code> settings:</p>
<blockquote>
<p>It will allow you to set the following boot options :</p>
<ul>
<li>Console Text console, requiring user to login</li>
<li>Console Autologin Text console, automatically logged in as ‘pi’ user</li>
<li>Desktop Desktop GUI, requiring user to login</li>
<li>Desktop Autologin Desktop GUI, automatically logged in as ‘pi’ user</li>
</ul>
</blockquote>
<p>One of the nice surprises is the updated configuration tool now includes a GUI version. </p>
<figure><a href="http://share.mygeekdaddy.net/raspberry_pi_config_tab1.png"><img src="http://share.mygeekdaddy.net/raspberry_pi_config_tab1.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>To get the latest version of <code>raspi-config</code>, you'll need to make sure your RPi has an internet connection. Once you get an internet connection, just run the update command - <code>sudo upgrade raspi-config</code>. Your RPi will download and install the new boot configuration utility. </p>
<p>Credit: Screenshot from <a href="http://www.raspberrypi-spy.co.uk">Raspberry Pi Spy</a></p>Using OmniGraffle for your iOS 9 review2015-09-13T17:24:40-05:002015-09-13T17:24:40-05:00Jason Verlytag:mygeekdaddy.net,2015-09-13:/2015/09/13/using-omnigraffle-for-your-ios-9-review/<p>Over the weekend, Federico asked for a little help with doing screenshots on iOS. </p>
<blockquote class="twitter-tweet" lang="en"><a href="https://twitter.com/viticci/status/642527305416470528"></a></blockquote>
<script async src="http://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>I followed up with some simple steps on Twitter, but I wanted to document them in more detail based on some follow up questions I got. </p>
<h4>Use OmniGraffle as a screenshot template</h4>
<p>Before you get started …</p><p>Over the weekend, Federico asked for a little help with doing screenshots on iOS. </p>
<blockquote class="twitter-tweet" lang="en"><a href="https://twitter.com/viticci/status/642527305416470528"></a></blockquote>
<script async src="http://platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>I followed up with some simple steps on Twitter, but I wanted to document them in more detail based on some follow up questions I got. </p>
<h4>Use OmniGraffle as a screenshot template</h4>
<p>Before you get started, make sure you have OmniGraffle downloaded to your iOS device. The examples I used below are from my iPad.</p>
<ol>
<li>Take the screen shot you want to use as a template and save it to your Photos library.</li>
<li>Open Photos and find the screenshot and copy it to your clipboard.
<figure><a href="http://share.mygeekdaddy.me/IMG_0506.PNG"><img src="http://share.mygeekdaddy.me/IMG_0506.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
<li>Open OmniGraffle and create a new document. </li>
<li>Make the canvas size the same size as the iPad screen shot.<sup id="fnref:15_09_12_20_15_30"><a class="footnote-ref" href="#fn:15_09_12_20_15_30">1</a></sup>
<figure><a href="http://share.mygeekdaddy.me/IMG_0499.PNG"><img src="http://share.mygeekdaddy.me/IMG_0499.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
<li>Create a new layer on the OG document. </li>
<li>Paste the picture on the new layer and use the object's geometry to set it to the center of the canvas.
<figure><a href="http://share.mygeekdaddy.me/IMG_0502.PNG"><img src="http://share.mygeekdaddy.me/IMG_0502.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
<li>Create a new layer and make sure it's above the locked screenshot layer.
<figure><a href="http://share.mygeekdaddy.me/IMG_0508.PNG"><img src="http://share.mygeekdaddy.me/IMG_0508.PNG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
<li>Now you can mark up the screenshot and not change the original screen shot.
<figure><a href="http://share.mygeekdaddy.me/IMG_0504.JPG"><img src="http://share.mygeekdaddy.me/IMG_0504.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
</ol>
<p>Now as you make comments or notes on your screenshots, you can edit/update them without having to remake the entire screenshot like you would in an app like <a href="https://itunes.apple.com/us/app/skitch-snap.-mark-up.-send./id490505997?mt=8&uo=4" title="skitch">Skitch</a>. </p>
<h4>Bonus Tip</h4>
<p>This tip came from Ken Case on how to create a loupe view in OmniGraffle Pro. </p>
<blockquote class="twitter-tweet" lang="en"><a href="https://twitter.com/kcase/status/642085744912105472"></a></blockquote>
<script async src="http://platform.twitter.com/widgets.js" charset="utf-8"></script>
<div class="footnote">
<hr>
<ol>
<li id="fn:15_09_12_20_15_30">
<p>2048x1536 for iPad Air. <a class="footnote-backref" href="#fnref:15_09_12_20_15_30" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Logging Ad Hoc Requests to OmniFocus2015-09-12T12:31:01-05:002015-09-12T12:31:01-05:00Jason Verlytag:mygeekdaddy.net,2015-09-12:/2015/09/12/logging-ad-hoc-requests-to-omnifocus/<p>I've been on a bit of a kick updating my OmniFocus scripts. Part of this work has been to finally follow up on some links I've saved over the past couple of months. Most of the links are to variants of scripts I already have, but include features I've wanted …</p><p>I've been on a bit of a kick updating my OmniFocus scripts. Part of this work has been to finally follow up on some links I've saved over the past couple of months. Most of the links are to variants of scripts I already have, but include features I've wanted to add but was too lazy to build from scratch. One of the linked scripts turned out to be something completely new. The script was originally created by <a href="http://bylr.net/3/">Dan Byler</a> on how to <a href="http://bylr.net/3/2015/05/log-ad-hoc-items-into-omnifocus/">Log ad hoc items into OmniFocus</a>. I liked his approach to documenting ad hoc requests made through out the day. The idea is when someone makes an out of band request to me, I wanted a way to document the request as a way to book mark that some had asked me to do something.<sup id="fnref:148928"><a class="footnote-ref" href="#fn:148928">1</a></sup> After reviewing the script, I decided to make a couple of tweaks so it would better fit my personal workflow.</p>
<ul>
<li>The script will record the date the entry was recorded on the Defer Date for reference of when the request was made, so I know how long a follow up task has been sitting in OmniFocus.</li>
<li>I didn't set the tasks default status as 'Completed', but left it open so I can complete it during my weekly review. </li>
<li>I updated the default Folder/Project/Context the ad hoc task is recorded to fit my GTD system. </li>
<li>I updated the dialog box to fit my workflow process. </li>
</ul>
<p>I put the script in my master OmniFocus Applescript folder and use a Keyboard Maestro hot key trigger to run the script. </p>
<figure><a href="http://share.mygeekdaddy.net/create_ad_hoc_OmniFocus_task_2015-09-05.png"><img src="http://share.mygeekdaddy.net/create_ad_hoc_OmniFocus_task_2015-09-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now no matter what app I'm in, I can hit the hot key trigger, open the dialog box, enter the ad hoc request made to me, and record them in OmniFocus. The query will even open OmniFocus <sup id="fnref:546653"><a class="footnote-ref" href="#fn:546653">2</a></sup> so I can record the ad hoc request.</p>
<p>The full script can be found on GitHub:</p>
<script src="https://gist.github.com/mygeekdaddy/50c72f688dc351e4b98e.js"></script>
<div class="footnote">
<hr>
<ol>
<li id="fn:148928">
<p>If it isn't documented, it didn't happen. <a class="footnote-backref" href="#fnref:148928" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:546653">
<p>In the rare case it wasn't already open. <a class="footnote-backref" href="#fnref:546653" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Update to Exporting OmniFocus to iThoughtsHD2015-09-07T22:47:39-05:002015-09-07T22:47:39-05:00Jason Verlytag:mygeekdaddy.net,2015-09-07:/2015/09/07/update-to-exporting-omnifocus-to-ithoughtshd/<p>In a recent post, I described some of the <a href="http://mygeekdaddy.net/2015/09/05/adding-applescript-to-of-2-tool-bar/">changes that I've been making to my core OmniFocus 2 Applescripts</a>. This work happened to coincide with a shout out for help I saw on Twitter:</p>
<blockquote class="twitter-tweet" data-conversation="none" lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/mygeekdaddy">@mygeekdaddy</a> <a href="https://twitter.com/macdrifter">@macdrifter</a> <a href="https://twitter.com/MSchechter">@MSchechter</a> Thanks all. I am trying to get a Mind Map of my …</p></blockquote><p>In a recent post, I described some of the <a href="http://mygeekdaddy.net/2015/09/05/adding-applescript-to-of-2-tool-bar/">changes that I've been making to my core OmniFocus 2 Applescripts</a>. This work happened to coincide with a shout out for help I saw on Twitter:</p>
<blockquote class="twitter-tweet" data-conversation="none" lang="en"><p lang="en" dir="ltr"><a href="https://twitter.com/mygeekdaddy">@mygeekdaddy</a> <a href="https://twitter.com/macdrifter">@macdrifter</a> <a href="https://twitter.com/MSchechter">@MSchechter</a> Thanks all. I am trying to get a Mind Map of my OF database. IThoughts is my preferred app.</p>— Iain McCormack (@iain_mccormack) <a href="https://twitter.com/iain_mccormack/status/638910582146637826">September 2, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>I knew I had a script that did this, but I hadn't used it in a while, so I dusted it off and looked at what changes needed to be made to run it against a current version of OmniFocus. </p>
<h4>Origin Story</h4>
<p>The original script came from work Rob Trew(<a href="https://twitter.com/complexpoint">@complexpoint</a>) had done to get OmniFocus tasks in to a hierarchal OPML file format. <sup id="fnref:515608"><a class="footnote-ref" href="#fn:515608">5</a></sup> Rob took his work and built up an <a href="http://forums.omnigroup.com/showthread.php?t=25965">Applescript that would output active OmniFocus tasks into an iThoughts mind map</a>. The script I have is a copy of the one that was originally posted to the OmniFocus forums by Rob Trew (<a href="https://github.com/RobTrew/tree-tools/tree/master/OmniFocus%20scripts">GitHub copy here</a>). </p>
<p>One part of the Applescript used to export OmniFocus to iThoughts, was that it used a Python script to do most of the work.</p>
<figure><a href="http://share.mygeekdaddy.net/python_in_applescript_OF_2015-09-07.png"><img src="http://share.mygeekdaddy.net/python_in_applescript_OF_2015-09-07.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Since the Python script is what did most of the heavy lifting, that's what I wanted to focus on first.</p>
<h4>Updates to the Original Version</h4>
<p>Federico Viticci(<a href="https://twitter.com/viticci">@viticci</a>], at <a href="https://www.macstories.net">MacStories</a>, did a great write up about <a href="https://www.macstories.net/tutorials/visualize-omnifocus-as-ithoughts-map-opml-or-plain-text/">visualizing your OmniFocus tasks in a mind map</a>. In his article, Federico did basically the same thing I've done and pulled out the Python script<sup id="fnref:716819"><a class="footnote-ref" href="#fn:716819">6</a></sup> to convert his OmniFocus task list to an iThoughts mind map file. One part of Federico's article stood out to me:</p>
<blockquote>
<p>So here's what I did. I got the Python script from the Resources inside the .scptd bundle. I moved the .py file to my Home directory alongside the map.itm template I'm using. In Hazel, I set up a "Run shell script" action that does the following:</p>
<p><pre>python $HOME/ofoc_to_mindmap_018.py --format=itmz --output=$HOME/Dropbox/Maps/ActiveTasks -m map.itm -c '0'</pre></p>
</blockquote>
<p>That was more than I wanted to remember to run the script, so I cleaned up the need for so many switches to run the OmniFocus to iThoughts conversion. Some of the tweaks included:</p>
<ul>
<li>Changing the default output format to iThoughts' <code>.itmz</code> file format.</li>
<li>Added a line to copy a base <code>map.itm</code> file from a dedicated location.</li>
<li>Updated the default file location for the exported mind map file to <code>~/Desktop</code>. </li>
</ul>
<p>The main change, from the original version, was telling the script where the OmniFocus 2 database was located. This starts on <code>line 742</code> of the script:</p>
<div class="highlight"><pre><span></span><code><span class="n">def</span><span class="w"> </span><span class="n">get_flat_omnifocus</span><span class="p">(</span><span class="n">var_root</span><span class="p">):</span><span class="w"></span>
<span class="sd">"""Read Omnifocus cache data into flat ordered list"""</span><span class="w"></span>
<span class="c1"># Where is the ofoc cache ?</span><span class="w"></span>
<span class="n">ofoc_container</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">expanduser</span><span class="p">(</span><span class="s1">'~/Library/Containers/com.omnigroup.OmniFocus2'</span><span class="p">)</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">ofoc_container</span><span class="p">):</span><span class="w"></span>
<span class="w"> </span><span class="n">ofoc_container</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ofoc_container</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'.MacAppStore'</span><span class="w"></span>
<span class="n">ofoc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ofoc_container</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'/Data/Library/Caches/com.omnigroup.OmniFocus2'</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">os</span><span class="o">.</span><span class="n">path</span><span class="o">.</span><span class="n">exists</span><span class="p">(</span><span class="n">ofoc</span><span class="p">):</span><span class="w"></span>
<span class="w"> </span><span class="n">ofoc</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ofoc</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'.MacAppStore'</span><span class="w"></span>
<span class="n">cache_db</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">ofoc</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'/OmniFocusDatabase2'</span><span class="w"></span>
</code></pre></div>
<p>A special thanks to Ken Case (<a href="https://twitter.com/kcase">@kcase</a>) for giving me some guidance on the OmniFocus database changes from OmniFocus 1 to OmniFocus 2 for MAS vs direct purchase versions. <sup id="fnref:268449"><a class="footnote-ref" href="#fn:268449">1</a></sup> </p>
<h4>Getting OmniFocus to iThoughts HD</h4>
<p>There are two files you will need to export your OmniFocus task list into iThoughts HD. </p>
<ol>
<li><a href="http://share.mygeekdaddy.net/OF_to_iThoughts_R25.py">OF_to_iThoughts_R25.py</a>: This is the Python script that will read your OmniFocus database and convert the tasks, contexts and notes into an iThoughts mind map.</li>
<li><a href="http://share.mygeekdaddy.net/map.itm">map.itm</a>: This is an uncompressed iThoughts map file that's used as a template to convert the OmniFocus tasks into a iThoughts mind map. </li>
</ol>
<p>The <code>OF_to_iThoughts_R25.py</code> script can be stored anywhere. <sup id="fnref:922427"><a class="footnote-ref" href="#fn:922427">3</a></sup> The file/folder paths have been set up in the script to be relative to a User's home directory - e.g. <code>~/Desktop</code>. The <code>map.itm</code> file needs to be stored in the <code>~/Library/Scripts/Applications/OmniFocus</code> folder.<sup id="fnref:676174"><a class="footnote-ref" href="#fn:676174">2</a></sup></p>
<h4>Running the script</h4>
<p>Once you've found a home for the script, locate the script's folder in a Terminal window and run the following command <code>./OF_to_iThoughts_R25.py</code>. <sup id="fnref:435996"><a class="footnote-ref" href="#fn:435996">4</a></sup> </p>
<figure><a href="http://share.mygeekdaddy.net/OmniFocus_script_terminal_2015-09-07.png"><img src="http://share.mygeekdaddy.net/OmniFocus_script_terminal_2015-09-07.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This will run the Python script and put a copy of the mind map on to your Desktop.</p>
<figure><a href="http://share.mygeekdaddy.net/OmniFocus_mindmap_desktop_2015-09-07.png"><img src="http://share.mygeekdaddy.net/OmniFocus_mindmap_desktop_2015-09-07.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>From there you can just double click on the file and open it in iThoughts HD.</p>
<figure><a href="http://share.mygeekdaddy.net/OmniFocus_opened_mindmap_2015-09-07.png"><img src="http://share.mygeekdaddy.net/OmniFocus_opened_mindmap_2015-09-07.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now you can trim, modify, update, etc. your current task list in iThoughts HD as a mind map file. </p>
<h4>Caveats to script</h4>
<p>There are a couple of caveats you need to be aware of:</p>
<ol>
<li>This script was created against a version of OmniFocus purchased directly from Omni Group. The code in the script <em>should</em> take into account a Mac App Store version of OmniFocus. Since I only have the direct purchase version of OmniFocus, I'm not 100% sure it will work with MAS version. </li>
<li>The default formatting of the iThoughts HD map that is generated by the script may not be to your tastes. You may have to play around with your own version of the <code>map.itm</code> file to get it the way you want it.</li>
<li>As the notice says in the script, this script is provided 'as is'. It works for me and does everything I need it to. I may add new functionality in the future, but I don't have anything planned yet. </li>
<li>If you're running Python 3 as your default Python version, I have no idea what will happen with the script. </li>
</ol>
<h4>Script Switches</h4>
<p>The Python script originally had a set of optional switches you could run to make more specific conversions of your OmniFocus task list. Here is a list of the switches used in the script:</p>
<div class="highlight"><pre><span></span><code><span class="o">-</span><span class="n">h</span><span class="p">,</span><span class="w"> </span><span class="o">--</span><span class="n">help</span><span class="w"></span>
<span class="w"> </span><span class="n">show</span><span class="w"> </span><span class="n">this</span><span class="w"> </span><span class="n">help</span><span class="w"> </span><span class="n">message</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="k">exit</span><span class="w"></span>
<span class="o">-</span><span class="n">a</span><span class="w"> </span><span class="n">ROOT</span><span class="p">,</span><span class="w"> </span><span class="o">--</span><span class="n">root</span><span class="o">=</span><span class="n">ROOT</span><span class="w"> </span>
<span class="w"> </span><span class="n">Specify</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">sub</span><span class="o">-</span><span class="n">tree</span><span class="w"> </span><span class="k">by</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">OmniFocus</span><span class="w"> </span><span class="n">id</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">its</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="n">node</span><span class="p">.</span><span class="w"></span>
<span class="w"> </span><span class="n">Defaults</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="k">None</span><span class="p">.</span><span class="w"></span>
<span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="nf">FORMAT</span><span class="p">,</span><span class="w"> </span><span class="o">--</span><span class="nf">format</span><span class="o">=</span><span class="nf">FORMAT</span><span class="w"></span>
<span class="w"> </span><span class="k">Set</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">export</span><span class="w"> </span><span class="nf">format</span><span class="w"> </span><span class="o">[</span><span class="n">itmz | itm | opml | txt | md | ft</span><span class="o">]</span><span class="p">.</span><span class="w"> </span>
<span class="w"> </span><span class="n">Defaults</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="p">.</span><span class="n">itmz</span><span class="w"> </span><span class="n">mind</span><span class="w"> </span><span class="k">map</span><span class="p">.</span><span class="w"> </span><span class="n">md</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">simple</span><span class="w"> </span><span class="n">Markdown</span><span class="p">,</span><span class="w"> </span>
<span class="w"> </span><span class="n">ft</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">Markdown</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">addition</span><span class="w"> </span><span class="k">of</span><span class="w"> </span><span class="n">FoldingText</span><span class="s1">'s </span>
<span class="s1"> .todo mode tags for checkboxes and struck-through done items</span>
<span class="s1">-o OUTPUT, --output=OUTPUT</span>
<span class="s1"> Set the export filepath.</span>
<span class="s1"> Defaults to file named Omnifocus_tasks + date</span>
<span class="s1">-c COLLAPSE, --collapse=COLLAPSE</span>
<span class="s1"> List the outline levels to collapse. Defaults to 2,4</span>
<span class="s1">-m TEMPLATE, --template=TEMPLATE</span>
<span class="s1"> The pathname of an .itm or .itmz template for</span>
<span class="s1"> iThoughtsHD. Defaults to same directory as script.</span>
<span class="s1">-l, --links</span>
<span class="s1"> Include OmniFocus task/folder links. Defaults to false</span>
<span class="s1">-n, --notes</span>
<span class="s1"> Include OmniFocus notes. Defaults to false</span>
<span class="s1">-r, --recurinfo</span>
<span class="s1"> Add any repetition information to start of notes.</span>
<span class="s1"> Defaults to false</span>
<span class="s1">-f FOLDER_SQL, --folders=FOLDER_SQL</span>
<span class="s1"> SQL clause[s] to limit which FOLDERS are exported.</span>
<span class="s1"> Defaults to effectiveActive=1</span>
<span class="s1">-s SINGLES_SQL, --singlelists=SINGLES_SQL</span>
<span class="s1"> SQL clause[s] to limit which SINGLE ACTION LISTS are exported. </span>
<span class="s1"> Defaults to status=active, folderEffectiveActive=1, </span>
<span class="s1"> dateCompleted is null</span>
<span class="s1">-p PROJECT_SQL, --projects=PROJECT_SQL</span>
<span class="s1"> SQL clause[s] to limit which PROJECTS are exported.</span>
<span class="s1"> Defaults to status=active, folderEffectiveActive=1,</span>
<span class="s1"> dateCompleted is null </span>
<span class="s1"> Use a comma for AND (OR is not supported) </span>
<span class="s1"> e.g. -p '</span><span class="n">childrenCount</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="n">blockedByFutureStartDate</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="err">'</span><span class="w"></span>
<span class="o">-</span><span class="n">t</span><span class="w"> </span><span class="n">TASK_SQL</span><span class="p">,</span><span class="w"> </span><span class="o">--</span><span class="n">tasks</span><span class="o">=</span><span class="n">TASK_SQL</span><span class="w"></span>
<span class="w"> </span><span class="k">SQL</span><span class="w"> </span><span class="n">clause</span><span class="o">[</span><span class="n">s</span><span class="o">]</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="k">limit</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="n">TASKS</span><span class="w"> </span><span class="k">are</span><span class="w"> </span><span class="n">exported</span><span class="p">.</span><span class="w"></span>
<span class="w"> </span><span class="n">Defaults</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">dateCompleted</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="k">null</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="n">effectiveContainingProjectInfoActive</span><span class="o">=</span><span class="mi">1</span><span class="w"></span>
<span class="o">-</span><span class="n">i</span><span class="w"> </span><span class="n">INBOX_SQL</span><span class="p">,</span><span class="w"> </span><span class="o">--</span><span class="n">inbox</span><span class="o">=</span><span class="n">INBOX_SQL</span><span class="w"></span>
<span class="w"> </span><span class="k">SQL</span><span class="w"> </span><span class="n">clause</span><span class="o">[</span><span class="n">s</span><span class="o">]</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="k">limit</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="n">INBOX</span><span class="w"> </span><span class="n">TASKS</span><span class="w"> </span><span class="k">are</span><span class="w"> </span><span class="n">exported</span><span class="p">.</span><span class="w"></span>
<span class="w"> </span><span class="n">Defaults</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="ow">all</span><span class="w"> </span><span class="n">inbox</span><span class="w"> </span><span class="n">tasks</span><span class="w"></span>
</code></pre></div>
<p>The sections in the Python script related to the switches used above hasn't been altered from the original version, so they appear to be working still as is. Your results may vary. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:268449">
<p>I <em>think</em> the script works with MAS OmniFocus 2. <a class="footnote-backref" href="#fnref:268449" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:676174">
<p>If you don't, then you need to update the script to know where the <code>map.itm</code> file has been saved. <a class="footnote-backref" href="#fnref:676174" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:922427">
<p>I'm keeping my in the <code>~/Library/Scripts/Applications/OmniFocus</code> folder. <a class="footnote-backref" href="#fnref:922427" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:435996">
<p>If it doesn't work, you may need to <code>chmod u+x</code> the file again. <a class="footnote-backref" href="#fnref:435996" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:515608">
<p>For OmniOutliner. <a class="footnote-backref" href="#fnref:515608" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
<li id="fn:716819">
<p>Do you sense a pattern here? <a class="footnote-backref" href="#fnref:716819" title="Jump back to footnote 6 in the text">↩</a></p>
</li>
</ol>
</div>Adding Applescript to OF 2 Tool Bar2015-09-05T12:44:13-05:002015-09-05T12:44:13-05:00Jason Verlytag:mygeekdaddy.net,2015-09-05:/2015/09/05/adding-applescript-to-of-2-tool-bar/<p>I'm fortunate enough to be able to use a Mac with my day job. However I've recently run into problems of creating, or updating, a script or automation method on one Mac, only to find it missing on the other. The tipping point was when I couldn't produce a list …</p><p>I'm fortunate enough to be able to use a Mac with my day job. However I've recently run into problems of creating, or updating, a script or automation method on one Mac, only to find it missing on the other. The tipping point was when I couldn't produce a list of open tasks for a project at work because a recent update to an Applescript I made was only on my Mac at home.<sup id="fnref:170240"><a class="footnote-ref" href="#fn:170240">2</a></sup> I got home that night and knew I needed to work out a way to update all my Applescripts related to OmniFocus and keep them organized for both home and work. </p>
<h4>OmniFocus 2 Database</h4>
<p>When I started going through the Applescripts I had saved for OmniFocus I noticed some of them weren't working. Quite a few of the scripts I have are based on the original scripts Rob Trew (<a href="https://twitter.com/ComplexPoint">@ComplexPoint</a>) created for OmniFocus 1. Changes to OmniFocus and OS X <sup id="fnref:955614"><a class="footnote-ref" href="#fn:955614">3</a></sup> has led Omni Group to change where the OmniFocus database is located. This caused most of Rob's original scripts to break. So I started going through the scripts I had and updated them up for OmniFocus 2.</p>
<p>The first thing I needed to do was make sure all my scripts knew the correct path to the OmniFocus database. In older OmniFocus scripts, the database location would be listed at <code>~/Library/Caches/com.omnigroup.OmniFocus</code>. The correct location in OmniFocus 2 is <code>~/Library/Containers/com.omnigroup.OmniFocus2/Data/Library/Caches/com.omnigroup.OmniFocus2</code>.</p>
<p>With this update, most of the scripts would <em>automagically</em> <sup id="fnref:181003"><a class="footnote-ref" href="#fn:181003">4</a></sup> work again. </p>
<h4>Set OmniFocus Scripts Folder</h4>
<p>The next thing I wanted to do was get some of the common Applescripts I use on to the OmniFocus tool bar. Out of the box, OmniFocus has a default scripts folder, <code>~/Library/Scripts/Applications/OmniFocus</code> that you can see from the OS X menu bar:</p>
<figure><a href="http://share.mygeekdaddy.net/OmniFocus_default_scripts_folder_2015-09-05.png"><img src="http://share.mygeekdaddy.net/OmniFocus_default_scripts_folder_2015-09-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>However this is Apple's default folder location for scripts, not the one OmniFocus wants to use. <sup id="fnref:814619"><a class="footnote-ref" href="#fn:814619">1</a></sup> So if you add scripts to the default folder, you cannot add them to the OmniFocus tool bar. </p>
<p>To locate the <em>real</em> OmniFocus script folder, open OmniFocus and go to the Help menu and click on the <code>Open Scripts Folder</code>. This is the script folder that can be accessed by OmniFocus and used to add scripts to the OmniFocus tool bar.</p>
<figure><a href="http://share.mygeekdaddy.net/OmniFocus2_default_script_R2_2015-09-05.png"><img src="http://share.mygeekdaddy.net/OmniFocus2_default_script_R2_2015-09-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now both folders had the most recent revisions of my OmniFocus Applescripts.</p>
<h4>Keeping them all in sync</h4>
<p>Now that I've updated some of the scripts and figured out all the proper folders, I needed a way to keep the folders in sync with each other. Using Dropbox and Hazel I created a simple process to keep the files synced in all three folders:</p>
<ol>
<li>
<p>Dropbox Master Folder: First I created a master folder on Dropbox that will hold the updated OmniFocus scripts I want to have available to me. This is where all new or updated files will be saved. </p>
</li>
<li>
<p>Create a syncing rule: In Hazel, I created a rule to sync the two OmniFocus script folders with the scripts from the master Dropbox folder. </p>
</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/hazel_sync_rule_2015-09-05.png"><img src="http://share.mygeekdaddy.net/hazel_sync_rule_2015-09-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>With the Hazel rule in place, all three folders are sync'd with the most recent version of the Applescript. </p>
<figure><a href="http://share.mygeekdaddy.net/folder_sync_status_2015-09-05.png"><img src="http://share.mygeekdaddy.net/folder_sync_status_2015-09-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now all I have to do is repeat the Hazel rule on my Mac at work and all of the Applescripts will be updated to the correct folders too. Any updates I make to the master set of Applescripts, from either my home or work Mac, will now update all the OmniFocus script folders on both computers. </p>
<h4>Wrapping it all up</h4>
<p>With the Applescripts being the proper OmniFocus folder, I can add them to the toolbar and run them directly from OmniFocus.</p>
<figure><a href="http://share.mygeekdaddy.net/OmniFocus_script_icons_2015-09-05.png"><img src="http://share.mygeekdaddy.net/OmniFocus_script_icons_2015-09-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The two icons I have shown above do the following:</p>
<ul>
<li>Task_Due_List: This script pulls all my tasks +/-7d from today and <a href="http://mygeekdaddy.net/2015/07/03/getting-my-daily-to-do-list-out-of-omnifocus/">outputs them to a Markdown file</a>. </li>
<li>Open_Item_Count: A statistical look at the number of open action items I have in OmniFocus.</li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn:814619">
<p>Not sure why Apple creates this folder, because OmniFocus can't control it due to sandboxing. <a class="footnote-backref" href="#fnref:814619" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:170240">
<p>Back to Mac is not an option at work due to the network setup. Setting up a VPN is now on my to do list. <a class="footnote-backref" href="#fnref:170240" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:955614">
<p>Due to sandboxing. <a class="footnote-backref" href="#fnref:955614" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:181003">
<p>Which is always the best thing that can happen when you mess with someone else's scripts. <a class="footnote-backref" href="#fnref:181003" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Common SQL Server Statements for Maximo2015-09-04T15:42:41-05:002015-09-04T15:42:41-05:00Jason Verlytag:mygeekdaddy.net,2015-09-04:/2015/09/04/common-sql-server-statements-for-maximo/<h3>SQL Statements</h3>
<p>This page was originally an <a href="http://mygeekdaddy.net/2013/04/17/javascript-date-functions-in-birt/">article on the site</a> to hold a list of common and unique SQL statements. This page is a more permanent spot to reference SQL statements related queries, searches, or reports in IBM Maximo. There are two types of statements listed:</p>
<ul>
<li><em>SQL Server Function …</em></li></ul><h3>SQL Statements</h3>
<p>This page was originally an <a href="http://mygeekdaddy.net/2013/04/17/javascript-date-functions-in-birt/">article on the site</a> to hold a list of common and unique SQL statements. This page is a more permanent spot to reference SQL statements related queries, searches, or reports in IBM Maximo. There are two types of statements listed:</p>
<ul>
<li><em>SQL Server Function:</em> Lists the syntax to get the value in a Maximo Where Clause, BIRT selection statement or querying the database directly.</li>
<li><em>Javascript Function:</em> Lists the syntax to get a value as data value used in BIRT's Expression Builder.</li>
</ul>
<h4>Date of last Saturday</h4>
<p>My company uses a maintenance reporting period of Saturday through Friday, so a common query is to know what's happened since last Saturday. This statement is used in conjunction with other date fields (e.g. <code>reportdate</code>, <code>orderdate</code>, etc), to show any records since the previous Saturday at 00:00am.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="w"> </span><span class="nv">week</span>,<span class="w"> </span><span class="nv">datediff</span><span class="ss">(</span><span class="w"> </span><span class="nv">week</span>,<span class="w"> </span><span class="mi">0</span>,<span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">day</span>,<span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="w"> </span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="ss">)</span>,<span class="o">-</span><span class="mi">2</span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
</code></pre></div>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code>TBD
</code></pre></div>
<h4>Number of days since Saturday</h4>
<p>A variant to the query above, this gives a decimal value of how many days it's been since Saturday.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="ss">(</span><span class="nv">cast</span><span class="ss">(</span><span class="k">getdate</span><span class="ss">()</span><span class="w"> </span><span class="nv">as</span><span class="w"> </span><span class="nv">float</span><span class="ss">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="nv">cast</span><span class="ss">(</span><span class="nv">dateadd</span><span class="ss">(</span><span class="w"> </span><span class="nv">week</span>,<span class="w"> </span><span class="nv">datediff</span><span class="ss">(</span><span class="w"> </span><span class="nv">week</span>,<span class="w"> </span><span class="mi">0</span>,<span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">day</span>,<span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="w"> </span>,<span class="w"> </span><span class="k">getdate</span><span class="ss">()</span><span class="w"> </span><span class="ss">)</span><span class="w"> </span><span class="ss">)</span>,<span class="o">-</span><span class="mi">2</span><span class="ss">)</span><span class="w"> </span><span class="nv">as</span><span class="w"> </span><span class="nv">float</span><span class="ss">))</span><span class="c1">;</span><span class="w"></span>
</code></pre></div>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code>TBD
</code></pre></div>
<h4>Midnight next day:</h4>
<p>Functions for setting a date at midnight for the next day.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">d</span>,<span class="mi">0</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">d</span>,<span class="o">-</span><span class="mi">1</span>,<span class="k">getdate</span><span class="ss">()))</span><span class="w"></span>
</code></pre></div>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code>TBD
</code></pre></div>
<h4>First day of the previous month:</h4>
<p>Functions look for the first day of the previous month, based on what the date is today.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">now</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">()</span><span class="c1">;</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getMonth</span><span class="ss">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="ss">)</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getFullYear</span><span class="ss">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="mi">11</span>,<span class="w"> </span><span class="mi">1</span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
}<span class="w"> </span><span class="k">else</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getFullYear</span><span class="ss">()</span>,<span class="w"> </span><span class="nv">now</span>.<span class="nv">getMonth</span><span class="ss">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="mi">1</span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
}<span class="w"></span>
</code></pre></div>
<h4>Last day of previous month:</h4>
<p>Functions look for the last day of the previous month, based on what the date is today.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">day</span>,<span class="w"> </span><span class="o">-</span><span class="mi">1</span>,<span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">))</span><span class="w"></span>
</code></pre></div>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">now</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">()</span><span class="c1">;</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getMonth</span><span class="ss">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">0</span><span class="ss">)</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getFullYear</span><span class="ss">()</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="mi">11</span>,<span class="w"> </span><span class="mi">31</span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
}<span class="w"> </span><span class="k">else</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="w"> </span><span class="ss">(</span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getFullYear</span><span class="ss">()</span>,<span class="w"> </span><span class="nv">now</span>.<span class="nv">getMonth</span><span class="ss">()</span>,<span class="w"> </span><span class="mi">1</span><span class="ss">)</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="mi">1</span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
}<span class="w"></span>
</code></pre></div>
<h4>First day of current month:</h4>
<p>Functions look for the first day of the current month, based on what the date is today.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code>now = new Date();
new Date(now.getFullYear(), now.getMonth(), 1);
</code></pre></div>
<h4>Last day of current month:</h4>
<p>Functions look for the last day of the current month, based on what the date is today.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">day</span>,<span class="w"> </span><span class="o">-</span><span class="mi">1</span>,<span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">))</span><span class="w"></span>
</code></pre></div>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code>now = new Date();
new Date (new Date(now.getFullYear(), now.getMonth() +1 , 1) - 1);
</code></pre></div>
<h4>First day of next month:</h4>
<p>Functions look for the first day of the next month, based on what the date is today.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">now</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">()</span><span class="c1">;</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getMonth</span><span class="ss">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">11</span><span class="ss">)</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getFullYear</span><span class="ss">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="mi">1</span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
}<span class="w"> </span><span class="k">else</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getFullYear</span><span class="ss">()</span>,<span class="w"> </span><span class="nv">now</span>.<span class="nv">getMonth</span><span class="ss">()</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="w"> </span>,<span class="w"> </span><span class="mi">1</span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
}<span class="w"></span>
</code></pre></div>
<h4>Last day of next month:</h4>
<p>Functions look for the last day of the next month, based on what the date is today.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">day</span>,<span class="w"> </span><span class="o">-</span><span class="mi">1</span>,<span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">2</span>,<span class="mi">0</span><span class="ss">))</span><span class="w"></span>
</code></pre></div>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">now</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">()</span><span class="c1">;</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getMonth</span><span class="ss">()</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="mi">11</span><span class="ss">)</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getFullYear</span><span class="ss">()</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="mi">31</span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
}<span class="w"> </span><span class="k">else</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">current</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">(</span><span class="nv">new</span><span class="w"> </span><span class="nv">Date</span><span class="ss">(</span><span class="nv">now</span>.<span class="nv">getFullYear</span><span class="ss">()</span>,<span class="w"> </span><span class="nv">now</span>.<span class="nv">getMonth</span><span class="ss">()</span><span class="w"> </span><span class="o">+</span><span class="mi">2</span><span class="w"> </span>,<span class="w"> </span><span class="mi">1</span><span class="ss">)</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="w"> </span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
}<span class="w"></span>
</code></pre></div>
<h4>Exactly 'x' months ago:</h4>
<p>Functions will give a date/time value of exactly 1 month ago.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="o">-</span><span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"></span>
</code></pre></div>
<p>Change the <code>-1</code> to adjust how many months back the date/time value should be. Using a <code>+x</code> value to give a future date/time value.</p>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code>TBD
</code></pre></div>
<h4>Exactly 'x' days ago:</h4>
<p>Similar to the function above, this statement will give a date/time value of exactly 30 days ago.</p>
<p><em>SQL Server Function:</em></p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">day</span>,<span class="o">-</span><span class="mi">30</span>,<span class="k">getdate</span><span class="ss">())</span><span class="c1">;</span><span class="w"></span>
</code></pre></div>
<p>Change the <code>-30</code> to adjust how many days back the date/time value should be. Using a <code>+x</code> value to give a future date/time value.</p>
<p><em>Javascript Function:</em></p>
<div class="highlight"><pre><span></span><code>TBD
</code></pre></div>Humility through learning2015-08-30T15:04:39-05:002015-08-30T15:04:39-05:00Jason Verlytag:mygeekdaddy.net,2015-08-30:/2015/08/30/humility-through-learning/<p>Last week I took my first Tae Kwon Do belt test. I started taking Tae Kwon Do classes a couple of months ago because my kids were in it, it looked like fun, and it was something my kids and I could enjoy together.<sup id="fnref:15_08_31_13_35_40"><a class="footnote-ref" href="#fn:15_08_31_13_35_40">2</a></sup> As I approached my test …</p><p>Last week I took my first Tae Kwon Do belt test. I started taking Tae Kwon Do classes a couple of months ago because my kids were in it, it looked like fun, and it was something my kids and I could enjoy together.<sup id="fnref:15_08_31_13_35_40"><a class="footnote-ref" href="#fn:15_08_31_13_35_40">2</a></sup> As I approached my test, I looked back at what I'd learned in my first three months of classes and I realized that I had experienced something I wasn't expecting. </p>
<h4>Learning something new</h4>
<p>One of the aspects of Tae Kwon Do that I appreciated when I watched my kids was that it's not just a physical sport. There's also an aspect of mental learning involved too. As a martial art, Tae Kwon Do has many traditions. One of them being for new students to learn certain words in Korean. The first set of words a student is tasked to learn is counting to eight. This is used to count out stretches and warm up exercises at the beginning of classes. </p>
<p>In my first white belt class there were only about 7 students... me and 6 kids under the age of 9y old. Class began and we started to do our warm up and stretching exercises. Since I had watched my kids in classes before, I knew the routine was for the student to count first and then the entire class count back again. Each student clearly had been to several classes before because they went down the line and counted to eight with absolutely no trepidation. When it was my turn, an assistant instructor knew I didn't know the words and helped me count out each number. I haven't felt that lost since I took organic chemistry in college. </p>
<p>The next week I dropped my kids off at their school for a summer program. I was walking out and I noticed a young girl pointing at me. I recognized her, but I couldn't immediately remember where I knew her from. That was until I overheard the young girl say to her mom. </p>
<blockquote>
<p>Mommy, that's the man that can't count to eight. </p>
</blockquote>
<p>I really couldn't get snarky with a 7y old in the hallway. One, because all she had done was make an observation about what happened in the class and tied it to who I was. Two, because her observation was completely accurate. This got me wondering, when was the last time I put myself in a position to be completely lost in a new topic?</p>
<h4>Being a student at any age</h4>
<p>As my classes progressed, there were times when the white belts would be pulled aside from the other beginning belts for more elementary training. At the school I attend the master instructor emphasizes responsibility by his students, so there is a leadership team comprised of advanced belt students. One of the tasks the leadership students have is to assist with lower belt classes. </p>
<p>In a recent class, the leadership team was asked to take the white belts to the other studio to practice. The class proceeded like other classes before. We started working on the kicks we'd be tested on in a couple of weeks. I was trying to work on the speed of one of my kicks and I wasn't doing it very well. One of the instructors proceeded to demonstrate the proper kick and asked me to do it again. Then I got some coaching from the instructor. </p>
<blockquote>
<p>Sir, your kick needs to come up a little higher. Pivot on your foot, then snap the kick, and... </p>
</blockquote>
<p>She's 10 years old. </p>
<p>But the amazing part was I just stood there and just listened to her. Even at her young age, she had the experience and technique to tell me what I was doing wrong and how to correct my kick. After the class I looked back and thought when was the last time I was corrected by a child and I <em>actually listened</em> ?</p>
<h4>Testing day</h4>
<p>On the day of testing for my next belt, I realized I hadn't felt this nervous in over 20 years. A belt test consists primarily of three parts: demonstrate you learned your pattern (poomse), complete a breaking technique, and demonstrate you've learned certain Korean words or terminology. By now I had learned to count to ten in Korean. <sup id="fnref:15_08_30_18_35_02"><a class="footnote-ref" href="#fn:15_08_30_18_35_02">1</a></sup> To stand there, in front of a group of instructors, and be graded on what I've tried to learn in the past 3 months was nothing like anything I've had to do in my adult life. </p>
<p>I've never been asked in the work place to present what I've done the last three months to a senior leadership team and then get a pass or fail grade. <sup id="fnref:15_08_31_13_47_06"><a class="footnote-ref" href="#fn:15_08_31_13_47_06">3</a></sup>The work I do is generally an iterative process. I get a set of tasks completed and those build on the next set of task to be completed, this builds on another set of tasks, etc, etc. The result of my work may not meet the expectations, but I cannot conceive of a situation where the last 3 months of my work could be peer reviewed, given a failing grade, and cause me to basically do them all over again. Maybe that's a symptom of my job, maybe it's a testament to the effort I put into my career, or maybe it's a bit of both. </p>
<p>I take pride in the things I've accomplished, but I couldn't remember being this nervous about something related to my career since my first job interview after graduating college.</p>
<h4>Reflecting on what I've learned</h4>
<p>As continued to test I got a sense of the larger organization I'd decided to join. Our master instructor gave us some history of Tae Kwon Do and what it means to be a student of martial arts. The work it will take to advance through different belt levels (geup) to eventually test for our black belt. This re-emphasized what I was taught about what the different color belts mean. </p>
<blockquote>
<p>White belt lacks of color and signifies purity and innocence. The novice has no knowledge of Tae Kwon Do.</p>
</blockquote>
<p>As an adult, I've taken on new challenges, but these were always related to something I had already been a part of or had tried earlier in my life. Even with the exposure of my kids previously participating in Tae Kwon Do, this experience has been different because I knew nothing going in - nothing of the Korean language, none of Tae Kwon Do's history, nor any of the techniques to physically excel at Tae Kwon Do. </p>
<p>Looking back as some of things I've learned, both in and out of the classes, I wonder if we should all be so lucky to be humbled in learning something completely new as an adult?</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:15_08_30_18_35_02">
<p>Go ahead... ask me. <a class="footnote-backref" href="#fnref:15_08_30_18_35_02" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:15_08_31_13_35_40">
<p>As opposed to video games, which was starting to drive my wife crazy. <a class="footnote-backref" href="#fnref:15_08_31_13_35_40" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:15_08_31_13_47_06">
<p>Yes you get performance reviews, but that's an aggregate review of your work. <a class="footnote-backref" href="#fnref:15_08_31_13_47_06" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Adding Word Wrap Javascript Function to BIRT2015-08-24T19:57:49-05:002015-08-24T19:57:49-05:00Jason Verlytag:mygeekdaddy.net,2015-08-24:/2015/08/24/adding-word-wrap-javascript-function-to-birt/<p>On IBM developerWorks site, a <a href="https://www.ibm.com/developerworks/community/forums/html/topic?id=a1445282-a9bc-451e-8217-cc03b02c9763&ps=100">forum question</a> was asked about how to wrap a text field in BIRT that does not contain any spaces.</p>
<blockquote>
<p>I would like to know how to wrap data for a field in BIRT report , the wrapping has been set to AUTO . I tried to use …</p></blockquote><p>On IBM developerWorks site, a <a href="https://www.ibm.com/developerworks/community/forums/html/topic?id=a1445282-a9bc-451e-8217-cc03b02c9763&ps=100">forum question</a> was asked about how to wrap a text field in BIRT that does not contain any spaces.</p>
<blockquote>
<p>I would like to know how to wrap data for a field in BIRT report , the wrapping has been set to AUTO . I tried to use the below function in expression in data binding of that particular field.
by max072014</p>
</blockquote>
<p>I game a quick answer of just using a <em>Dynamic Text</em> field, but realized later that day that wouldn't work. I had run into a similar case and instead of wrapping the text, I would <a href="http://mygeekdaddy.net/2013/04/23/gracefully-trimming-fields-in-birt/">trim the extended text gracefully</a>. Poking around the inter webs a bit, I found a similar solution on the Actuate forums - <a href="http://developer.actuate.com/community/forum/index.php?/topic/19827-how-do-i-use-word-wrap-in-report-design/">How do I word wrap in BIRT</a>.</p>
<p>The original javascript was good, but incomplete. In the event a value didn't exist for a given field, the javascript would flake out. So now if the field is empty (<code>null</code>), BIRT will print an empty string. Otherwise the report will wrap the field as expected. </p>
<h4>Enter wrapped element in BIRT</h4>
<ol>
<li>Make sure the field that needs to be wrapped exists in your Dataset. In this example I'm using a field labeled <code>description</code>.</li>
<li>Insert a new <code>Data</code> element and set the datatype to <code>string</code>.</li>
<li>
<p>Paste the following code into the expression builder for the element.</p>
<div class="highlight"><pre><span></span><code><span class="k">if</span><span class="w"> </span><span class="ss">(</span><span class="nv">dataSetRow</span>[<span class="s2">"description"</span>]<span class="o">==</span><span class="w"> </span><span class="nv">null</span><span class="ss">)</span><span class="w"> </span>{<span class="w"> </span><span class="s1">''</span><span class="w"> </span>}<span class="w"> </span>
<span class="k">else</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">function</span><span class="w"> </span><span class="nv">wrap</span><span class="ss">(</span><span class="nv">longStr</span>,<span class="nv">width</span><span class="ss">)</span><span class="w"></span>
<span class="w"> </span>{<span class="w"> </span><span class="nv">length</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">longStr</span>.<span class="nv">length</span><span class="c1">; if(length <= width) return longStr; return (longStr.substring(0, width) </span><span class="w"></span>
<span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"\n"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">wrap</span><span class="ss">(</span><span class="nv">longStr</span>.<span class="nv">substring</span><span class="ss">(</span><span class="nv">width</span>,<span class="w"> </span><span class="nv">length</span><span class="ss">)</span>,<span class="w"> </span><span class="nv">width</span><span class="ss">))</span><span class="c1">; } </span><span class="w"></span>
<span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">wrap</span><span class="ss">(</span><span class="w"> </span><span class="nv">dataSetRow</span>[<span class="s2">"description"</span>],<span class="w"> </span><span class="mi">15</span><span class="w"> </span><span class="ss">)</span><span class="c1">;</span><span class="w"></span>
}<span class="w"></span>
</code></pre></div>
</li>
<li>
<p>Save the report and preview it.</p>
</li>
</ol>
<p>The field will now wrap at every 15 characters. Adjust the integer value on the last line to make the wrap shorter or longer. </p>Using Quick Find to return most recently revised Job Plan2015-08-24T12:02:42-05:002015-08-24T12:02:42-05:00Jason Verlytag:mygeekdaddy.net,2015-08-24:/2015/08/24/using-quick-find-to-return-most-recently-revised-job-plan/<p>IBM released a support document on <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21965038">Find option retrieves Revision 0 of the Job Plan</a>. The crux of the issue is that when you use the Quick Find box in Maximo 7.5 or 7.6 for an item that has a revision on it, Maximo will return the first …</p><p>IBM released a support document on <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21965038">Find option retrieves Revision 0 of the Job Plan</a>. The crux of the issue is that when you use the Quick Find box in Maximo 7.5 or 7.6 for an item that has a revision on it, Maximo will return the first record it finds. This will normally be the original record, or Revision 0. The support document shows how to update the application presentation to sort the results based on the <code>STATUS</code> field. This will give a Maximo user the <code>ACTIVE</code> record over a <code>REVISED</code> record, which is what we want most of the time. The problem with this search order is a <code>PNDREV</code> record will now show up after an <code>ACTIVE</code> record. </p>
<p>Another option is to not sort on the <code>STATUS</code> field, but on the <code>PLUSCREVNUM</code> field. This is the revision number for the Job Plan. Since the highest revision will most likely be either the <code>ACTIVE</code> or <code>PNDREV</code> record, it will give the user what they most likely are looking for.</p>
<p>Using similar steps laid out in the IBM support document:</p>
<ol>
<li>Go to the Application Designer application.</li>
<li>Search for the JOBPLAN application.</li>
<li>Select JOBPLAN.</li>
<li>Click the 'Export Application Definition' icon on the toolbar.</li>
<li>Save the jobplan.xml to a temporary location.</li>
<li>Open the jobplan.xml with Textastic, Notepad++, or your favorite text editor</li>
<li>
<p>Add an <code>orderby="PLUSCREVNUM desc"</code> in the presentation tag at the top of the <code>jobplan.xml</code> file.
<code><presentation apphelp="com.ibm.mbs.doc,jobplan/c_job_plans_application.html" beanclass="psdi.webclient.beans.jobplan.JobPlanAppBean" id="jobplan" keyattribute="jpnum" mboname="JOBPLAN" resultstableid="results_showlist" version="7.1.0.0" orderby="PLUSCREVNUM desc"></code></p>
</li>
<li>
<p>Save the modified XML file.</p>
</li>
<li>Go back to Maximo and open the Application Designer application.</li>
<li>Click on 'Import Application Definition'.</li>
<li>Select the modified jobplan.xml and import it back into Maximo.</li>
</ol>
<p>Now when a user enters a jop plan number in the Quick Find box, they will get the most recent revision, regardless of the status. </p>
<h4>Bonus Tip</h4>
<p>You can do the same steps in the Purchasing app to get the most recently revised PO. Just add <code>orderby="REVISIONNUM desc"</code> in the presentation tag for the PO.XML file. </p>Conditionally show 'Where Clause' search box2015-07-09T13:29:36-05:002015-07-09T13:29:36-05:00Jason Verlytag:mygeekdaddy.net,2015-07-09:/2015/07/09/conditionally-show-where-clause-search-box/<p>On one of the IBM developerWorks forums, a recent question came up on <a href="https://www.ibm.com/developerworks/community/forums/html/topic?id=793f0b9c-951c-498c-b807-2982ae7c339d&ps=100#repliesPg=0">how to conditionally show/hide the 'Where Clause'</a> for a specific set of users. </p>
<blockquote>
<p>Hi,
I want to hide the Clause where from the List view in all application in Maximo 7.1. In security application, I …</p></blockquote><p>On one of the IBM developerWorks forums, a recent question came up on <a href="https://www.ibm.com/developerworks/community/forums/html/topic?id=793f0b9c-951c-498c-b807-2982ae7c339d&ps=100#repliesPg=0">how to conditionally show/hide the 'Where Clause'</a> for a specific set of users. </p>
<blockquote>
<p>Hi,
I want to hide the Clause where from the List view in all application in Maximo 7.1. In security application, I give access to signature option "serachwhere" with condition to such users. But it seems that the condition is not validated. To be sure that my condition is true, I give access to signature option "serachwhere" if the condition (1=2) is true. But when I log on into an application in maximo, I find that the clause where is always there.
There is any help!
Thanks.</p>
</blockquote>
<p>While the original request made it sound like all users should be excluded from seeing the 'Where Clause', a few clarifications and the request was to be able to exclude seeing the 'Where Clause' drop down for only some users. I responded back that you could use a Person Group, a Conditional Expression, and apply the Conditional Expression on the application's sigoption for using the 'Where Clause'. </p>
<p>Here's the breakdown of how to set it up in Maximo. </p>
<h4>Person Group Setup</h4>
<p>Person Groups are a little gem I thought more Maximo admins would use. A Person Group is exactly what it sounds like... a group or person records. The beauty of a person group is that it can be updated independently of any query or conditional expression. So when a user is needed to be added or dropped from a group, you can update the Person Group and not have to touch the original query or conditional expression. </p>
<p>In this case I created a new group and added just my <code>testuser1</code> user to the group.</p>
<figure><a href="http://share.mygeekdaddy.net/person_group_setup_2015-07-09.png"><img src="http://share.mygeekdaddy.net/person_group_setup_2015-07-09.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Anyone with access to the Person Group app (Administration > Resources > Person Group) can then add, or remove, a person record from the list.</p>
<h4>Conditional Expression</h4>
<p>Next you setup a Conditional Expression (Administration > Conditional Expression Manager) to create a condition. Conditional Expressions are small (or large) SQL snippets to test the condition of something in Maximo. The example below is a condition that will check to see if the current user is not in the Person Group I created above. The goal is that anyone <em>not</em> in the group will be allowed to see the 'Where Clause'. </p>
<figure><a href="http://share.mygeekdaddy.net/full_conditional_express_where_clause_2015-07-09.png"><img src="http://share.mygeekdaddy.net/full_conditional_express_where_clause_2015-07-09.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The field <code>:&USERNAME&</code> is a built in shortcut in Maximo to return the <code>userid</code> value of the current user. The condition then checks to see if the current user <em>is not</em> (<code><></code>) in list of people in the Person Group '1028'. </p>
<p>You can change the expression to be:</p>
<div class="highlight"><pre><span></span><code>:&username& = (select resppartygroup from persongroupteam where :&username& = resppartygroup and persongroup = '1028')
</code></pre></div>
<p>This would then check to make sure a user <em>is</em> in the person group.</p>
<h4>Apply Condition to Sigoption</h4>
<p>The final step is to apply the Conditional Expression to the signature option that allows access to the 'Where Clause'. In the example shown below, I added the Condition Expression on a cloned version of the Purchase Requisition (PR) app. </p>
<figure><a href="http://share.mygeekdaddy.net/PR_sigoption_condition_2015-07-09.png"><img src="http://share.mygeekdaddy.net/PR_sigoption_condition_2015-07-09.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Based on the login in the Conditional Expression, Maximo will allow access to the 'Where Clause' sigoption as long as the current user <em>is not</em> in the person group '1028'. Use the alternate expression from above to allow access to the 'Where Clause' drop down to only users that are in person group '1028'. </p>
<h4>Result in Application</h4>
<p>Now when user <code>testuser1</code> logs into Maximo and goes to the PR application, the user can see the Advanced Search box, but cannot access the 'Where Clause' dropdown. </p>
<figure><a href="http://share.mygeekdaddy.net/where_clause_missing_2015-07-09.png"><img src="http://share.mygeekdaddy.net/where_clause_missing_2015-07-09.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>Update to OmniFocus To Do List Script2015-07-08T12:11:57-05:002015-07-08T12:11:57-05:00Jason Verlytag:mygeekdaddy.net,2015-07-08:/2015/07/08/update-to-omnifocus-to-do-list-script/<p>I've updated the Applescript to generate daily To Do lists from OmniFocus. </p>
<p>The change in the script is on line #52 so completed tasks are filter out of your results. The new line is:</p>
<div class="highlight"><pre><span></span><code>set refDueTaskList to a reference to (flattened tasks where (due date ≥ CurrDate and due date < endDatetxt …</code></pre></div><p>I've updated the Applescript to generate daily To Do lists from OmniFocus. </p>
<p>The change in the script is on line #52 so completed tasks are filter out of your results. The new line is:</p>
<div class="highlight"><pre><span></span><code>set refDueTaskList to a reference to (flattened tasks where (due date ≥ CurrDate and due date < endDatetxt and completion date is missing value))
</code></pre></div>
<p>The update adds the filter string of <code>and completion date is missing value</code> to only return results where the 'Completion Date' field is empty. This will filter all tasks that were due +/- 7d from today, but also got completed. </p>
<script src="https://gist.github.com/mygeekdaddy/c542ff8d11cf22f44f02.js"></script>
<p>Download update: <a href="https://gist.github.com/mygeekdaddy/c542ff8d11cf22f44f02">OmniFocus_Due_List_R2.scpt</a></p>Parents... Minecraft News to Impress Your Kids2015-07-04T00:00:00-05:002015-07-04T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2015-07-04:/2015/07/04/parents-minecraft-news-to-impress-your-kids/<p>As a parent of two young kids, Minecraft has become a popular topic in our household. After pointing these there news articles out, my kids were amazed I even knew about this. Here's three things to impress your kids this weekend.</p>
<h4>Run your own Minecraft PE Server</h4>
<p>I know a …</p><p>As a parent of two young kids, Minecraft has become a popular topic in our household. After pointing these there news articles out, my kids were amazed I even knew about this. Here's three things to impress your kids this weekend.</p>
<h4>Run your own Minecraft PE Server</h4>
<p>I know a lot of people run their own server. Most kids are playing Minecraft PE. Linode has given parents directions on becoming rockstars by showing how to setup your own Minecraft PE server. </p>
<p><a href="https://www.linode.com/docs/applications/game-servers/pocketmine-server-on-debian-7">How to setup your own Minecraft PE Server</a></p>
<h4>Windows 10 Minecraft Beta</h4>
<p>Microsoft keeps upping the ante with their Windows 10 beta. Now Microsoft has announced the release of a Minecraft Beta for Windows 10 beta users starting July 29. </p>
<p><a href="https://mojang.com/2015/07/announcing-minecraft-windows-10-edition-beta/">Details on Windows 10 Minecraft Beta</a></p>
<h4>Minecraft Storymode</h4>
<p>I saved the biggest news for last. Telltale Games & Mojang have announced a new story mode for Minecraft. This will be a separate game from the core Minecraft game. They released a trailer for the new game this morning.</p>
<iframe width="560" height="315" src="https://www.youtube-nocookie.com/embed/HAnRtMEDrvU?rel=0" frameborder="0" allowfullscreen></iframe>
<p><a href="https://www.telltalegames.com/blog/discussion/97267/minecraft-story-mode-reveal-trailer-and-first-cast-details">Telltale Games & Mojang Announce Minecraft Story Mode</a></p>Getting my Daily To Do List Out of OmniFocus2015-07-03T18:10:28-05:002015-07-03T18:10:28-05:00Jason Verlytag:mygeekdaddy.net,2015-07-03:/2015/07/03/getting-my-daily-to-do-list-out-of-omnifocus/<p>Working in the food industry, I can't always have my phone or laptop with me, so I've been looking for a way to have my task list with me through out the day. Dr. Drang (<a href="https://twitter.com/drdrang">@drdrang</a>) recently shared how he gets his daily <a href="http://leancrew.com/all-this/2015/06/putting-the-paper-in-taskpaper">To Do list out of Taskpaper and …</a></p><p>Working in the food industry, I can't always have my phone or laptop with me, so I've been looking for a way to have my task list with me through out the day. Dr. Drang (<a href="https://twitter.com/drdrang">@drdrang</a>) recently shared how he gets his daily <a href="http://leancrew.com/all-this/2015/06/putting-the-paper-in-taskpaper">To Do list out of Taskpaper and onto paper</a>. His setup inspired me to look at ways I can update my process of creating a daily To Do list with me. </p>
<h4>Setup Summary</h4>
<p>My current setup includes the following:</p>
<ul>
<li>OmniFocus - Keeps all my tasks electronically. This is where my To Do list is generated from. </li>
<li>Applescript - Used to generate a <code>.md</code> file of my current To Do items from OmniFocus.</li>
<li>Marked - Renders the <code>.md</code> file and allows me to save the To Do list as a PDF file. <sup id="fnref:112801"><a class="footnote-ref" href="#fn:112801">2</a></sup></li>
</ul>
<p>With the PDF, I simply print the list out, stuff it in my binder, and I'm off for the day. I'm not worried about whether or not OmniFocus is always up to date because I spend 20-30 minutes in the late afternoon catching up on email and phone calls. At this point in the day I'll take a few minutes to update OmniFocus, complete any tasks that got done, or add new tasks I collected through the day. </p>
<h4>OmniFocus Applescript</h4>
<p>The script that generates the <code>.md</code> file was <em>heavily</em> borrowed from one that Justin Lancy (<a href="https://twitter.com/veritrope">@veritrope</a> posted on his site about <a href="http://veritrope.com/code/write-todays-completed-tasks-in-omnifocus-to-a-text-file">showing completed tasks in OmniFocus in a text file</a>. My script will show all tasks that have a due date +/- 7d from today.<sup id="fnref:453360"><a class="footnote-ref" href="#fn:453360">3</a></sup></p>
<script src="https://gist.github.com/mygeekdaddy/780181e963560599bdd7.js"></script>
<p>The full script: <a href="https://gist.github.com/mygeekdaddy/780181e963560599bdd7">OmniFocus_Due_List.scpt</a></p>
<p><em>Side Note:</em> If you happen to be using a version of OmniFocus from the App Store, you need to change line 50 in the script <sup id="fnref:915461"><a class="footnote-ref" href="#fn:915461">1</a></sup> from</p>
<div class="highlight"><pre><span></span><code> tell application id "com.omnigroup.OmniFocus2"
</code></pre></div>
<p>to </p>
<div class="highlight"><pre><span></span><code> tell application id "com.omnigroup.OmniFocus.MacAppStore"
</code></pre></div>
<p>and you'll be good to go. </p>
<h4>Convert Markdown to PDF</h4>
<p>The next step is to take the generated <code>.md</code> file and render it as a PDF. Again, Marked 2 app comes to my rescue to do the heavy lifting. Marked allows you to use a custom CSS file to render Markdown files, so just like my <a href="http://mygeekdaddy.net/2015/07/01/outlining-with-ithoughts-marked/">iThoughtsX outline process</a>, I use a custom CSS file to render my OmniFocus To Do list as a PDF. </p>
<p>One carry over I have from college is the need to write on graph paper. It's what I put in my binder for taking notes and what I have at my desk to collect ideas. While documenting the my steps for this article, I discovered I wanted to add some graph lines to the PDF so I could continue to have graph paper as part of my system. I added a custom CSS file to Marked to generate a 'graph paper' PDF.</p>
<script src="https://gist.github.com/mygeekdaddy/218c81e098c198cf8c63.js"></script>
<p>The custom css can be download here: <a href="https://gist.github.com/mygeekdaddy/218c81e098c198cf8c63">custom.css</a></p>
<p>The graph paper image: <a href="http://share.mygeekdaddy.net/graph_paper_sm.png">graph_paper_sm.png</a></p>
<p>Just print from Marked as you normally would and then use the save as PDF option in the lower left corner. </p>
<figure><a href="http://share.mygeekdaddy.net/print_as_pdf_2015-07-03.png"><img src="http://share.mygeekdaddy.net/print_as_pdf_2015-07-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<h4>Implementation</h4>
<p>I normally have at least 30 min in the morning to get my day started. This is when I'll open up OmniFocus, clear my OmniFocus inbox, and then generate my To Do list. The difference now is I've got a cleaner looking version of my To Do list than I did with my previous setup. Keeping a paper copy of my tasks lets me easily see what I need to get done, look at what new tasks I can take on today, or look at requests that I may need to defer to later. </p>
<p>As I previously mentioned, this process doesn't require me to have OmniFocus always up to date... and that's okay. I consider this an extension of my GTD system and as long as I reconcile my To Do list at the end of the day, I feel I'm still good. </p>
<p>The output from Marked looks like this:</p>
<figure><a href="http://share.mygeekdaddy.net/marked_graph_output_2015-07-03.png"><img src="http://share.mygeekdaddy.net/marked_graph_output_2015-07-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>And the PDF in Preview looks like this:</p>
<figure><a href="http://share.mygeekdaddy.net/marked_pdf_graph_output_2015-07-03.png"><img src="http://share.mygeekdaddy.net/marked_pdf_graph_output_2015-07-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Next Steps</h4>
<p>There are a couple of steps I want to automate in the process to make this even smoother for me. </p>
<ol>
<li><strike>Set the script to a Keyboard Maestro keystroke trigger to generate the <code>.md</code> file and save it to a designated folder. </strike> [DONE]</li>
<li>Add to the script to have Marked open the <code>.md</code> file and automatically generate the PDF. </li>
<li>Create a Hazel rule to watch for the PDF and run another script to use Preview to print the PDF. </li>
</ol>
<h4>Special Thanks</h4>
<p>A huge thanks to Brett Terpstra (<a href="https://twitter.com/ttscoff">@ttscoff</a>) and Michael Bishop (<a href="https://twitter.com/miklb">@miklb</a>) for their help in getting the "graph paper" look to work in Marked. Also a shout out to Justin Lancy (<a href="https://twitter.com/veritrope">@veritrope</a>) for sharing his Apple script which is core to my automated process. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:915461">
<p>Thx to <a href="http://elliotbetancourt.com">Elliot Betancourt</a> for pointing this out in comments of <a href="http://veritrope.com/code/write-todays-completed-tasks-in-omnifocus-to-a-text-file/#comment-896">Justin's post</a>. <a class="footnote-backref" href="#fnref:915461" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:112801">
<p>Yes I could print it straight out, but I save a PDF as a back up for my end of the day review. <a class="footnote-backref" href="#fnref:112801" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:453360">
<p>Because why <em>wouldn't</em> you have due dates on tasks. <a class="footnote-backref" href="#fnref:453360" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Outlining with iThoughts & Marked2015-07-01T15:59:51-05:002015-07-01T15:59:51-05:00Jason Verlytag:mygeekdaddy.net,2015-07-01:/2015/07/01/outlining-with-ithoughts-marked/<p>Over the years I've come to rely on mind maps for outlining most of my work. Using a mind map to outline my thoughts and ideas seems more fluid than using a typical outline. I'm guessing I subconsciously flash back to 5th grade where I was mercilessly taught how to …</p><p>Over the years I've come to rely on mind maps for outlining most of my work. Using a mind map to outline my thoughts and ideas seems more fluid than using a typical outline. I'm guessing I subconsciously flash back to 5th grade where I was mercilessly taught how to outline first before doing your book report. The outlines I use today are not as stoic by having to follow the <a href="http://cmos-dev.uchicago.edu/15/ch06/ch06_sec130.html">Chicago Manual of Style</a>. But not everyone wants to get a project outline or task list breakdown as a mind map. </p>
<p>Here's a rundown on how I use <a href="https://itunes.apple.com/us/app/marked-2/id890031187?mt=12&uo=4" title="Marked">Marked</a> and <a href="https://itunes.apple.com/us/app/ithoughtsx-mindmap/id720669838?mt=12&uo=4" title="iThoughtsX">iThoughtsX</a> to convert a mind map outline of my ideas to a PDF I can share with others.</p>
<h4>Setting up iThoughtsX</h4>
<p>Before you begin, you need to make sure iThoughtsX is setup to generate a Markdown preview of the mind map. Open iThoughtsX and go to Preferences by entering Cmd-U (⌘U) and click on the Advanced Tab. Make sure the <em>Markdown Preview</em> is set to 'All Topics'.</p>
<figure><a href="http://share.mygeekdaddy.net/ithoughtsx_md_preview_2015-06-29.png"><img src="http://share.mygeekdaddy.net/ithoughtsx_md_preview_2015-06-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>Now iThoughtsX is setup to generate Markdown previews that can be read by Marked.</p>
<h4>Walking through the process</h4>
<p>The goal is to get a visual mind map into a orderly text form that can be shared with others. iThoughtsX is what I use to create and capture my thoughts and ideas. We'll use Marked to render the mind map into a text outline. We need to look at what output iThoughtsX is sharing with Marked, so we can create a custom CSS file to convert the Markdown preview in Marked into a coherent text outline that can be shared with others. To do this create a [sample outline like this] (http://share.mygeekdaddy.net/Sample_Outline.itmz):</p>
<figure><a href="http://share.mygeekdaddy.net/sample_map_ithoughtsx_2015-06-29.png"><img src="http://share.mygeekdaddy.net/sample_map_ithoughtsx_2015-06-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now open Marked, find the outline file and open the <code>.itmz</code> file to preview the outline. Using the default style in Marked, the outline will look something like this:</p>
<figure><a href="http://share.mygeekdaddy.net/default_ithoughts_marked_preview_2015-06-29.png"><img src="http://share.mygeekdaddy.net/default_ithoughts_marked_preview_2015-06-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now we have a text version of the mind map, but the formatting needs some work before it can handed off to your boss or coworker. Hitting Cmd-U (⌘U) will toggle the preview from text to source view. This will show how iThoughtsX has rendered the <code>.itmz</code> file to a Markdown compatible format. </p>
<figure><a href="http://share.mygeekdaddy.net/ithoughtsx_md_output_format_2015-06-29.png"><img src="http://share.mygeekdaddy.net/ithoughtsx_md_output_format_2015-06-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Looking at the HTML tags, we can see that the iThoughtsX Markdown output is essentially an HTML outline with <code>H1</code> to <code>H3</code> and standard lists tags. So looking at the outline, the outline topics have the corresponding tags like this:</p>
<figure><a href="http://share.mygeekdaddy.net/sample_map_tagged_ithoughtsx_2015-07-01.png"><img src="http://share.mygeekdaddy.net/sample_map_tagged_ithoughtsx_2015-07-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This gives us the outline we need to create an iThoughtsX specific CSS file. </p>
<h4>Custom CSS for Marked</h4>
<p>To make the text output of the visual mind map, we want to create a custom CSS file for Marked. To do this, open Marked and go to the Preferences panel by pressing Cmd-, (⌘,) and clicking on the Style Tab. Click the 'Reveal' button to show the folder where Marked has saved the custom CSS files. </p>
<figure><a href="http://share.mygeekdaddy.net/reveal_custom_css_2015-07-01.png"><img src="http://share.mygeekdaddy.net/reveal_custom_css_2015-07-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now copy/paste the custom CSS file, <code>Custom Example.css</code> supplied with Marked. Rename it with a new file name, like <code>iThoughts_PDF.css</code>. Now use a text editor and update the <code>iThoughts_PDF.css</code> file (or whatever you called it) with some generic CSS to include the <code>H1</code> to <code>H3</code> tags and the outline tags. This is the generic CSS file I created.</p>
<figure><a href="http://share.mygeekdaddy.net/ithoughts_pdf_css_2015-07-01.png"><img src="http://share.mygeekdaddy.net/ithoughts_pdf_css_2015-07-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Download a copy of the CSS file here: <a href="http://share.mygeekdaddy.net/iThoughts_PDF.css">iThoughts_PDF.css</a></p>
<h4>Output from iThoughtsX to Marked to PDF</h4>
<p>Now with a generic CSS file in place, we can open the iThoughtsX outline and see the text output of the mind map.</p>
<figure><a href="http://share.mygeekdaddy.net/ithoughts_marked_outline_render_2015-07-01.png"><img src="http://share.mygeekdaddy.net/ithoughts_marked_outline_render_2015-07-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>From here we can use the print output from Marked to save it as a PDF.</p>
<figure><a href="http://share.mygeekdaddy.net/Print_and_Sample_Outline_2015-07-01.png"><img src="http://share.mygeekdaddy.net/Print_and_Sample_Outline_2015-07-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now I can work and visualize my ideas in a mind map, but share them with coworkers in a standard text PDF.</p>Setting Notepad++ as default editor2015-06-05T08:28:47-05:002015-06-05T08:28:47-05:00Jason Verlytag:mygeekdaddy.net,2015-06-05:/2015/06/05/setting-notepad-as-default-editor/<p>Normally I work on a Mac, but my work with Maximo means I still live in the Windows world too. Just like OS X text editors, the default editors in Windows need a little help from the outside. For Windows, my favorite editor is <a href="https://notepad-plus-plus.org">Notepad++</a>. The gang over at <a href="http://www.tech-recipes.com">Tech-Recipes …</a></p><p>Normally I work on a Mac, but my work with Maximo means I still live in the Windows world too. Just like OS X text editors, the default editors in Windows need a little help from the outside. For Windows, my favorite editor is <a href="https://notepad-plus-plus.org">Notepad++</a>. The gang over at <a href="http://www.tech-recipes.com">Tech-Recipes</a> show how easy it is to have Notepad++ be your default editor for a given file type.</p>
<blockquote>
<p>Notepad++ is one of the smartest editors available that programmers typically use. If you have installed Notepad++, by default the system will not set Notepad++ as your default editor. Fortunately, you can use settings that are available in Notepad++ to circumvent this issue.</p>
</blockquote>
<p><a href="http://www.tech-recipes.com/rx/53473/how-to-set-notepad-as-the-default-editor-in-windows/">How to Set Notepad++ as the Default Editor in Windows</a></p>Automation Scripting 1012015-05-29T12:30:55-05:002015-05-29T12:30:55-05:00Jason Verlytag:mygeekdaddy.net,2015-05-29:/2015/05/29/automation-scripting-101/<p>I've been quiet the last couple of weeks as I prepared to upgrade our Maximo environment to 7.5. Last week I finally made the move with a marathon session on Wednesday with the upgrade and then did triage Thursday. With a new version comes new features. The one I'm …</p><p>I've been quiet the last couple of weeks as I prepared to upgrade our Maximo environment to 7.5. Last week I finally made the move with a marathon session on Wednesday with the upgrade and then did triage Thursday. With a new version comes new features. The one I'm looking forward to the most is Automation Scripting.</p>
<p>IBM's definition of Automation Scripting is:</p>
<blockquote>
<p>An automation script consists of a launch point, variables with corresponding binding values, and the source code. You use wizards to create the components of an automation script. You create scripts and launch points or you create a launch point and associate the launch point with an existing script.<sup id="fnref:779520"><a class="footnote-ref" href="#fn:779520">1</a></sup></p>
</blockquote>
<p>In typical geek fashion, the definition lacks the emotional punch of what's actually being described. What Automation Scripting does is replace the burden of creating a custom java class file Maximo that does a specific function or an Escalation that had to run so frequently it would try catch records almost instantaneously. But getting started with Automation Scripting can be a little daunting. Here's a quick primer to get you started.</p>
<h4>Disclaimer:</h4>
<p style="BORDER-RIGHT: rgb(115,175,183) 1px solid;
PADDING-RIGHT: 10px;
BORDER-TOP: rgb(115,175,183) 1px solid;
PADDING-LEFT: 10px; FONT-SIZE: 0.95em;
PADDING-BOTTOM: 10px;
MARGIN: 0px 100px 0px 50px;
BORDER-LEFT: rgb(115,175,183) 1px solid;
PADDING-TOP: 10px;
BORDER-BOTTOM: rgb(115,175,183) 1px solid;
BACKGROUND-COLOR: rgb(251,239,153)">Most (ok... all) of this came from a great session I had with Brian Baird. Brian's very active on the developerWorks forums and the Maximo Manufacturer's User Group. Hit him up on <a href="https://twitter.com/bgbaird">Twitter</a>... he'll love the attention.</p>
<p></br></p>
<h4>Background</h4>
<p>The first time I tried to use Automation Scripting was to <a href="https://www.ibm.com/developerworks/community/groups/service/html/communityview?communityUuid=a9ba1efe-b731-4317-9724-a181d6155e3a#fullpageWidgetId=W5f281fe58c09_49c7_9fa4_e094f86b7e98&file=ce22a4ca-d585-4ad6-937b-8057f0f32e3e">set the Scheduled Start/Finish dates</a> on a work order based on the Assignment dates. This was supposed to work out of the box. So when I tried it the firsts time, guess what happened? Pfffttt... nothing. </p>
<p>This should have been a slam dunk to get working because it came from IBM, right? Apparently I wasn't as smart as I thought I was. Since this was my first Automation Script I was still getting used to the setup and debugging. I reached out to the Maximo user community and Brian stepped up to answer a few of my questions. His suggested development path is what got the script working for me. </p>
<h4>Start with the basics</h4>
<p>An Automation Script has three basic points:</p>
<ul>
<li>The launch point - context of where/how the script is initiated</li>
<li>The variables - input/output variables to the script</li>
<li>The script - executes the functions on the input and output variables</li>
</ul>
<p>If these three components don't work together, then your script won't work no matter how well it's written. </p>
<p>The next step to getting your scripting done right is to start off with the right tools. In this case <a href="https://notepad-plus-plus.org">Notepad ++</a>. This is one of my <em>must have</em> utilities on any Maximo server I run. Notepad++ also has the ability to turn on syntax highlighting. In this case we want to use the <em>Python</em> syntax. </p>
<figure><a href="http://share.mygeekdaddy.net/notepad_plus_loc_script_2015-05-23.png"><img src="http://share.mygeekdaddy.net/notepad_plus_loc_script_2015-05-23.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I'll get into the script itself in the next section.</p>
<h4>Laying the ground work</h4>
<p>When I talked to Brian about the problems I was having, he asked if I was able to confirm if the Automation Script was even firing off. Nope, I couldn't. He walked me through the basics to ensure your Automation Script is firing off. This part was exactly what I skipped when I tried to apply the 'Set Scheduled Start/Finish Date' script.</p>
<ol>
<li>Create a separate log appender to capture just Automation Script issues. </li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/auto_script_appender_2015-05-29.png"><img src="http://share.mygeekdaddy.net/auto_script_appender_2015-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Set the <code>autoscript</code> logger to show log output to the appender created in the previous step. </li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/set_log_debug_autoscript_2015-05-29.png"><img src="http://share.mygeekdaddy.net/set_log_debug_autoscript_2015-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Go to System Configuration > Platform Configuration > Automation Scripts to create a new Automation Script.</li>
<li>From the Select Action menu, click Creat > Script with Object Launch Point. </li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/selectaction_createscript_2015-05-29.png"><img src="http://share.mygeekdaddy.net/selectaction_createscript_2015-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Create a name for the launch point - <code>LOC_SAVE</code> - against the <code>LOCATIONS</code> object. Make sure to check the <code>Add?</code> and <code>Update?</code> events. Then click <em>Next</em>. </li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/create_autoscript_tab1_2015-05-29.png"><img src="http://share.mygeekdaddy.net/create_autoscript_tab1_2015-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>On the 'Create Script' tab, even though you don't have your script yet, give it a name to load it in later. In this case I'll be using the <code>jython</code> language. </li>
<li>Now we need to enter the variables that will be used in script to interact with Maximo. It is <strong>critical</strong> that your variables match character to character here as they will in your script. In the example the variable is labeled <code>description_t</code>. Click <em>Next</em>. </li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/create_auto_script_tab2_2015-05-29.png"><img src="http://share.mygeekdaddy.net/create_auto_script_tab2_2015-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>
<p>The 'Create Script' tab is where we can add the actual script file. In the beginning I'm going to add just the basics to prove that the script is getting picked up by Maximo and getting triggered - this was the heart of Brian's advice and it makes total sense. Brian suggested that you don't add the functionality to a script in the beginning, but add a general framework first. If the general framework works, then you can build the bells and whistles and know what bell or whistle broke your scrip.</p>
<p>The following script is general framework to prove your Automation Script is getting triggered in Maximo and write something out to the log file.</p>
<div class="highlight"><pre><span></span><code><span class="kn">from</span> <span class="nn">psdi.server</span> <span class="kn">import</span> <span class="n">MXServer</span>
<span class="kn">from</span> <span class="nn">psdi.mbo</span> <span class="kn">import</span> <span class="n">MboConstants</span>
<span class="n">today</span> <span class="o">=</span> <span class="n">MXServer</span><span class="o">.</span><span class="n">getMXServer</span><span class="p">()</span><span class="o">.</span><span class="n">getDate</span><span class="p">()</span>
<span class="n">s_rem</span> <span class="o">=</span> <span class="s1">'LOC_SAVE____>>>>>'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">today</span><span class="p">)</span> <span class="o">+</span> <span class="s1">': '</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">' '</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">'------------- BEGIN SCRIPT --------------'</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">' '</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">'------------- END SCRIPT --------------'</span>
<span class="nb">print</span> <span class="s1">' '</span>
</code></pre></div>
</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/automation_script_mx_2015-05-29.png"><img src="http://share.mygeekdaddy.net/automation_script_mx_2015-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Click the 'Create' button in the lower right to create the Automation Script. </li>
<li>Verify the 'Log Level' is set to <code>DEBUG</code>. </li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/set_autoscript_debug_2015-05-29.png"><img src="http://share.mygeekdaddy.net/set_autoscript_debug_2015-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Change the status of the script from 'Draft' to 'Active'.</li>
<li>At this point we can go into the Locations app and update a description to see if the Automation script fires. <ul>
<li>Go to the Locations app.</li>
<li>Select a Location record.</li>
<li>Open the Main Tab and edit the record's Description field.</li>
<li>Save the record.</li>
</ul>
</li>
<li>Look at the log file and you will see the following:<div class="highlight"><pre><span></span><code><span class="mi">29</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">2015</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">21</span><span class="err">:</span><span class="mi">10</span><span class="err">:</span><span class="mi">631</span><span class="w"> </span><span class="o">[</span><span class="n">DEBUG</span><span class="o">]</span><span class="w"> </span><span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">21</span><span class="err">:</span><span class="mi">10</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span>
<span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">21</span><span class="err">:</span><span class="mi">10</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span><span class="o">-------------</span><span class="w"> </span><span class="k">BEGIN</span><span class="w"> </span><span class="n">SCRIPT</span><span class="w"> </span><span class="o">--------------</span><span class="w"></span>
<span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">21</span><span class="err">:</span><span class="mi">10</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span>
<span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">21</span><span class="err">:</span><span class="mi">10</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span><span class="c1">------------- END SCRIPT --------------</span>
</code></pre></div>
</li>
</ol>
<h4>Extending the script</h4>
<p>Now that I can see the script is getting triggered as expected, I can expand the script to start doing something. In this example I'll extend the script to log the new description in the log file. Going back to the original setup we included a the variable <code>description_t</code> in the setup. This is variable we'll add to the script to log change out to the log file. </p>
<p>Open the Automation Script and update the script with two new lines:</p>
<div class="highlight"><pre><span></span><code> <span class="kn">from</span> <span class="nn">psdi.server</span> <span class="kn">import</span> <span class="n">MXServer</span>
<span class="kn">from</span> <span class="nn">psdi.mbo</span> <span class="kn">import</span> <span class="n">MboConstants</span>
<span class="n">today</span> <span class="o">=</span> <span class="n">MXServer</span><span class="o">.</span><span class="n">getMXServer</span><span class="p">()</span><span class="o">.</span><span class="n">getDate</span><span class="p">()</span>
<span class="n">s_rem</span> <span class="o">=</span> <span class="s1">'LOC_SAVE____>>>>>'</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">today</span><span class="p">)</span> <span class="o">+</span> <span class="s1">': '</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">' '</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">'------------- BEGIN SCRIPT --------------'</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">' '</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">'Description: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">s_desc</span><span class="p">)</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">'Description Modified: '</span> <span class="o">+</span> <span class="nb">str</span><span class="p">(</span><span class="n">s_desc_modified</span><span class="p">)</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">' '</span>
<span class="nb">print</span> <span class="n">s_rem</span> <span class="o">+</span> <span class="s1">'------------- END SCRIPT --------------'</span>
</code></pre></div>
<p>The two lines do the following:</p>
<ul>
<li><code>'Description: ' + str(s_desc)</code>: outputs the new Description value to the log file.</li>
<li><code>'Description Modified: ' + str(s_desc_modified)</code>: passes True/False value if the variable was modified. </li>
</ul>
<p>Editing a Location record will now show the following in the log file:</p>
<div class="highlight"><pre><span></span><code><span class="mi">29</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">2015</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">59</span><span class="err">:</span><span class="mi">18</span><span class="err">:</span><span class="mi">269</span><span class="w"> </span><span class="o">[</span><span class="n">DEBUG</span><span class="o">]</span><span class="w"> </span><span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">59</span><span class="err">:</span><span class="mi">18</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span>
<span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">59</span><span class="err">:</span><span class="mi">18</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span><span class="o">-------------</span><span class="w"> </span><span class="k">BEGIN</span><span class="w"> </span><span class="n">SCRIPT</span><span class="w"> </span><span class="o">--------------</span><span class="w"></span>
<span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">59</span><span class="err">:</span><span class="mi">18</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span>
<span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">59</span><span class="err">:</span><span class="mi">18</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span><span class="nl">Description</span><span class="p">:</span><span class="w"> </span><span class="n">THANKS</span><span class="w"> </span><span class="k">FOR</span><span class="w"> </span><span class="n">THE</span><span class="w"> </span><span class="n">HELP</span><span class="w"> </span><span class="n">BRIAN</span><span class="err">!</span><span class="w"></span>
<span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">59</span><span class="err">:</span><span class="mi">18</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span><span class="n">Description</span><span class="w"> </span><span class="nl">Modified</span><span class="p">:</span><span class="w"> </span><span class="k">True</span><span class="w"></span>
<span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">59</span><span class="err">:</span><span class="mi">18</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span>
<span class="n">LOCSAVE____</span><span class="o">>>>>></span><span class="n">Fri</span><span class="w"> </span><span class="n">May</span><span class="w"> </span><span class="mi">29</span><span class="w"> </span><span class="mi">11</span><span class="err">:</span><span class="mi">59</span><span class="err">:</span><span class="mi">18</span><span class="w"> </span><span class="n">CDT</span><span class="w"> </span><span class="mi">2015</span><span class="err">:</span><span class="w"> </span><span class="c1">------------- END SCRIPT --------------</span>
</code></pre></div>
<p>Now you can add additional functionality to the script and know the script is getting triggered by Maximo. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:779520">
<p>http://www-01.ibm.com/support/knowledgecenter/#!/SSLKT6_7.5.0.5/com.ibm.mbs.doc/autoscript/c_automation_scripts.html <a class="footnote-backref" href="#fnref:779520" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>3 Questions from 'Age of Ultron'2015-05-04T13:20:35-05:002015-05-04T13:20:35-05:00Jason Verlytag:mygeekdaddy.net,2015-05-04:/2015/05/04/3-questions-from-age-of-ultron/<p><strong>SPOILER ALERT: Do not read if you haven't seen Age of Ultron yet.</strong></p>
<p>I did what every other red blooded geek planned on doing this weekend... see Avengers - Age of Ultron. It had everything you would expect from a Joss Whedon movie and the amount of cameo appearances was impressive …</p><p><strong>SPOILER ALERT: Do not read if you haven't seen Age of Ultron yet.</strong></p>
<p>I did what every other red blooded geek planned on doing this weekend... see Avengers - Age of Ultron. It had everything you would expect from a Joss Whedon movie and the amount of cameo appearances was impressive. But this isn't a review of the movie, there are plenty of sources for that. At the end of the movie I was left wondering about what's next for the Marvel universe. Here are the three big questions I had walking out of the theater. </p>
<h4>Is he coming back?</h4>
<p>Was Ultron really destroyed at the end by Vision? Honestly, I don't know and I'm not sure I care. The bigger point alluded to in the movie was by Tony Stark when he was talking to Maria Hill about how Steve Rogers was really the leader of the Avengers team. But at the end of the movie we see the team at a new Avengers complex. While the complex appears to have had Tony's fingerprints all over it, it's not the Avengers tower we saw earlier in the movie nor what we've seen in most comic books.</p>
<p>There have been differences in the Marvel Cinematic Universe (MCU) and Marvel comics, but the team that Steve Rogers has assembled<sup id="fnref:15_05_03_16_18_26"><a class="footnote-ref" href="#fn:15_05_03_16_18_26">1</a></sup> at the end of the movie did not include Iron Man. In my opinion, the team we saw at the end of the movie looks quite a bit like the <a href="http://en.m.wikipedia.org/wiki/West_Coast_Avengers#Fictional_team_biography">West Coast Avengers</a>. The closing scenes in 'Age of Ultron' have the same <em>good-bye</em> vibe we saw in 'Iron Man 3'. However, much of the upcoming MCU storyline has Tony Stark/Iron Man at the center of the plot.</p>
<p>Now part of the charisma of any screen character comes from how well the character has been played by the actor. And Robert Downey Jr. has <em>owned</em> the screen with his interpretation of Tony Stark. In 'Age of Ultron' you really got a feel of the side of Tony Stark from the comics of 'the ends justify the means' mentality. Downey nailed the character flaws we see in Tony Stark as we lead up to 'Civil War'. But with the repeated stories that Robert Downey Jr. is asking for as much as the low to mid 8 figures per movie, you have to wonder how much longer Marvel studios is going to work with Downey and those kind of numbers. If push comes to shove, and Robert Downey Jr. is out due to pricing, how is Marvel going to transition to a new Tony Stark? </p>
<h4>Is he dead?</h4>
<p>Is Ultron dead? Again, I don't know and not sure I care. What I do wonder about is if Pietro really is dead. If the team being assembled for the next movie is a pseudo West Coast Avengers style team, then Pietro needs to make some sort of resurrection or clarify that he was only "injured" in 'Age of Ultron' in the next movie. I know Joss Whedon has recently commented about the return of Agent Coulson and how he wishes he hadn't done that. What I'm not sure if Joss was lamenting about Coulson and how that will mix in the MCU down the road <strong>or</strong> if Whedon was cryptically griping about how he has another dilemma with Pietro and future MCU movies. What happens if Marvel and Fox come to an agreement on the X-Men? I know the MCU is it's own universe, but seeing the studios interweave storylines along one constant storyline would be absolutely mind blowing.<sup id="fnref:15_05_03_16_18_28"><a class="footnote-ref" href="#fn:15_05_03_16_18_28">2</a></sup> Regardless of that fan boy fantasy, is Pietro really dead?</p>
<h4>Did they really have to cut that part out?</h4>
<p>Most people are talking about how Marvel commented that there isn't a snippet at the end of the movie, which has become a staple in every other Marvel movie to date. Yep, they didn't lie, there's just the 15 second blip with Thanos right after the credits start to roll. My guess is they needed to cut the original movie snippet because of the recent team-up with Sony that will bring Spider-Man home to Marvel and/or that 'Infinity Gauntlet' is so far out on the MCU timeframe. </p>
<p>No, my issue is that they cut Captain America off from saying <em>the phrase</em>. Closing the movie with 'Avengers...' was the only hollow moment in the movie for me. Fans have wanted to hear that phrase since the first Avengers movie was announced. Whedon even teased us with Iron Man coming close to saying it just before the final battle with Ultron. I would have been more inspired to hear Captain America say 'Avengers Assemble' and then cut to credits. End on a high note and leave us wanting more. Did other fans feel let fans down by Marvel for not letting Captain America finish his sentence?</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:15_05_03_16_18_26">
<p>Even though he didn't say <em>the phrase</em>. <a class="footnote-backref" href="#fnref:15_05_03_16_18_26" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:15_05_03_16_18_28">
<p>\<cough>House of M\</cough>. <a class="footnote-backref" href="#fnref:15_05_03_16_18_28" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Using KM to fix Mac Excel2015-05-01T16:23:28-05:002015-05-01T16:23:28-05:00Jason Verlytag:mygeekdaddy.net,2015-05-01:/2015/05/01/using-km-to-fix-mac-excel/<p>I was talking to a co-worker about this over lunch and he said the worst one he's run into was Excel on the Mac. He thought it was ridiculous that Microsoft would think <code>Ctrl-U</code> was even close to hitting the <code>F2</code> key that Windows users use.<sup id="fnref:2015-05-0116-28-20"><a class="footnote-ref" href="#fn:2015-05-0116-28-20">1</a></sup> I sat there …</p><p>I was talking to a co-worker about this over lunch and he said the worst one he's run into was Excel on the Mac. He thought it was ridiculous that Microsoft would think <code>Ctrl-U</code> was even close to hitting the <code>F2</code> key that Windows users use.<sup id="fnref:2015-05-0116-28-20"><a class="footnote-ref" href="#fn:2015-05-0116-28-20">1</a></sup> I sat there for a second and said I always use <code>F2</code> key when I edit cells in Excel. We argued for about 10 minutes and finally made a bet on whether I was right or not. </p>
<p>We sat down at my desk and started Excel, opened a file and went to edit a cell. Just as I was about to hit <code>F2</code> I remembered I had set up a Keyboard Maestro macro to remap <code>F2</code> <sup id="fnref:2015-05-0116-28-21"><a class="footnote-ref" href="#fn:2015-05-0116-28-21">2</a></sup> key to <code>Ctrl-U</code>. I hit <code>F2</code> and sure enough, I was in edit mode for the cell.</p>
<p>My buddy's jaw dropped and immediately asked how I had remapped the keyboard for just Excel to do that. I had to sheepishly admit that it wasn't that complicated.</p>
<figure><a href="http://share.mygeekdaddy.net/F2_Key_Mac_Excel_2015-05-01.png"><img src="http://share.mygeekdaddy.net/F2_Key_Mac_Excel_2015-05-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>He argued that I didn't win the bet because I <em>forgot</em> to mention I was using another program to remap the key. We called it draw because he was just happy to not have to use the horrendous <code>Ctrl-U</code> key combo. One of the few things I think are messed up on a Mac is how companies think they need to re-invent the wheel with keyboard shortcuts. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:2015-05-0116-28-20">
<p>Have ever tried to hit that key combo... terrible. <a class="footnote-backref" href="#fnref:2015-05-0116-28-20" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2015-05-0116-28-21">
<p>You have to enable 'Use F1, F2, etc. keys as standard keys' in Keyboard settings. <a class="footnote-backref" href="#fnref:2015-05-0116-28-21" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Changing Cisco AnyConnect default VPN2015-04-29T19:52:48-05:002015-04-29T19:52:48-05:00Jason Verlytag:mygeekdaddy.net,2015-04-29:/2015/04/29/changing-cisco-anyconnect-default-vpn/<p>Working in a mixed desktop environment is eventually going to land you with a VPN client on your Mac. With the predominance of Cisco routes in the enterprise environment, this is mostly likely the one you'll see. The OS X Cisco client looks like this when you first open it …</p><p>Working in a mixed desktop environment is eventually going to land you with a VPN client on your Mac. With the predominance of Cisco routes in the enterprise environment, this is mostly likely the one you'll see. The OS X Cisco client looks like this when you first open it.</p>
<figure><a href="http://share.mygeekdaddy.net/vpn_acmeinc_2015-04-29.png"><img src="http://share.mygeekdaddy.net/vpn_acmeinc_2015-04-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>So what happens when you leave on Friday working for Acme Inc. and find out you work for Beta Corp on Monday? Here's how to change the default VPN connection setting on the OS X Cisco AnyConnect client.</p>
<ol>
<li>Open a Terminal window and run the following command: <code>open -a textastic ~/.anyconnect</code>.</li>
<li>
<p>This will open the default configuration file for the Cisco AnyConnect client in Textastic.<sup id="fnref:2015-04-29-20.03"><a class="footnote-ref" href="#fn:2015-04-29-20.03">1</a></sup> The default file will look like this: </p>
<div class="highlight"><pre><span></span><code><span class="cp"><?xml version="1.0" encoding="UTF-8"?></span>
<span class="nt"><AnyConnectPreferences></span>
<span class="nt"><DefaultUser></span>verlyj01<span class="nt"></DefaultUser></span>
<span class="nt"><DefaultSecondUser></DefaultSecondUser></span>
<span class="nt"><ClientCertificateThumbprint></span>EC5797GJ844479J02131510EC71AF3D44BE72B2956<span class="nt"></ClientCertificateThumbprint></span>
<span class="nt"><ServerCertificateThumbprint></span>EC2CBED20511170EA4560039AECDED3E23002C53<span class="nt"></ServerCertificateThumbprint></span>
<span class="nt"><DefaultHost></span>vpn.acmeinc.com<span class="nt"></DefaultHost></span>
<span class="nt"><DefaultGroup></DefaultGroup></span>
<span class="nt"><ProxyHost></ProxyHost></span>
<span class="nt"><ProxyPort></ProxyPort></span>
<span class="nt"><SDITokenType></SDITokenType></span>
<span class="nt"><ControllablePreferences></ControllablePreferences></span>
<span class="nt"></AnyConnectPreferences></span>
</code></pre></div>
</li>
<li>
<p>Change is the <code><DefaultHost>vpn.acmeinc.com</DefaultHost></code> field. Update this to the new the new VPN server settings: <code><DefaultHost>vpn.betacorp.com</DefaultHost></code>.</p>
</li>
<li>
<p>Now start the Cisco AnyConnect client and the default will now be updated. </p>
<p><figure><a href="http://share.mygeekdaddy.net/vpn_beatcorp_2015-04-29.png"><img src="http://share.mygeekdaddy.net/vpn_beatcorp_2015-04-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure></p>
</li>
</ol>
<div class="footnote">
<hr>
<ol>
<li id="fn:2015-04-29-20.03">
<p>Replace your favorite text editor in this command. <a class="footnote-backref" href="#fnref:2015-04-29-20.03" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>It's just 15 minutes...2015-04-07T11:48:48-05:002015-04-07T11:48:48-05:00Jason Verlytag:mygeekdaddy.net,2015-04-07:/2015/04/07/its-just-15-minutes/<p>As a project manager, I know part of my job is to keep people, who may not directly report to me, on schedule for tasks that have been assigned to them. Lately I've been dealing with more disruptions to my schedules and finally took some time to look at the …</p><p>As a project manager, I know part of my job is to keep people, who may not directly report to me, on schedule for tasks that have been assigned to them. Lately I've been dealing with more disruptions to my schedules and finally took some time to look at the root cause of the problem. The disruptions weren't to the level of "the contractor missed their estimate by 2 weeks" or "the building is 8" too short" <sup id="fnref:15_04_07_11_50_43"><a class="footnote-ref" href="#fn:15_04_07_11_50_43">1</a></sup>, but more subtle ones that were letting tasks were slip by a day or two. After spending some time reviewing my project notes I found some of the gaps that were disrupting my projects.</p>
<h4>Missed the meeting</h4>
<p>The first schedule disruption was also the largest. This one typically revolved around a co-worker who was supposed to attend a meeting but never showed up. I would look back and see they wouldn't accept or decline the meeting, they just left it as tentative on their calendar because Outlook knew they had a pending meeting invite in their inbox. I would send out meeting minutes and eventually they'd stop by my office to ask a few questions. </p>
<blockquote>
<p>[Knock on my office door] <br>
Mgr: Hey I'm sorry I missed the meeting, can we go over a few question I have from the meeting? <br>
Me: Can we do this another time, I'm tied up right now? <br>
Mgr: It's no big deal, it will only take 15 minutes. </p>
</blockquote>
<p>They would then proceed to go through their questions, which would have been answered if they had read the meeting notes, for the next 15 minutes. </p>
<h4>I missed the meeting</h4>
<p>Similar to the first example, but in this case I was unable to attend a meeting. A day or two after the meeting I'd bump into the other project manager in hallway.</p>
<blockquote>
<p>Me: Hey, sorry I couldn't attend the status meeting. Can you send me the meeting minutes so I can catch up on what happened? <br>
PM: Uhh, I don't have any. Why don't we catch up for 15 minutes after lunch and I can answer any questions you have. <br>
Me: Sure. </p>
</blockquote>
<p>We then work out a time to sit down and have a meeting on the meeting. </p>
<h4>Late to meeting</h4>
<p>One of the common tools we use for progress meetings is a quick video or web conference call. The conference call starts and 15 minutes into the meeting someone joins late. Sometimes they just join quietly and catch up as the discussion continues. Sometimes they don't.</p>
<blockquote>
<p>Mgr: Sorry I'm late, what'd I miss? <br>
PM: I can catch you up at the end of the meeting. <br>
Mgr: Just give me a quick recap. <br>
PM: Ok. <br>
[15 min spent restarting meeting] </p>
</blockquote>
<p>So the entire group is placed on hold for about 15 minutes for the PM and the Mgr to go back and forth. </p>
<h4>15 minute math</h4>
<p>After looking at some of my notes, I realized I was losing my project schedules 15 minutes at time. After doing the math I was shocked at how much time was being lost. Being conservative in the number of disruptions per week, I came up with the following: </p>
<blockquote>
<p>15 min/disruption * 4 disruptions/wk * 50 wk/yr = 50 hour/yr</p>
</blockquote>
<p><strong>Wow!</strong></p>
<p>Who wouldn't want an entire work week back to focus on their own priorities either at home or at work. </p>
<h4>Root cause</h4>
<p>Now in the end, I was as guilty as some of my co-workers I mentioned above. I let others manipulate my calendar, allow them to waste my time, or allow them disrupt my meeting. </p>
<p>Here are some ways I'm trying to reclaim my time:</p>
<ul>
<li>Ensure meeting minutes are sent out after a meeting. If someone wants to follow up about the meeting, I'll decline and direct them to read the meeting minutes and send me an email with their questions. Generally they'll read the notes and it will either be too much trouble to write the email or they'll get the answers they were looking for. Either way I'm spared the 15 minutes of having to rehash the same meeting again. </li>
<li>If another PM isn't sending out meeting notes, I'll just wait until the next progress meeting to catch up. If I was assigned an action item out of the meeting, I'll drop the PM an email with the specific questions I have. This way I'm driving my information request on my schedule, not theirs. </li>
<li>When someone comes in late, I generally don't acknowledge them when the arrive. I'll continue the meeting for everyone who arrived on time. Now this only works so far. If an executive is participating in your meeting, shows up late, and then asks for a recap, you're probably inclined to oblige. </li>
</ul>
<p>These are small steps I'm trying to make to keep my calendar focused to work on the things I need to get done. </p>
<p></br>
Because it's just 15 minutes...</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:15_04_07_11_50_43">
<p>Ok... so that actually happened once. <a class="footnote-backref" href="#fnref:15_04_07_11_50_43" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Setting Referential Due Dates in OmniFocus2015-03-31T15:11:42-05:002015-03-31T15:11:42-05:00Jason Verlytag:mygeekdaddy.net,2015-03-31:/2015/03/31/setting-referential-due-dates-in-omnifocus/<p>OmniFocus has been my primary task management app for quite a while now. One feature I requested a while back is a setting that allows OmniFocus to have referential Due Date entry based on the task's Defer Date. The idea is if I have a deferred date in the future …</p><p>OmniFocus has been my primary task management app for quite a while now. One feature I requested a while back is a setting that allows OmniFocus to have referential Due Date entry based on the task's Defer Date. The idea is if I have a deferred date in the future, say <code>2015-04-07</code>, and I use the OmniFocus syntax of <code>+2w</code> to set the Due Date in 2 weeks, I don't want my Due Date to be 2 weeks from now, I want my Due Date to be another 2 weeks from the Defer Date. I finally got around to making a Keyboard Maestro macro to have referential Due Dates in OmniFocus. </p>
<p>The KM macro is keyed off of a trigger keystroke of <code>+d2w</code> to set the Due Date in OmniFocus to be 2 weeks from the Defer Date. The macro looks like this:</p>
<figure><a href="http://share.mygeekdaddy.net/OmniFocus_KM_ref_duedate_2015-03-31.png"><img src="http://share.mygeekdaddy.net/OmniFocus_KM_ref_duedate_2015-03-31.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now if I set a task to have a deferred date of <code>2015-04-07</code>, and use the KM macro keystroke of <code>+d2w</code>, the whole process looks like this:</p>
<figure><a href="http://share.mygeekdaddy.net/refential_defer_date_2015-03-31.gif"><img src="http://share.mygeekdaddy.net/refential_defer_date_2015-03-31.gif" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:275px;" /></img></a></figure>
<p>The Applescript in the KM macro is:<sup id="fnref:250137401"><a class="footnote-ref" href="#fn:250137401">1</a></sup></p>
<div class="highlight"><pre><span></span><code>set dateString to the clipboard
set thisDate to date dateString
set deferDate to thisDate + 14 * days
set deferDate to deferDate + 12 * hours
set DueDate to deferDate as string
set the clipboard to DueDate
</code></pre></div>
<p>I have 3 referential due dates macros so far: </p>
<ul>
<li>1 week <a href="http://share.mygeekdaddy.net/OmniFocus_%2B1w_Ref_Due_Date.kmmacros">Download +d1w</a></li>
<li>2 weeks <a href="http://share.mygeekdaddy.net/OmniFocus_%2B2w_Ref_Due_Date.kmmacros">Download +d2w</a></li>
<li>1 month <a href="http://share.mygeekdaddy.net/OmniFocus_%2B1m_Ref_Due_Date.kmmacros">Download +d1m</a></li>
</ul>
<p>I still have my fingers crossed that Omnigroup will have a setting to enable referential dates in future versions of OmniFocus. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:250137401">
<p>I've never claimed to be an Applescript expert. <a class="footnote-backref" href="#fnref:250137401" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>What Metrics Are Really Tell Us2015-03-23T12:34:35-05:002015-03-23T12:34:35-05:00Jason Verlytag:mygeekdaddy.net,2015-03-23:/2015/03/23/what-metrics-are-really-tell-us/<p>I was recently sitting in a staff meeting for one of our factories and listening to them review their maintenance scorecard. The plant has a set of KPI's and metrics they review weekly to gauge how their reliability program was working. About half way through the meeting, a manager followed …</p><p>I was recently sitting in a staff meeting for one of our factories and listening to them review their maintenance scorecard. The plant has a set of KPI's and metrics they review weekly to gauge how their reliability program was working. About half way through the meeting, a manager followed up excitedly when the number of work orders completed the previous week was reported. I sat back any listened to the discussion on why the number of work orders completed the previous week was so impressive. The discussion centered on the number completed and didn't relate the work order count in any other context. I let the review continue and decided to follow up with the manager later on.</p>
<p>Later in the day I followed up with the manager who was so excited about the work order count. I asked why this number seemed to be so important over the other metrics discussed. The manager replied, "But look at how much work we got done. This has to be one of our best weeks in a long time!" I agreed. The plant hadn't done that many work orders for some time, but followed up again and asked what that meant to the department. Did the number of work orders completed indicate anything to the maintenance department about the work they would complete this week or how much work they had to get done next week? He stared blankly at the scorecard and wasn't sure what I meant. So we sat down in the break room and started going over the scorecard in more detail.</p>
<p>We started to review the scorecard and I asked again what the number of work orders completed meant. The manager was worried he was in trouble or that he'd made a spectacle of himself in the meeting. I tried to assure him that wasn't the case. What I wanted to do was explain that the single statistic he had pointed out didn't really tell us anything. I asked if the department got every single work order it was supposed to get done that week, but the plant was only able to run 80% of the time, should we be excited about what we got done? He replied, 'No', because the plant still wouldn't have been running very well. I agreed and then walked through how the scorecard had been originally setup and how the metrics were supposed to be used to tell us how our reliability program was doing. </p>
<p>I went over the three most important things I've learned about KPI's and metrics:</p>
<ul>
<li><strong>All reporting is about being more effective in the future:</strong> Metrics are not about understanding what got done, but what can we learn as an indication of how we are going to do in the future. We cannot change what happened yesterday, but understanding how we performed yesterday can make us more effective and improve how we perform tomorrow.</li>
<li><strong>Telling me how much you got done is not a metric, it's a statistic:</strong> A lot of times a manager will sit in a staff meeting and state we got 'x' work orders completed last week, like in the case of the manager at the staff meeting above. But leaving the fact that your department got 'x' work orders done is a statistic, not a metric. Reliability professionals want to use multiple statistics as an indicator of something bigger, that's when we turn it into a useful metric. </li>
<li><strong>All process changes need to be measured:</strong> Whenever a change is made to a process, in an effort to make it more effective and/or efficient<sup id="fnref:7242432"><a class="footnote-ref" href="#fn:7242432">1</a></sup>, there needs to be a metric put in place to gauge on how well the change is working. Making changes, without any feedback, is worse than making no changes at all. </li>
</ul>
<p>The most important point I raised with the manager was that we shouldn't be using metrics to point out what was done wrong, but use the information to adjust our behaviors and processes to improve our reliability program going forward. Metrics are not about reporting about what happened, it's about making more effective decisions about the future. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:7242432">
<p>Because 'Effective' and 'Efficient' are not the same. <a class="footnote-backref" href="#fnref:7242432" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Better Asset Reliability through GTD2015-03-13T21:32:28-05:002015-03-13T21:32:28-05:00Jason Verlytag:mygeekdaddy.net,2015-03-13:/2015/03/13/better-asset-reliability-through-gtd/<p>Normally when you talk to someone in the engineering, maintenance or reliability fields about the subject of better productivity, their minds usually jump to ways to increase the productivity of what they are working on - better throughput in the factory, increased wrench time, decreased down time, etc. </p>
<p>So when do …</p><p>Normally when you talk to someone in the engineering, maintenance or reliability fields about the subject of better productivity, their minds usually jump to ways to increase the productivity of what they are working on - better throughput in the factory, increased wrench time, decreased down time, etc. </p>
<p>So when do we stop and think about how we can make ourselves more productive?</p>
<h4>Getting Things Done</h4>
<p>I've been using David Allen's <a href="http://gettingthingsdone.com">Getting Things Done</a>(GTD) methodology for some time. For those who haven't heard, GTD is a framework on how to better manage the task and work you need to get completed. The framework has five basic steps:</p>
<ol>
<li>Capture - collect all of your to do's, projects, action items, etc. </li>
<li>Clarify - is what I have collected actionable, and if it is, decide if I need to do it now, defer it to later, delegate it someone else, or drop it completely. </li>
<li>Organize - put things in their proper place.</li>
<li>Reflect - look over your lists and determine what to do next. </li>
<li>Engage - go out and do what you now believe needs to get done. </li>
</ol>
<p>But when I looked at these 5 steps, I saw at a broad level everything a maintenance department should be doing fit in GTD's workflow.</p>
<ol>
<li>Capture - collect all the work that needs to be done in Maximo.</li>
<li>Clarify - think about a job and is it something that needs to be done today or tomorrow, should it get pushed back to next week, should we hire a contractor to do the work, or is the job out of date and get dropped.</li>
<li>Organize - get the list of jobs we're going to do on to the schedule.</li>
<li>Reflect - review the schedule with Production and make sure what we believe needs to get done, should get done. </li>
<li>Engage - issue work to mechanics and technicians so the tasks get completed. </li>
</ol>
<p>But then I started to think about the collateral responsibilities most of us have in our organizations. We have tasks that go beyond issuing work orders and running reports. I started to think about ways I could GTD to help make me and my department more productive.</p>
<h4>Keep running lists of meeting agendas</h4>
<p>Most organizations will have a regular team meeting related to reliability and maintenance. The agenda for these meetings are posted before the meeting and some ideas on the next meeting are written down somewhere too. This is then repeated month after month through out the year. </p>
<p>Assuming you're having a monthly team meeting, a better approach is to create 12 agenda files (Word, Excel, text file, etc) for all the upcoming meetings. This way as new agenda ideas come up, you can capture them immediately in that month's agenda or see that the agenda for 2 months from now is already pretty full. </p>
<figure><a href="http://share.mygeekdaddy.net/GTD_for_reliability_agenda_list_2015-03-13.png"><img src="http://share.mygeekdaddy.net/GTD_for_reliability_agenda_list_2015-03-13.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>Now I'm collecting ideas for August all the way back in March. </p>
<h4>Treat all maintenance activities with one inbox</h4>
<p>Let's not lie to each other. Most organizations will treat their maintenance groups as an ad hoc project group at times. The work being isn't truly corrective maintenance, it's more like <em>enhancement maintenance</em>. But when reviewing the workload and priorities of these project tasks, they will sometimes get put on a spreadsheet or email list. </p>
<p>Definitely not the way we should be managing these tasks.</p>
<p>Put all of the tasks onto individual work orders (we want to track and time & materials anyway) and then use a simple BIRT report to keep track of all the projects. So as new work comes up and old work drops off, the processes we already use to manage work orders will manage the project list too. As project priorities change, change the priority value on the work order to reflect its importance. </p>
<h4>Do less work trying to get work done</h4>
<p>I have to admit, I've been doing something <em>close</em> to this, but George Williams, from Bristol Myers Squibb, did a great job at Interconnect 2015 of connecting the dots on how to use BIRT reporting in Maximo to help employees focus what needs to get done. They used a three staged linked report to <em>show</em> their employees what needed their attention versus having them work on <em>finding</em> what needed their attention.</p>
<p>The process was pretty simple:</p>
<ul>
<li>An over view report to show what needed to be looked at.</li>
<li>A list to report to quickly scan what was being looked at.</li>
<li>A detail (print) report to assign work to employee to get completed</li>
</ul>
<blockquote>
<p>Aging Report → List Report → Details Report</p>
</blockquote>
<p>The first report is a summary aging report that shows transactional records (work order, purchase request, purchase order, etc) in a grid based on data type vs age:</p>
<p>| | WO Age ||||| <br>
| WO Type | 0-30d | 30-60d | 60-90d | 90d+ |
|:------------:|:-----------:|:-------------------:|:---------------:|:------------:|
| PM | 12 | 23 | 2 | 1 |
| CM | 23 | 18 | 4 | 6 |
| EM | 14 | 34 | 0 | 3 |</p>
<p>Each of the work order aging counts would link to a work order list report. Then the work order list report would link to the WO print report. This allowed the maintenance department to identify outlier activities that needed to be monitored. </p>
<p>The report is placed on a Maximo user's Start Center, so they won't have to work at getting the information they need. It was one of the best presentations I saw at Interconnect.</p>Markdown Test Snippet2015-03-13T12:09:23-05:002015-03-13T12:09:23-05:00Jason Verlytag:mygeekdaddy.net,2015-03-13:/2015/03/13/markdown-test-snippet/<p>More and more of my information is being written and documented in Markdown. But not everyone I work with uses Markdown. So the apps I use to write in Markdown are also used to export Markdown into a file format that works for the recipient. The current list includes:</p>
<ul>
<li><a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8&uo=4" title="Editorial">Editorial …</a></li></ul><p>More and more of my information is being written and documented in Markdown. But not everyone I work with uses Markdown. So the apps I use to write in Markdown are also used to export Markdown into a file format that works for the recipient. The current list includes:</p>
<ul>
<li><a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8&uo=4" title="Editorial">Editorial</a></li>
<li><a href="https://itunes.apple.com/us/app/drafts-4-quickly-capture-notes/id905337691?mt=8&uo=4" title="Drafts">Drafts</a></li>
<li><a href="https://itunes.apple.com/us/app/marked-2/id890031187?mt=12&uo=4" title="Marked">Marked 2</a></li>
</ul>
<p>The upside in all the apps I've chosen is that they allow a custom CSS file to be created to modify the rendered Markdown. The next step logical step was to get the same CSS files in all three apps so I would get the same rendered output from each application. This way I could give someone the same looking document from any device I happened to be working on. I got tired of saving, reloading or having multiple copies of a MD test sample while testing the CSS updates and tweaking. The easy solution was to create a Text Expander snippet to generate a MD test sample whenever I wanted. </p>
<div class="highlight"><pre><span></span><code><span class="n">Title</span><span class="o">:</span><span class="w"> </span><span class="n">This</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">MD</span><span class="w"> </span><span class="n">Preview</span><span class="w"> </span><span class="n">Test</span><span class="w"></span>
<span class="n">Lorem</span><span class="w"> </span><span class="n">ipsum</span><span class="w"> </span><span class="n">dolor</span><span class="w"> </span><span class="n">sit</span><span class="w"> </span><span class="n">amet</span><span class="o">,</span><span class="w"> </span><span class="n">consectetur</span><span class="w"> </span><span class="n">adipiscing</span><span class="w"> </span><span class="n">elit</span><span class="o">.</span><span class="w"> </span><span class="n">Integer</span><span class="w"> </span><span class="n">sit</span><span class="w"> </span><span class="n">amet</span><span class="w"> </span><span class="n">eleifend</span><span class="w"> </span><span class="n">leo</span><span class="o">.</span><span class="w"> </span><span class="n">Vivamus</span><span class="w"> </span><span class="n">auctor</span><span class="w"> </span><span class="n">arcu</span><span class="w"> </span><span class="n">sed</span><span class="w"> </span><span class="n">arcu</span><span class="w"> </span><span class="n">consectetur</span><span class="w"> </span><span class="n">aliquam</span><span class="o">.</span><span class="w"> </span><span class="n">Quisque</span><span class="w"> </span><span class="n">mollis</span><span class="w"> </span><span class="n">dictum</span><span class="w"> </span><span class="n">enim</span><span class="w"> </span><span class="n">ullamcorper</span><span class="w"> </span><span class="n">molestie</span><span class="o">.</span><span class="w"> </span><span class="n">Maecenas</span><span class="w"> </span><span class="n">massa</span><span class="w"> </span><span class="n">eros</span><span class="o">,</span><span class="w"> </span><span class="n">euismod</span><span class="w"> </span><span class="n">eget</span><span class="w"> </span><span class="n">sollicitudin</span><span class="w"> </span><span class="n">eu</span><span class="o">,</span><span class="w"> </span><span class="n">fringilla</span><span class="w"> </span><span class="n">ac</span><span class="w"> </span><span class="n">eros</span><span class="o">.</span><span class="w"> </span><span class="n">Phasellus</span><span class="w"> </span><span class="n">lobortis</span><span class="w"> </span><span class="n">hendrerit</span><span class="w"> </span><span class="n">facilisis</span><span class="o">.</span><span class="w"></span>
<span class="o">*</span><span class="w"> </span><span class="n">List</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
<span class="o">*</span><span class="w"> </span><span class="n">List</span><span class="w"> </span><span class="mi">2</span><span class="w"></span>
<span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">List</span><span class="w"> </span><span class="mf">2.1</span><span class="w"></span>
<span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">List</span><span class="w"> </span><span class="mf">2.2</span><span class="w"></span>
<span class="o">*</span><span class="w"> </span><span class="n">List</span><span class="w"> </span><span class="mi">3</span><span class="w"></span>
<span class="o">></span><span class="n">Block</span><span class="w"> </span><span class="n">quote</span><span class="w"> </span><span class="n">of</span><span class="w"> </span><span class="n">text</span><span class="o">...</span><span class="w"> </span><span class="n">lorem</span><span class="w"> </span><span class="n">ipsum</span><span class="w"> </span><span class="n">facto</span><span class="o">.</span><span class="w"></span>
<span class="w"> </span><span class="n">Indented</span><span class="w"> </span><span class="n">block</span><span class="w"> </span><span class="n">code</span><span class="w"> </span><span class="n">text</span><span class="w"> </span><span class="n">field</span><span class="w"></span>
<span class="n">This</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">sentence</span><span class="w"> </span><span class="n">using</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="err">`</span><span class="n">block</span><span class="w"> </span><span class="n">code</span><span class="err">`</span><span class="w"> </span><span class="n">apostrophes</span><span class="o">.</span><span class="w"></span>
<span class="mi">1</span><span class="o">.</span><span class="w"> </span><span class="n">Number</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
<span class="mi">2</span><span class="o">.</span><span class="w"> </span><span class="n">Number</span><span class="w"> </span><span class="mi">2</span><span class="w"></span>
<span class="mi">3</span><span class="o">.</span><span class="w"> </span><span class="n">Number</span><span class="w"> </span><span class="mi">3</span><span class="w"></span>
<span class="w"> </span><span class="mi">4</span><span class="o">.</span><span class="w"> </span><span class="n">Number</span><span class="w"> </span><span class="mf">3.1</span><span class="w"></span>
<span class="w"> </span><span class="mi">5</span><span class="o">.</span><span class="w"> </span><span class="n">Number</span><span class="w"> </span><span class="mf">3.2</span><span class="w"></span>
<span class="w"> </span><span class="mi">6</span><span class="o">.</span><span class="w"> </span><span class="n">Number</span><span class="w"> </span><span class="mf">3.3</span><span class="w"></span>
<span class="mi">7</span><span class="o">.</span><span class="w"> </span><span class="n">Number</span><span class="w"> </span><span class="mi">4</span><span class="w"></span>
</code></pre></div>
<p>This sample block will show the most common MD elements I'd need to use when generating documents for others. This block of text is added whenever I type <code>;mdtest</code>. You can download the snippet here: <a href="http://share.mygeekdaddy.me/mdtest.textexpander">MD Test Snippet</a>.</p>Best thread on Ubuntu for RPi2015-03-03T22:33:26-06:002015-03-03T22:33:26-06:00Jason Verlytag:mygeekdaddy.net,2015-03-03:/2015/03/03/best-thread-on-ubuntu-for-rpi/<p>Trying to learn Python has been something I've been taking on over the winter. I've been using the Raspberry Pi as my work environment to find real world examples to work through. One of the collateral changes that has come from this is using Linux more and more. I switched …</p><p>Trying to learn Python has been something I've been taking on over the winter. I've been using the Raspberry Pi as my work environment to find real world examples to work through. One of the collateral changes that has come from this is using Linux more and more. I switched to a VPS using Ubuntu to run my website and have been dual booting Ubuntu on my MBP. <sup id="fnref:567468"><a class="footnote-ref" href="#fn:567468">1</a></sup></p>
<p>The biggest breakthrough came a couple of weeks ago when the Raspberry Pi foundation released an updated version of the <a href="http://www.raspberrypi.org/help/what-is-a-raspberry-pi/">Raspberry Pi</a>. The Raspberry Pi community has gone crazy of the update. From all the great work has come the best update of all: <a href="http://www.raspberrypi.org/forums/viewtopic.php?f=56&t=100553">Ubuntu 14.04 (trusty) Raspberry Pi 2 image</a></p>
<p>The forum thread gives a link to download an <a href="http://www.finnie.org/software/raspberrypi/2015-03-02-ubuntu-trusty.zip">Ubuntu image for the Raspberry Pi 2</a>. There are some great comments and contributions being made on this thread.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:567468">
<p>Look for more on moving from OS X to Linux in the coming months. <a class="footnote-backref" href="#fnref:567468" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Fixing Raspbian LXDE GDBUS Error2015-02-13T22:55:15-06:002015-02-13T22:55:15-06:00Jason Verlytag:mygeekdaddy.net,2015-02-13:/2015/02/13/fixing-raspbian-lxde-gdbus-error/<p>With the recent release of the Raspberry Pi 2, <a href="http://www.raspberrypi.org/forums/viewtopic.php?f=32&t=98466&p=685804">little bugs</a> <a href="http://www.raspberrypi.org/xenon-death-flash-a-free-physics-lesson/">have crawled</a> out of the woodwork. One annoying, but very minor bug, is when you log into LXDE, the windows manager for Raspbian. After entering <code>startx</code> to start the windows manager, your Raspberry Pi opens up LXDE and you …</p><p>With the recent release of the Raspberry Pi 2, <a href="http://www.raspberrypi.org/forums/viewtopic.php?f=32&t=98466&p=685804">little bugs</a> <a href="http://www.raspberrypi.org/xenon-death-flash-a-free-physics-lesson/">have crawled</a> out of the woodwork. One annoying, but very minor bug, is when you log into LXDE, the windows manager for Raspbian. After entering <code>startx</code> to start the windows manager, your Raspberry Pi opens up LXDE and you get this:</p>
<figure><a href="http://share.mygeekdaddy.me/lxdess_1a_2015-02-13.jpeg"><img src="http://share.mygeekdaddy.me/lxdess_1a_2015-02-13.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<div class="highlight"><pre><span></span><code><span class="nv">GDBus</span>.<span class="nv">Error</span>:<span class="nv">org</span>.<span class="nv">freedesktop</span>.<span class="nv">PolicyKit1</span>.<span class="nv">Error</span>.<span class="nv">Failed</span>:<span class="w"> </span><span class="nv">An</span><span class="w"> </span><span class="nv">authentication</span><span class="w"> </span><span class="nv">agent</span><span class="w"> </span><span class="nv">already</span><span class="w"> </span><span class="nv">exists</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nv">the</span><span class="w"> </span><span class="nv">given</span><span class="w"> </span><span class="nv">subject</span><span class="w"></span>
</code></pre></div>
<p>You can click 'Ok' and the window goes away, but then you're left with that uneasy feeling of <em>"why did it show up"</em> and <em>"is it really an issue"</em>. </p>
<p>Well... yes, there is <em>some</em> sort of problem because an error window showed up - <a href="http://www.blackmoreops.com/2013/11/19/fix-gdbus-error-org-freedesktop-policykit1-error-failed-authentication-agent-already-exists-given-subject-error-kali-lmde-debian-linux/">see list of times</a> same error showed up at the bottom of the page. In fact that page explains how to fix this <strong>exact</strong> error. But the fix doesn't work for Raspian. </p>
<p>To fix the problem on Raspian in LXDE, you need to take a couple of extra steps.</p>
<ol>
<li>Dismiss the error window by clicking 'Ok'. You can continue to do that each time you log into LXDE. But let's face it, you're not the type of person to be running Raspbian Linux and accept some random error message.</li>
<li>Open a terminal window and enter the following command <code>lxsession-edit</code> Don't run it as <code>sudo</code>.</li>
<li>This will open up another dialog window. Uncheck the box shown below:
<figure><a href="http://share.mygeekdaddy.me/lxdess_edit_2015-02-13.png"><img src="http://share.mygeekdaddy.me/lxdess_edit_2015-02-13.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></li>
<li>Click 'Ok'. </li>
</ol>
<p>At this point you can continue working in LXDE or reboot Raspberry Pi. The next time you log in you won't see the error dialog box. </p>Nationwide got it right2015-02-02T12:27:15-06:002015-02-02T12:27:15-06:00Jason Verlytag:mygeekdaddy.net,2015-02-02:/2015/02/02/nationwide-got-it-right/<p>You'd have to be living under a rock to have not heard about Nationwide's commercial that aired during the Superbowl. Twitter went crazy over it and memes of all sorts were made using screen shots from the commercial. If you haven't seen it before, here you go, I'll wait. </p>
<iframe width="640" height="360" src="https://www.youtube-nocookie.com/embed/dKUy-tfrIHY?rel=0" frameborder="0" allowfullscreen></iframe>
<p>The …</p><p>You'd have to be living under a rock to have not heard about Nationwide's commercial that aired during the Superbowl. Twitter went crazy over it and memes of all sorts were made using screen shots from the commercial. If you haven't seen it before, here you go, I'll wait. </p>
<iframe width="640" height="360" src="https://www.youtube-nocookie.com/embed/dKUy-tfrIHY?rel=0" frameborder="0" allowfullscreen></iframe>
<p>The Superbowl is hyped to have funny, big budget, over the top commercials. So going into this one everyone expected some happy/feel good ending. </p>
<blockquote>
<p>But it didn't.</p>
</blockquote>
<p>The problem wasn't that it was a terrible commercial, but that everyone watching it had different expectations. You see a boy hoping to live all his big dreams, with the emotional music in the backgroud, and then cut... none of them will come true. The ending was a harsh reality to what happens everyday.</p>
<p>So what did you do at the end of the commercial?</p>
<p>I sat back and thought how awful of a commercial that was and why in the hell would Nationwide put THAT on during the Superbowl. It was a complete mess of a story and it made you feel terrible at the end. But then in the back of my mind, I paused for about half a second, and thought of about a dozen other things. </p>
<p>If you're a parent:</p>
<ul>
<li>Didn't you pause to think about how safe your children are?</li>
<li>Didn't you pause to think about that one "near miss" that could have ended terribly?</li>
<li>Didn't you pause to wonder if there was something else you could do to protect your child?</li>
<li>Didn't you pause and think how terrible it would be if you lost your child to something preventable?</li>
</ul>
<p>If you stopped and did anyone of those things, then Nationwide and Make Safe Happen made their point.
The commercial was a complete success.</p>Desktop Widget Charger2015-01-30T15:11:49-06:002015-01-30T15:11:49-06:00Jason Verlytag:mygeekdaddy.net,2015-01-30:/2015/01/30/desktop-widget-charger/<p>Like most geeks, I have of gadgets that fall on my "what was I thinking" list, some that fall on my "really do like it" list and then a select few that fall on my "must have" list. Items on the "must have" list are the ones I would sacrifice …</p><p>Like most geeks, I have of gadgets that fall on my "what was I thinking" list, some that fall on my "really do like it" list and then a select few that fall on my "must have" list. Items on the "must have" list are the ones I would sacrifice my beer budget to get replaced.<sup id="fnref:23452521"><a class="footnote-ref" href="#fn:23452521">1</a></sup> Currently on my desk I have a mix of devices - an iPhone, an iPad, a Raspberry Pi, a BT speaker, and Twelve South stand. The common thread of all these devices is they require power. My desk has been an absolute mess trying to keep all of the chargers and cords straight. I while back I got a <a href="http://www.amazon.com/Desktop-Charger-PowerIQ-Technology-Samsung/dp/B00GTGETFG/ref=sr_1_2?ie=UTF8&qid=1422653449&sr=8-2&keywords=Anker+5+port+usb+charger">Anker 40W 5-port USB charger</a> and have fallen in love with it.<sup id="fnref:23r23rw"><a class="footnote-ref" href="#fn:23r23rw">2</a></sup> So after moving to a new office at work, I got a second one to help declutter my work area. Getting more than one of the same device automatically promotes it to the "really do like it" list... it's a rule. </p>
<figure><a href="http://share.mygeekdaddy.me/Photo%20Jan%2030,%202%2002%2043%20PM.jpeg"><img src="http://share.mygeekdaddy.me/Photo%20Jan%2030,%202%2002%2043%20PM.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The unit itself nice and compact, just a little smaller than an iPhone 5s. Each USB port is capable of supplying 2.4A at 5V. This perfect for me since almost every gadget I own runs on a 5V input voltage. The charger sits on the corner of my desk and can be plugged into a variety of devices. Just swap in and out the USB cord you need to charge or power your device. No more digging under the desk to unplug a charger because you need to power up a different device or running out of outlets. It's also the only charger I have to bring with while traveling. Since it handles up to 2.4A (plenty of power for my iPad), all I need to worry about is bringing the correct cables with.</p>
<figure><a href="http://share.mygeekdaddy.me/IMG_0391.JPG"><img src="http://share.mygeekdaddy.me/IMG_0391.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The Anker USB charger comes with the charging station, a power cord and a very nice note from the folks at Anker.</p>
<figure><a href="http://share.mygeekdaddy.me/Photo%20Jan%2030,%203%2038%2019%20PM.jpeg"><img src="http://share.mygeekdaddy.me/Photo%20Jan%2030,%203%2038%2019%20PM.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>If you're looking for a great way to clean up your desk, this has been a fantastic way for me to streamline cord management.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:23452521">
<p>Currently there are 4 on that list. <a class="footnote-backref" href="#fnref:23452521" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:23r23rw">
<p>Affiliate link free. ;-) <a class="footnote-backref" href="#fnref:23r23rw" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Adding Custom Sort Order in BIRT2015-01-29T16:26:10-06:002015-01-29T16:26:10-06:00Jason Verlytag:mygeekdaddy.net,2015-01-29:/2015/01/29/adding-custom-sort-order-in-birt/<p>One of the best ways to clarify information on a BIRT report is to group the information on a key field. This field could the status of the record, who made the request, or the last person to change the record. Normally when you create a group in BIRT, the …</p><p>One of the best ways to clarify information on a BIRT report is to group the information on a key field. This field could the status of the record, who made the request, or the last person to change the record. Normally when you create a group in BIRT, the report will be sorted on the values of the group field value in alphabetical order. For example, you create a report to show a set of open work orders and group them by the <code>STATUS</code> field, you would get your work orders grouped in this order:</p>
<ul>
<li>APPR</li>
<li>COMP</li>
<li>INPRG</li>
<li>W-PLAN</li>
<li>W-SUPV</li>
<li>WAPPR</li>
<li>WMATL</li>
<li>WSCH</li>
</ul>
<p>But most organizations don't want the list in alphabetical order, but in functional order. They want to see the work orders that are still waiting to be issued - <code>Wxxx</code> status - before work that's already been issued. In this case the order they'd want to see the results in is:</p>
<ul>
<li>WAPPR</li>
<li>WSCH</li>
<li>W-PLAN</li>
<li>W-SUPV</li>
<li>WMATL</li>
<li>APPR</li>
<li>INPRG</li>
<li>COMP</li>
</ul>
<p>But BIRT doesn't have a magical sort button to organize the records based on function. To do this we need to add a custom sort filter on the group. </p>
<h4>Custom Sort Order</h4>
<p>Once your report is created and the group is set, open the group details page:</p>
<figure><a href="http://share.mygeekdaddy.net/birt_grp_details_2015-01-29.png"><img src="http://share.mygeekdaddy.net/birt_grp_details_2015-01-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>At the bottom of the details page, click in the <code>Sorting</code> button and then <code>Add...</code> a new sort key. This will open a dialog box similar to creating a new <code>Data</code> element.</p>
<figure><a href="http://share.mygeekdaddy.net/new_grp_sort_key_2015-01-29.png"><img src="http://share.mygeekdaddy.net/new_grp_sort_key_2015-01-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>Click the function button, <code>f(x)</code>, to open the expression builder for the sort key. In the expression builder enter a if/else statement:</p>
<div class="highlight"><pre><span></span><code><span class="nf">var</span><span class="w"> </span><span class="n">pattern</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">/^[</span><span class="n">W</span><span class="o">]/</span><span class="n">gi</span><span class="p">;</span><span class="w"> </span>
<span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">dataSetRow</span><span class="o">[</span><span class="n">"status"</span><span class="o">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'WAPPR'</span><span class="p">)</span><span class="w"> </span><span class="err">{</span><span class="mi">1</span><span class="err">}</span><span class="w"> </span>
<span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">dataSetRow</span><span class="o">[</span><span class="n">"status"</span><span class="o">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'WSCH'</span><span class="p">)</span><span class="w"> </span><span class="err">{</span><span class="mi">2</span><span class="err">}</span><span class="w"> </span>
<span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">pattern</span><span class="p">.</span><span class="n">test</span><span class="p">(</span><span class="n">dataSetRow</span><span class="o">[</span><span class="n">"status"</span><span class="o">]</span><span class="p">)</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="k">true</span><span class="p">)</span><span class="w"> </span><span class="err">{</span><span class="mi">3</span><span class="err">}</span><span class="w"> </span>
<span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">dataSetRow</span><span class="o">[</span><span class="n">"status"</span><span class="o">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'APPR'</span><span class="p">)</span><span class="w"> </span><span class="err">{</span><span class="mi">4</span><span class="err">}</span><span class="w"> </span>
<span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">dataSetRow</span><span class="o">[</span><span class="n">"status"</span><span class="o">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'INPRG'</span><span class="p">)</span><span class="w"> </span><span class="err">{</span><span class="mi">5</span><span class="err">}</span><span class="w"> </span>
<span class="k">else</span><span class="w"> </span><span class="k">if</span><span class="w"> </span><span class="p">(</span><span class="n">dataSetRow</span><span class="o">[</span><span class="n">"status"</span><span class="o">]</span><span class="w"> </span><span class="o">==</span><span class="w"> </span><span class="s1">'COMP'</span><span class="p">)</span><span class="w"> </span><span class="err">{</span><span class="mi">6</span><span class="err">}</span><span class="w"> </span>
<span class="k">else</span><span class="w"> </span><span class="err">{</span><span class="mi">99</span><span class="err">}</span><span class="w"></span>
</code></pre></div>
<figure><a href="http://share.mygeekdaddy.net/sort_order_exp_builder_copy_2015-01-29_2015-01-29.png"><img src="http://share.mygeekdaddy.net/sort_order_exp_builder_copy_2015-01-29_2015-01-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now BIRT will sort records based on the value passed by the if/else statement and not by the alphabetically listing of the group header. </p>
<h4>Breaking it down</h4>
<p>The expression used for the sort order is not your typical if/else statement. I added a regular expression (regex) to handle groups with multiple statuses with the same first letter. Here is a break down of each line in the if/else sorting key statement. </p>
<ul>
<li><code>var pattern = /^[W]/gi;</code>: This line declares the regex pattern that will be used later on in the sorting expression. The pattern is looking for any vale that has the letter <code>W</code> at the beginning of the field. </li>
<li><code>if (dataSetRow["status"] == 'WAPPR') {1}</code>: This is the first line that is used to start sorting the group. The statement looks to see if the value of the <code>status</code> is equal to the string <code>WAPPR</code>. If it is, pass a value of <code>1</code>. If not, move onto the next line. </li>
<li><code>else if (dataSetRow["status"] == 'WSCH') {2}</code>: This is the next iteration to set the sort order. If the <code>status</code> value is equal to the string <code>WSCH</code>, pass a value of <code>2</code>. If not, move onto the next line. BIRT will start using these values getting passed back by the sorting key expression to sort the groups. </li>
<li><code>else if (pattern.test(dataSetRow["status"]) == true) {3}</code>: This is the line that uses the variable <code>pattern</code> that we declared on the first line. The line is testing to see if the <code>status</code> record begins with a <code>W</code>. If it does, the <code>.test()</code> function passes a <code>true</code> value, if not it passes a <code>false</code>. The line is checking to see if the pattern test is passing a <code>true</code> value with comparison of <code>== true</code>. If the line is equal to true, then it passes a value of <code>3</code> back to BIRT for sorting the group. If not, it moves onto the next line. However, this line will pass a value of <code>3</code> to multiple groups - <code>W-MGR</code>, <code>W-SUP</code>, and <code>WMATL</code>. When this happens, BIRT will roll back to sorting the groups alphabetically. </li>
<li><code>else if (dataSetRow["status"] == 'APPR') {4}</code>: Sorts records with <code>APPR</code> status 4th.</li>
<li><code>else if (dataSetRow["status"] == 'INPRG') {5}</code>: Sorts records with <code>INPRG</code> status 5th.</li>
<li><code>else if (dataSetRow["status"] == 'COMP') {6}</code>: Sorts records with <code>COMP</code> status 6th.</li>
<li><code>else {99}</code>: Sorts any other work order status in alphabetical order, just like the 4th line would do. </li>
</ul>
<p>Now when a Maximo user generates the report, the work order list will be sorted in the defined sort order. </p>Adding jQuery navigation arrow2015-01-28T14:59:01-06:002015-01-28T14:59:01-06:00Jason Verlytag:mygeekdaddy.net,2015-01-28:/2015/01/28/adding-jquery-navigation-arrow/<p>I've always admired the little things a person does for their website. The last big update I made to my site was adding a <a href="http://mygeekdaddy.net/2014/11/17/adding-local-search-to-pelican/">built-in search box</a>. One of the subtle touches I've wanted to add is adding a button that will bring a user back to the top of …</p><p>I've always admired the little things a person does for their website. The last big update I made to my site was adding a <a href="http://mygeekdaddy.net/2014/11/17/adding-local-search-to-pelican/">built-in search box</a>. One of the subtle touches I've wanted to add is adding a button that will bring a user back to the top of the page.</p>
<p>Here are the steps to add a button to return the user back to the top of the page for a Pelican theme. The core code in article was from a tutorial on <a href="http://codyhouse.co/gem/back-to-top/">codyhouse.co</a>. </p>
<h4>Backup your setup</h4>
<p>This update will require editing a couple of critical files to your Pelican setup. Make sure you have a back up of your Pelican folder and Pelican theme folder.</p>
<h4>Required content</h4>
<p>For this function to work on your site, you need to have jQuery enabled on your site. jQuery has been added for 99% of the Pelican themes I've seen to date, but you need to make sure jQuery is active. To verify if jQuery is getting loaded, look at your <code>base.html</code> template and look for a line similar to this:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><script</span> <span class="na">src=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/theme/js/jquery-1.11.1.min.js"</span> <span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">></script></span>
</code></pre></div>
<p>It will typically be located near other .js files that are being loaded by your Pelican theme. </p>
<figure><a href="http://share.mygeekdaddy.net/backtotop_js_base_html_2015-01-28.png"><img src="http://share.mygeekdaddy.net/backtotop_js_base_html_2015-01-28.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:700px;" /></img></a></figure>
<p>In the event your theme doesn't load jQuery, add the following line to your <code>base.html</code> template:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><script</span> <span class="na">src=</span><span class="s">"http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"</span><span class="nt">></script></span>
</code></pre></div>
<p>This will load a copy of jQuery from Google. Download a local copy to your webserver if you don't want to rely on a 3rd party's copy of jQuery. </p>
<h4>Create new .js</h4>
<p>Most of the magic with this update is in the javascript file that runs the jQuery functions. You'll need to create a new .js file and save it to your theme's <code>js</code> folder. In the rest of the example this .js file is called <code>backtotop.js</code>. The actual javascript is shown below:</p>
<div class="highlight"><pre><span></span><code><span class="n">jQuery</span><span class="p">(</span><span class="n">document</span><span class="p">)</span><span class="o">.</span><span class="n">ready</span><span class="p">(</span><span class="n">function</span><span class="p">(</span><span class="o">$</span><span class="p">){</span><span class="w"></span>
<span class="w"> </span><span class="o">//</span><span class="w"> </span><span class="n">browser</span><span class="w"> </span><span class="n">window</span><span class="w"> </span><span class="n">scroll</span><span class="w"> </span><span class="p">(</span><span class="ow">in</span><span class="w"> </span><span class="n">pixels</span><span class="p">)</span><span class="w"> </span><span class="n">after</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="s2">"back to top"</span><span class="w"> </span><span class="n">link</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">shown</span><span class="w"></span>
<span class="w"> </span><span class="k">var</span><span class="w"> </span><span class="n">offset</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">400</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="o">//</span><span class="n">browser</span><span class="w"> </span><span class="n">window</span><span class="w"> </span><span class="n">scroll</span><span class="w"> </span><span class="p">(</span><span class="ow">in</span><span class="w"> </span><span class="n">pixels</span><span class="p">)</span><span class="w"> </span><span class="n">after</span><span class="w"> </span><span class="n">which</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="s2">"back to top"</span><span class="w"> </span><span class="n">link</span><span class="w"> </span><span class="n">opacity</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">reduced</span><span class="w"></span>
<span class="w"> </span><span class="o">//</span><span class="n">offset_opacity</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1500</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="o">//</span><span class="n">duration</span><span class="w"> </span><span class="n">of</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">top</span><span class="w"> </span><span class="n">scrolling</span><span class="w"> </span><span class="n">animation</span><span class="w"> </span><span class="p">(</span><span class="ow">in</span><span class="w"> </span><span class="n">ms</span><span class="p">)</span><span class="w"></span>
<span class="w"> </span><span class="n">scroll_top_duration</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1500</span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="o">//</span><span class="n">grab</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="s2">"back to top"</span><span class="w"> </span><span class="n">link</span><span class="w"></span>
<span class="w"> </span><span class="o">$</span><span class="n">back_to_top</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">$</span><span class="p">(</span><span class="s1">'.cd-top'</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="o">//</span><span class="n">hide</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">show</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="s2">"back to top"</span><span class="w"> </span><span class="n">link</span><span class="w"></span>
<span class="w"> </span><span class="o">$</span><span class="p">(</span><span class="n">window</span><span class="p">)</span><span class="o">.</span><span class="n">scroll</span><span class="p">(</span><span class="n">function</span><span class="p">(){</span><span class="w"></span>
<span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="o">$</span><span class="p">(</span><span class="n">this</span><span class="p">)</span><span class="o">.</span><span class="n">scrollTop</span><span class="p">()</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">offset</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="err">?</span><span class="w"> </span><span class="o">$</span><span class="n">back_to_top</span><span class="o">.</span><span class="n">addClass</span><span class="p">(</span><span class="s1">'cd-is-visible'</span><span class="p">)</span><span class="w"> </span><span class="p">:</span><span class="w"> </span><span class="o">$</span><span class="n">back_to_top</span><span class="o">.</span><span class="n">removeClass</span><span class="p">(</span><span class="s1">'cd-is-visible cd-fade-out'</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="k">if</span><span class="p">(</span><span class="w"> </span><span class="o">$</span><span class="p">(</span><span class="n">this</span><span class="p">)</span><span class="o">.</span><span class="n">scrollTop</span><span class="p">()</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">offset_opacity</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span>
<span class="w"> </span><span class="o">$</span><span class="n">back_to_top</span><span class="o">.</span><span class="n">addClass</span><span class="p">(</span><span class="s1">'cd-fade-out'</span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="p">}</span><span class="w"></span>
<span class="w"> </span><span class="p">});</span><span class="w"></span>
<span class="w"> </span><span class="o">//</span><span class="n">smooth</span><span class="w"> </span><span class="n">scroll</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">top</span><span class="w"></span>
<span class="w"> </span><span class="o">$</span><span class="n">back_to_top</span><span class="o">.</span><span class="n">on</span><span class="p">(</span><span class="s1">'click'</span><span class="p">,</span><span class="w"> </span><span class="n">function</span><span class="p">(</span><span class="n">event</span><span class="p">){</span><span class="w"></span>
<span class="w"> </span><span class="n">event</span><span class="o">.</span><span class="n">preventDefault</span><span class="p">();</span><span class="w"></span>
<span class="w"> </span><span class="o">$</span><span class="p">(</span><span class="s1">'body,html'</span><span class="p">)</span><span class="o">.</span><span class="n">animate</span><span class="p">({</span><span class="w"></span>
<span class="w"> </span><span class="n">scrollTop</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">,</span><span class="w"></span>
<span class="w"> </span><span class="p">},</span><span class="w"> </span><span class="n">scroll_top_duration</span><span class="w"></span>
<span class="w"> </span><span class="p">);</span><span class="w"></span>
<span class="w"> </span><span class="p">});</span><span class="w"></span>
<span class="p">});</span><span class="w"></span>
</code></pre></div>
<p>The <code>backtotop.js</code> file (or however you called it) has an option setting of <code>offset_opacity = 1500</code> that determines how far down a user has to navigate before the button will become opaque. On my site I have this commented out so the button is visible as soon as the <code>var offset = 400</code> is hit. </p>
<h4>Changes to base.html</h4>
<p>The next step is to update your <code>base.html</code> template to include a couple of items to all of the html files generated for your site. Add the following line to the section of your <code>base.html</code> template file to load the <code>backtotop.js</code> file when someone visits your site. </p>
<div class="highlight"><pre><span></span><code><span class="nt"><script</span> <span class="na">src=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/theme/js/backtotop.js"</span> <span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">></script></span>
</code></pre></div>
<figure><a href="http://share.mygeekdaddy.net/insert_backtotop_js_base_html_2015-01-28.png"><img src="http://share.mygeekdaddy.net/insert_backtotop_js_base_html_2015-01-28.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Next, add the following line to the end of the <code>body</code> section just above the closing <code></body></code> tag. </p>
<div class="highlight"><pre><span></span><code><span class="nt"><a</span> <span class="na">href=</span><span class="s">"#0"</span> <span class="na">class=</span><span class="s">"cd-top"</span><span class="nt">></span>Top<span class="nt"></a></span>
</code></pre></div>
<figure><a href="http://share.mygeekdaddy.net/insert_cd_to_top_link_2015-01-28.png"><img src="http://share.mygeekdaddy.net/insert_cd_to_top_link_2015-01-28.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This will automatically add the needed link tags in all the HTML pages on your website.</p>
<h4>Update main.css</h4>
<p>Now we need to add a little style to our button. Add the following to your main.css file for your theme:</p>
<div class="highlight"><pre><span></span><code><span class="na">.cd-top</span><span class="w"> </span><span class="err">{</span><span class="w"></span>
<span class="w"> </span><span class="nl">display:</span><span class="w"> </span><span class="nf">inline-block</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">height:</span><span class="w"> </span><span class="err">40</span><span class="nf">px</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">width:</span><span class="w"> </span><span class="err">40</span><span class="nf">px</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">position:</span><span class="w"> </span><span class="nf">fixed</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">bottom:</span><span class="w"> </span><span class="err">40</span><span class="nf">px</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">right:</span><span class="w"> </span><span class="err">10</span><span class="nf">px</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">z-index:</span><span class="w"> </span><span class="err">1000</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">box-shadow:</span><span class="w"> </span><span class="err">0</span><span class="w"> </span><span class="err">0</span><span class="w"> </span><span class="err">10</span><span class="nf">px</span><span class="w"> </span><span class="no">rgba</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="no">.05</span><span class="p">)</span><span class="c1">;</span>
<span class="w"> </span><span class="cm">/* image replacement properties */</span><span class="w"></span>
<span class="w"> </span><span class="nl">overflow:</span><span class="w"> </span><span class="nf">hidden</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">text-indent:</span><span class="w"> </span><span class="err">100%</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">white-space:</span><span class="w"> </span><span class="nf">nowrap</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">background:</span><span class="w"> </span><span class="c1">#21759B url(../img/cd-top-arrow.svg) no-repeat center 50%;</span>
<span class="w"> </span><span class="nl">visibility:</span><span class="w"> </span><span class="nf">hidden</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">opacity:</span><span class="w"> </span><span class="err">0</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">border-radius:</span><span class="w"> </span><span class="err">10</span><span class="nf">px</span><span class="c1">;</span>
<span class="w"> </span><span class="err">-</span><span class="nl">webkit-transition:</span><span class="w"> </span><span class="nf">opacity</span><span class="w"> </span><span class="no">.3s</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="p">,</span><span class="w"> </span><span class="no">visibility</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="w"> </span><span class="no">.3s</span><span class="c1">;</span>
<span class="w"> </span><span class="err">-</span><span class="nl">moz-transition:</span><span class="w"> </span><span class="nf">opacity</span><span class="w"> </span><span class="no">.3s</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="p">,</span><span class="w"> </span><span class="no">visibility</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="w"> </span><span class="no">.3s</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">transition:</span><span class="w"> </span><span class="nf">opacity</span><span class="w"> </span><span class="no">.3s</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="p">,</span><span class="w"> </span><span class="no">visibility</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="w"> </span><span class="no">.3s</span><span class="c1">;</span>
<span class="err">}</span><span class="w"></span>
<span class="na">.cd-top.cd-is-visible</span><span class="p">,</span><span class="w"> </span><span class="no">.cd-top.cd-fade-out</span><span class="p">,</span><span class="w"> </span><span class="no">.no-touch</span><span class="w"> </span><span class="no">.cd-top</span><span class="p">:</span><span class="no">hover</span><span class="w"> </span><span class="err">{</span><span class="w"></span>
<span class="w"> </span><span class="err">-</span><span class="nl">webkit-transition:</span><span class="w"> </span><span class="nf">opacity</span><span class="w"> </span><span class="no">.3s</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="p">,</span><span class="w"> </span><span class="no">visibility</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="c1">;</span>
<span class="w"> </span><span class="err">-</span><span class="nl">moz-transition:</span><span class="w"> </span><span class="nf">opacity</span><span class="w"> </span><span class="no">.3s</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="p">,</span><span class="w"> </span><span class="no">visibility</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">transition:</span><span class="w"> </span><span class="nf">opacity</span><span class="w"> </span><span class="no">.3s</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="p">,</span><span class="w"> </span><span class="no">visibility</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="w"> </span><span class="mi">0</span><span class="no">s</span><span class="c1">;</span>
<span class="err">}</span><span class="w"></span>
<span class="na">.cd-top.cd-is-visible</span><span class="w"> </span><span class="err">{</span><span class="w"></span>
<span class="w"> </span><span class="cm">/* the button becomes visible */</span><span class="w"></span>
<span class="w"> </span><span class="nl">visibility:</span><span class="w"> </span><span class="nf">visible</span><span class="c1">;</span>
<span class="w"> </span><span class="nl">opacity:</span><span class="w"> </span><span class="err">1</span><span class="c1">;</span>
<span class="err">}</span><span class="w"></span>
<span class="na">.cd-top.cd-fade-out</span><span class="w"> </span><span class="err">{</span><span class="w"></span>
<span class="w"> </span><span class="cm">/* if the user keeps scrolling down, the button is out of focus and becomes less visible */</span><span class="w"></span>
<span class="w"> </span><span class="nl">opacity:</span><span class="w"> </span><span class="nf">.5</span><span class="c1">;</span>
<span class="err">}</span><span class="w"></span>
<span class="na">.no-touch</span><span class="w"> </span><span class="no">.cd-top</span><span class="p">:</span><span class="no">hover</span><span class="w"> </span><span class="err">{</span><span class="w"></span>
<span class="nl">background-color:</span><span class="w"> </span><span class="c1">#f09c05;</span>
<span class="nl">opacity:</span><span class="w"> </span><span class="err">1</span><span class="c1">;</span>
<span class="err">}</span><span class="w"></span>
</code></pre></div>
<p>The code above will create a button that looks like this when activated:</p>
<figure><a href="http://share.mygeekdaddy.net/nav_button_back_to_top_2015-01-28.png"><img src="http://share.mygeekdaddy.net/nav_button_back_to_top_2015-01-28.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:76px;" /></img></a></figure>
<p>Change colors and other properties to match your site's style. You can download the arrow image file from here: <a href="http://share.mygeekdaddy.net/cd-top-arrow.svg">Arrow Image</a>.</p>
<h4>Reload site</h4>
<p>With all of the changes in place, you'll need to basically reload your entire site to pass along the changes you've made to all of your site's HTML files. This requires clearing (aka deleting) everything in your <code>output</code> folder. If you have your site setup to delete the entire <code>output</code> folder each time it's generated, you can skip this step.</p>
<ol>
<li>Open a terminal window and <code>ssh</code> into your server. </li>
<li>Navigate to your base folder for your website. A typical out of the box install of Pelican on a Linux box should have everything in the <code>/var/www</code> folder. Adjust accordingly to your setup.</li>
<li>Change directories to the <code>output</code> folder. <strong>Make sure you're in your <code>output</code> folder before proceeding.</strong></li>
<li>Did I mention to make sure you're in the <code>output</code> folder before proceeding. </li>
<li>Run <code>rm -rf *</code> in the <code>output</code> folder. </li>
<li>Move back to your root Pelican folder with <code>cd ..</code>.</li>
<li>Regenerate your site with <code>pelican content</code> or <code>sudo pelican content</code>, depending on your setup. </li>
</ol>
<p>Now re-open your site in your browser and scroll down a little bit on the page. On the right hand side you should see the button pop-up to take you back to the top.</p>Planning out your documentation2015-01-22T09:32:07-06:002015-01-22T09:32:07-06:00Jason Verlytag:mygeekdaddy.net,2015-01-22:/2015/01/22/planning-out-your-documentation/<p>Earlier this week I tweeted this:</p>
<blockquote class="twitter-tweet" lang="en"><p>If your design includes the logic of, ‘Well nobody would be dumb enough to do that’, you really need to rethink your design.</p>— Jason Verly (@mygeekdaddy) <a href="https://twitter.com/mygeekdaddy/status/558049725174546432">January 21, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Normally this would be a dig on someone else, but in this case I was …</p><p>Earlier this week I tweeted this:</p>
<blockquote class="twitter-tweet" lang="en"><p>If your design includes the logic of, ‘Well nobody would be dumb enough to do that’, you really need to rethink your design.</p>— Jason Verly (@mygeekdaddy) <a href="https://twitter.com/mygeekdaddy/status/558049725174546432">January 21, 2015</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Normally this would be a dig on someone else, but in this case I was actually digging on myself. I had just wrapped up a 2 hour session of going back and forth with a remote employee on how to use a new report in Maximo. The steps I gave I thought were quite clear:</p>
<ol>
<li>Log into Maximo and go to Inventory application.</li>
<li>Search for inventory items that need to be printed on labels - e.g. all items in a specific bin.</li>
<li>From the 'Select Action' menu, Click Run Reports and select the "Inventory Bin Labels" report.</li>
<li>Run the report and export results as a PDF. Leave all the other settings as is.</li>
<li>Save the PDF file to your desktop or preferred file folder.</li>
<li>Open the PDF file and print at 100% scale on label sheets. Do not print at 'Scale to Fit' or 'Fit to Page'.</li>
</ol>
<p>The problem was <em>I thought</em> the directions were clear. I was the one who created the workflow to run the report to print out the results, I was the one who troubleshooted the process for the step by step procedure, and I was the who sent out the documentation to other Maximo users. </p>
<blockquote>
<p>Since I was the one who did all the work, I was the only one who knew exactly how to print the report.</p>
</blockquote>
<p>Looking back I realized I didn't do this coworker any favors by rushing out an abbreviated step by step procedure. I took a step back and created another set of directions. This time I followed my standard practice for creating Maximo documentation:</p>
<ol>
<li>Outline the steps: From beginning to end, collect all the steps needed to do the task you want to document. Don't worry about the details, just make sure you got down everything. This includes some of the simpler steps like what module to go to and any steps you assumed a user would take.</li>
<li>Fill in the details: Now go back to the outline and fill in the details. This is where all the minor steps and potential 'gotchas' should be documented - what button do you need to push, what button should you <em>not</em> push, etc. Use screenshots to emphasize where/how a certain step is supposed to be taken.</li>
<li>Try it yourself: Go back a third time and do all the steps yourself... <strong>exactly as you wrote them</strong>. This is actually the hardest step because it forces you to turn off what you already know. Go step by step and see if you can repeat the process based on what is written down, not what you know. If you can't, go back to step #2 and re-document the process. Try again and again until you can get the desired results. </li>
</ol>
<p>After reviewing what I had originally sent out, versus my 2nd version, I realized that I had not cleanly explained how to export the report to a PDF. Most of my Maximo users have the option to print to PDF from an application. So in this case, the Maximo user used the browser's print function to print the web page the report generated to PDF. After sending the 2nd version of the step by step process the user had no issues getting the report to print new bin labels. </p>
<p></br></p>
<p>Brevity of how to do something has never made for better directions.</p>Breaking down a hardware hack2015-01-13T22:07:35-06:002015-01-13T22:07:35-06:00Jason Verlytag:mygeekdaddy.net,2015-01-13:/2015/01/13/breaking-down-a-hardware-hack/<p>Any geek worth their salt dreams of hacking together some components and making their own spy gear. We've done it since we were 10 and we're still doing it now. However, Samy Kamkar (<a href="https://twitter.com/samykamkar">@samykamkar</a>) has done exactly that. </p>
<blockquote>
<p>KeySweeper is a stealthy Arduino-based device, camouflaged as a functioning USB wall …</p></blockquote><p>Any geek worth their salt dreams of hacking together some components and making their own spy gear. We've done it since we were 10 and we're still doing it now. However, Samy Kamkar (<a href="https://twitter.com/samykamkar">@samykamkar</a>) has done exactly that. </p>
<blockquote>
<p>KeySweeper is a stealthy Arduino-based device, camouflaged as a functioning USB wall charger, that wirelessly and passively sniffs, decrypts, logs and reports back (over GSM) all keystrokes from any Microsoft wireless keyboard in the vicinity.</p>
</blockquote>
<p>Samy gives a great background on the project and then a step by step narrative on how he setup a simple Arduino to sniff a wireless keyboard. Putting aside the debate on right vs wrong, Samy's breakdown of the project should be a template for how any hardware hacking project should be described. Samy gives the steps, the logic and the background information on how he made nearly every step. Even if you don't decide to build one yourself (and why wouldn't you), going through Samy's steps and methodology on the project is worth the read. </p>
<p>Project details: <a href="http://samy.pl/keysweeper">KeySweeper</a></p>
<p>Project Source Code: <a href="https://github.com/samyk/keysweeper">KeySweeper (GitHub)</a></p>The right time to lose a character2015-01-12T15:40:02-06:002015-01-12T15:40:02-06:00Jason Verlytag:mygeekdaddy.net,2015-01-12:/2015/01/12/the-right-time-to-lose-a-character/<p>You never want to read the byline of an article that includes your favorite comic book character and how its writers are planning to kill them off. Unfortunately, this is what I found over the weekend:</p>
<blockquote>
<p>EXCLUSIVE: GERRY DUGGAN AND JORDAN D. WHITE ON THE DEATH OF DEADPOOL IN MARVEL …</p></blockquote><p>You never want to read the byline of an article that includes your favorite comic book character and how its writers are planning to kill them off. Unfortunately, this is what I found over the weekend:</p>
<blockquote>
<p>EXCLUSIVE: GERRY DUGGAN AND JORDAN D. WHITE ON THE DEATH OF DEADPOOL IN MARVEL’S DEADPOOL #250 (A.K.A. #45)</p>
</blockquote>
<figure><a href="http://share.mygeekdaddy.me/IMG_0377.JPG"><img src="http://share.mygeekdaddy.me/IMG_0377.JPG" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:200px;" /></img></a></figure>
<p style="font-size:10px">Image credit: <a href="http://www.comicvine.com/forums/battles-7/deadpool-typhoid-mary-vs-wolverine-1631653/">comicvine.com</a></p>
<p>I found the story over the weekend on <a href="http://www.nerdist.com/2015/01/exclusive-gerry-duggan-jordan-d-white-death-of-deadpool-marvel-comics-deadpool-250-aka-45/">Nerdist.com</a>. It was an interview with the current writers of one of my favorite comics, Deadpool. The summary of the story is:</p>
<blockquote>
<p>FINAL ISSUE!
That’s right—if you add together all the Deadpool series (creatively) issue 45 is the big 250th issue of Deadpool! What better way to celebrate than to end the series? In our over-sized main story, ULTIMATUM comes at Deadpool for revenge, so he has no choice but to take them on—ALL OF THEM. Then, in an Infinity Gauntlet crossover, what would Deadpool do if he got the six gems from Thanos? Plus: a slew of stories showcasing Deadpool’s closest friends and allies by special guest writers! Also, SPOILER: Deadpool dies at the end of the issue.</p>
</blockquote>
<p>I know comic book writers need to kill off characters every once in a while to refresh a character's storyline. We've seen untimely demise of some of the biggest names in comic books - <a href="http://dc.wikia.com/wiki/Many_Deaths_of_the_Batman">Batman</a>, <a href="http://www.dccomics.com/graphic-novels/superman-the-death-of-superman">Superman</a>, <a href="http://marvel.com/universe/Hawkeye_%28Clint_Barton%29">Hawkeye</a> and others have been killed off. Captain American has been <a href="http://en.m.wikipedia.org/wiki/The_Death_of_Captain_America">killed off</a>, <a href="http://en.m.wikipedia.org/wiki/Captain_America:_Reborn">returned</a>, and has now <a href="http://marvel.com/news/comics/22895/its_time_for_an_all-new_captain_america">lost his super solider powers</a>. </p>
<p>Marvel recently killed off <a href="http://marvel.com/comics/series/19073/death_of_wolverine_2014">Wolverine</a>, another character I care about. My problem isn't that Marvel is killing off Wolverine or Deadpool (ok, I have a small problem with Deadpool), but it's that killing off a character is starting to feel like a playlist that's been on repeat too long. The plot is:</p>
<ul>
<li>The character has a cliffhanger of a storyline.</li>
<li>The character anticipates their death.</li>
<li>The character accepts their fate.</li>
<li>The character dies, but the character is never really dead. </li>
<li>Rinse, lather, repeat.</li>
</ul>
<blockquote>
<p>After the upteenth time a character dies and comes back again, the plot line wears a little thin. </p>
</blockquote>
<p>What I'd rather see is a mini <a href="http://marvel.wikia.com/Glossary:Reboot">"reboot"</a> of a character's universe. <a href="http://comicsalliance.com/dc-comics-reboot-history/">DC</a>, and to a <a href="http://en.m.wikipedia.org/wiki/Marvel_NOW!">lesser extent Marvel</a>, have rebooted their comic universes to give writers the opportunity to refine, or redefine, story lines of their comic universe. We've seen this to a some degree in Marvel's Cinematic Universe (<a href="http://marvel.wikia.com/Earth-199999">MCU</a>) and how it differs from the Marvel comic universe. We have the same characters in the movies and in the comics, but allowing them to be in separate universes allows characters to have different origin or backstories. The cycle of loss and rebirth is core to comic book mythos. Part of rising up from an overwhelming tragedy is part of what makes them heroes to us. Let's just make the return of a character less of a cliche. </p>
<p>Rebooting a character, instead of killing them off and having them come back, still allows readers to understand that this is something different. The readers don't have to go through the hollow feeling of seeing their character get killed off, only to be thinking in the back of their mind of how they will have to wait a couple of months before the character has a miraculous come back. I believe rebooting a character gives writers the opportunity to do something extraordinary with 'Issue #1'.</p>
<p>I'll miss Deadpool... probably only for a little while.</p>Never change your Pelican footer again2015-01-09T22:22:08-06:002015-01-09T22:22:08-06:00Jason Verlytag:mygeekdaddy.net,2015-01-09:/2015/01/09/never-change-your-pelican-footer-again/<p>One of the less glamorous tasks of hosting a blog is keeping all the small details up to date. One of those details is the copyright date on the site. Here's an easy way to never have to worry about this again. Pelican themes have a core set of files …</p><p>One of the less glamorous tasks of hosting a blog is keeping all the small details up to date. One of those details is the copyright date on the site. Here's an easy way to never have to worry about this again. Pelican themes have a core set of files to generate a website. One of them is the <code>base.html</code> theme file. Check your Pelican theme and see if the <code>base.html</code> file includes a reference to a footer theme file, like <code>footer.html</code>. If it does, skip the next step and move on. </p>
<h4>Add Footer.html reference</h4>
<p>Because your <code>base.html</code> file does not reference a footer theme file, or have any details related to a copyright date at the bottom, you'll need to add some code between the last <code></div</code> tag and just before the <code></body</code> tag to get your footer to show up. You'll need to add the following snippet:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><footer</span> <span class="na">role=</span><span class="s">"contentinfo"</span><span class="nt">></span>{% include 'footer.html' %}<span class="nt"></footer></span>
</code></pre></div>
<p>The end of the <code>base.html</code> theme file should now look similar to this:<sup id="fnref:d23radfadfa"><a class="footnote-ref" href="#fn:d23radfadfa">1</a></sup></p>
<div class="highlight"><pre><span></span><code>...
<span class="nt"><div</span> <span class="na">id=</span><span class="s">"main"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">id=</span><span class="s">"content"</span><span class="nt">></span>
<span class="cp">{%</span> <span class="k">block</span> <span class="nv">content</span> <span class="cp">%}{%</span> <span class="k">endblock</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">include</span> <span class="s1">'_includes/sidebar.html'</span> <span class="cp">%}</span>
<span class="nt"></div></span>
<span class="nt"></div></span>
<span class="nt"><footer</span> <span class="na">role=</span><span class="s">"contentinfo"</span><span class="nt">></span><span class="cp">{%</span> <span class="k">include</span> <span class="s1">'footer.html'</span> <span class="cp">%}</span><span class="nt"></footer></span>
<span class="nt"></body></span>
<span class="nt"></html></span>
</code></pre></div>
<p>So now the next time your regenerate the content on your site, the <code>base.html</code> theme file will call on the <code>footer.html</code> theme file we'll create in the next step. </p>
<h4>Create/Edit Footer.html</h4>
<p>The next step is also dependent on the Pelican theme you have installed. Some themes have the <code>footer.html</code> file in the main <em>theme</em> folder, others have it one level down in another folder, like <em>_includes</em>. Locate the <code>footer.html</code> file and open it with your favorite text editor - e.g. nano. </p>
<p>Most Pelican themes that use a <code>footer.html</code> theme file use the date of the most recent post to set up the copyright date range. My theme originally used the following: </p>
<div class="highlight"><pre><span></span><code><span class="nt"><p></span>
<span class="cp">{%</span> <span class="k">if</span> <span class="nv">LICENSE</span> <span class="cp">%}</span>
<span class="cp">{{</span> <span class="nv">LICENSE</span> <span class="cp">}}</span>
<span class="cp">{%</span> <span class="k">else</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">set</span> <span class="nv">years</span> <span class="o">=</span> <span class="nv">dates</span><span class="o">|</span><span class="nf">groupby</span><span class="o">(</span><span class="s1">'date.year'</span><span class="o">)|</span><span class="nf">sort</span><span class="o">(</span><span class="nv">reverse</span><span class="o">=</span><span class="kp">False</span><span class="o">)</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">set</span> <span class="nv">sinceYear</span> <span class="o">=</span> <span class="nv">years</span><span class="o">|</span><span class="nf">first</span><span class="o">|</span><span class="nf">first</span><span class="o">|</span><span class="nf">default</span><span class="o">(</span><span class="s1">'2014'</span><span class="o">)</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">set</span> <span class="nv">toYear</span> <span class="o">=</span> <span class="nv">years</span><span class="o">|</span><span class="nf">last</span><span class="o">|</span><span class="nf">first</span><span class="o">|</span><span class="nf">default</span><span class="o">(</span><span class="s1">'2014'</span><span class="o">)</span> <span class="cp">%}</span>
Copyright <span class="ni">&copy;</span> <span class="cp">{%</span> <span class="k">if</span> <span class="nv">sinceYear</span> <span class="o">==</span> <span class="nv">toYear</span> <span class="cp">%}</span> <span class="cp">{{</span> <span class="nv">sinceYear</span> <span class="cp">}}</span>
<span class="cp">{%</span> <span class="k">else</span> <span class="cp">%}</span>
<span class="cp">{{</span> <span class="nv">sinceYear</span> <span class="cp">}}</span>-<span class="cp">{{</span> <span class="nv">toYear</span> <span class="cp">}}</span> <span class="cp">{%</span> <span class="k">endif</span><span class="cp">%}</span> - <span class="cp">{{</span> <span class="nv">AUTHOR</span> <span class="cp">}}</span> -
<span class="cp">{%</span> <span class="k">endif</span> <span class="cp">%}</span>
<span class="nt"><span</span> <span class="na">class=</span><span class="s">"credit"</span><span class="nt">></span>Powered by <span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://getpelican.com"</span><span class="nt">></span>Pelican
<span class="nt"></a></span></span>
<span class="nt"></p></span>
</code></pre></div>
<p>Using a little Javascript we can have the footer be up to date at the stroke of midnight on Jan 1. Change the <code>footer.html</code>template to something like this:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><p</span> <span class="na">class =</span> <span class="s">"credit"</span><span class="nt">></span>Copyright <span class="err">&</span>copy 1999 - <span class="nt"><script</span> <span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">></span>
document.write(new Date().getFullYear()); <span class="nt"></script></span>
John Smith | Powered by <span class="nt"><a</span> <span class="na">href=</span><span class="s">"http://getpelican.com"</span><span class="nt">></span>Pelican<span class="nt"></a></span></span>
<span class="nt"></p></span>
</code></pre></div>
<p>If your theme doesn't have a <code>footer.html</code> file, create one on the root of your theme folder by copying and pasting the snippet from above into the new file. Save the file and refresh the content on your site - <code>pelican content</code>. </p>
<p>Now when someone views your site the footer will show the correct copyright year. </p>
<figure><a href="http://share.mygeekdaddy.me/From%20Skitch.png"><img src="http://share.mygeekdaddy.me/From%20Skitch.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<div class="footnote">
<hr>
<ol>
<li id="fn:d23radfadfa">
<p>YMMV based on your theme, so may need to experiment with the syntax based on your Pelican theme. <a class="footnote-backref" href="#fnref:d23radfadfa" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Using 'rank over partition' in BIRT reports2015-01-08T13:24:12-06:002015-01-08T13:24:12-06:00Jason Verlytag:mygeekdaddy.net,2015-01-08:/2015/01/08/using-rank-over-partition-in-birt-reports/<p>One of the common reporting requests I get is provide a list of the most recent set of records out a series of updates or changes. For example, provide a list of all inventory items that have been added/changed in the previous month or all work orders that were …</p><p>One of the common reporting requests I get is provide a list of the most recent set of records out a series of updates or changes. For example, provide a list of all inventory items that have been added/changed in the previous month or all work orders that were set to the COMP status last week. The trouble with these types of requests is that they don't allow a report writer to rely on the current status of the record, they need to see what may have been a historical status. In the example of inventory records, monitoring the INVENTORY. CHANGEDATE will only show the last date the item was changed. The historical status change date (INVSTATUS.CHANGEDATE) is saved separate from the main inventory records. I can use this field to segregate records that have been created or altered in the previous month without relying on the current CHANGEDATE value. </p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">status</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"></span>
<span class="nv">from</span><span class="w"> </span><span class="nv">inventory</span><span class="w"> </span>
<span class="nv">join</span><span class="w"> </span><span class="nv">invstatus</span><span class="w"> </span><span class="nv">on</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemnum</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemnum</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">location</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">location</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">siteid</span><span class="w"> </span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">siteid</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemsetid</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemsetid</span><span class="w"></span>
<span class="nv">where</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
<span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span><span class="w"></span>
</code></pre></div>
<p>Query results: <sup id="fnref:adfa3q23faef"><a class="footnote-ref" href="#fn:adfa3q23faef">1</a></sup></p>
<table>
<thead>
<tr>
<th style="text-align: center;">Item Num</th>
<th style="text-align: center;">Status</th>
<th style="text-align: center;">Change Date</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">9716</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:48:30.05</td>
</tr>
<tr>
<td style="text-align: center;">11182</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:35:49.803</td>
</tr>
<tr>
<td style="text-align: center;">11183</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:35:49.983</td>
</tr>
<tr>
<td style="text-align: center;">11183</td>
<td style="text-align: center;">NONSTOCK</td>
<td style="text-align: center;">2015-01-06 16:12:12.91</td>
</tr>
<tr>
<td style="text-align: center;">11185</td>
<td style="text-align: center;">OBSOLETE</td>
<td style="text-align: center;">2015-01-03 19:31:50.003</td>
</tr>
<tr>
<td style="text-align: center;">11186</td>
<td style="text-align: center;">ACTIVE</td>
<td style="text-align: center;">2015-01-04 8:23:12.017</td>
</tr>
</tbody>
</table>
<p>I got the results I wanted, but item 11183 happens to have had two status changes. I only want the most recent change of the two, so I'll have to add some filter function to get only the last status change. A common methods is to use a rank() function like this: <code>rank() over (partition field1 order by field2)</code>. </p>
<p>So I updated the SQL selection statement:<sup id="fnref:243rq4qrefa"><a class="footnote-ref" href="#fn:243rq4qrefa">2</a></sup></p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">status</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span>,<span class="w"> </span>
<span class="nv">rank</span><span class="ss">()</span><span class="w"> </span><span class="nv">over</span><span class="w"> </span><span class="ss">(</span><span class="nv">partition</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">inventory</span>.<span class="nv">siteid</span><span class="w"> </span><span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="nv">desc</span><span class="ss">)</span><span class="w"> </span><span class="nv">as</span><span class="w"> </span><span class="nv">rank</span><span class="w"></span>
<span class="nv">from</span><span class="w"> </span><span class="nv">inventory</span><span class="w"> </span>
<span class="nv">join</span><span class="w"> </span><span class="nv">invstatus</span><span class="w"> </span><span class="nv">on</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemnum</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemnum</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">location</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">location</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">siteid</span><span class="w"> </span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">siteid</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemsetid</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemsetid</span><span class="w"></span>
<span class="nv">where</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
<span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span><span class="w"></span>
</code></pre></div>
<p>Query results:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Item Num</th>
<th style="text-align: center;">Status</th>
<th style="text-align: center;">Change Date</th>
<th style="text-align: center;">Rank</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">9716</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:48:30.05</td>
<td style="text-align: center;">1</td>
</tr>
<tr>
<td style="text-align: center;">11182</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:35:49.803</td>
<td style="text-align: center;">1</td>
</tr>
<tr>
<td style="text-align: center;">11183</td>
<td style="text-align: center;">NONSTOCK</td>
<td style="text-align: center;">2015-01-06 16:12:12.91</td>
<td style="text-align: center;">1</td>
</tr>
<tr>
<td style="text-align: center;">11183</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:35:49.983</td>
<td style="text-align: center;">2</td>
</tr>
<tr>
<td style="text-align: center;">11185</td>
<td style="text-align: center;">OBSOLETE</td>
<td style="text-align: center;">2015-01-03 19:31:50.003</td>
<td style="text-align: center;">1</td>
</tr>
<tr>
<td style="text-align: center;">11186</td>
<td style="text-align: center;">ACTIVE</td>
<td style="text-align: center;">2015-01-04 8:23:12.017</td>
<td style="text-align: center;">1</td>
</tr>
</tbody>
</table>
<p>So now that I've got the <em>rank</em> value, I should be able to update the SQL selection statement to filter out only results where <code>rank = 1</code>. </p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">status</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span>,<span class="w"> </span>
<span class="nv">rank</span><span class="ss">()</span><span class="w"> </span><span class="nv">over</span><span class="w"> </span><span class="ss">(</span><span class="nv">partition</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">inventory</span>.<span class="nv">siteid</span><span class="w"> </span><span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="nv">desc</span><span class="ss">)</span><span class="w"> </span><span class="nv">as</span><span class="w"> </span><span class="nv">rank</span><span class="w"></span>
<span class="nv">from</span><span class="w"> </span><span class="nv">inventory</span><span class="w"> </span>
<span class="nv">join</span><span class="w"> </span><span class="nv">invstatus</span><span class="w"> </span><span class="nv">on</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemnum</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemnum</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">location</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">location</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">siteid</span><span class="w"> </span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">siteid</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemsetid</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemsetid</span><span class="w"></span>
<span class="nv">where</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
<span class="nv">and</span><span class="w"> </span><span class="nv">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
<span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">siteid</span>,<span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span><span class="w"></span>
</code></pre></div>
<p>Run the SQL statement and you'll get an error in your SQL tool similar to this: <code>Invalid column name 'rank'</code>. The problem is the <em>rank</em> value isn't being read from the database, it's being generated as the SQL statement is processed, so it can't be used to filter out the results. If you remove the where clause statement <code>and rank = 1</code> the SQL statement works again, but it goes back to showing all records that had the status changed this month. </p>
<h4>Breaking down the rank() function</h4>
<p>The <code>rank() over (partition field1 order by field2</code> function works by adding a field to a select statement and generating a value based on how the partition order was set up. In the example above, I used the following setup:</p>
<div class="highlight"><pre><span></span><code>rank() over (partition by inventory.itemnum, inventory.siteid order by invstatus.changedate desc) as rank
</code></pre></div>
<p>Breaking down each piece of the function and what it does:</p>
<ul>
<li><code>rank() over</code>: This is how you call the function to initiate SQL server to start ranking the returned records.</li>
<li><code>(partition by inventory.itemnum, inventory.siteid</code>: This tells SQL server how the ranking should be broken up. In this case we stated an individual rank should be applied when the returned record has the same inventory.itemnum and inventory.siteid. If it was applied to only inventory.itemnum, you would get the ranking applied to an item used in multiple sites. </li>
<li><code>order by invstatus.changedate decs</code>: This tells how the ranking should be ordered. In this case we wanted the ranking based on the descending order of the invstatus.changedate field. This is why the most recent change will be ranked 1 and older status changes will be ranked lower. </li>
<li><code>as rank</code>: The rank() function itself doesn't have a column/field description, like inventory.itemnum. To reference the values obtained by the rank() function we use the <code>as rank</code> statement at the end to trick SQL server into giving the rank values a column name. This is how we later used the statement <code>rank = 1</code> to filter out results. </li>
</ul>
<blockquote>
<p>So how can we use the rank() function in the where clause?</p>
</blockquote>
<p>The trick is to basically run the selection twice. The first selection will get the records and applies the rank() function. The second selection will apply any filtering on the original results, like <code>rank = 1</code>. </p>
<h4>Double Select Method</h4>
<p>The first method is basically what I described before, run the selection twice and filter on the 2nd set of results. In this case we setup the original selection and then a second selection around it to filter on the rank() function results. We do this by encasing the original selection statement inside another select statement.</p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">status</span>,<span class="w"> </span><span class="nv">changedate</span><span class="w"> </span><span class="nv">from</span><span class="w"> </span><span class="ss">(</span><span class="w"></span>
<span class="nv">select</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">status</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span>,<span class="w"> </span>
<span class="nv">rank</span><span class="ss">()</span><span class="w"> </span><span class="nv">over</span><span class="w"> </span><span class="ss">(</span><span class="nv">partition</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">inventory</span>.<span class="nv">siteid</span><span class="w"> </span><span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="nv">desc</span><span class="ss">)</span><span class="w"> </span><span class="nv">as</span><span class="w"> </span><span class="nv">rank</span><span class="w"></span>
<span class="nv">from</span><span class="w"> </span><span class="nv">inventory</span><span class="w"> </span>
<span class="nv">join</span><span class="w"> </span><span class="nv">invstatus</span><span class="w"> </span><span class="nv">on</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemnum</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemnum</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">location</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">location</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span>
<span class="nv">invstatus</span>.<span class="nv">siteid</span><span class="w"> </span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">siteid</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemsetid</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemsetid</span><span class="w"></span>
<span class="nv">where</span><span class="w"> </span><span class="nv">INVSTATUS</span>.<span class="nv">CHANGEDATE</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">INVSTATUS</span>.<span class="nv">CHANGEDATE</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
<span class="ss">)</span><span class="w"> </span><span class="nv">a</span><span class="w"> </span>
<span class="nv">where</span><span class="w"> </span><span class="nv">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
<span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">itemnum</span><span class="w"></span>
</code></pre></div>
<p>Query results:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Item Num</th>
<th style="text-align: center;">Status</th>
<th style="text-align: center;">Change Date</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">9716</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:48:30.05</td>
</tr>
<tr>
<td style="text-align: center;">11182</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:35:49.803</td>
</tr>
<tr>
<td style="text-align: center;">11183</td>
<td style="text-align: center;">NONSTOCK</td>
<td style="text-align: center;">2015-01-06 16:12:12.91</td>
</tr>
<tr>
<td style="text-align: center;">11185</td>
<td style="text-align: center;">OBSOLETE</td>
<td style="text-align: center;">2015-01-03 19:31:50.003</td>
</tr>
<tr>
<td style="text-align: center;">11186</td>
<td style="text-align: center;">ACTIVE</td>
<td style="text-align: center;">2015-01-04 8:23:12.017</td>
</tr>
</tbody>
</table>
<p>Exactly what we wanted. </p>
<h4>With Statement Method</h4>
<p>The other method is to use a <a href="http://msdn.microsoft.com/en-us/library/ms175972.aspx">WITH AS</a> select statement. The idea is similar to the first method in that the selection is set aside and tagged as its own pseudo table. Then a second selection is made from the pseudo table, including the filter statement <code>rank = 1</code>.</p>
<div class="highlight"><pre><span></span><code><span class="nv">with</span><span class="w"> </span><span class="nv">invdetail</span><span class="w"> </span><span class="nv">as</span><span class="w"> </span><span class="ss">(</span><span class="w"></span>
<span class="nv">select</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">status</span>,<span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span>,<span class="w"> </span>
<span class="nv">rank</span><span class="ss">()</span><span class="w"> </span><span class="nv">over</span><span class="w"> </span><span class="ss">(</span><span class="nv">partition</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">inventory</span>.<span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">inventory</span>.<span class="nv">siteid</span><span class="w"> </span><span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">changedate</span><span class="w"> </span><span class="nv">desc</span><span class="ss">)</span><span class="w"> </span><span class="nv">as</span><span class="w"> </span><span class="nv">rank</span><span class="w"></span>
<span class="nv">from</span><span class="w"> </span><span class="nv">inventory</span><span class="w"> </span>
<span class="nv">join</span><span class="w"> </span><span class="nv">invstatus</span><span class="w"> </span><span class="nv">on</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemnum</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemnum</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">location</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">location</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">siteid</span><span class="w"> </span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">siteid</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">invstatus</span>.<span class="nv">itemsetid</span><span class="o">=</span><span class="nv">inventory</span>.<span class="nv">itemsetid</span><span class="w"></span>
<span class="nv">where</span><span class="w"> </span><span class="nv">INVSTATUS</span>.<span class="nv">CHANGEDATE</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">INVSTATUS</span>.<span class="nv">CHANGEDATE</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span>
<span class="ss">)</span><span class="w"> </span>
<span class="nv">select</span><span class="w"> </span><span class="nv">itemnum</span>,<span class="w"> </span><span class="nv">status</span>,<span class="w"> </span><span class="nv">changedate</span><span class="w"></span>
<span class="nv">from</span><span class="w"> </span><span class="nv">invdetail</span><span class="w"></span>
<span class="nv">where</span><span class="w"> </span><span class="nv">rank</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
<span class="nv">order</span><span class="w"> </span><span class="nv">by</span><span class="w"> </span><span class="nv">itemnum</span><span class="w"></span>
</code></pre></div>
<p>Query results:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">Item Num</th>
<th style="text-align: center;">Status</th>
<th style="text-align: center;">Change Date</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">9716</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:48:30.05</td>
</tr>
<tr>
<td style="text-align: center;">11182</td>
<td style="text-align: center;">PENDOBS</td>
<td style="text-align: center;">2015-01-02 11:35:49.803</td>
</tr>
<tr>
<td style="text-align: center;">11183</td>
<td style="text-align: center;">NONSTOCK</td>
<td style="text-align: center;">2015-01-06 16:12:12.91</td>
</tr>
<tr>
<td style="text-align: center;">11185</td>
<td style="text-align: center;">OBSOLETE</td>
<td style="text-align: center;">2015-01-03 19:31:50.003</td>
</tr>
<tr>
<td style="text-align: center;">11186</td>
<td style="text-align: center;">ACTIVE</td>
<td style="text-align: center;">2015-01-04 8:23:12.017</td>
</tr>
</tbody>
</table>
<p>Again, the SQL statement gives the results we wanted. </p>
<h4>Wrapping it up in BIRT</h4>
<p>Now that we got the results we wanted, we place the same SQL statement into BIRT to give a report to show all of the inventory items that have had a status change:</p>
<figure><a href="http://share.mygeekdaddy.net/rank_over_part_birt_2015-01-08.png"><img src="http://share.mygeekdaddy.net/rank_over_part_birt_2015-01-08.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This report will give us just the results where <code>rank = 1</code> and the status was changed in the selected reporting period. No additional filter or settings are needed in the report itself. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:adfa3q23faef">
<p>The query actually runs on the current month, but I didn't have any data that demonstrated the duplicate issue from Dec 2014. <a class="footnote-backref" href="#fnref:adfa3q23faef" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:243rq4qrefa">
<p>The <code>rank</code> function included two <code>order by</code> functions so items will be listed by SITEID first and by ITEMNUM second. <a class="footnote-backref" href="#fnref:243rq4qrefa" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Options to move beyond Apple2015-01-06T20:57:37-06:002015-01-06T20:57:37-06:00Jason Verlytag:mygeekdaddy.net,2015-01-06:/2015/01/06/options-to-move-beyond-apple/<p>One of my intentions for 2015 is that since it's a new year, it's time to have a new attitude.<sup id="fnref:237724"><a class="footnote-ref" href="#fn:237724">1</a></sup> Over the weekend <a href="http://www.marco.org/2015/01/04/apple-lost-functional-high-ground">Marco Arment reiterated</a> some of the <a href="http://mygeekdaddy.net/2014/12/27/losing-faith-in-apples-ecosystem/">same thoughts I've had</a> on Apple's decline in product quality. There have been <a href="http://www.macstories.net/stories/balance/">counter points</a> and <a href="http://bitsplitting.org/2015/01/05/the-functional-high-ground/">affirmations</a> to the concerns …</p><p>One of my intentions for 2015 is that since it's a new year, it's time to have a new attitude.<sup id="fnref:237724"><a class="footnote-ref" href="#fn:237724">1</a></sup> Over the weekend <a href="http://www.marco.org/2015/01/04/apple-lost-functional-high-ground">Marco Arment reiterated</a> some of the <a href="http://mygeekdaddy.net/2014/12/27/losing-faith-in-apples-ecosystem/">same thoughts I've had</a> on Apple's decline in product quality. There have been <a href="http://www.macstories.net/stories/balance/">counter points</a> and <a href="http://bitsplitting.org/2015/01/05/the-functional-high-ground/">affirmations</a> to the concerns raised on Apple's recent quality standards. While I didn't intend to be part of a trend of bashing Apple, it appears I'm not the only one concerned with Apple's direction. </p>
<p>One of the themes I've seen with all of the concerns on Apple's product quality is that this is starting to go beyond media pundits and click bait sites. Some of the people voicing their concerns are power users with a long standing stature in the Apple community. So while this lends some support on my growing concerns of how well Apple has delivered lately. </p>
<blockquote>
<p>What I haven't seen is anyone offering any ideas to move beyond Apple. </p>
</blockquote>
<p>I believe there are solid options to Apple's ecosystem. Here is a run down on some ideas I have for moving on from Apple.</p>
<h4>Better AppleTV</h4>
<p>The Apple TV has been the primary way I've watched movies or listened to music. Earlier models were big enough to mirror my entire music collection and use as one of my backup points for my iTunes collection. Current models only stream from either Apple's iTunes Store or a local media cache. Streaming media is something I don't want to give up just because Apple can't decide if the Apple TV is a 'hobby' or a business line. </p>
<p>I've been testing out a couple of options to move from an Apple TV to a new streaming device.</p>
<ul>
<li>Raspberry Pi Kodi: <a href="http://kodi.tv">Kodi</a> is the next generation of XBMC media player. While Kodi can be installed on most computer systems, using the Raspberry Pi is a project I've been personally working on. You can mount your media collection to the RPi and then play/stream your media through its native HDMI port. </li>
<li>Roku Player: The <a href="https://www.roku.com/">Roku</a> is similar to the Apple TV in that it streams your media to your TV or receiver. The Roku needs the content to be hosted by a some service (like <a href="https://plex.tv/">Plex</a>) before it can stream your media to your TV or receiver. The upside to the Roku over everything else I've tested is the headphone jack on the remote. Absolute genius.</li>
<li>Chromecast: Similar to the Roku, <a href="http://www.google.com/chrome/devices/chromecast/">Chromecast</a> can take hosted media and show it on your TV. This has been a little less polished than Kodi and the Roku because you generally have to use your phone or tablet as the remote. Quite a few iOS apps have Chromecast streaming built-in, which treats the Chromecast as an alternative AirPlay system. Google's <a href="http://www.theverge.com/2015/1/5/7482719/google-cast-audio-streaming-speakers-availability-ces-2015">announcement for Google Cast</a> at CES may make the Chromecast a bigger player in 2015.</li>
<li>Amazon Fire TV: The <a href="http://www.amazon.com/dp/B00GDQ0RMG?tag=googhydr-20&hvadid=50322748923&hvpos=1t1&hvexid=&hvnetw=g&hvrand=17517607916953944988&hvpone=&hvptwo=&hvqmt=e&hvdev=t&ref=pd_sl_8shcav8shv_e">Amazon Fire TV</a> can come as a box, like the Apple TV or Roku, or as a stick, like the Chromecast. I haven't tested one of these devices myself, but from the research I've done it should work similarly to the Chromecast or Roku. </li>
</ul>
<h4>Better Time Machine</h4>
<p>Apple has had a method to back up your Mac and media for some time with their Time Machine unit. While the concept of a Time Machine is great, I've started to feel less safe relying on a Time Machine back up due to recent problems I've had restoring files off of a TM backup. But a recent tweet by <a href="https://twitter.com/modernscientist">@modernscientist</a> is exactly what the doctor has ordered for the new year. (Rimshot) </p>
<blockquote>
<p>New Year's organization: rolled my own version of Time Machine (rsnapshot-based) for backing up to NAS drive. Tired of TM flakiness. <br>
— themodernscientist (@modernscientist) <a href="https://twitter.com/modernscientist/status/551835758580203520">January 4, 2015</a></p>
</blockquote>
<p>Between her tweet and her recent post, <a href="http://themodernscientist.com/posts/2015/2015-01-04-secure_password_use_in_scripts/">Secure Password Use in Scripts</a>, these give a little insight on how she's used <a href="http://www.rsnapshot.org">rsnapshot</a> to roll her own Time Machine. Getting started with <a href="https://rayed.com/wordpress/?p=1693">rsnapshot is pretty straight</a> forward with Homebrew:</p>
<div class="highlight"><pre><span></span><code>$ brew install rsnapshot
</code></pre></div>
<p>Now with a simple NAS, or a drive attached to another computer, you can set up a script to use rsnapshot to automatically back up your stuff. I am looking forward to seeing what @modernscientist has up her sleeves in her follow up post. </p>
<h4>Better OS X</h4>
<p>Ok, not necessarily a better OS X, but a different OS X. OS X at its heart is a Unix variant. I got started using Linux back in the late 90's with Red Hat Linux.<sup id="fnref:2443434"><a class="footnote-ref" href="#fn:2443434">2</a></sup> My website is now hosted on a Linux box and so I've had the chance to go back and revisit an old friend. Lately I've been using <a href="http://www.ubuntu.com/">Ubuntu</a> in Parallels as a test web hosting environment. Over the holidays I used Ubuntu as my primary OS to see how things would work for me if I ever made the switch full time. While this was just a test, the one step that made using Ubuntu extremely easy was setting up Dropbox. Once I had Dropbox setup, the idea of migrating to different tools in Ubuntu didn't seem so bad.</p>
<h4>Better iOS</h4>
<p>Ok, you got me. I don't have an alternative to iOS that I'm willing to switch to. The only alternative I'd seriously look at would be Android. I've played with Android a little bit, but I haven't used it long enough to say I'd be happy with it as my daily mobile OS. I asked a few people about some apps I use regularly on iOS and if they found an equivalent in Android. I batted about 0.428 on finding an equivalent iOS app on Android. </p>
<p></br></p>
<p>If Apple can't give us devices 'that just work', we should look at ways to develop our own ecosystem to get our work done and enjoy our time off. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:237724">
<p>Gotta love cheesy. <a class="footnote-backref" href="#fnref:237724" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2443434">
<p>When true geeks rolled their own kernels. <a class="footnote-backref" href="#fnref:2443434" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Letting someone else fail first2015-01-05T13:47:42-06:002015-01-05T13:47:42-06:00Jason Verlytag:mygeekdaddy.net,2015-01-05:/2015/01/05/letting-someone-else-fail-first/<p>I've been trying to expand my Python skills and recently ran into a problem with mixing string and Unicode text together. After some searching I found my answers from <a href="https://github.com/duilio">Maurizio Sambati</a>, creating of the <a href="https://github.com/duilio/pelican-octopress-theme">Octopress Pelican theme</a>. </p>
<blockquote>
<p>In order to help beginners avoid a few of them and understand most …</p></blockquote><p>I've been trying to expand my Python skills and recently ran into a problem with mixing string and Unicode text together. After some searching I found my answers from <a href="https://github.com/duilio">Maurizio Sambati</a>, creating of the <a href="https://github.com/duilio/pelican-octopress-theme">Octopress Pelican theme</a>. </p>
<blockquote>
<p>In order to help beginners avoid a few of them and understand most of them, I've decided to focus this post on the common pitfalls you can hit with Python 2.x and Unicode. Python 3.x handles Unicode in a very different way, it has its own issues but are usually different that the ones you'll fight against on Python 2.x.</p>
</blockquote>
<p><a href="http://blogs.skicelab.com/maurizio/unicode-common-pitfalls.html">Unicode in Python: Common Pitfalls</a></p>Raspberry Pi SD Card Setup in OS X2015-01-03T13:18:01-06:002015-01-03T13:18:01-06:00Jason Verlytag:mygeekdaddy.net,2015-01-03:/2015/01/03/raspberry-pi-sd-card-setup-in-os-x/<p>This is a quick guide on how to write a Raspberry Pi distro image to a new SD card from the command line on OS X. The original steps are from an <a href="http://elinux.org/RPi_Easy_SD_Card_Setup#Using_command_line_tools_.282.29">elinux.org</a> article that I've updated for my own reference. </p>
<ol>
<li>Select the <a href="http://www.raspberrypi.org/downloads/">Raspberry Pi image</a> you want to …</li></ol><p>This is a quick guide on how to write a Raspberry Pi distro image to a new SD card from the command line on OS X. The original steps are from an <a href="http://elinux.org/RPi_Easy_SD_Card_Setup#Using_command_line_tools_.282.29">elinux.org</a> article that I've updated for my own reference. </p>
<ol>
<li>Select the <a href="http://www.raspberrypi.org/downloads/">Raspberry Pi image</a> you want to setup on your SD card.</li>
<li>Once the image is downloaded, open a Terminal window and move to folder the image was downloaded to. Typically this will be the <code>Downloads</code> folder. </li>
<li>
<p>Before inserting the blank SD card, run the following command to get a list of mounted drives:</p>
<div class="highlight"><pre><span></span><code>df -h
</code></pre></div>
<p>This will give an output something like this:</p>
<p><figure><a href="http://share.mygeekdaddy.net/df_h_diskutil_base_2015-01-03.png"><img src="http://share.mygeekdaddy.net/df_h_diskutil_base_2015-01-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></p>
<p>Make a quick note of what is currently mounted on your Mac.</p>
</li>
<li>
<p>Insert the SD card and run the <code>df -h</code> command again. Look for the differences from the two commands to identify where the SD card was mounted.</p>
<p><figure><a href="http://share.mygeekdaddy.net/df_h_sdcard_insert_2015-01-03.png"><img src="http://share.mygeekdaddy.net/df_h_sdcard_insert_2015-01-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></p>
<p>In this case the SD card was mounted at <code>/dev/disk2s1</code>. </p>
<p><figure><a href="http://share.mygeekdaddy.net/df_h_sdcard_insert_2_2015-01-03.png"><img src="http://share.mygeekdaddy.net/df_h_sdcard_insert_2_2015-01-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></p>
</li>
<li>
<p>Now unmount the SD card with the following command - <strong>don't remove it</strong>.</p>
<div class="highlight"><pre><span></span><code>sudo diskutil unmount /dev/disk2s1
</code></pre></div>
<p>This will keep the main SD card attached, but allow the next command to write the Raspberry Pi disk image to the SD card.</p>
</li>
<li>
<p>Make a note on where SD card was mounted to work out the <a href="http://superuser.com/questions/631592/mac-osx-why-is-dev-rdisk-20-times-faster-than-dev-disk">raw device name</a>. In the example above, the SD card was mounted at <code>/dev/disk2s1</code>, so the raw device name would be <code>/dev/rdisk2</code>. The raw device name will be used as part of the image write command.</p>
</li>
<li>
<p>In the terminal, use the following command to write the downloaded image to the SD card. This will use the raw device name as determined in the previous step.</p>
<div class="highlight"><pre><span></span><code><span class="nv">sudo</span><span class="w"> </span><span class="nv">dd</span><span class="w"> </span><span class="nv">bs</span><span class="o">=</span><span class="mi">1</span><span class="nv">m</span><span class="w"> </span><span class="k">if</span><span class="o">=</span><span class="nv">raspi_image_name</span>.<span class="nv">img</span><span class="w"> </span><span class="nv">of</span><span class="o">=/</span><span class="nv">dev</span><span class="o">/</span><span class="nv">rdisk2</span><span class="w"></span>
</code></pre></div>
<p><figure><a href="http://share.mygeekdaddy.net/raspi_dd_image_command_2015-01-03.png"><img src="http://share.mygeekdaddy.net/raspi_dd_image_command_2015-01-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></p>
</li>
<li>
<p>After the <code>dd</code> command finishes, eject the card:</p>
<div class="highlight"><pre><span></span><code>sudo diskutil eject /dev/rdisk2
</code></pre></div>
</li>
<li>
<p>Pull the SD card out of your Mac and insert it into your Raspberry Pi.</p>
</li>
</ol>
<hr>
<p>The content on this page is available under a <a href="http://creativecommons.org/licenses/by-sa/3.0/">Creative Commons Attribution-ShareAlike 3.0 Unported License</a> unless otherwise noted.</p>Challenges for today's digital household2015-01-02T10:21:59-06:002015-01-02T10:21:59-06:00Jason Verlytag:mygeekdaddy.net,2015-01-02:/2015/01/02/challenges-for-todays-digital-household/<p>I've spoken about some of <a href="http://mygeekdaddy.net/2014/12/27/losing-faith-in-apples-ecosystem/">my concerns with Apple</a> and the misses they've had in 2014. So it seems only fitting that on the first day of 2015 that <a href="http://macsparky.com/blog/2015/1/quitting-family-sharing">David Sparks gave some insight</a> on Apple's Family Sharing feature. Apple's <a href="https://www.apple.com/ios/whats-new/family-sharing/">intent on what Family Sharing</a> should be is what every …</p><p>I've spoken about some of <a href="http://mygeekdaddy.net/2014/12/27/losing-faith-in-apples-ecosystem/">my concerns with Apple</a> and the misses they've had in 2014. So it seems only fitting that on the first day of 2015 that <a href="http://macsparky.com/blog/2015/1/quitting-family-sharing">David Sparks gave some insight</a> on Apple's Family Sharing feature. Apple's <a href="https://www.apple.com/ios/whats-new/family-sharing/">intent on what Family Sharing</a> should be is what every family living in Apple's ecosystem has wished for.</p>
<blockquote>
<p>Up to six people in your family can share purchases from iTunes, iBooks, and the App Store without sharing accounts. Pay for family purchases with the same credit card and approve kids’ spending right from a parent’s device. Easily share photos, a family calendar, and more to help keep everyone connected.</p>
</blockquote>
<p>I tested Family Sharing on my son's iPod Touch before releasing it to the entire family.<sup id="fnref:405296"><a class="footnote-ref" href="#fn:405296">2</a></sup> While Apple's previous statement on Family Sharing is true, it was working out the details that proved to a headache. The biggest problem was there was no way to migrate a family member's iOS device from sharing a single AppleID to a being under Family Sharing and their own AppleID. When I enabled Family Sharing on his device a couple of things happened:</p>
<ul>
<li>Game Progress: Since my son's iPod Touch was now under his own AppleID, most of the games he was playing reset their progress - especially those tied to Game Center. <em>Strike 1</em> </li>
<li>Content Selection: As I tested my son's device I noticed that not all the apps he had before were showing up. After doing some digging I found that some of the apps we wanted to share, the developer had opted out of the Family Sharing program. <em>Strike 2</em></li>
<li>Playlist Management: Since Family Sharing put his music choices under his own AppleID, the playlists he had generated on his device were gone. On top of this, the ability to generate playlists on his device was limited to the music on his device because the Music Match functionality was lost with using his own Apple ID. <em>Strike 3... you're out</em></li>
</ul>
<p>After reading David's comments, I can see how some of the playlist and music problems were compounded by my account (which his iPod has been sharing with ) had Music Match enabled. The heartburn I have is that Apple's own documents make it sound like <a href="http://support.apple.com/en-us/HT201085">enabling Family Sharing should enable features similar to Music Match</a> for family members. </p>
<p>David summarizes my experience to a tee - </p>
<blockquote>
<p>Family Sharing is not ready for the Sparks family. I’ve spent way too much time trying to make this all work and this weekend I’m officially throwing in the towel on Family Sharing until it gets better.<sup id="fnref:796062"><a class="footnote-ref" href="#fn:796062">1</a></sup> </p>
</blockquote>
<p>I'll continue to watch Apple's progress and test again in the future. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:796062">
<p>From <a href="http://macsparky.com/blog/2015/1/quitting-family-sharing">Macsparky.com</a>. <a class="footnote-backref" href="#fnref:796062" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:405296">
<p>Make sure you have a good back up before testing. <a class="footnote-backref" href="#fnref:405296" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Losing faith in Apple's ecosystem2014-12-27T22:17:05-06:002014-12-27T22:17:05-06:00Jason Verlytag:mygeekdaddy.net,2014-12-27:/2014/12/27/losing-faith-in-apples-ecosystem/<p>I got my first iPod before there was even an iTunes app for Windows. I purchased a Firewire 400 PCMCIA card for my <a href="http://www.pcmag.com/article2/0,2817,1572365,00.asp">Dell laptop</a> to make syncing easier with Musicmatch.<sup id="fnref:126489"><a class="footnote-ref" href="#fn:126489">1</a></sup> The reason I purchased an iPod, over other MP3 players at the time, was how well Apple had …</p><p>I got my first iPod before there was even an iTunes app for Windows. I purchased a Firewire 400 PCMCIA card for my <a href="http://www.pcmag.com/article2/0,2817,1572365,00.asp">Dell laptop</a> to make syncing easier with Musicmatch.<sup id="fnref:126489"><a class="footnote-ref" href="#fn:126489">1</a></sup> The reason I purchased an iPod, over other MP3 players at the time, was how well Apple had thought out how to integrate the MP3 player to the user experience. You could just effortlessly listen to anything stored on your iPod. There was almost a little bit of magic in how Apple had fused the device to the experience. </p>
<p>For a long time I had invested in the Microsoft ecosystem. All my computers and devices spoke to each other the way Microsoft wanted them to speak. Over time Microsoft showed they weren't capable of handling a digital ecosystem - dropping PlaysForSure for Zune and then dropping Zune for Xbox Music. I loved my iPod and eventually looked at what else Apple had to offer. I made the switch to my first Macbook Pro laptop, and as time has gone on, I've continued to purchase more products from Apple. My purchasing choices weren't based on the idea that Apple's hardware was so much better than everyone else's. It was that purchasing Apple devices, and using them <em>together</em>, made them worth more than the sum of their parts. The ecosystem, not the hardware, is what I was buying into. </p>
<blockquote>
<p>My worry is the ecosystem I've invested in is no longer working as promised.</p>
</blockquote>
<p>This fall Apple released iOS 8 and Yosemite with the promise that using these two operating systems together would blur the lines of how you used Mac and iOS device. One of the common questions I've been getting this holiday season is on media collections - managing pictures, music, movies, etc. - with everyone's brand new Apple device. I have family and friends who have purchased iOS devices, or switched to OS X, because of my previous recommendations or on what Apple promised to all of us in 2014. Unfortunately as I look toward 2015, it feels like Apple hasn't kept their promise. Using my Mac and iPhone together is no longer a "more than the sum of their parts" kind of experience.</p>
<p>So as family and friends have asked how to do more with their devices, I've been less and less inclined to automatically tell them about another Apple device to expand their media experiences. Apple has kept a frantic pace of adding new features and functions. This pace has caused some serious setbacks on long standing features and made what was previously an easy recommendation something I've had to pause and reflect on. </p>
<p>The first issue I've had with Apple this year is the one step forward, two steps back approach to basic features. Three things that stood out to me with iOS 8 and Yosemite:</p>
<ul>
<li>Music Playlist Editing: It's almost 2015 and we've had playlist folders in iTunes for over 10 years. In 2011, Apple introduced iTunes Match. This allowed an iOS device to create and manage playlists on your device. These steps forward are moot with iOS 8 because users cannot <a href="http://forums.macrumors.com/showthread.php?t=1780337">edit playlists inside a folder</a>. </li>
<li>Audiobook Chapters: Audiobooks have been apart of iTunes since v3. Overtime the emphasis of audiobooks has ebbed and flowed, but being able to play an audiobook on your iOS device has been a standard feature. With recent releases, a <a href="http://forums.macrumors.com/showthread.php?t=1741459">simple feature like chapter selection</a> has gone missing. </li>
<li>iTunes UI: iTunes UI and play features are a step back from previous generations of OS X. Simple things like <a href="http://www.mcelhearn.com/itunes-12-wheres-the-repeat-button/">shuffle and repeat buttons</a> are missing and have to be controlled via the menu instead of on the music player UI.</li>
</ul>
<p>My worries aren't with just the iOS 8 and OS X Yosemite, but everything Apple has taken on to support their updated ecosystem.</p>
<ul>
<li>App Store: When App Store opened in 2008, it ushered in everything I had hoped my iPhone would grow into. Now in 2014, the App Store is the running punchline of a series of bad jokes. App <a href="http://www.macstories.net/ios/goodbye-drafts-widget-for-now/">developers are told</a> to <a href="http://www.panic.com/blog/transmit-ios-1-1-1/">roll back features</a> after Apple themselves promoted said app in the App Store. Only to have the <a href="http://www.macrumors.com/2014/12/17/drafts-notification-center-widget-reinstated/">choice reversed</a> after public outcry on cloudy guidelines. Counterfeit apps continue to get through Apple's review process. All of this caused some OS X developers to <a href="http://www.tuaw.com/2014/10/13/bare-bones-software-pulling-next-bbedit-from-the-mac-app-store/">abandon the App Store</a> and release updates or new versions of their software independently </li>
<li>Secondary Features: iOS 8 and Yosemite promised so much, but fell so short. Family Sharing, iCloud Drive, Continuity, Handoff, and iCloud Photo. These all sounded amazing from the 2014 WWDC presentations and the bilingual live stream of the iPhone 6/6 plus release. The problem is none of these features are working as Apple has promised. </li>
<li>Media Management: Beyond the iTunes UI problems I mentioned above, iTunes 12 overall is a navigational disaster. I can understand the need to update and move forward with iTunes, but the change to navigation and functionality makes the transition from iTunes 11 to iTunes 12 feel more like the transition from Windows 7 to Windows 8. The experience feels forced by the software maker and with zero input from the user community.</li>
</ul>
<p>When you look at how Apple releases their hardware, maybe it's time they do the same on their software side. On the hardware side, Apple releases a new device one year and then tweaks the same design with small upgrades and corrections the following year. Now imagine the stability and speed of iOS and OS X if one year is about the new features and functions and the following year is spent to make these features work faster and smoother. Apple did this once with Snow Leopard and it was met with dull clapping from the media, but overwhelming praise from the user community. </p>
<p>Here's hoping 2015 turns out to be the year of the Snow Leopard's return. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:126489">
<p>Windows users didn't get an iTunes app until Oct 2003. <a class="footnote-backref" href="#fnref:126489" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>The potential of Markdown + Javascript2014-12-16T13:23:36-06:002014-12-16T13:23:36-06:00Jason Verlytag:mygeekdaddy.net,2014-12-16:/2014/12/16/the-potential-of-markdown-javascript/<p>With the resurgence of Javascript in variety of places - <a href="https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/">OS X</a>, <a href="http://drafts4-actions.agiletortoise.com">iOS</a> and my use for it in <a href="http://mygeekdaddy.net/2013/04/17/javascript-date-functions-in-birt/">Maximo</a>, I started to dust off a couple of books to refresh my memory on a few things. As I was going over some stuff on manipulating date/time values and I …</p><p>With the resurgence of Javascript in variety of places - <a href="https://developer.apple.com/library/mac/releasenotes/InterapplicationCommunication/RN-JavaScriptForAutomation/">OS X</a>, <a href="http://drafts4-actions.agiletortoise.com">iOS</a> and my use for it in <a href="http://mygeekdaddy.net/2013/04/17/javascript-date-functions-in-birt/">Maximo</a>, I started to dust off a couple of books to refresh my memory on a few things. As I was going over some stuff on manipulating date/time values and I realized how wonderful this would be in some of the Markdown documents I have. Now the beauty of Markdown is that it's really not just plain text. Yes, the file you saved is just plaintext, but Markdown is a plaintext <em>syntax</em> to format HTML.</p>
<blockquote>
<p>Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML). <sup id="fnref:43407"><a class="footnote-ref" href="#fn:43407">1</a></sup></p>
</blockquote>
<p>So guess what? You can also write straight HTML in a Markdown document. This opens the door to placing simple Javascript straight into your MD files too. The simplest example is using a Javascript to print the current date. </p>
<p>The current date is: <span id="demo"><script>
var d = new Date();
document.getElementById("demo").innerHTML = d.toDateString();
</script></span>.</p>
<p>That sentence was actually written as this in the MD file:</p>
<div class="highlight"><pre><span></span><code>The current date is: <span class="nt"><span</span> <span class="na">id=</span><span class="s">"demo"</span><span class="nt">><script></span>
var d = new Date();
document.getElementById("demo").innerHTML = d.toDateString();
<span class="nt"></script></span></span>.
</code></pre></div>
<p>This article was originally posted on <code>December 16, 2014 13:23:36</code>. So now I can use Javascript within the Markdown file to do some date/time calculations.</p>
<blockquote>
<p>Original post date was on <span id="demo6"><script>
var d = new Date("December 16, 2014 13:23:36");
document.getElementById("demo6").innerHTML = d.toDateString();
</script></span> and has been up for <span id="demo2"><script>
var date1 = new Date();
var date2 = new Date("December 16, 2014 13:23:36");
var hours = (Math.abs(date2 - date1) / 36e5).toFixed(1);
document.getElementById("demo2").innerHTML = hours;
</script></span> hours.</p>
</blockquote>
<p>As the article sits on the website, the time period will continue to count up. </p>
<p>One more notch in the flexibility column for Markdown. </p>
<hr>
<p><em>Update 2014-12-16:</em> In fact the Javascript will even be parsed by some Markdown Editors. In the example below, Byword parsed the entire article properly. </p>
<figure><a href="http://share.mygeekdaddy.net/byword_parse_js_2014-12-16.png"><img src="http://share.mygeekdaddy.net/byword_parse_js_2014-12-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<div class="footnote">
<hr>
<ol>
<li id="fn:43407">
<p>Daring Fireball: <a href="http://daringfireball.net/projects/markdown/">Markdown</a> <a class="footnote-backref" href="#fnref:43407" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Installing Pelican on Raspberry Pi2014-12-11T22:22:10-06:002014-12-11T22:22:10-06:00Jason Verlytag:mygeekdaddy.net,2014-12-11:/2014/12/11/installing-pelican-on-raspberry-pi/<p>Each holiday season I try to find new and unique ways share updates from the previous year with my family and friends. This year I'm bringing a mobile website to my family. I have a small Raspberry Pi that will be loaded with pictures and posts of family events from …</p><p>Each holiday season I try to find new and unique ways share updates from the previous year with my family and friends. This year I'm bringing a mobile website to my family. I have a small Raspberry Pi that will be loaded with pictures and posts of family events from the previous year. My plan is to plug the <a href="http://www.raspberrypi.org/help/what-is-a-raspberry-pi/">Raspberry Pi</a> onto their network and then let my family browse through the site as they wish. This way if there are pictures they want to keep, it's a simple click for them to download to their computer, phone or tablet. This keeps family pictures and updates on your own private network. </p>
<p>So here's a simple setup to have a mobile family blog. </p>
<h4>Basic Requirements</h4>
<p>The core requirement of this project will be a working Raspberry Pi. The project I have running right now is on an older Raspberry Pi B. Earlier this fall the <a href="http://www.raspberrypi.org/products/model-b-plus/">Raspberry Pi B+</a> was released and these directions will work on a B+ model just as well.<sup id="fnref:839622"><a class="footnote-ref" href="#fn:839622">3</a></sup> The setup I have uses the <a href="http://www.raspbian.org">Raspian Linux OS</a> and that's what is shown in the example setup below. </p>
<p>Going forward I've assumed you have a Raspberry Pi B/B+ that is up and running. Boot up your Rasp Pi and log into the command line. Run the following commands to make sure your Rasp Pi is up to date.</p>
<div class="highlight"><pre><span></span><code>sudo apt-get update
sudo apt-get upgrade
</code></pre></div>
<p>After installing any required updates, reboot your Rasp Pi and then we're ready to begin.</p>
<h4>Install Apache2</h4>
<p>First up is getting an Apache web server running on your Rasp Pi. This will be a version of Apache just like one that is used to serve up web pages on the internet. To install Apache, run the following command:</p>
<div class="highlight"><pre><span></span><code>sudo apt-get install apache2
</code></pre></div>
<p>This will initiate the package installation of the Apache2 web server. </p>
<figure><a href="http://share.mygeekdaddy.net/apache2_install_rpi_2014-12-11.png"><img src="http://share.mygeekdaddy.net/apache2_install_rpi_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>As part of the installation of Apace 2, the installation process will also create a new folder, <code>/var/www</code>, to host the files to be served up by Apache. From here we can start the Apache2 service to serve up the default <code>index.html</code> page. </p>
<div class="highlight"><pre><span></span><code>sudo service apache2 start
</code></pre></div>
<p>Run <code>lynx</code><sup id="fnref:562888"><a class="footnote-ref" href="#fn:562888">2</a></sup> to view the web page from the command line, you should see something similar to this:</p>
<figure><a href="http://share.mygeekdaddy.net/default_apache2_lynx_2014-12-11.png"><img src="http://share.mygeekdaddy.net/default_apache2_lynx_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>We now have an Apache web server up and running on your Rasp Pi.</p>
<h4>Install pip</h4>
<p>A lot of the work involved installing Pelican will be around a Python based package manager called <a href="https://pip.pypa.io/en/latest/">Pip</a>. If you use your Rasp Pi often, there's a good chance you already installed Pip. If you haven't, you need to download the initial setup file first. Run the following command to download the initial setup file: </p>
<div class="highlight"><pre><span></span><code>wget https://bootstrap.pypa.io/get-pip.py
</code></pre></div>
<p>This will download the core installation file for Pip. </p>
<figure><a href="http://share.mygeekdaddy.net/wget_pip_files_2014-12-11.png"><img src="http://share.mygeekdaddy.net/wget_pip_files_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The next step is to run the initial setup file for Pip. </p>
<div class="highlight"><pre><span></span><code>sudo python get-pip.py
</code></pre></div>
<p>This command will initiate the download of the installation files needed to install Pip. As part of the setup for Pip, another package called Setuptools will also be installed. </p>
<figure><a href="http://share.mygeekdaddy.net/pip_install_process_2014-12-11.png"><img src="http://share.mygeekdaddy.net/pip_install_process_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>After the installation is complete, you can verify everything is working by entering <code>sudo pip --version</code> for Pip to return what version has been installed.</p>
<figure><a href="http://share.mygeekdaddy.net/pip_install_version_2014-12-11.png"><img src="http://share.mygeekdaddy.net/pip_install_version_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This confirms Pip has been installed and is working correctly.</p>
<h4>Install Pelican</h4>
<p>Now that Pip is installed, we can start installing the secondary packages to get Pelican up and running on your Rasp Pi. Run the following command to start the installation of Pelican on your Rasp Pi</p>
<div class="highlight"><pre><span></span><code>sudo pip install pelican markdown typogrify
</code></pre></div>
<p>This will initiate the package installation for Pelican, Markdown, and Typogrify. The Markdown package is used to translate <code>.md</code> to <code>.html</code>. The Typogrify is actually an optional package because it creates highlighted code syntax in the generated <code>.html</code> files. The installation of these package will install some additional packages due to package dependencies. So don't be surprised if you see some packages like <code>jinja2</code> or <code>pygments</code> also getting installed. </p>
<p>Once the package installation is complete should get a notification from Pip at the command line similar to this:</p>
<figure><a href="http://share.mygeekdaddy.net/pelican_install_rpi_2014-12-11.png"><img src="http://share.mygeekdaddy.net/pelican_install_rpi_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Apache Setup</h4>
<p>After the installation is complete, we need to tell Apache to serve up the web pages from the correct location. Change folders to <code>/etc/apache2/sites-available</code>. These are the default site configuration files that Apache has for enabling new websites to be served up. Run the following commands:</p>
<div class="highlight"><pre><span></span><code>sudo cp default raspiweb
sudo nano raspiweb
</code></pre></div>
<p>The second command will open a <em>nano</em> editor to modify the <code>raspiweb</code> configuration file. You want to update the 4th line for the <code>DocumentRoot</code> variable:</p>
<figure><a href="http://share.mygeekdaddy.net/apache_raspiweb_conf_2014-12-11.png"><img src="http://share.mygeekdaddy.net/apache_raspiweb_conf_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Save the changes in <em>nano</em> and close the document. Now you need to promote the available site to be available to Apache run:</p>
<div class="highlight"><pre><span></span><code>sudo a2ensite raspi
</code></pre></div>
<p>You can ignore the <code>service apache2 reload</code> notice because we have one more change to make. Change folders to <code>/etc/apache2/sites-enabled</code>. By default Apache will enable a generic page after it is installed and loaded for the first time. However, that default configuration is also on port 80 and we need to disable it so the Pelican site can be the primary web page. Run the following command:</p>
<div class="highlight"><pre><span></span><code>sudo a2dissite 000-default
</code></pre></div>
<p>You'll get the same reload warning, but this time you should restart the apache web service:</p>
<div class="highlight"><pre><span></span><code><span class="n">sudo</span><span class="w"> </span><span class="n">service</span><span class="w"> </span><span class="n">apache2</span><span class="w"> </span><span class="n">reload</span><span class="w"></span>
</code></pre></div>
<p>You now have Pelican installed on your Raspberry Pi. </p>
<h4>Pelican Setup</h4>
<p>After getting Pelican installed If you happen to check your webpage after getting Pelican installed, you'll notice that you get an empty page. We still need to do some configuring of Pelican to set up the static page engine.</p>
<p>Change folders to <code>/var/www</code> and run the following command:</p>
<div class="highlight"><pre><span></span><code>sudo pelican-quickstart
</code></pre></div>
<p>This will initiate the Pelican setup and guide you through some questions that need to be answered. Read through Pelican's <a href="http://docs.getpelican.com/en/3.5.0/quickstart.html">Quick Start Guide</a> for more details on Pelican's initial setup.</p>
<figure><a href="http://share.mygeekdaddy.net/rpi_pelican_setup_2014-12-11.png"><img src="http://share.mygeekdaddy.net/rpi_pelican_setup_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Out of the box, the files created in the <code>/var/www</code> folders are assigned to the <code>root</code> user and group. This happens because we used the <code>sudo</code> command to install the Apache and Pelican packages. Go to the <code>/var</code> folder and run the following commands:</p>
<div class="highlight"><pre><span></span><code><span class="n">sudo</span><span class="w"> </span><span class="n">chown</span><span class="w"> </span><span class="n">pi</span><span class="w"> </span><span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">www</span><span class="o">/*</span><span class="w"></span>
<span class="n">sudo</span><span class="w"> </span><span class="n">chgrp</span><span class="w"> </span><span class="n">www</span><span class="o">-</span><span class="n">data</span><span class="w"> </span><span class="o">/</span><span class="k">var</span><span class="o">/</span><span class="n">www</span><span class="o">/*</span><span class="w"></span>
</code></pre></div>
<p>This will change ownership of the <code>/var/www</code> folder to user <code>pi</code> and group <code>www-data</code></p>
<figure><a href="http://share.mygeekdaddy.net/rpi_pelican_www_chown_2014-12-11.png"><img src="http://share.mygeekdaddy.net/rpi_pelican_www_chown_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Next we want to make sure user <code>pi</code>' is also part of the <code>www-data</code> group. Run the following command to add a user to an existing group:<sup id="fnref:678217"><a class="footnote-ref" href="#fn:678217">1</a></sup></p>
<div class="highlight"><pre><span></span><code>sudo usermod -a -G www-data pi
</code></pre></div>
<p>At this point Pelican is setup and ready to go.</p>
<h4>Test Run</h4>
<p>We need to add a quick test post to the <code>content</code> folder. Change folders to <code>/var/www/content</code> and use <em>nano</em> to create a new file named <code>firstpage.md</code>:</p>
<div class="highlight"><pre><span></span><code><span class="n">title</span><span class="o">:</span><span class="w"> </span><span class="n">Pelican</span><span class="w"> </span><span class="n">Test</span><span class="w"> </span><span class="n">Page</span><span class="w"></span>
<span class="n">tags</span><span class="o">:</span><span class="w"> </span><span class="n">Pelican</span><span class="o">,</span><span class="w"> </span><span class="n">Python</span><span class="o">,</span><span class="w"> </span><span class="n">Raspberry</span><span class="w"> </span><span class="n">Pi</span><span class="w"></span>
<span class="n">category</span><span class="o">:</span><span class="w"> </span><span class="n">RaspPi</span><span class="w"></span>
<span class="n">date</span><span class="o">:</span><span class="w"> </span><span class="mi">2014</span><span class="o">-</span><span class="mi">12</span><span class="o">-</span><span class="mi">10</span><span class="w"> </span><span class="mi">19</span><span class="o">:</span><span class="mi">17</span><span class="w"></span>
<span class="n">This</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">test</span><span class="w"> </span><span class="n">page</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">my</span><span class="w"> </span><span class="n">Raspberry</span><span class="w"> </span><span class="n">Pi</span><span class="o">.</span><span class="w"></span>
</code></pre></div>
<p>Move up one folder to <code>/var/www</code> and run the <code>pelican content</code> command. Pelican will convert the Markdown file you created in the <code>content</code> folder to an HTML document in the <code>output</code> folder. </p>
<p>Enter the IP address of your Raspberry Pi in your computer or tablet, and you will see an out of the box Pelican theme rendering the test page.</p>
<figure><a href="http://share.mygeekdaddy.net/generic_raspi_pelican_2014-12-11.png"><img src="http://share.mygeekdaddy.net/generic_raspi_pelican_2014-12-11.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now you have a fully functioning Pelican website running on your Raspberry Pi. </p>
<p>From here you can take the Rasp Pi, plug it into your family's network and have everyone browse your mobile website. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:678217">
<p>Note: make sure that's a capital <code>-G</code> in the <code>usermod</code> command. <a class="footnote-backref" href="#fnref:678217" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:562888">
<p>I used <code>lynx</code> because most of the setup is from the command line and I didn't necessarily have to start up LXDE, the default window manage for Raspian. <a class="footnote-backref" href="#fnref:562888" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:839622">
<p>The Raspberry Pi A and A+ are also options, but I have not tested out the directions on either unit myself. <a class="footnote-backref" href="#fnref:839622" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Holiday Tech Support Planning2014-12-06T11:11:55-06:002014-12-06T11:11:55-06:00Jason Verlytag:mygeekdaddy.net,2014-12-06:/2014/12/06/holiday-tech-support-planning/<p>Every year the holidays play out the same way. You show up to your family's gathering for the holidays, and right after you've had one too many pieces of pie, someone asks if you have any idea on how to fix their tech problem. Normally I don't mind helping, but …</p><p>Every year the holidays play out the same way. You show up to your family's gathering for the holidays, and right after you've had one too many pieces of pie, someone asks if you have any idea on how to fix their tech problem. Normally I don't mind helping, but everyone once in a while the problem is too big handle on short notice. Over the last couple of years I've learned a few tricks to make holiday tech support a little less painful.</p>
<h4>Be Prepared</h4>
<p>Over time you begin to learn that certain family members are going to ask for help over the holidays. Do yourself a favor and call them ahead of time to see if there is something specific they're wanting help with this year. Knowing what Mom, Dad or Uncle Bob is going to ask about will help you know if you need to bring any extra hardware with you or if they have to bring a special dongle or widget with themselves.</p>
<p>When you talk to your family or friend, set the expectation of what you're willing to take on. Setting up Grandma's iPad is one thing, but diagnosing why your cousin's game console can't connect to his family's hobbled together WiFi is another. Asking a few questions now will save on the feelings of frustration or resentment of trying to do something at the last minute. </p>
<h4>Pass It Forward</h4>
<p>One of the common help requests will be on technology that is probably WAY more out dated than the stuff you use day to day - like your cousin's WiFi. Take a look around and see what you have sitting around that could be re-used by a friend or family member. That "old" router you have sitting in the basement is probably 3x better than the one your being asked to fix. If you don't have anyone who needs these items, look around and see if a local non-profit, school, or STEM program could use them.<sup id="fnref:51149"><a class="footnote-ref" href="#fn:51149">1</a></sup> Most of these organizations will take just about anything, as long as it works. </p>
<h4>Gather Details</h4>
<p>Holidays also mean you're likely going to be asked to help setup a new gadet or device. This probably means helping set up a new user account (iCloud, AppleID, Microsoft, etc) as part of setting up the device. Here's a few points to remember:</p>
<ul>
<li>No matter how passionately your family member says they'll remember the answers to the security questions, they won't. Write down the answers to the security questions you are asked while setting up the new online account. If the device you're setting up can take screenshots, like a tablet or computer, send yourself a snapshot of the answers for future reference. </li>
<li>Sometimes an online account will ask for the birthdate as part of its security questions. Make sure you get the correct birthdate when entering. Having all the answers to the security questions doesn't work if you can't verify the person's birthday.<sup id="fnref:210490"><a class="footnote-ref" href="#fn:210490">2</a></sup></li>
<li>With everything fresh in your mind, setup a recovery account that you, or your relative, can get access too. If you know you're the family tech support person, put in your email address. As a backup option, use your cell number as the recovery contact too. </li>
<li>Get the serial/model number of the unit or device you helped setup. Most companies, like Apple for instance, requires a serial number to initiate a support call - including resetting an AppleID.</li>
<li>Make sure the password you select is something your friend or family member can rememeber. Unless it's to their bank account or credit card, give them a pass on having to have an 18 character password. </li>
</ul>
<p>Take a few minutes to collect all the information and store it in a safe place (e.g. 1Password or LastPass).</p>
<h4>Explain Features</h4>
<p>After you've got the device figured out, take 10 minutes and show them one feature you think they may enjoy. A couple of suggestions:</p>
<ul>
<li>How to setup a shared photostream on an iOS or Mac. </li>
<li>Give some suggestions on a few good starter apps.</li>
<li>Advanced features of the camera on a mobile phone.</li>
<li>Tell them a few things <em>not</em> to do - e.g. upgrade to iCloud Drive. </li>
</ul>
<h4>Advanced Tips</h4>
<p>If you happen to be <em>the</em> tech support person for a certain friend or family member, there may be some additional steps you want to take. </p>
<ul>
<li>Setup a free Dropbox account for them and set their default Documents folder to their new Dropbox folder. Remember to use a referral code to our Dropbox account. </li>
<li>Install a free version of LogMeIn. This will make things simpler when you get a phone call around Easter about fixing their next problem. </li>
<li>Do a scan of any updates or hot fixes that need to be installed. Get their gadgets on the latest software version. This includes other devices like routers, WiFi AP's, etc.</li>
<li>Double check on how they're backing up their critical files. Give them that old USB drive you don't use anymore in case backing up isn't happening. It's not a complete three step back up plan, but one step is better than no step. </li>
</ul>
<h4>Tech Support Workbag</h4>
<p>When you make your holiday housecall, make sure you have all the needed tools to help fix whatever. Get a small bag and have the following on hand:</p>
<ul>
<li>A small 4 port switch (e.g. Linksys unit).</li>
<li>Two extra Ethernet cables (preferably >= 10').</li>
<li>Extra USB cables (all three sizes + printer cable).</li>
<li>USB hard drive or extra large USB flash drive.</li>
<li>URL's for common precautionary software (e.g. <a href="https://www.malwarebytes.org">Malwarebytes</a>, <a href="http://windows.microsoft.com/en-us/windows/security-essentials-download">MS Security Essentials</a>, or <a href="http://www.sophos.com/en-us/products/free-tools/virus-removal-tool.aspx">Sophos AV</a>.</li>
<li>Any special software needed for your support.<sup id="fnref:579011"><a class="footnote-ref" href="#fn:579011">3</a></sup> </li>
</ul>
<h4>Be Patient</h4>
<p>As frustrating as it can be helping a friend or family member, remember they're frustrated too. We sometimes fly through a setup, or whatever steps were needed to fix the problem, because we've done it dozens of times. They just want their gadget to work. </p>
<p></br></p>
<p>Hope you have a Happy Holidays!</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:51149">
<p>Hint, this would also be a tax deductible dontation. <a class="footnote-backref" href="#fnref:51149" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:210490">
<p>I had this exact problem this holiday season. <a class="footnote-backref" href="#fnref:210490" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:579011">
<p>Because you called ahead of time, right? <a class="footnote-backref" href="#fnref:579011" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>How to install a local file in Homebrew2014-12-05T14:02:43-06:002014-12-05T14:02:43-06:00Jason Verlytag:mygeekdaddy.net,2014-12-05:/2014/12/05/how-to-install-a-local-file-in-homebrew/<p>You see a post or tweet and the author is talking about this really cool program they discovered. You find out the program can be installed via <a href="http://brew.sh">Homebrew</a>,<sup id="fnref:395328"><a class="footnote-ref" href="#fn:395328">1</a></sup> so you add it to your 'Putzing Project List'.<sup id="fnref:687001"><a class="footnote-ref" href="#fn:687001">2</a></sup> </p>
<p>When you get time to work on your project, you fire …</p><p>You see a post or tweet and the author is talking about this really cool program they discovered. You find out the program can be installed via <a href="http://brew.sh">Homebrew</a>,<sup id="fnref:395328"><a class="footnote-ref" href="#fn:395328">1</a></sup> so you add it to your 'Putzing Project List'.<sup id="fnref:687001"><a class="footnote-ref" href="#fn:687001">2</a></sup> </p>
<p>When you get time to work on your project, you fire your computer to install the package and get this:</p>
<figure><a href="http://share.mygeekdaddy.net/brew_qemu_download_fail_2014-12-05.png"><img src="http://share.mygeekdaddy.net/brew_qemu_download_fail_2014-12-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:700px;" /></img></a></figure>
<p>Crap.</p>
<p>Thankfully there is a way to manually download the package and have Homebrew use the local file to install the program.</p>
<h4>Manual Brew Install</h4>
<p>When you install a program with Homebrew it will download an archive file (gzip, bz2, tar, etc.) of the package to your computer first. Normally this happens automagically with the Homebrew install process, but sometimes you'll run into a problem with the default URL. Here's a work around on how to install a package with a manually downloaded archive file. </p>
<ol>
<li>Locate the project homepage for the program you're trying to install. Typically you'll be able to go back to the URL listed when the install failed. In my example I went back to <a href="http://wiki.qemu-project.org">http://wiki.qemu-project.org</a> to find the archive package file.</li>
<li>Check to see if you can download the package from your browser from the primary repository. Make sure you're downloading the same version that Homebrew believes it should install, even if there is a new version. Leave this file to your <code>Downloads</code> folder for now.</li>
<li>Sometimes you hit an outage (e.g. maintenance schedule) for the main repository. If you can't download the archive file from the main source, double check if there is a mirror and grab the archive file from there. Again, make sure you grab the same version that Homebrew wants to install.</li>
<li>Determine where Homebrew would normally download the archive file to, so you know where to put the manually downloaded file. Open a Terminal window and enter <code>brew --cache</code>. This will give a path on where the archive file would normally be saved to before getting installed. In my case the path is <code>/Users/mygeekdaddy/Library/Caches/Homebrew</code>.</li>
<li>Copy/move the archive file from <code>Downloads</code> to the folder path you found with the <code>brew --cache</code> command. </li>
<li>Re-run the Homebrew install command - <code>brew install qemu</code>. Homebrew will notice you already have the file downloaded and run the rest of the install process using the local file.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/brew_qemu_local_install_2014-12-05.png"><img src="http://share.mygeekdaddy.net/brew_qemu_local_install_2014-12-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:700px;" /></img></a></figure>
<p>Boom! The program installs and you're ready to work on your new project. If you run into any problems, double check for any dependencies that aren't being met or specific errors when Homebrew was trying to compile the package. </p>
<p>Beyond that... Google is your new friend for an answer.</p>
<hr>
<p>FWIW: The <a href="http://wiki.qemu-project.org/Main_Page">qemu</a> package I was trying to install is a processor emulator I want to use to a version of <a href="http://www.raspbian.org">Raspian Linux</a> on my Mac. This way I can test Raspberry Pi projects when I'm away from my home work bench.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:395328">
<p>Because you already use Homebrew, right? <a class="footnote-backref" href="#fnref:395328" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:687001">
<p>Because you have one of these too. <a class="footnote-backref" href="#fnref:687001" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Setting up SSH keys for remote access2014-12-01T14:57:40-06:002014-12-01T14:57:40-06:00Jason Verlytag:mygeekdaddy.net,2014-12-01:/2014/12/01/setting-up-ssh-keys-for-remote-access/<p>One of the criteria I had when I moved my site to a new hosting provides was better access and control of the host server. A key step that I wanted was access to the server via secure shell (SSH). I know a lot of users who will use SSH …</p><p>One of the criteria I had when I moved my site to a new hosting provides was better access and control of the host server. A key step that I wanted was access to the server via secure shell (SSH). I know a lot of users who will use SSH to remote into a sever, but use their account password to remotely log in. I wanted to be able to access the server via SSH keys so I didn't have to enter my password for remote access.</p>
<p>Here are the steps to enable remote access via SSH keys to access a Linux webserver from your Mac. When you're done, you will be able to log into your server without having to enter your account password. </p>
<h4>Create SSH Key Pair</h4>
<p>The first step is to create the SSH keypair (one public and one private) on your Mac. Open a Terminal window and enter the following command:</p>
<p><code>ssh-keygen -t rsa -C "name@domain.com"</code></p>
<p>The <code>-C</code> option tells the key generation process to add additional information to the key pair. In this case I wanted to make sure my public key included my email address. You can drop the <code>-C "name@domain.com"</code> if you want, it will not affect the key generation process. Once you have entered the <code>ssh-keygen</code> command, you'll get a few more questions on where the keys should be stored. </p>
<blockquote>
<p>Enter file in which to save the key (/Users/username/.ssh/id_rsa):</p>
</blockquote>
<p>Just hit enter here to save the key file to your home folder. </p>
<blockquote>
<p>Enter passphrase (empty for no passphrase):</p>
</blockquote>
<p>I know you have the option to <em>not</em> enter a passphrase, but come on, if you wanted to go to the extent of creating SSH keys to access your server you should enter a good passphrase.<sup id="fnref:not_password"><a class="footnote-ref" href="#fn:not_password">2</a></sup></p>
<p>Once the key generation is done, your terminal session should look like this: <sup id="fnref:ref_sshart"><a class="footnote-ref" href="#fn:ref_sshart">1</a></sup></p>
<pre>bash_term1: ssh-keygen -t rsa -C "name@domain.com"
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/username/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/username/.ssh/id_rsa.
Your public key has been saved in /Users/username/.ssh/id_rsa.pub.
The key fingerprint is:
4a:dd:0a:c6:35:4e:3f:ed:27:e3:9e:ac:bb:f1:b1:8a name@domain.com
The key's randomart image is:
+--[ RSA 2048]----+
| .oo. |
| . o.E |
| + . o |
| . =.= . |
| = = . |
| o + E + |
| . o . o . |
| . o |
| |
+-----------------+</pre>
<p>The public key has been saved to <code>/Users/usermame/.ssh/id_rsa.pub</code> There is also a private key that is generated (private keys <strong>should not</strong> be shared) which has been saved to <code>/Users/username/.ssh/id_rsa</code>. <sup id="fnref:ref_noshare"><a class="footnote-ref" href="#fn:ref_noshare">3</a></sup></p>
<h4>Share Public Key</h4>
<p>Once the SSH keypair has been created, you need to get the public key onto your server. Your server will have a file, <code>authorized_keys</code>, with a list of public keys the server knows are safe to use. The cumbersome way would be to cut/paste the key from your Mac, <code>cat ~/.ssh/id_rsa.pub | pbcopy</code>, then take the contents of the clipboard and get them into the <code>authorized_keys</code> folder on your server. </p>
<p>The easier way to combine a couple of terminal commands to create/append the <code>authorized_keys</code> folder. The following command will list the contents of your public key file, <code>id_rsa.pub</code>, connect you to your server via SSH, and create/append the <code>authorized_keys</code> file. </p>
<p><code>cat ~/.ssh/id_rsa.pub | ssh username@192.168.1.100 "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys"</code></p>
<p>You will need to modify the command with your actual username and IP/URL address. Enter your account password when prompted (it will be the last time you have to do this) to allow the command to connect to your server to append the <code>authorized_keys</code> file. After hitting enter, your Mac will connect to the server and add your SSH public key.</p>
<h4>Connect to Server</h4>
<p>After appending the <code>authorized_keys</code> file, you will be able to remote connect to your server without having to enter your account password. Open a new Terminal window and remote access your server:</p>
<p><code>ssh username@192.168.1.100</code></p>
<p>When you connect to the server you will see the a dialog box pop-up asking for your <em>passphrase</em>, not your <em>password</em>.</p>
<figure><a href="http://share.mygeekdaddy.net/ssh_keychain_challenge_2014-12-01.png"><img src="http://share.mygeekdaddy.net/ssh_keychain_challenge_2014-12-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>Enter your passphrase and your Terminal session will connect you to your server.<sup id="fnref:ref_keychain"><a class="footnote-ref" href="#fn:ref_keychain">4</a></sup></p>
<figure><a href="http://share.mygeekdaddy.net/ssh_remote_login_2014-12-01.png"><img src="http://share.mygeekdaddy.net/ssh_remote_login_2014-12-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Boom! Now you can connect to your server without having to enter your password. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:ref_sshart">
<p>Reasons for the <a href="http://superuser.com/questions/22535/what-is-randomart-produced-by-ssh-keygen">ASCII art in SSH key generation.</a>. <a class="footnote-backref" href="#fnref:ref_sshart" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:not_password">
<p><strong>Don't</strong> use your account password as your passphrase. That's the whole point to this excercise. <a class="footnote-backref" href="#fnref:not_password" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:ref_noshare">
<p>Did I make it clear that you <strong>don't</strong> share your private key. <a class="footnote-backref" href="#fnref:ref_noshare" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:ref_keychain">
<p>The dialog box <em>may not</em> appear again if you leave your OS X keychain unlocked. <a class="footnote-backref" href="#fnref:ref_keychain" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
</ol>
</div>Fixing a MultiLineItem error in BIRT2014-12-01T11:44:39-06:002014-12-01T11:44:39-06:00Jason Verlytag:mygeekdaddy.net,2014-12-01:/2014/12/01/fixing-a-multilineitem-error-in-birt/<p>It's a simple report. Just a couple of fields. You know it has to churn through a lot of data, but you did everything correct, and BIRT <em>still</em> decides to kick out an error stack. The latest example of this is when I did a simple inventory label report. I …</p><p>It's a simple report. Just a couple of fields. You know it has to churn through a lot of data, but you did everything correct, and BIRT <em>still</em> decides to kick out an error stack. The latest example of this is when I did a simple inventory label report. I expected to get pages of inventory item numbers and descriptions, but instead I got this:<sup id="fnref:refx_stacktrace"><a class="footnote-ref" href="#fn:refx_stacktrace">1</a></sup></p>
<blockquote>
<p>java.lang.IllegalStateException: can't re-generate content for MultiLineItem</p>
</blockquote>
<p>Reading through the entire error stack shows the culprit on the last three lines:</p>
<blockquote>
<p>Caused by: java.lang.IllegalStateException: can't re-generate content for MultiLineItem at
org.eclipse.birt.report.engine.internal.document.v4.DynamicTextItemExecutor.doCreateContent(DynamicTextItemExecutor.java:41)
at org.eclipse.birt.report.engine.internal.document.v4.ReportItemExecutor.execute(ReportItemExecutor.java:285)</p>
</blockquote>
<p>After some research I found that the problem was the BIRT engine was choking on a dynamic text box (aka MultiLineItem) as the report data is generated into HTML. The report was using Dynamic Text to concatenate the <code>item.description</code> and <code>inventory.issueunit</code> fields, like this: </p>
<div class="highlight"><pre><span></span><code> BirtStr.left(row["description"], 40) + ' (' + row["issueunit"] + ')'
</code></pre></div>
<p>Changing the field from Dynamic Text element to a Data element with <em>String</em> data type fixed the issue. This was great because it didn't change the output from the report. Shown below are two bin labels, on the left is a Dynamic Text element and on the right is a Data element.</p>
<figure><a href="http://share.mygeekdaddy.net/screen_output_comp_2014-12-01_2014-12-01.png"><img src="http://share.mygeekdaddy.net/screen_output_comp_2014-12-01_2014-12-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px; border-width:1px; border-color: black; border-top-style: solid;border-bottom-style: solid;border-right-style: solid;" /></img></a></figure>
<p>The Dynamic Text element was created with this:</p>
<figure><a href="http://share.mygeekdaddy.net/birt_dynamic_text_field_2014-12-01_2014-12-01.png"><img src="http://share.mygeekdaddy.net/birt_dynamic_text_field_2014-12-01_2014-12-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px; " /></img></a></figure>
<p>The Data element with a <em>String</em> data type was created with this:</p>
<figure><a href="http://share.mygeekdaddy.net/birt_data_string_element_2014-12-01.png"><img src="http://share.mygeekdaddy.net/birt_data_string_element_2014-12-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>While the visual output from the the report appears to be the same, the underlying HTML must be rendered differently to cause the error. Comparing the HTML output of each element would show the differences:</p>
<p>Dynamic Text Element:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><tr</span> <span class="na">style=</span><span class="s">" height: 0.333in;"</span> <span class="na">valign=</span><span class="s">"bottom"</span><span class="nt">></span>
<span class="nt"><td</span> <span class="na">class=</span><span class="s">"style_12"</span> <span class="na">colspan=</span><span class="s">"2"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">style=</span><span class="s">" text-align:center;"</span><span class="nt">></span>FILTER, AIR, MINI PLEAT, 24 X 24 X 12, F (EA)<span class="nt"></div></span>
<span class="nt"></td></span>
<span class="nt"></tr></span>
</code></pre></div>
<p>Data Element:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><tr</span> <span class="na">style=</span><span class="s">" height: 0.333in;"</span> <span class="na">valign=</span><span class="s">"bottom"</span><span class="nt">></span>
<span class="nt"><td</span> <span class="na">class=</span><span class="s">"style_12"</span> <span class="na">colspan=</span><span class="s">"2"</span><span class="nt">></span>
<span class="nt"><div</span> <span class="na">style=</span><span class="s">" text-align:center;"</span><span class="nt">></span>FILTER, AIR, MINI PLEAT, 24 X 24 X 12, F (EA)<span class="nt"></div></span>
<span class="nt"></td></span>
<span class="nt"></tr></span>
</code></pre></div>
<p>See! They're... uh, umm.... exactly the same. </p>
<p>So what's the root cause of the error? No clue.<sup id="fnref:refx_errorguess"><a class="footnote-ref" href="#fn:refx_errorguess">2</a></sup> Just know if you get an stack trace related to <code>MultiLineItem</code>, change the field from Dynamic Text to a Data element with a <em>String</em> data type. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:refx_stacktrace">
<p>The entire stack trace was much longer, but this was the crucial piece. <a class="footnote-backref" href="#fnref:refx_stacktrace" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:refx_errorguess">
<p>While the rendered HTML is identical, my guess is there was a character string that choked in a <code>.js</code> script that BIRT uses to communicate with some Java class files to parse the raw data to render the output HTML. <a class="footnote-backref" href="#fnref:refx_errorguess" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>My 3 'Must Watch' Holiday Movies2014-11-30T12:03:33-06:002014-11-30T12:03:33-06:00Jason Verlytag:mygeekdaddy.net,2014-11-30:/2014/11/30/my-3-must-watch-holiday-movies/<p>Thanksgiving is over and we're sailing full steam into the holiday season. This time of year is all about traditions and one of mine is filling weekend nights with my favorite holiday classics. Oh sure there's Frosty, and Rudolph and a Chistmas Carol, but these movies, these are what show …</p><p>Thanksgiving is over and we're sailing full steam into the holiday season. This time of year is all about traditions and one of mine is filling weekend nights with my favorite holiday classics. Oh sure there's Frosty, and Rudolph and a Chistmas Carol, but these movies, these are what show the holiday season is all about. Adversity during the holidays making the bonds of friends and family even stronger. </p>
<p>Each movie has it's own synopsis on Rotten Tomatoes or IMDB, but I think these more aptly describe these holiday classics.</p>
<h4>I'm too old for this shit</h4>
<p>Roger Murtaugh is a LAPD detective who is pondering his life as the holidays approach and he celebrates his 50th birthday. Roger's life gets a little too interesting after being assigned a new partner, Martin Riggs. Martin is struggling with depression this holiday season due to the loss of his wife. Murtaugh and Riggs have to get over not killing each other as they learn to work to stop a gang of drug smugglers. They soon discover that maybe they're the support they need this holiday season. </p>
<p>Amazon: <a href="http://www.amazon.com/Lethal-Weapon-Mel-Gibson/dp/0790729695/ref=sr_1_10?s=movies-tv&ie=UTF8&qid=1417153293&sr=1-10&keywords=lethal+weapon">DVD</a>/<a href="http://www.amazon.com/Lethal-Weapon-Blu-ray/dp/B000K2UIVO/ref=tmm_blu_title_0?_encoding=UTF8&sr=1-10&qid=1417153293">Blu-ray</a> | iTunes: <a href="https://itunes.apple.com/us/movie/lethal-weapon/id283819728">SD</a>/<a href="https://itunes.apple.com/us/movie/lethal-weapon/id283819728">HD</a></p>
<h4>Welcome to the party pal</h4>
<p>John and Holly have a strained marriage due to living apart. Both are dedicated to their careers, but hers required moving to Los Angeles, while John stayed in New York. At Christmas, they are re-united at her company's holiday party. The uneasy tension of seeing each other is broken when a group of unknown terrorists crash the party. John is challenged to find a way to keep his wife and her coworkers safe as the </p>
<p>Amazon: <a href="http://www.amazon.com/Die-Hard-Bruce-Willis/dp/B000O77SRC/ref=sr_1_3?ie=UTF8&qid=1417153044&sr=8-3&keywords=movie+die+hard">DVD</a>/<a href="http://www.amazon.com/Die-Hard-Blu-ray-Bruce-Willis/dp/B000W4HIX6/ref=tmm_blu_title_0?_encoding=UTF8&sr=8-3&qid=1417153044">Blu-ray</a> | iTunes: <a href="https://itunes.apple.com/us/movie/die-hard/id270711082">SD</a>/<a href="https://itunes.apple.com/us/movie/die-hard/id270711082">HD</a></p>
<h4>Holy Moly</h4>
<p>As the holidays approach, a fued between two long time neighbors, John Gustafson and Max Goldman, is rekindled when a new 'hot to trot' neighbor moves in. Each of them vie for their neighbor's attention, but only one can win her heart. John and Max learn to look past their own desires and find what their friendship really means during the Christmas season. </p>
<p>Amazon: <a href="http://www.amazon.com/Grumpy-Old-Men-Grumpier-DBFE/dp/B000FOPPC4/ref=sr_1_1_twi_1?s=movies-tv&ie=UTF8&qid=1417156883&sr=1-1&keywords=grumpy+old+men">DVD</a>/<a href="http://www.amazon.com/Grumpy-Grumpier-Double-Feature-Blu-ray/dp/B0022NHTD4/ref=tmm_blu_title_0?_encoding=UTF8&sr=1-1&qid=1417156883">Blu-ray</a> | iTunes: <a href="https://itunes.apple.com/us/movie/grumpy-old-men/id549991129">SD</a>/<a href="https://itunes.apple.com/us/movie/grumpy-old-men/id549991129">HD</a></p>
<p></br>
So get the popcorn, grab your favorite blanket, and curl up on the couch with one of these holiday classics. </p>Adding local search to Pelican2014-11-17T00:00:00-06:002014-11-17T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2014-11-17:/2014/11/17/adding-local-search-to-pelican/<p>One of the key features I've always wanted with my site was a way for readers to quickly find related content - either through search or related posts. When I was previously on WordPress, search functionality was baked in, so it was easy to incorporate searching into the site layout. Static …</p><p>One of the key features I've always wanted with my site was a way for readers to quickly find related content - either through search or related posts. When I was previously on WordPress, search functionality was baked in, so it was easy to incorporate searching into the site layout. Static page engines, like Pelican, don't offer site searching because there isn't a database or index file to do the search against. Previously I showed how to <a href="http://mygeekdaddy.me/2014/11/06/adding-search-function-to-static-page-site/">add a search box and use an external search engine</a> to allow searching against a static web site. This works pretty good for my site, but I am at the mercy of Duck Duck Go or Google and how often they crawled my site. The results at times were shoddy and displayed in a haphazard fashion. </p>
<p>After doing some research I found a way to index my site locally using a Pelican plugin called <a href="http://www.tipue.com/search/">Tipue Search</a>. Tipue Search is a jQuery plugin that uses a JSON file to return search results of a web site. Tipue was embedded into a Pelican plugin with the same name - Tipue-Search. After a little more research and some trial and error (that's the extent of plugin prowess), I was able to setup a search box for content on my site, from my site. </p>
<p>The steps below should be a good start for anyone using Pelican for their website. </p>
<blockquote>
<p><strong>Disclaimer:</strong> This setup was done on my Mac and on the Linux box hosting my site. I have no idea how well this will work in any other environment, so you will have to take my directions as a starting point and feel out the details yourself if your setup is different.</p>
</blockquote>
<h4>Getting Started</h4>
<p>There are three components you need to install before getting search setup on your website:</p>
<ul>
<li><a href="http://www.crummy.com/software/BeautifulSoup/bs4/doc/">Beautifulsoup4</a> - A python module used to help create a JSON file.</li>
<li><a href="https://github.com/Tipue/Tipue-Search/tree/master/tipuesearch">Tipue-Search</a>: The javascript and CSS files to return search results.</li>
<li><a href="https://github.com/getpelican/pelican-plugins/tree/master/tipue_search">Tipue_Search</a>: The Pelican plugin that generates the JSON index file.</li>
</ul>
<p>I know... naming the plugin and theme modification packages basically the same thing can be confusing. I kept the naming for each software package consistent through the rest of the article:</p>
<blockquote>
<p>Tipue-Search = Theme modification package <br>
Tipue_Search = Pelican plugin package</p>
</blockquote>
<p>The steps to install the core software:</p>
<ol>
<li>Install Beautifulsoup4 on your web server. If you're using a Linux box from Linode, Digital Ocean, etc., there's a good chance this package is already installed. If not, to install Beautifulsoup4 run the following command on your web server from the command line: <code>pip install beautifulsoup4</code>. If you run into some errors, you may need to run <code>sudo pip install beautifulsoup4</code> instead. </li>
<li>
<p>The next step is to install the theme modification software package. Download <code>Tipue-Search</code> software package from GitHub - <a href="https://github.com/Tipue/Tipue-Search/tree/master/tipuesearch">download here</a>. Place the <code>Tipue-Search</code> folder and files into the subfolder of your theme, like this: </p>
<p><figure><a href="http://share.mygeekdaddy.net/tipue-search_folder_2014-11-18.png"><img src="http://share.mygeekdaddy.net/tipue-search_folder_2014-11-18.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></p>
</li>
<li>
<p>The last step to prepare your server is to install the Pelican plugin. Download <code>Tipue_Search</code> files from GitHub - <a href="https://github.com/getpelican/pelican-plugins/tree/master/tipue_search">download here</a>. Place the Tipue_Search plugin into your Pelican plug-in folder. If you haven't installed any plugins yet, you may need to create the <code>plugins</code> folder first.</p>
<p><figure><a href="http://share.mygeekdaddy.net/tipue_search_2_2014-11-18.png"><img src="http://share.mygeekdaddy.net/tipue_search_2_2014-11-18.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure></p>
</li>
</ol>
<h4>Updating Pelican Configuration</h4>
<p>Now that the core files are in place, we need to tell Pelican where and how to use the plugin. If you haven't used any plugins for your website yet, open up the <code>pelicanconf.py</code> configuration file in the root folder of where you installed Pelican - e.g. /var/www. Edit the <code>pelicanconf.py</code> file and add the following lines (based on Pelican 3.4):</p>
<div class="highlight"><pre><span></span><code>PLUGIN_PATHS = ['plugins']
PLUGINS = ['tipue_search']
</code></pre></div>
<p>Next we need to tell Pelican to render the <code>search.html</code> template, which we'll create later, because it's not referenced by any other template. You do this by adding 'search' to the list of templates to the <code>DIRECT_TEMPLATES</code> setting:</p>
<div class="highlight"><pre><span></span><code>DIRECT_TEMPLATES = (('index', 'tags', 'categories', 'archives', 'search'))
</code></pre></div>
<p>If you don't add the <code>search.html</code> template to the <code>DIRECT_TEMPLATE</code> settings, the page won't render and searching won't work. You're list of tags in the <code>DIRECT_TEMPLATES</code> setting may look different, just make sure to add <code>search</code> to the list as shown above. </p>
<p>Your <code>pelicanconf.py</code> file should look similar to this:</p>
<figure><a href="http://share.mygeekdaddy.net/pelicanconf_tipue_settings_2014-11-18.png"><img src="http://share.mygeekdaddy.net/pelicanconf_tipue_settings_2014-11-18.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>Optional - Add Search to Menu List:</strong> If you want to have a 'Search' item in your site's menu bar, update the <code>pelicanconf.py</code> file again and add/update the <code>MENUITEMS</code> setting. </p>
<div class="highlight"><pre><span></span><code>MENUITEMS = [('Home', '/'), ('Archives', '/archives.html'), ('Search', '/search.html')]
</code></pre></div>
<p>Now when the site regenerates there will be a menu item for Search too.</p>
<h4>Update Theme Template Files</h4>
<p>The Tipue_Search plugin references its own CSS file, so you'll need to update the <code>base.html</code> template to make sure it gets pulled into your rendered HTML pages correctly. Add the following line in the <code><head></code> section of the <code>base.html</code> template:</p>
<div class="highlight"><pre><span></span><code><span class="x"><link rel="stylesheet" href="</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="x">/theme/tipuesearch/tipuesearch.css"></span>
</code></pre></div>
<p>In my theme, the line was added as part of the <code>base.html</code> file and looks like this:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><link</span> <span class="na">href=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/favicon.png"</span> <span class="na">rel=</span><span class="s">"icon"</span><span class="nt">></span>
<span class="nt"><link</span> <span class="na">href=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/theme/css/</span><span class="cp">{{</span> <span class="nv">CSS_FILE</span> <span class="cp">}}</span><span class="s">"</span> <span class="na">media=</span><span class="s">"screen, projection"</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">type=</span><span class="s">"text/css"</span><span class="nt">></span>
<span class="nt"><link</span> <span class="na">rel=</span><span class="s">"stylesheet"</span> <span class="na">href=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/theme/tipuesearch/tipuesearch.css"</span><span class="nt">></span>
<span class="nt"><script</span> <span class="na">src=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/theme/js/jquery-1.11.1.min.js"</span> <span class="na">type=</span><span class="s">"text/javascript"</span><span class="nt">></script></span>
<span class="nt"><script</span> <span class="na">src=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/theme/js/modernizr-2.0.js"</span><span class="nt">></script></span>
</code></pre></div>
<h4>Adding Search Functionality</h4>
<p>After adding all of the components, you'll need to add a <code>search.html</code> template to your theme so you have a web page to show the search results. Most of the heavy lifting on sorting and displaying the search results are already in the Tipue-Search theme package.</p>
<p>Create a new file called <code>search.html</code> in the <code>templates</code> folder of your theme. You can use the following template as a quick start for your <code>search.html</code> template. You'll probably (ok, most definitely) have to tweak the template content to match some of the CSS class names and <code>base.html</code> content. </p>
<div class="highlight"><pre><span></span><code><span class="cp">{%</span> <span class="k">extends</span> <span class="s2">"base.html"</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">block</span> <span class="nv">title</span> <span class="cp">%}{{</span> <span class="nv">SITENAME</span> <span class="cp">}}</span> Search <span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span>
<span class="cp">{%</span> <span class="k">block</span> <span class="nv">content</span> <span class="cp">%}</span>
<span class="nt"><div</span> <span class="na">class=</span><span class="s">"entry-content"</span><span class="nt">></span>
<span class="nt"><script</span> <span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"http://ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"</span><span class="nt">></span>
<span class="nt"></script></span>
<span class="nt"><script</span> <span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/theme/tipuesearch/tipuesearch_set.js"</span><span class="nt">></script></span>
<span class="nt"><script</span> <span class="na">type=</span><span class="s">"text/javascript"</span> <span class="na">src=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/theme/tipuesearch/tipuesearch.min.js"</span><span class="nt">></script></span>
<span class="nt"><script></span>
$(document).ready(function() {
$('#tipue_search_input').tipuesearch({
'show': 8,
'mode': 'json',
'contentLocation': '<span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span>/tipuesearch_content.json'
});
});
<span class="nt"></script></span>
<span class="nt"><div</span> <span class="na">align=</span><span class="s">"center"</span><span class="nt">><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">size=</span><span class="s">"60"</span> <span class="na">id=</span><span class="s">"tipue_search_input"</span><span class="nt">></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"button"</span> <span class="na">id=</span><span class="s">"tipue_search_button"</span> <span class="na">value=</span><span class="s">"Search"</span><span class="nt">></div></span>
<span class="nt"><div</span> <span class="na">id=</span><span class="s">"tipue_search_content"</span><span class="nt">></div></span>
<span class="nt"></div></span>
<span class="cp">{%</span> <span class="k">endblock</span> <span class="cp">%}</span>
</code></pre></div>
<p><strong>Optional - Adding search to a <em>sidebar.html</em> template:</strong> If your theme currently uses a sidebar, like mine does, you may want to include a search box there too. Open the <code>sidebar.html</code> template and add a new section for a search box. The snippet below is what I used for my search box. </p>
<div class="highlight"><pre><span></span><code><span class="nt"><section></span>
<span class="nt"><h1></span>Search<span class="nt"></h1></hr></span>
<span class="nt"><form</span> <span class="na">class=</span><span class="s">"navbar-search"</span> <span class="na">action=</span><span class="s">"</span><span class="cp">{{</span> <span class="nv">SITEURL</span> <span class="cp">}}</span><span class="s">/search.html"</span> <span class="na">onsubmit=</span><span class="s">"return validateForm(this.elements['q'].value);"</span><span class="nt">></span> <span class="nt"><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">class=</span><span class="s">"search-query"</span> <span class="na">placeholder=</span><span class="s">""</span> <span class="na">name=</span><span class="s">"q"</span> <span class="na">id=</span><span class="s">"tipue_search_input"</span><span class="nt">><input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">value=</span><span class="s">"Go!"</span><span class="nt">></form></li></span>
<span class="nt"></section></span>
</code></pre></div>
<p>Again, you <strike>may have</strike> <em>will have</em> to tweak the HTML tags in the snippet above to match your template's tags. You may also want to update your <code>main.css</code> file to make your search box blend into your site's overall layout.</p>
<h4>Wrapping Up</h4>
<p>With all the elements in place, open the command line on your box and regenerate site with <code>pelican content</code>. Open your site up in your browser and refresh the home page. You should now have site searching enabled for your site. </p>
<p>If the search does not work, or renders complete gibberish, go back and look at the <code>search.html</code> template. Best chance is that there is a <code><div></code> tag or conflicting CSS class reference causing your problems. </p>
<h4>Misc Notes</h4>
<p>With the Tipue_Search plugin, each time the site is regenerated a new JSON file is created. This file stores bits of your entire site that are then used for the search process. Per the <a href="http://www.tipue.com/search/docs/">Tipue Documentation</a>, not all browsers are supported with JSON search:</p>
<blockquote>
<p>BROWSERS</p>
<p>Tipue Search supports IE 9 and above, along with recent versions of Google Chrome, Firefox, Safari and Opera. It can support IE 7/8 in Static and Live modes if you use jQuery 1.11.1 rather than 2.1.1. </p>
</blockquote>
<p>Feel free to review the <a href="http://www.tipue.com/search/docs/">Tipue Documentation</a> for additional options to customize your search settings. </p>Backing up Pelican with Dropbox2014-11-16T00:00:00-06:002014-11-16T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2014-11-16:/2014/11/16/backing-up-pelican-with-dropbox/<p>Now that the move from WordPress to Pelican is complete, I'm starting to automate some of my site maintenance tasks. The first one I wanted to take on was backing up the site. My previous WP site was pretty automated, so I wanted to have the same "fire and forget …</p><p>Now that the move from WordPress to Pelican is complete, I'm starting to automate some of my site maintenance tasks. The first one I wanted to take on was backing up the site. My previous WP site was pretty automated, so I wanted to have the same "fire and forget" process here too. </p>
<p>There are three primary items I wanted to make sure were getting backed up right away:</p>
<ul>
<li>The original markdown files used to generate the site</li>
<li>The current pelican configuration files</li>
<li>The current website theme - which includes the CSS, template, and .js files</li>
</ul>
<p>I looked a variety of options, but the one I'm going with for now is backing up to Dropbox. </p>
<h4>Install Dropbox</h4>
<p>My current setup is on a <a href="https://www.linode.com">Linode</a><sup id="fnref:2014-11-16_linode"><a class="footnote-ref" href="#fn:2014-11-16_linode">1</a></sup> box running Linux. So in order to back up my site to Dropbox, I needed to install Dropbox on my box. There are several guides on how to setup Dropbox. The most informative one I read was on <a href="http://www.dropboxwiki.com">dropboxwiki.com</a> - <a href="http://www.dropboxwiki.com/tips-and-tricks/install-dropbox-in-an-entirely-text-based-linux-environment">Install Dropbox In An Entirely Text-Based Linux Environment</a>. This gave a great background on getting Dropbox up and running on a Linux box. </p>
<p>One step I took that wasn't in the dropboxwiki.com article was using Dropbox's native <a href="https://www.dropbox.com/download?dl=packages/dropbox.py">command line script</a> to run the Dropbox process. Dropbox's documentation apparently is not up to date with the script. The current version allows you to setup the daemon process by running <code>dropbox.py -i</code>. This will go through an install option and get the <code>dropboxd</code> process to run in the background. </p>
<p><em>Side note:</em> I created a new Dropbox account just for backing up the site. I know there is no way I'll be hitting more than 2GB of files anytime soon. Plus, it keeps my personal stuff segregated from the website. </p>
<h4>Setup shell script</h4>
<p>The next step was to get a the files copied from various spots on the server into the Dropbox folder. This was pretty straight forward with the follow shell script:</p>
<div class="highlight"><table class="highlighttable"><tr><td class="linenos"><div class="linenodiv"><pre><span class="normal">1</span>
<span class="normal">2</span>
<span class="normal">3</span>
<span class="normal">4</span>
<span class="normal">5</span>
<span class="normal">6</span></pre></div></td><td class="code"><div><pre><span></span><code><span class="ch">#!/bin/sh</span>
<span class="nb">export</span> <span class="nv">LANG</span><span class="o">=</span>en_US.UTF-8
cp -a /var/www/content/. ~/Dropbox/pelican/content
cp -a /usr/local/lib/python2.7/dist-packages/pelican/themes/mygeekdaddy/. ~/Dropbox/pelican/theme/
cp /var/www/*.* ~/Dropbox/pelican
<span class="nb">echo</span> <span class="s2">"site backed up at: </span><span class="k">$(</span>date<span class="k">)</span><span class="s2">"</span> >> /home/mygeekdaddy/pelican_site.log
</code></pre></div></td></tr></table></div>
<p>The last line will append a log file I have to monitor various activities and processes related to automating my site. As I find new folders that need to be backed up, I can just add them to the script and start copying them over to </p>
<h4>Add shell script to crontab</h4>
<p>The last step was to add the shell script as a cron task so it would run once a day. I simply added the time, user credentials, and script path to the existing <code>crontab</code> configuration. </p>
<div class="highlight"><pre><span></span><code><span class="p">#</span><span class="w"> </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="nl">crontab:</span><span class="w"> </span><span class="n">system</span><span class="o">-</span><span class="n">wide</span><span class="w"> </span><span class="n">crontab</span><span class="w"></span>
<span class="n">SHELL</span><span class="o">=/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span><span class="w"></span>
<span class="n">PATH</span><span class="o">=/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="nl">sbin:</span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">local</span><span class="o">/</span><span class="nl">bin:</span><span class="o">/</span><span class="nl">sbin:</span><span class="o">/</span><span class="nl">bin:</span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nl">sbin:</span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="w"></span>
<span class="p">#</span><span class="w"> </span><span class="n">m</span><span class="w"> </span><span class="n">h</span><span class="w"> </span><span class="n">dom</span><span class="w"> </span><span class="n">mon</span><span class="w"> </span><span class="n">dow</span><span class="w"> </span><span class="n">user</span><span class="w"> </span><span class="n">command</span><span class="w"></span>
<span class="o">*/</span><span class="mh">5</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">smithj099</span><span class="w"> </span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">smithj099</span><span class="o">/</span><span class="n">site_regen_script</span><span class="p">.</span><span class="n">sh</span><span class="w"></span>
<span class="mh">0</span><span class="w"> </span><span class="mh">4</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">smithj099</span><span class="w"> </span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">smithj099</span><span class="o">/</span><span class="n">pelican_backup</span><span class="p">.</span><span class="n">sh</span><span class="w"></span>
<span class="mh">17</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">run</span><span class="o">-</span><span class="n">parts</span><span class="w"> </span><span class="o">--</span><span class="n">report</span><span class="w"> </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">cron</span><span class="p">.</span><span class="n">hourly</span><span class="w"></span>
<span class="mh">25</span><span class="w"> </span><span class="mh">6</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="n">test</span><span class="w"> </span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span><span class="n">anacron</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">run</span><span class="o">-</span><span class="n">parts</span><span class="w"> </span><span class="o">--</span><span class="n">report</span><span class="w"> </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">cron</span><span class="p">.</span><span class="n">daily</span><span class="err">$</span><span class="w"></span>
<span class="mh">47</span><span class="w"> </span><span class="mh">6</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="mh">7</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="n">test</span><span class="w"> </span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span><span class="n">anacron</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">run</span><span class="o">-</span><span class="n">parts</span><span class="w"> </span><span class="o">--</span><span class="n">report</span><span class="w"> </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">cron</span><span class="p">.</span><span class="n">weekl</span><span class="err">$</span><span class="w"></span>
<span class="mh">52</span><span class="w"> </span><span class="mh">6</span><span class="w"> </span><span class="mh">1</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="o">*</span><span class="w"> </span><span class="n">root</span><span class="w"> </span><span class="n">test</span><span class="w"> </span><span class="o">-</span><span class="n">x</span><span class="w"> </span><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span><span class="n">anacron</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="p">(</span><span class="w"> </span><span class="n">cd</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="o">&&</span><span class="w"> </span><span class="n">run</span><span class="o">-</span><span class="n">parts</span><span class="w"> </span><span class="o">--</span><span class="n">report</span><span class="w"> </span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">cron</span><span class="p">.</span><span class="n">month</span><span class="err">$</span><span class="w"></span>
</code></pre></div>
<h4>Backing up the backup</h4>
<p>With every backup plan, there has to be a backup of the backup. In this case I have two redundant backups.</p>
<ol>
<li>Linode backup service: This was originally going to be my primary backup method (and probably should be considered as much). For a whopping $2.50/mo, Linode will do an automated backup of my box with incremental versions. No brainer. Yes. Easy. Done.</li>
<li>Time Machine: Since I'm using Dropbox as one of the backup methods, I setup a 2nd user account on my Mac Mini and linked that user account to the website's Dropbox account. Since the files are essentially saved locally on my Mac Mini, I can use Time Machine to backup the Dropbox folder and keep redundant backups of the website files. </li>
</ol>
<p>So now I have a backup in:</p>
<ul>
<li>Dropbox</li>
<li>By my hosting service</li>
<li>In my local Time Machine </li>
</ul>
<p>3 different backups for a grand total of $2.50 per month.<sup id="fnref:2014-11-16_backup"><a class="footnote-ref" href="#fn:2014-11-16_backup">2</a></sup></p>
<h4>System Impact</h4>
<p>After all of the following updates after the full site switchover: </p>
<ul>
<li>Moving the primary domain over to Linode</li>
<li>Adding the automatic site regeneration process</li>
<li>The automated backup process</li>
<li>Running the Dropbox daemon</li>
</ul>
<p>I can say the performance of the site took a slight hit - CPU utilization went up almost 3x.</p>
<figure><a href="http://share.mygeekdaddy.net/mgd_cpu_util_2014-11-16.png"><img src="http://share.mygeekdaddy.net/mgd_cpu_util_2014-11-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>The best part</h4>
<p>Now I can post to the site using Dropbox and some shell scripts. Look for a post on this soon. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:2014-11-16_linode">
<p>I can't speak enough about how happy I've been with the setup and access with Linode. <a class="footnote-backref" href="#fnref:2014-11-16_linode" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2014-11-16_backup">
<p>Damn this site is getting expensive. <a class="footnote-backref" href="#fnref:2014-11-16_backup" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Fixing your childhood memories2014-11-13T00:00:00-06:002014-11-13T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2014-11-13:/2014/11/13/fixing-your-childhood-memories/<p>As part of the ESA's landing of Rosetta’s Philae probe on Comet P67, the photoshop wizards came out in style. I think I saw just about every variation possible about of "alien in corner of picture" possible - Marvin the Martian, Alien, Daleks (and every other Doctor Who character), etc …</p><p>As part of the ESA's landing of Rosetta’s Philae probe on Comet P67, the photoshop wizards came out in style. I think I saw just about every variation possible about of "alien in corner of picture" possible - Marvin the Martian, Alien, Daleks (and every other Doctor Who character), etc. The one picture that stood out for me was this one: <sup id="fnref:pic_ref"><a class="footnote-ref" href="#fn:pic_ref">1</a></sup></p>
<figure><a href="http://share.mygeekdaddy.me/_img_Fixing_your_childhood_2014_11_13_091437.png"><img src="http://share.mygeekdaddy.me/_img_Fixing_your_childhood_2014_11_13_091437.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>If you don't know who those two aliens are then you had a shallow childhood and you should spend the weekend on YouTube. Here's a little clip to get you started: </p>
<iframe width="480" height="360" src="//www.youtube.com/embed/KTc3PsW5ghQ?rel=0" frameborder="0" allowfullscreen></iframe>
<p>Yip Yip Yip Yip....</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:pic_ref">
<p>I wish I could give original credit, but I followed the RT stream and gave up. <a class="footnote-backref" href="#fnref:pic_ref" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Over the Garden Wall2014-11-13T00:00:00-06:002014-11-13T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2014-11-13:/2014/11/13/over-the-garden-wall/<p>I normally don't do TV show reviews, but this latest release from Cartoon Network is the exception. <em>Over the Garden Wall</em> is an original series on Cartoon Network, which was created by Patrick McHale, one of the creators of another CN show, <em>Adventure Time</em>. The story is about two children …</p><p>I normally don't do TV show reviews, but this latest release from Cartoon Network is the exception. <em>Over the Garden Wall</em> is an original series on Cartoon Network, which was created by Patrick McHale, one of the creators of another CN show, <em>Adventure Time</em>. The story is about two children who get lost in the woods. In their attempt to find their way home, the two boys have a series of adventures in a strange land. I won't go into details on the plot, but the creators of the series have some great actors voicing the characters to help tell the story - Elijah Wood, Christopher Lloyd, John Cleese, and many others. </p>
<figure><a href="http://share.mygeekdaddy.me/over_the_garden_wall_2014-11-13.jpg"><img src="http://share.mygeekdaddy.me/over_the_garden_wall_2014-11-13.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>What's made this series stand out to me was how well McHale combined artistry and storytelling into the series. Each 'chapter' is a 15 minute segment of the story. My wife and I sat down one night to watch part of the series with our kids. Instantly we were both amazed on how wrapped up we got into the show. Both of us immediately commented that the series <strong>had</strong> to be an adaptation from a book or book series. Nope. We were surprised to find out the show was totally original and that based on an Amazon search, books based on the show were "coming soon".</p>
<p>The show just oozes with references to old time cartoons. From the way the characters are drawn to the voice styles used by the voice actors, there are subtle touches that flashes you back to early era cartoon films. As you watch the show you can pick up pieces from other fairy tales, but it's the way <em>Over the Garden Wall</em> is orchestrated together that brings out its own story. </p>
<p>As the cold weather sets in for most of us, this series is definitely one where you can wrap up on the couch in a warm blanket with your kids and sit back to watch the entire series. I guarentee this one will not disappoint. </p>
<p>You can find it on iTunes: <a href="https://itunes.apple.com/us/tv-season/over-the-garden-wall/id923088981">Over the Garden Wall</a></p>Referencing related data in Conditional Expressions2014-11-10T00:00:00-06:002014-11-10T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2014-11-10:/2014/11/10/referencing-related-data-in-conditional-expressions/<p>I was recently working with a power user at one of our sites and I was asked why a conditional expression they had created wasn't working. The user had previously used the SQL statement in a query, but now wanted to use it as a restriction for the purchase requests …</p><p>I was recently working with a power user at one of our sites and I was asked why a conditional expression they had created wasn't working. The user had previously used the SQL statement in a query, but now wanted to use it as a restriction for the purchase requests. The goal was to restrict users changing a purchase request to 'APPR' status if the PR had a line item that was using a decimal quantity with the UOM of 'EA' - e.g 2.32 EA. <sup id="fnref:refx_why"><a class="footnote-ref" href="#fn:refx_why">1</a></sup></p>
<p>The conditional expression looked like this:</p>
<div class="highlight"><pre><span></span><code>not exists(select 1 from prline where prnum=pr.prnum and siteid=pr.siteid and orderunit = 'EA' and (orderqty % 1 <> 0))
</code></pre></div>
<p>At first glance it appeared to be correct. I used the expression as part of a query and it returned the expected results of several PR's that did not have any lines with <code>2.32 EA</code>. So I went into the Conditional Expression app to verify that the statement was valid. Maximo validated the statement as correct and let me save the conditional expression. The problem was when the same statement was applied as a conditional expression on the security group, the expected restricted results were not occurring. Users were still given the opportunity to change the PR to 'APPR' status. </p>
<p>After leaving it alone for the afternoon, I came back and tried to look at why the conditional expression wasn't working as planned. After looking at other ways I could write the expression I remembered that Conditional Expressions don't work like Where Clause queries. While Where Clauses, like the one the user provided, need to build table relationships on standard SQL, Conditional Expressions uses a syntax that <em>looks like SQL</em>. Conditional Expressions uses a colon <code>:</code> to reference the record of the current business object. In my case, I was doing a subselect and needed to reference back to the parent PR object. </p>
<p>Updating the expression to this:</p>
<div class="highlight"><pre><span></span><code>not exists(select 1 from prline where prnum=:prnum and siteid=:siteid and orderunit = 'EA' and (orderqty % 1 <> 0))
</code></pre></div>
<p>Allowed the conditional expression to correctly restrict a user from changing the status from WAPPR to APPR status.</p>
<p>The proper method should be:</p>
<ul>
<li>Where Clause: <code>prnum = pr.prnum</code></li>
<li>Conditional Expression: <code>prnum = :prnum</code></li>
</ul>
<p>Just a friendly reminder that syntax can make or break your expressions. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:refx_why">
<p>The reason for the restriction was to prevent PR's from getting processed and causing confusion when invoice processing occurred. The goal was prevent the question on why the PO said '2.32 EA' and the invoice said '2.32 LB', '2.32 HR', '2.32 KG', etc. <a class="footnote-backref" href="#fnref:refx_why" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Adding search function to static page site2014-11-06T00:00:00-06:002014-11-06T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2014-11-06:/2014/11/06/adding-search-function-to-static-page-site/<p>I've discussed some of my <a href="http://mygeekdaddy.me/2014/11/01/thoughts-on-why-im-switching/">reasons for moving my site</a> from WordPress to a static page engine. The one reason I didn't explicitly state is that a static page engine, like Pelican or Jekyll, renders quite a bit faster - ok, a <strong>lot</strong> faster. The upside to the rendering speed is …</p><p>I've discussed some of my <a href="http://mygeekdaddy.me/2014/11/01/thoughts-on-why-im-switching/">reasons for moving my site</a> from WordPress to a static page engine. The one reason I didn't explicitly state is that a static page engine, like Pelican or Jekyll, renders quite a bit faster - ok, a <strong>lot</strong> faster. The upside to the rendering speed is because the site isn't being queried from a database and then rendered by the Wordpress engine as an HTML page for users to view. The downside to not having a WordPress database is there isn't anything to run queries against to do searches on your own site. This was a problem for me because I use searches on my site daily to find old articles or snippets of stuff I can't remember.</p>
<p>So I knew I needed to be able to add searching capabilities to my site. Here's a general run down on how you can add a search box to your static engine site. </p>
<h4>General setup</h4>
<p>You can add search to a static page site by taking three steps. </p>
<ol>
<li>Create a <code>sitemap.html</code> template to generate the <code>sitemap.xml</code> file.</li>
<li>Update your static engine to automatically generate a <code>sitemap.xml</code> file.</li>
<li>Add a search field to your site layout.</li>
</ol>
<p>What I ended up doing was giving search engines a map of my site and then used that an external search engine to find information on my site. Most search engines allow users to limit search results to a single site, like this:</p>
<div class="highlight"><pre><span></span><code>foo bar site:example.com
</code></pre></div>
<p>So the search results will only return hits found on the <code>example.com</code> site. So adding a search box that only searches my site was the simplest way to go. </p>
<p><em>Disclaimer:</em> The example below is how I added site searching on a Pelican static page site. I'm guessing the process would be similar for Jekyll, or other static page engines, but you'll have to use your Google-foo if you use another engine. </p>
<h4>Create the sitemap.html template</h4>
<p>The first part of the process is to give search engines a road map of your site. On Pelican this was handled by <a href="https://github.com/getpelican/pelican/wiki/Tips-n-Tricks">adding a template</a> to my theme called <code>sitemap.html</code>. </p>
<script src="https://gist.github.com/mygeekdaddy/b2fb6e5704f666a8b343.js"></script>
<p>Now the template rebuilds a <code>sitemap.xml</code> file each time the site is regenerated and adds any new content to the site's map file. </p>
<h4>Have Pelican generate sitemap.xml file</h4>
<p>Next step is we want Pelican to generate the <code>sitemap.xml</code> file each time we regenerate the site. To do this you direct Pelican to use the <code>sitemap.html</code> template, even though it isn't being directly called by the core templates. To do this you add a line to your <code>pelicanconf.py</code> configuration file.</p>
<div class="highlight"><pre><span></span><code>DIRECT_TEMPLATES = ('index', 'tags', 'categories', 'archives', 'sitemap')
</code></pre></div>
<p>After adding and saving the config file, the <code>sitemap.html</code> template will get polled when the site regenerates and create the <code>sitemap.xml</code> file. </p>
<h4>Adding search in your sidebar</h4>
<p>The last part is adding a search box to your site. We gave the search engines a map of the site in the previous step, now we want to add the search box into a site template so it is visible when the site in regenerated and viewed in a browser. In my case my theme had a sidebar template where the search field would be a perfect placement for the box. You could use a similar technique to add a search bar in other template files to show up in your preferred spot on the page.</p>
<p>The search engine I chose to use is DuckDuckGo. DDG has a great page on how to create a search box for your site - <a href="https://duckduckgo.com/search_box">DDG Search Box Tutorial</a>. After using the DDG tools and the tips from <a href="http://hardik.org/2013/06/01/stylising-duckduckgo-site-search/">hardik.org</a>, I got the following HTML snippet:</p>
<div class="highlight"><pre><span></span><code><span class="nt"><section></span>
<span class="nt"><h1></span>Search<span class="nt"></h1></span>
<span class="nt"><form</span> <span class="na">method=</span><span class="s">"get"</span> <span class="na">id=</span><span class="s">"search"</span> <span class="na">action=</span><span class="s">"http://duckduckgo.com/"</span><span class="nt">></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"hidden"</span> <span class="na">name=</span><span class="s">"sites"</span><span class="na">value=</span><span class="s">"mygeekdaddy.me"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"hidden"</span> <span class="na">name=</span><span class="s">"ka"</span> <span class="na">value=</span><span class="s">"h"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"hidden"</span> <span class="na">name=</span><span class="s">"k7"</span> <span class="na">value=</span><span class="s">"w"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"hidden"</span> <span class="na">name=</span><span class="s">"kj"</span> <span class="na">value=</span><span class="s">"#434843"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"hidden"</span> <span class="na">name=</span><span class="s">"ky"</span> <span class="na">value=</span><span class="s">"#F3FEF3"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"hidden"</span> <span class="na">name=</span><span class="s">"kx"</span> <span class="na">value=</span><span class="s">"#384338"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"hidden"</span> <span class="na">name=</span><span class="s">"kt"</span> <span class="na">value=</span><span class="s">"Helvetica"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"text"</span> <span class="na">name=</span><span class="s">"q"</span> <span class="na">maxlength=</span><span class="s">"255"</span> <span class="na">placeholder=</span><span class="s">"via DuckDuckGo"</span><span class="nt">/></span>
<span class="nt"><input</span> <span class="na">type=</span><span class="s">"submit"</span> <span class="na">value=</span><span class="s">"Go!"</span> <span class="nt">/></span>
<span class="nt"></form></span>
<span class="nt"></section></span>
</code></pre></div>
<p>The full <code>sidebar.html</code> template looks like this:</p>
<script src="https://gist.github.com/mygeekdaddy/137905b8f77e70850d3e.js"></script>
<hr>
<p><em>Note:</em> Due to the age of my <a href="http://mygeekdaddy.me">new static page site</a>, results may be limited. For sites that have been online for a while, you would see immediate results from previous site crawls. </p>CSS Item Check2014-11-05T00:00:00-06:002014-11-05T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2014-11-05:/2014/11/05/css-item-check/<h4>Basic CSS Formatting Checks</h4>
<p>p tag: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet eleifend leo. Vivamus auctor arcu sed arcu consectetur aliquam. Quisque mollis dictum enim ullamcorper molestie. Maecenas massa eros, euismod eget sollicitudin eu, fringilla ac eros. Phasellus lobortis hendrerit facilisis.</p>
<p>code tag: <code>Lorem ipsum …</code></p><h4>Basic CSS Formatting Checks</h4>
<p>p tag: Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet eleifend leo. Vivamus auctor arcu sed arcu consectetur aliquam. Quisque mollis dictum enim ullamcorper molestie. Maecenas massa eros, euismod eget sollicitudin eu, fringilla ac eros. Phasellus lobortis hendrerit facilisis.</p>
<p>code tag: <code>Lorem ipsum dolor sit amet</code></p>
<p>pre code tag: MD text was indented with <em>tab</em></p>
<div class="highlight"><pre><span></span><code>Lorem ipsum dolor sit amet
</code></pre></div>
<p>blockquote: MD text was tagged with > character</p>
<blockquote>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet eleifend leo. Vivamus auctor arcu sed arcu consectetur aliquam. Quisque mollis dictum enim ullamcorper molestie. Maecenas massa eros, euismod eget sollicitudin eu, fringilla ac eros. Phasellus lobortis hendrerit facilisis.</p>
</blockquote>
<p>Unordered List:</p>
<ul>
<li>Cat</li>
<li>Dog</li>
<li>Bird<ul>
<li>Parrot</li>
<li>Robin</li>
<li>Eagle</li>
</ul>
</li>
<li>Fox</li>
<li>Bear</li>
</ul>
<p>Ordered List:</p>
<ol>
<li>Alpha</li>
<li>Bravo</li>
<li>Charlie</li>
<li>Delta<ol>
<li>Diego</li>
<li>Delphi</li>
</ol>
</li>
<li>Echo</li>
<li>Foxtrot</li>
</ol>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet eleifend leo. Vivamus auctor arcu sed arcu consectetur aliquam. Quisque mollis dictum enim ullamcorper molestie. Maecenas massa eros, euismod eget sollicitudin eu, fringilla ac eros. Phasellus lobortis hendrerit facilisis.</p>
<hr>
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer sit amet eleifend leo. Vivamus auctor arcu sed arcu consectetur aliquam. Quisque mollis dictum enim ullamcorper molestie. Maecenas massa eros, euismod eget sollicitudin eu, fringilla ac eros. Phasellus lobortis hendrerit facilisis.</p>Say goodbye to subsidized smartphones2014-11-05T00:00:00-06:002014-11-05T00:00:00-06:00Jason Verlytag:mygeekdaddy.net,2014-11-05:/2014/11/05/say-goodbye-to-subsidized-smartphones/<p>The regular upgrade cycle by smartphone makers has finally brought an end to the era of subsidized smartphone purchases. A new plan<sup id="fnref:refx_att_next"><a class="footnote-ref" href="#fn:refx_att_next">1</a></sup> announced by AT&T let's customers pay off their new smartphone purchase over an extended period, instead of bearing the brunt of the cost up front. </p>
<blockquote>
<p>AT …</p></blockquote><p>The regular upgrade cycle by smartphone makers has finally brought an end to the era of subsidized smartphone purchases. A new plan<sup id="fnref:refx_att_next"><a class="footnote-ref" href="#fn:refx_att_next">1</a></sup> announced by AT&T let's customers pay off their new smartphone purchase over an extended period, instead of bearing the brunt of the cost up front. </p>
<blockquote>
<p>AT&T customers can choose the monthly installment plan that works for them - either AT&T Next<sup>SM</sup> 12 (a 20-month installment plan), AT&T Next 18 (a 24-month installment plan) or the new AT&T Next 24 (a 30-month installment plan). AT&T Next is available for new, qualified AT&T customers or existing customers who are upgrade eligible.</p>
</blockquote>
<p>To a customer like me, this <em>may</em> make sense. I don't upgrade my smartphone with every new version so I would get to keep a lower cost data plan, the cost of the phone is spread out, and cost of the plan is interest free. Happy customer. After digging through the plan in more detail I saw two issues. One, the plan's title is a little deceiving. Two, the cost differences weren't truly laid out for a consumer. </p>
<p>First off, the way AT&T names these plans is a little deceiving. The name says one thing, but means another:</p>
<table>
<thead>
<tr>
<th style="text-align: center;">AT&T Next Plan</th>
<th style="text-align: center;">Plan Period</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align: center;">AT&T Next 12</td>
<td style="text-align: center;">20</td>
</tr>
<tr>
<td style="text-align: center;">AT&T Next 18</td>
<td style="text-align: center;">24</td>
</tr>
<tr>
<td style="text-align: center;">AT&T Next 24</td>
<td style="text-align: center;">30</td>
</tr>
</tbody>
</table>
<p>The title describes not how long the plan's term is, but how soon I can upgrade again. So even on AT&T's fastest Next plan is called 'AT&T Next 12', the plan actually has a 20 month payment term plan. Now in 12 months I could upgrade again to the next latest and greatest. So how does AT&T plan to make up for these costs? You don't get to keep the older device after you switch up.</p>
<p>Read the fine print: </p>
<blockquote>
<p>Requires payment of 12 installments on 20-month agreement or 18 on 24-month agreement, account in good standing, <strong>trade-in of your financed device in good condition</strong>, and purchase of new eligible device with qualifying wireless service. After upgrade, unbilled installments are waived.</p>
</blockquote>
<p>The second part of the plan, and what I think borders on false advertising, is how AT&T is comparing the plans from a subsidized smartphone purchase to ones made on a AT&T Next plan.<sup id="fnref:refx_plan_comp1"><a class="footnote-ref" href="#fn:refx_plan_comp1">2</a></sup> The graph below is from AT&T comparing the purchase of a subsidized iPhone 6 at $199 with a 2 year contract over the cost of the 1st year AT&T Next purchase of an iPhone at full retail price of $650.</p>
<figure><a href="http://share.mygeekdaddy.me/att_plan_comparison_next_2014-11-04.png"><img src="http://share.mygeekdaddy.me/att_plan_comparison_next_2014-11-04.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Hmm... Is $390 really less than $325.08? Is $1105.08 really comparable to $1170? </p>
<p>Here's how the costs actually stack up after 1 year.</p>
<figure><a href="http://share.mygeekdaddy.me/att_plan_cost_comp_2014-11-04.png"><img src="http://share.mygeekdaddy.me/att_plan_cost_comp_2014-11-04.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Great, but AT&T forgot one detail. On the Next 12 and Next 18 plans, a customer is still paying for their phone after 12 months. So by the end of the contract term of 2 years, assuming they didn't upgrade again, the actuals costs are:</p>
<figure><a href="http://share.mygeekdaddy.me/att_plan_cost_comp_fullterm_2014-11-04.png"><img src="http://share.mygeekdaddy.me/att_plan_cost_comp_fullterm_2014-11-04.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So over 2 years, the subsidized smartphone will actually be cheaper. </p>
<p>Now I'm just picking on AT&T because they made the announcement today. But I'm betting Verizon and other mobile carriers will be coming out with similar deals now that the holiday season is ramping up. </p>
<p>Just be a smart shopper for your new gadgets this holiday. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:refx_att_next">
<p><a href="http://about.att.com/story/att_gives_wireless_customers_one_more_way_to_save_with_att_next_24.html">http://about.att.com/story/att_gives_wireless_customers_one_more_way_to_save_with_att_next_24.html</a> <a class="footnote-backref" href="#fnref:refx_att_next" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:refx_plan_comp1">
<p><a href="http://www.att.com/shop/wireless/next.html">http://www.att.com/shop/wireless/next.html</a> <a class="footnote-backref" href="#fnref:refx_plan_comp1" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Thoughts on why I'm switching2014-11-01T00:00:00-05:002014-11-01T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-11-01:/2014/11/01/thoughts-on-why-im-switching/<p>When I announced the move from WordPress to a static page engine, I wanted everyone reading my site to be prepared. I know there are going to be subtle changes and wanted to prepare everyone of the switch. One reader, Sun, that I've talked with on a couple of posts …</p><p>When I announced the move from WordPress to a static page engine, I wanted everyone reading my site to be prepared. I know there are going to be subtle changes and wanted to prepare everyone of the switch. One reader, Sun, that I've talked with on a couple of posts, came back with a couple questions on why I was moving the site over to Pelican.</p>
<blockquote>
<p>You are not interested in implementing static pages within WordPress? I’ve been running dynamic for years, but recently ran across WP Super Cache as a featured plugin. I installed in 10 minutes and I noticed a great increase my WordPress page loads.</p>
<p><a href="https://wordpress.org/plugins/wp-super-cache/">https://wordpress.org/plugins/wp-super-cache/</a></p>
<p>I am not sure about your motivations for switching blogging platforms (hosting cost, speed?), but WP Super Cache might be a good solution if you are looking for speed improvements.</p>
</blockquote>
<p>He raised some good questions about why I was switching. I’ve tried <a href="https://wordpress.org/plugins/wp-super-cache/">WP Super Cache</a> and it helped somewhat, but my switch to Super Cache was also at the height of some WordPress DOS attacks. I added <a href="https://www.cloudflare.com">CloudFlare</a> and <a href="http://www.wordfence.com">Wordfence</a> in an effort to keep things up and running. This got more and more involved with having to monitor hacks on WP credentials and other patches. Over time I realized I wanted to be in the business of creating stuff, not maintaining it.</p>
<p>Beyond the maintenance of WordPress, the efforts to get content <em>into</em> WordPress was also starting to drag on me. I had really hoped WP/Automatic would have taken their purchase of Poster for iOS and make it even better. Poster was one of my go to apps on iOS that allowed me to easily push posts/text around the way I wanted to quickly get posts up on the site. The default WordPress app for iOS doesn’t have any extensions or x-callback-urls (that I know of) to easily push content from iOS apps. With the workflow I'm developing for my static page blog, I will literally be able to click a button in Editorial and have it post to the site in less than a minute. Same goes for posting from OS X with Automator. <sup id="fnref:moreonthis"><a class="footnote-ref" href="#fn:moreonthis">1</a></sup></p>
<p>Sun was correct on the second reason for the move - there <em>is</em> a cost for maintaining my site. I don’t have ads on the site to offset my hosting and domain costs. I’ve looked into having ads to help offset my costs, but unless I go the sponsorship route, most ad companies require the first ad to be in the first 'x' number of pixels of the site. I’m not changing my site design for a few bucks a month. So finding a way to affordably keep the site up is also part of the move. Could I move the entire WP setup from where I am now to another hosting provide? Sure I could - I even planned on doing that first. But it still didn’t fix some of the drag I was feeling on being able to get content easily and quickly up on the site.</p>
<p>One part of the reply to Sun, and other interactions I've had with other readers, made me realize that this site needed to continue to have a way to interact. I'll be looking at adding Disqus to the new site so I can continue to interact with everyone. Being able to interact with everyone is part of why I do this. Adding Disqus wasn't originally on my punchlist before going live on the new site, but after talking with Sun, I've realized how important this is. So I've decided to hold off throwing the switch until the new site has Disqus up and running. Getting feedback and talking to people who really interact with the site is what makes this all worth while.</p>
<p>Thanks Sun for helping me make the site even better!</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:moreonthis">
<p>I have draft posts on both of these topics. <a class="footnote-backref" href="#fnref:moreonthis" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Apologies for the mess...2014-10-30T00:00:00-05:002014-10-30T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-10-30:/2014/10/30/apologies-for-the-mess/<p>I'm in the final stretch of moving this site from WordPress to a <a href="http://mygeekdaddy.me/temporary-home-before-the-move.html">static page setup</a>. My goal is to work backwards from the most recent post and popular posts to the dregs of my early days on this site. At this point I'm moving on to my 4th platform …</p><p>I'm in the final stretch of moving this site from WordPress to a <a href="http://mygeekdaddy.me/temporary-home-before-the-move.html">static page setup</a>. My goal is to work backwards from the most recent post and popular posts to the dregs of my early days on this site. At this point I'm moving on to my 4th platform since starting my site: Blogger to TypePad to WordPress to Pelican.</p>
<blockquote>
<p>I can say with absolute certainty... stuff will be broken. </p>
</blockquote>
<p>Since being on WordPress, this site has gone through three transformations. </p>
<ul>
<li>I split the site into two sites - mygeekdaddy.net and theothersideof.mygeekdaddy.net.</li>
<li>I merged the two sites back into one and dropped family related posts. </li>
<li>I moved away from loading images and media through WordPress and uploaded them directly through various workflows. </li>
</ul>
<p>This has given me a hodgepodge of posts to go through as I migrate to the new site. With the myriad of changes that have occurred over the years I've seen that I don't have just one way posts have been formatted - I have five. The time and effort to create a set of scripts to do the needed cleaning and fixing of post just isn't worth it to me. I don't have this site tied to any ads or ad syndiates, so I'm not messing up a revenue stream. I have a <a href="http://mygeekdaddy.me">temporary domain</a> for the new site so I can begin moving stuff over before doing the DNS switch. And with my OCD to detail, I would be chasing down each and every exception until I could push one button and automagically have all my posts converted to Markdown.</p>
<p>So this goes back to my earlier statement of how I plan to back build the site. A lot of my recent posts, say in the last 2 years, are already in Markdown. Those will just get reloaded into the site (if not already). I have some older posts that either I reference to on occassion or for some reason resonate with you guys. Those are the one I don't want to break. My hyper excitement on the <a href="http://mygeekdaddy.net/2008/07/08/iphone-3g-this-friday-but-will-it-sell/">upcoming release of the iPhone 3G</a> may take a back seat for polished editing. </p>
<p>Either way I plan on making the switch over on Sunday night. Wish me luck!</p>Formatting Maximo BIRT for year end reports2014-10-28T09:24:33-05:002014-10-28T09:24:33-05:00Jason Verlytag:mygeekdaddy.net,2014-10-28:/2014/10/28/formatting-maximo-birt-for-year-end-reports/<p>I wrapped up a week long trip to one of our plants to conduct a year end physical count. One change this year has been a request to update the final adjustment summary report. It was requested that our year end reports be an electronic report generated with all the …</p><p>I wrapped up a week long trip to one of our plants to conduct a year end physical count. One change this year has been a request to update the final adjustment summary report. It was requested that our year end reports be an electronic report generated with all the required information in a single PDF document. That sounded pretty simple from the initial description that was given to me. Then a clarification request came in that asked that the title page and the backup data be inside the single document. </p>
<p>That changed things a little bit.</p>
<p>The front page had a lot of boiler plate information that needed to be included, but it required inserting information from the report into the text - total cost of adjustments made, the date the balance reconciliation occurred, number of items counted, etc. Most of the information worked fine until I got to currency values in the text block. I wanted a portion of the text to look like this:</p>
<blockquote>
The cycle count adjustments made this period totaled $1,234.56.
</blockquote>
<p>But simply inserting the the aggregate summary in the report form ended up looking like this:</p>
<blockquote>
The cycle count adjustments made this period totaled $1234.5678.
</blockquote>
<p>Not what I wanted at all. </p>
<p>To format the number in the text block too look like it belonged required using some Javascript to reformat the number. I added the following Javascript <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> function to convert the aggregation field from a decimal number to a string with the proper commas and two decimal places. To use this Javascript function in the report, add the function block on the initialize method for the main report design. </p>
<pre><code>function CurrencyFormat(amount) {
var delimiter = ","; // replace comma if desired
amount = new String(amount);
var a = amount.split('.',2)
var d = a[1];
var i = parseInt(a[0]);
if(isNaN(i)) { return ''; }
var minus = '';
if(i < 0) { minus = '-'; }
i = Math.abs(i);
var n = new String(i);
var a = [];
while(n.length > 3)
{
var nn = n.substr(n.length-3);
a.unshift(nn);
n = n.substr(0,n.length-3);
}
if(n.length > 0) { a.unshift(n); }
n = a.join(delimiter);
if(d.length < 1) { amount = n; }
else { amount = n + '.' + d; }
amount = minus + amount;
return amount;
}
</code></pre>
<p>The initialize method for the main report would look like this:</p>
<figure><a href="http://share.mygeekdaddy.me/birt_decimal_to_currency_string_2014-10-28.png"><img src="http://share.mygeekdaddy.me/birt_decimal_to_currency_string_2014-10-28.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>By adding it to the initialize method, it allows the Javascript function to be called anywhere in the report. So now the output text in the report I wanted to look like this:</p>
<blockquote>
The cycle count adjustments made this period totaled $1,234.56.
</blockquote>
<p>Would be entered as a dynamic text object in the BIRT report like this:</p>
<pre><code>'The cycle count adjustments made this period totaled $' + CurrencyFormat(row["aggregate_sum_val"]) + '.';
</code></pre>
<p>The boiler plate text is then put into the report header with a page break so it becomes a cover page for the overall report. </p>
<p>So now one BIRT report becomes the cover page and backup details in a single PDF document.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
Credit for the Javascript goes to <a href="http://css-tricks.com/snippets/javascript/comma-values-in-numbers/">CSS-tricks.com</a>. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>Getting comfortable with your lists2014-10-24T00:00:00-05:002014-10-24T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-10-24:/2014/10/24/getting-comfortable-with-your-lists/<p>On a recent Mac Power User podcast (<a href="http://5by5.tv/mpu/219">MPU 219</a>), David and Katie had David Allen, creator of Getting Things Done (GTD), as their guest. I've always enjoyed listening to David Allen and his insights on using GTD. What I've always enjoyed was how his explanations come off less liturgical and …</p><p>On a recent Mac Power User podcast (<a href="http://5by5.tv/mpu/219">MPU 219</a>), David and Katie had David Allen, creator of Getting Things Done (GTD), as their guest. I've always enjoyed listening to David Allen and his insights on using GTD. What I've always enjoyed was how his explanations come off less liturgical and more philosphical. David gave an overview of the GTD's 5 phases of work:<sup id="fnref:GTD_Steps"><a class="footnote-ref" href="#fn:GTD_Steps">1</a></sup></p>
<ol>
<li>Capture—collect what has your attention</li>
<li>Clarify—process what it means</li>
<li>Organize—put it where it belongs</li>
<li>Reflect—review frequently</li>
<li>Engage—simply do.</li>
</ol>
<p>The stage that I've struggled with is <em>Reflect</em> because when I start to look at my list I felt overwhelmed. I didn't feel overwhelmed of how big or how many things I had on my list, but how much I felt I wasn't getting done. David Sparks started to describe similar feelings to his lists in the podcast. David Allen diagnosed part of the problem of probably not doing a weekly review on a regular basis. In my case that's probably true, but it was David Allen's follow up on reviewing your lists is what was amazing:</p>
<blockquote>
<p>David Sparks: Frankly it's paralyzing when you look at a list that long.</p>
<p>David Allen: It's only paralyzingly if you think you need to do all of that all the time. That's because people just aren't used to feeling comfortable about all the stuff they're not doing.<sup id="fnref:GTD_Quote"><a class="footnote-ref" href="#fn:GTD_Quote">2</a></sup> </p>
</blockquote>
<p>In all my time reading and leaning, I've never heard the <em>Reflect</em> stage broken down in such simple terms. </p>
<blockquote>
<p>You need to get comfortable of what you're not doing. </p>
</blockquote>
<p>Now THAT'S what I was having a problem with. </p>
<p>I looked back and saw that I had gone through all the effort to Capture, Clarify, and Organize my tasks, but because I got overwhelmed with all the stuff I wasn't doing, I stumbled with my Weekly Reviews. This caused a domino effect on my work since I didn't Reflect on my lists I would typically fail to Engage with my lists, which led to me to not getting things done. While David Allen's statement seems obvious, in fact he seems to have a knack at doing that, incorporating the advice has been a challenge. The choice I've made is to do reviews more frequently, so I can get used to seeing everything on all my lists more often. </p>
<p>I'll update everyone on how this is going in a couple of months. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:GTD_Steps">
<p>GTD 5 steps from <a href="http://gettingthingsdone.com/fivesteps/">Getting Things Done</a>. <a class="footnote-backref" href="#fnref:GTD_Steps" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:GTD_Quote">
<p>MPU 219 @ 41:30. <a class="footnote-backref" href="#fnref:GTD_Quote" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Temporary home before the move2014-10-18T17:29:37-05:002014-10-18T17:29:37-05:00Jason Verlytag:mygeekdaddy.net,2014-10-18:/2014/10/18/temporary-home-before-the-move/<p>I'll be perfectly honest, there are times when a hobby starts to feel like a job. My goal of moving from Wordpress to Pelican has definitely moved into this category. The past couple of weekends have been spent re-learning Linux (for my new hosting provider), revisiting CSS (so I can …</p><p>I'll be perfectly honest, there are times when a hobby starts to feel like a job. My goal of moving from Wordpress to Pelican has definitely moved into this category. The past couple of weekends have been spent re-learning Linux (for my new hosting provider), revisiting CSS (so I can keep the same look to the site), and learning the ins and outs of a new CMS (because nothing from WP applies here). </p>
<p>As a transitional start from WP to Pelican, I want to give credit to a few people that have either directly, or indirectly, helped me along the way.</p>
<ul>
<li><a href="https://twitter.com/modernscientist">@modernscientist</a>: Her site, <a href="http://themodernscientist.com">themodernscientist.com</a>, runs on Pelican and she was gracious enough to share where she got her theme from on <a href="https://github.com/duilio/pelican-octopress-theme">github</a>. She also shared <a href="https://github.com/modernscientist/modernscientist.github.com/blob/master/theme/css/main.css">her CSS on github</a>, which was a life saver because her CSS was not condensed.</li>
<li><a href="https://twitter.com/macdrifter">@macdrifter</a>: Gabe has shared his transition from <a href="http://www.macdrifter.com/2012/08/pelican-guide-moving-from-wordpress-and-initial-setup.html">WordPress to Pelican</a>. He has other posts on his steps to move from WP to Pelican. I've used several of his posts as stepping stones to get over some of road blocks I've hit. </li>
</ul>
<p>I hope to make the full transition in about another two weeks. But since the transitional site has gone live, I wanted to share a few thoughts on the move as things come together. </p>Did Yosemite fix it or break it?2014-10-17T13:07:58-05:002014-10-17T13:07:58-05:00Jason Verlytag:mygeekdaddy.net,2014-10-17:/2014/10/17/did-yosemite-fix-it-or-break-it/<p>Apple has released the latest release of OS X, Yosemite (10.10), to the public this week. This update to OS X is similar to last year’s iOS 7 update where a lot of visual changes have been made. Yosemite has <em>a lot</em> of visual changes, but there are …</p><p>Apple has released the latest release of OS X, Yosemite (10.10), to the public this week. This update to OS X is similar to last year’s iOS 7 update where a lot of visual changes have been made. Yosemite has <em>a lot</em> of visual changes, but there are even more changes that you can’t see. New functionality like <a href="http://www.macstories.net/tutorials/os-x-yosemite-ios-8-continuity-explained-handoff-instant-hotspot-sms-phone-relay/">Continuity & Handoff</a> or Apple’s new <a href="https://www.apple.com/ios/whats-new/icloud-drive/">iCloud Drive</a> is great, but you need to be aware of subtler changes too. </p></p>
<p>One of my new favorite apps is <a href="http://tracesof.net/uebersicht">Übersicht</a>. I’ve talked about <a href="http://mygeekdaddy.net/2014/08/10/migrating-from-geektool-to-ubersicht">moving to Übersicht</a>, but what worked on Mavericks may not work on Yosemite. One of the widgets I have running under Übersicht is a memory summary:</p>
<figure><a href="http://share.mygeekdaddy.me/uber_memory_bar_2014-10-17.png"><img src="http://share.mygeekdaddy.me/uber_memory_bar_2014-10-17.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p>But after moving from Mavericks to Yosemite’s public beta, this is what I was getting:</p>
<figure><a href="http://share.mygeekdaddy.me/broken_uber_memory_bar_2014-10-17.png"><img src="http://share.mygeekdaddy.me/broken_uber_memory_bar_2014-10-17.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p>I was perplexed on why the memory bar wasn’t working. I hadn’t physically changed my laptop by putting new/different memory. I wasn’t getting any errors or warnings about a memory problem. I ran the commands for the widget over and over again, but didn’t see any errors in the results. I did comparisons on the widgets from a back up to the one in Yosemite. I just couldn’t see where the widget had been broken from updating to Yosemite.</p>
<p>After some digging I found the issue wasn’t my laptop memory frying out, it was a change in the underlying command that Übersicht was using to pick up system information. The terminal command the memory bar uses to get the widget information was the same in both instances:</p>
<pre><code>memory_pressure && sysctl -a | grep memsize
</code></pre>
<p>The problem wasn’t in the command, but the output. Yosemite had tweaked the output of the command from what was given in Mavericks.</p>
<p><strong>Output on Mavericks:</strong></p>
<pre><code>jason-mbp:~ mygeekdaddy$ memory_pressure && sysctl -a | grep memsize
The system has 2147483648 (524288 pages with a page size of 4096).
Stats:
Pages free: 2044707
Pages purgeable: 19858
Pages purged: 131099
Swap I/O:
Swapins: 0
Swapouts: 0
Page Q counts:
Pages active: 1084310
Pages inactive: 282182
Pages speculative: 297787
Pages throttled: 0
Pages wired down: 483186
Compressor Stats:
Pages used by compressor: 0
Pages decompressed: 0
Pages compressed: 0
File I/O:
Pageins: 2719200
Pageouts: 0
System-wide memory free percentage: 87%
hw.memsize = 17179869184
hw.memsize: 17179869184
</code></pre>
<p><strong>Output on Yosemite:</strong></p>
<pre><code>jason-mbp:~ mygeekdaddy$ memory_pressure && sysctl -a | grep memsize
The system has 2147483648 (524288 pages with a page size of 4096).
Stats:
Pages free: 2044707
Pages purgeable: 19858
Pages purged: 131099
Swap I/O:
Swapins: 0
Swapouts: 0
Page Q counts:
Pages active: 1084310
Pages inactive: 282182
Pages speculative: 297787
Pages throttled: 0
Pages wired down: 483186
Compressor Stats:
Pages used by compressor: 0
Pages decompressed: 0
Pages compressed: 0
File I/O:
Pageins: 2719200
Pageouts: 0
System-wide memory free percentage: 88%
hw.memsize: 17179869184
</code></pre>
<p>Look at the last two lines from each command. This is where the widget was getting the overall memory installed value.</p>
<blockquote>
On Mavericks: <code>hw.memsize = 17179869184</code><br>
On Yosemite: <code>hw.memsize: 17179869184</code>
</blockquote>
<p>Same number, different delimiter. Seeing the results had changed, from the same command on 10.9 verus 10.10, requried me to update the script used to generate the widget. After I updated the widget to use the correct expression to pull the memory value, the widget worked identical in Mavericks and Yosemite.</p>
<h4>Lesson learned</h4>
<p>Before you think Yosemite broke something, be sure it didn’t just change something.</p>Change Yosemite Finder app sort order2014-10-16T00:00:00-05:002014-10-16T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-10-16:/2014/10/16/change-yosemite-finder-app-sort-order/<p>Apple has released the <a href="http://www.apple.com/osx/">OS X Yosemite</a> to the general public. As with all the previous released of OS X, I still think Apple has got their system file sorting wrong. <sup id="fnref:myop"><a class="footnote-ref" href="#fn:myop">1</a></sup> My brain has been, and will probably always will be, hardwired to see folders first and file second …</p><p>Apple has released the <a href="http://www.apple.com/osx/">OS X Yosemite</a> to the general public. As with all the previous released of OS X, I still think Apple has got their system file sorting wrong. <sup id="fnref:myop"><a class="footnote-ref" href="#fn:myop">1</a></sup> My brain has been, and will probably always will be, hardwired to see folders first and file second. Here's how to change Finder.app sort order in OS X Yosemite. </p>
<p>Prior to changing how Yosemite sorts 'Kind', Folders will typically get buried in a folder's contents.</p>
<figure><a href="http://share.mygeekdaddy.net/before_folder_sort_2014-09-03.png"><img src="http://share.mygeekdaddy.net/before_folder_sort_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>After you're done, sorting by 'Kind' will bring Folders to the top of the list.</p>
<figure><a href="http://share.mygeekdaddy.net/after_folder_sort_2014-09-03.png"><img src="http://share.mygeekdaddy.net/after_folder_sort_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Required Tools:</h4>
<ul>
<li>BBEdit - My go to file editor. ($)</li>
<li>Plist Editor - Part of Apple's Xcode tool set.</li>
<li>A recent back-up. <sup id="fnref:backup"><a class="footnote-ref" href="#fn:backup">2</a></sup></li>
</ul>
<h4>Update Steps:</h4>
<p>Before beginning, please-please-please back up your Mac. One of the common issues I've helped people with is fixing a corrupted file after trying to make the changes. </p>
<ol>
<li>Open Finder and navigate to /System/Library/Coreservices folder and locate the Finder application. Use Shift-Cmd-G in Finder.app and enter the path above.</li>
<li>Once the folder is open, right click on the Finder.app file and click on ‘Show Package Contents’. </li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/show_package_contents_2014-09-03.png"><img src="http://share.mygeekdaddy.net/show_package_contents_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>The package contents of the Finder.app will open like it was a folder and show additional folders and files that make up the Finder.app application.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/finder_contents_as_folder_2014-10-16_2014-10-16.png"><img src="http://share.mygeekdaddy.net/finder_contents_as_folder_2014-10-16_2014-10-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Once the package contents are opened, navigate to “Contents/Resources/English.lproj” folder.</li>
<li>Locate the file “InfoPlist.strings” file. This is the file that contains the structure on how Finder.app sorts records.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/infoplist_file_found_2014-09-03.png"><img src="http://share.mygeekdaddy.net/infoplist_file_found_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Assuming you're using BBEdit, right click on the file and select BBEdit to edit the file. Note you may get a warning when you attempt to edit the <em>Folder</em> tag.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/BBEdit_warning_2014-09-03.png"><img src="http://share.mygeekdaddy.net/BBEdit_warning_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Locate the “Folder” entry in the “InfoPlist.strings” file and add a space to Folder <em>string</em> key.</li>
</ol>
<p>Before:</p>
<figure><a href="http://share.mygeekdaddy.net/finderapp_plist_before_2014-10-16.png"><img src="http://share.mygeekdaddy.net/finderapp_plist_before_2014-10-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>After:</p>
<figure><a href="http://share.mygeekdaddy.net/finderapp_plist_after_2014-10-16.png"><img src="http://share.mygeekdaddy.net/finderapp_plist_after_2014-10-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Save the changes to the “InfoPlist.strings” file. </li>
<li>Open a Terminal and run the following command: <code>sudo killall Finder</code>. Terminal may give you a warning prior to running the command.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/termninal_warning_2014-09-03.png"><img src="http://share.mygeekdaddy.net/termninal_warning_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now when you Finder.app to look at the same folder, the Folders will come first when you sort by <em>Kind</em>. </p>
<figure><a href="http://share.mygeekdaddy.net/after_folder_sort_2014-09-03.png"><img src="http://share.mygeekdaddy.net/after_folder_sort_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Caveat on Sort Order:</h4>
<p>In my previous post on <a href="http://mygeekdaddy.net/2013/10/24/change-mavericks-finder-app-sort-order/">updating Finder.app for OS Mavericks</a>, I added an <a href="http://mygeekdaddy.net/2013/11/25/caveat-to-finder-app-sort-order/">addendum on a problem a small percentage users</a> were having with the steps above. </p>
<p>To ensure the sort order by 'Kind' will show Folders first, make sure the default Arrange By order should be <em>None</em>. The tags for other Arrange By sorts orders override the file tag changed in the steps above.</p>
<figure><a href="http://share.mygeekdaddy.net/default_sort_order_2014-09-03.png"><img src="http://share.mygeekdaddy.net/default_sort_order_2014-09-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I'm looking into ways for <em>Arrange By</em> sorting to honor the change made to Folders. I'll post an update if I find a way. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:myop">
<p>Feel to tell me why you think I'm wrong, but politely. ;-) <a class="footnote-backref" href="#fnref:myop" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:backup">
<p>The changes discussed here <em>shouldn't</em> mess up your system, but wouldn't you feel better knowing you can just make a quick restore? <a class="footnote-backref" href="#fnref:backup" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Updated image merge script2014-10-14T00:00:00-05:002014-10-14T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-10-14:/2014/10/14/updated-image-merge-script/<p>Earlier on Twitter tonight, TJ Luoma (<a href="https://twitter.com/tjluoma">@tjluoma</a>) asked about a better way to merge iOS screenshots.</p>
<blockquote>
<p>I’m assuming there is some limitation in iOS which makes it impossible to merge two full-size screenshots? Every app seems to crop them.</br>— TJ Luoma (@tjluoma) <a href="https://twitter.com/tjluoma/status/521802016138338304">October 13, 2014</a></p>
</blockquote>
<p>I had a simple …</p><p>Earlier on Twitter tonight, TJ Luoma (<a href="https://twitter.com/tjluoma">@tjluoma</a>) asked about a better way to merge iOS screenshots.</p>
<blockquote>
<p>I’m assuming there is some limitation in iOS which makes it impossible to merge two full-size screenshots? Every app seems to crop them.</br>— TJ Luoma (@tjluoma) <a href="https://twitter.com/tjluoma/status/521802016138338304">October 13, 2014</a></p>
</blockquote>
<p>I had a simple Pythonista script to do exactly what he asked. It was short, simple, and worked perfectly. </p>
<p>Until I tested it in iOS 8.</p>
<p>I wanted to test the script before sending it off, but I found that some images weren't responding the way they did in iOS 7. After a little work I got the script working again, but the more I worked with it, the more I saw limitations in the script. </p>
<ul>
<li>The script assumed only portrait screenshots.</li>
<li>The script was written just for the iPhone. </li>
<li>The script just pasted the two screen shots side by side. </li>
</ul>
<p>That's too many limitations in this age of iOS devices. So I started to look at ways to make the script more universal. The script needed to merge images from either landscape or portrait captures. The script also needed to be able to do screenshots from any iOS device. After a little work, I can up with this:</p>
<script src="https://gist.github.com/mygeekdaddy/50cda2398e29ff5bb7c0.js"></script>
<p>Sometimes when someone asks for a little help, you end up scratching you're own itch.</p>My real wish for iOS keyboards2014-10-09T15:29:52-05:002014-10-09T15:29:52-05:00Jason Verlytag:mygeekdaddy.net,2014-10-09:/2014/10/09/my-real-wish-for-ios-keyboards/<p>Call me old fashioned, but when I want to use a tool, I want to use it consistently. It’s the confidence in knowing that what I got done last time with a tool can be repeated again and again. Lately I’ve been finding things to be less and …</p><p>Call me old fashioned, but when I want to use a tool, I want to use it consistently. It’s the confidence in knowing that what I got done last time with a tool can be repeated again and again. Lately I’ve been finding things to be less and less consistent in iOS8. Notifications coming up way after the triggering event occurred, sounds not alerting me to meetings/reminders all the time, and button/control placement for apps. The best example of my issue with button placement is the introduction of 3rd party keyboards. While I love what Apple has allowed developers to create in iOS 8 related to custom keyboards, the implementation has not been as thrilling for me. </p>
<p>Take for example the four keyboards <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> I currently have installed on my iPhone (from top to bottom):</p>
<figure><a href="http://share.mygeekdaddy.me/composite_keyboard_web_2014-10-09.png"><img src="http://share.mygeekdaddy.me/composite_keyboard_web_2014-10-09.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<ul>
<li>Clean Shaven’s Clips keyboard</li>
<li>Smile Software’s TextExpander keyboard</li>
<li>iOS Emoji keyboard</li>
<li>Default iOS keyboard</li>
</ul>
<p>I love what each of them can do for me in iOS until I have to switch from one to another. Since my primary keyboard is the default iOS keyboard, my typing habits are based on that keyboard. But switching between keyboards is starting to be a pain because the keyboard selection buttom keeps moving. I’ve lined up all the keyboards and using the default iOS keyboard as a baseline of where the keyboard switching key is placed.</p>
<figure><a href="http://share.mygeekdaddy.me/keyboard_alignment_2014-10-09.png"><img src="http://share.mygeekdaddy.me/keyboard_alignment_2014-10-09.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>Notice how the key moves around quite a bit between the four different keyboards. So when I switch from one keyboard to another, I either get an extra character from the Emoji keyboard or I press the number/alt key 3 times in TextExpander. My hope is that in iOS 8.x( or 9), the keyboard switcher is moved to the outside of the keyboard. By swapping the number/alt key with the keyboard switcher, the problem goes away.</p>
<figure><a href="http://share.mygeekdaddy.me/moved_number_keyboard_2014-10-09.png"><img src="http://share.mygeekdaddy.me/moved_number_keyboard_2014-10-09.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>Maybe this will prompt me to renew my developer membership and plead my case to Apple.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
Yes, I know, just four keyboards… how pathetic. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>Making the wrong arguement about Markdown2014-10-08T00:00:00-05:002014-10-08T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-10-08:/2014/10/08/making-the-wrong-arguement-about-markdown/<p>It's funny how people keep trying to redefine what Markdown is, when the original definition is so simple:</p>
<blockquote>
<p>Thus, “Markdown” is two things: (1) a plain text formatting syntax; and (2) a software tool, written in Perl, that converts the plain text formatting to HTML. <sup id="fnref:refx3"><a class="footnote-ref" href="#fn:refx3">1</a></sup></p>
</blockquote>
<p>This is the definition …</p><p>It's funny how people keep trying to redefine what Markdown is, when the original definition is so simple:</p>
<blockquote>
<p>Thus, “Markdown” is two things: (1) a plain text formatting syntax; and (2) a software tool, written in Perl, that converts the plain text formatting to HTML. <sup id="fnref:refx3"><a class="footnote-ref" href="#fn:refx3">1</a></sup></p>
</blockquote>
<p>This is the definition given by John Gruber, one of the creators of Markdown. This is the definition that has stood since Markdown was introduced on 17 Dec 2004. In the very next sentence after defining what Markdown is, Gruber gives <a href="http://daringfireball.net/projects/markdown/syntax">a syntax page</a> "for details pertaining to Markdown’s formatting syntax." But over the past couple of months there's been quite a dust up on what people think Markdown is and what some <a href="http://commonmark.org">people think it should be</a>. The latest is an article in Ars Technica, written by Scott Gilbertson - <a href="http://arstechnica.com/information-technology/2014/10/markdown-throwdown-what-happens-when-foss-software-gets-corporate-backing/2/">Markdown throwdown: what happens when FOSS software gets corporate backing?</a>.</p>
<p>Scott goes into the history of Markdown and why a lot of us think it's an important development on how we work and write. In this part I wholeheartedly agree. Gruber has created a tool that allows me to create and save my work in simple text files and convert them into a <a href="https://itunes.apple.com/us/app/marked-2/id890031187?mt=12&uo=4" title="Marked 2">multitude of other formats</a>. But then Scott argues that "[t]here are bugs, but worse there are ambiguities and edge cases where it's unclear what should happen." He goes on to argue with the variety of editors and parsers that Markdown, a user won't get what they expect from one editor/engine to another. One of the points Scott raised was how the following text would get parsed by various Markdown engines:</p>
<div class="highlight"><pre><span></span><code>Here's a list of stuff:
* item one
* item two
* item three
</code></pre></div>
<blockquote>
<p>In fact, depending on which fork of Markdown you use, there are 15 possible ways this snippet of Markdown might be rendered.</p>
</blockquote>
<p>Here's the problem with Scott's arguement, Markdown is a tool to format plain <em>syntax</em> into HTML. Syntax implies there are rules on how the plain text needs to be written. So let's see what happens if we follow the rules. Correcting the text to meet the syntax specifications laid out by Gruber means there should be a line break when starting a list. The updated raw text should look like this:</p>
<div class="highlight"><pre><span></span><code>Here's a list of stuff:
* item one
* item two
* item three
</code></pre></div>
<p>Using the correct text, I get the following HTML output from some of my favorite Markdown editors/engines:</p>
<p><strong>Byword:</strong></p>
<div class="highlight"><pre><span></span><code><span class="nt"><p></span>Here<span class="ni">&#8217;</span>s a list of stuff:<span class="nt"></p></span>
<span class="nt"><ul></span>
<span class="nt"><li></span>item one<span class="nt"></li></span>
<span class="nt"><li></span>item two<span class="nt"></li></span>
<span class="nt"><li></span>item three<span class="nt"></li></span>
<span class="nt"></ul></span>
</code></pre></div>
<p><strong>Marked 2:</strong></p>
<div class="highlight"><pre><span></span><code><span class="nt"><p></span>Here's a list of stuff:<span class="nt"></p></span>
<span class="nt"><ul></span>
<span class="nt"><li></span>item one<span class="nt"></li></span>
<span class="nt"><li></span>item two<span class="nt"></li></span>
<span class="nt"><li></span>item three<span class="nt"></li></span>
<span class="nt"></ul></span>
</code></pre></div>
<p><strong>MultiMarkdown Composer:</strong></p>
<div class="highlight"><pre><span></span><code><span class="nt"><p></span>Here<span class="ni">&#8217;</span>s a list of stuff:<span class="nt"></p></span>
<span class="nt"><ul></span>
<span class="nt"><li></span>item one<span class="nt"></li></span>
<span class="nt"><li></span>item two<span class="nt"></li></span>
<span class="nt"><li></span>item three<span class="nt"></li></span>
<span class="nt"></ul></span>
</code></pre></div>
<p><strong>PHP Markdown 1.0.2:</strong></p>
<div class="highlight"><pre><span></span><code><span class="nt"><p></span>Here's a list of stuff:<span class="nt"></p></span>
<span class="nt"><ul></span>
<span class="nt"><li></span>item one<span class="nt"></li></span>
<span class="nt"><li></span>item two<span class="nt"></li></span>
<span class="nt"><li></span>item three<span class="nt"></li></span>
<span class="nt"></ul></span>
</code></pre></div>
<p><strong>Editorial for iOS:</strong></p>
<div class="highlight"><pre><span></span><code><span class="nt"><p></span>Here<span class="ni">&#39;</span>s some stuff:<span class="nt"></p></span>
<span class="nt"><ul></span>
<span class="nt"><li></span>item one<span class="nt"></li></span>
<span class="nt"><li></span>item two<span class="nt"></li></span>
<span class="nt"><li></span>item three<span class="nt"></li></span>
<span class="nt"></ul></span>
</code></pre></div>
<p>Huh? So besides the encoding for an apostrophe (which renders the same anyway), if I follow the rules, I get the same results. </p>
<p>Guess Markdown isn't broken after all. <sup id="fnref:refx4"><a class="footnote-ref" href="#fn:refx4">2</a></sup></p>
<div class="footnote">
<hr>
<ol>
<li id="fn:refx3">
<p><a href="http://daringfireball.net/projects/markdown/">http://daringfireball.net/projects/markdown/</a> <a class="footnote-backref" href="#fnref:refx3" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:refx4">
<p>One last point... this post was written in Markdown. <a class="footnote-backref" href="#fnref:refx4" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Using Defer Dates in OmniFocus2014-10-04T15:30:14-05:002014-10-04T15:30:14-05:00Jason Verlytag:mygeekdaddy.net,2014-10-04:/2014/10/04/using-defer-dates-in-omnifocus/<p>OmniFocus continues to be one of my must have apps. If I find out someone else uses OmniFocus, I'm more than happy to stop and compare notes on how they've setup their system. But when I speak to other OmniFocus users, or hear how others use OmniFocus, more …</p><p>OmniFocus continues to be one of my must have apps. If I find out someone else uses OmniFocus, I'm more than happy to stop and compare notes on how they've setup their system. But when I speak to other OmniFocus users, or hear how others use OmniFocus, more and more are saying they love OmniFocus but don't use dates. I can understand that a lot of personal tasks may not be time sensitive - I mean if I don't pick up the dog poop this Saturday is not the end of the world. But I have hard time believing someone who uses OmniFocus for both home and work doesn't have a time sensitive.</p>
<p>Defer Dates in OmniFocus used to be labeled Start Date. The original idea was to have a date on when you would think of starting a task. OmniFocus now uses Defer Dates is a lot more subtle ways.</p>
<blockquote>
Start dates are now defer dates. This is to more accurately capture the intent that an item shouldn't be considered until a later time—it’s been <em>deferred</em>. <sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup>
</blockquote>
<p>Here's a sample of project with two tasks, one with a Defer Date and one without.</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_using_defer_date_in_OmniFocus_2014_10_04_134807.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_using_defer_date_in_OmniFocus_2014_10_04_134807.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now if I use a Perspective (you do use Perspectives, right?) to show only Available tasks</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_using_defer_date_in_OmniFocus_2014_10_04_141148.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_using_defer_date_in_OmniFocus_2014_10_04_141148.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So when I look at the tasks I am able to work on, the task that was deffered is hidden.</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_using_defer_date_in_OmniFocus_2014_10_04_141858.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_using_defer_date_in_OmniFocus_2014_10_04_141858.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Looking at different ways to use Defer Dates, I have different meanings on the actual date based on how the context is applied to a task.</p>
<ul>
<li>Deferred Tasks: This is the best example of what the Defer Date is for. When a task or a project has gotten pushed off or delayed, but I know it will still need to get done, I can set a Defer Date and let the item sit parked in OmniFocus until I'm ready to pick it back up.</li>
<li>Waiting For: When I have a task that is waiting on someone, I'll use the Defer Date as the date that initiated the task.</li>
<li>Assigned Tasks: When a task has been assigned, whether it was to me by my boss or by me to someone else, I use the Defer Date as the date it was assigned.</li>
<li>Tickler Tasks: One of GTD's key components is a Tickler File. I use the Defer Date as a way to keep track of tasks I need to do, but know I can't do them now. </li>
</ul>
<p>In all cases I can use OmniFocus to quickly give feedback on task because I can see critical date information as part of the task.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
Excerpt from “<a href="https://itunes.apple.com/us/book/omnifocus-2-for-ipad-user/id918781067?isInPurchasedView=true&mt=11">OmniFocus 2 for iPad User Manual</a>”, The Omni Group <a href="#fnref1" rev="footnote">↩</a>
</li>
</ol>
</div>Pragmatism for the win2014-09-24T22:28:59-05:002014-09-24T22:28:59-05:00Jason Verlytag:mygeekdaddy.net,2014-09-24:/2014/09/24/pragmatism-for-the-win/<p>There are only a few blogs that I have on my <em>must read</em> list. One of them is Dr. Drang’s, <a href="http://www.leancrew.com/all-this/">And not it’s all this</a>. Dr. Drang is a kindred engineering spirit who covers in his blog on topics ranging from <a href="http://www.leancrew.com/all-this/2014/08/energy-dissipation-in-damped-vibrations/">flashbacks to my engineering classes</a>, his recent …</p><p>There are only a few blogs that I have on my <em>must read</em> list. One of them is Dr. Drang’s, <a href="http://www.leancrew.com/all-this/">And not it’s all this</a>. Dr. Drang is a kindred engineering spirit who covers in his blog on topics ranging from <a href="http://www.leancrew.com/all-this/2014/08/energy-dissipation-in-damped-vibrations/">flashbacks to my engineering classes</a>, his recent <a href="http://www.leancrew.com/all-this/2014/09/post-mortem/">facination with Eddy Cue</a>, to <a href="http://www.leancrew.com/all-this/tag/python/">great explainations on his many uses of Python</a>. Generally the good doctor and I agree on most things. </p>
<p>Until today. </p>
<p>Today I learned that the Dr. Drang is prejudice to those of us who use a <a href="http://www.leancrew.com/all-this/2014/09/shortcut-stupidity/">left sided Dock</a>. </p>
<blockquote>
They’re not like those bizarre left-side Dock people, who are a blight upon the land.
</blockquote>
<p>Like most engineers, my preference for my Dock location is pragmatic. I use a dual monitor setup at work and at home. Below is my desk in my home office. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_You%27re_right%2C_but_you%27re_wrong_2014_09_24_221109.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_You%27re_right%2C_but_you%27re_wrong_2014_09_24_221109.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>There’s a reason my home office is setup this way. Why? So it matches my office setup at work. Why? Since I spend most of my time at work on a computer I’ve setup my <a href="http://theothersideof.mygeekdaddy.net/2012/make-os-x-window-management-easier">Keyboard Maestro monitor shortcuts</a> on how my monitor setup is at at work, which happens to be on the right side of my laptop. Why? At work I’m at a fixed desk setup in praire dog country with the outlets on the left and the main return for my desk runs to the right. Therefore, the logical place for my 2nd monitor is on my right - just like at home. </p>
<p>See… pragmatic. </p>
<p>So with my double monitor setup, why in the world would I want the Dock popping up each time I move the cursor over to my second monitor? <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a></p>
<figure><a href="http://share.mygeekdaddy.me/2014-09-24_21_49_31_2014-09-24.gif"><img src="http://share.mygeekdaddy.me/2014-09-24_21_49_31_2014-09-24.gif" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:576px;" /></img></a></figure>
<p>I do however whole heartedly agree on one specific point… Yosemite <strong>needs</strong> to get the Dock position setting fixed before GM release. I’m currently running the Yosemite PB3 at home and I can’t stand that the Dock on my home computer has to be centered on the left versus in the upper left (as it should be) like on my work laptop. </p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
Because only crazy people would leave their Dock exposed all the time. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#94623" title="2014-09-30 10:19:29">Sun</a>:</strong> If its any consolation, I think its bizarre that people who are multi monitor use different resolution screens. ;)</p>
<p><strong><a href="#95609" title="2014-10-02 07:58:08">Bill Eccles</a>:</strong> Totally agree on this one, because my primary monitor is to the left of my secondary monitor. And yet there are still other good reasons to dock the Dock to the left: 1 - It's less likely to get in the way of the vertical scrollbar of a large window, and windows which have controls in them on the left side (e.g., iTunes, Mail, etc.) tend to present bigger targets which don't cause me to bang up against the edge of the screen. 2 - It is less likely to get in the way of Desktop icons, traditionally stuck into the right side of the Desktop. 3 - It's closer to the menu bar, making for a nice L-shaped command center for your Mac. 4 - It looks less like Windows (you crazy bottom Dock people...).</p>You're right, but you're wrong2014-09-24T00:00:00-05:002014-09-24T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-09-24:/2014/09/24/youre-right-but-youre-wrong/<p>There are only a few blogs that I have on my <em>must read</em> list. One of them is Dr. Drang's, <a href="http://www.leancrew.com/all-this/">And not it's all this</a>. Dr. Drang is a kindred engineering spirit who covers in his blog on topics ranging from <a href="http://www.leancrew.com/all-this/2014/08/energy-dissipation-in-damped-vibrations/">flashbacks to my engineering classes</a>, his recent <a href="http://www.leancrew.com/all-this/2014/09/post-mortem/">facination with …</a></p><p>There are only a few blogs that I have on my <em>must read</em> list. One of them is Dr. Drang's, <a href="http://www.leancrew.com/all-this/">And not it's all this</a>. Dr. Drang is a kindred engineering spirit who covers in his blog on topics ranging from <a href="http://www.leancrew.com/all-this/2014/08/energy-dissipation-in-damped-vibrations/">flashbacks to my engineering classes</a>, his recent <a href="http://www.leancrew.com/all-this/2014/09/post-mortem/">facination with Eddy Cue</a>, to <a href="http://www.leancrew.com/all-this/tag/python/">great explainations on his many uses of Python</a>. Generally the good doctor and I agree on most things. </p>
<p>Until today. </p>
<p>Today I learned that the Dr. Drang is prejudice to those of us who use a <a href="http://www.leancrew.com/all-this/2014/09/shortcut-stupidity/">left sided Dock</a>. </p>
<blockquote>
<p>They’re not like those bizarre left-side Dock people, who are a blight upon the land.</p>
</blockquote>
<p>Like most engineers, my preference for my Dock location is pragmatic. I use a dual monitor setup at work and at home. Below is my desk in my home office. </p>
<figure><a href="http://share.mygeekdaddy.net/_img_BLOGX_You%27re_right%2C_but_you%27re_wrong_2014_09_24_221109.png"><img src="http://share.mygeekdaddy.net/_img_BLOGX_You%27re_right%2C_but_you%27re_wrong_2014_09_24_221109.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>There's a reason my home office is setup this way. Why? So it matches my office setup at work. Why? Since I spend most of my time at work on a computer I've setup my <a href="http://theothersideof.mygeekdaddy.net/2012/make-os-x-window-management-easier">Keyboard Maestro monitor shortcuts</a> on how my monitor setup is at at work, which happens to be on the right side of my laptop. Why? At work I'm at a fixed desk setup in praire dog country with the outlets on the left and the main return for my desk runs to the right. Therefore, the logical place for my 2nd monitor is on my right - just like at home. </p>
<p>See... pragmatic. </p>
<p>So with my double monitor setup, why in the world would I want the Dock popping up each time I move the cursor over to my second monitor? <sup id="fnref:sanepeople"><a class="footnote-ref" href="#fn:sanepeople">1</a></sup></p>
<figure><a href="http://share.mygeekdaddy.net/2014-09-24_21_49_31_2014-09-24.gif"><img src="http://share.mygeekdaddy.net/2014-09-24_21_49_31_2014-09-24.gif" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:576px;" /></img></a></figure>
<p>I do however whole heartedly agree on one specific point... Yosemite <strong>needs</strong> to get the Dock position setting fixed before GM release. I'm currently running the Yosemite PB3 at home and I can't stand that the Dock on my home computer has to be centered on the left versus in the upper left (as it should be) like on my work laptop. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:sanepeople">
<p>Because only crazy people would leave their Dock exposed all the time. <a class="footnote-backref" href="#fnref:sanepeople" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>A better way to view page sources in iOS2014-09-22T23:03:22-05:002014-09-22T23:03:22-05:00Jason Verlytag:mygeekdaddy.net,2014-09-22:/2014/09/22/a-better-way-to-view-page-sources-in-ios/<p>With release of iOS 8, the number of imaginative apps that have come out in the last couple of days has been amazing. One of the newly touted apps, <a href="https://itunes.apple.com/us/app/view-source-html-javascript/id917660039?mt=8&uo=4" title="view source">View Source</a>, is a mix of app and iOS extension that can let a user view the page source of a …</p><p>With release of iOS 8, the number of imaginative apps that have come out in the last couple of days has been amazing. One of the newly touted apps, <a href="https://itunes.apple.com/us/app/view-source-html-javascript/id917660039?mt=8&uo=4" title="view source">View Source</a>, is a mix of app and iOS extension that can let a user view the page source of a web page on their iOS device. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_View_source_in_iOS_2014_09_22_223210.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_View_source_in_iOS_2014_09_22_223210.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>I worked with View Source for a bit over the weekend, but found getting the raw HTML from View Source to an editor app to be a hassle. Federico did a <a href="http://www.macstories.net/reviews/view-source-code-in-safari-with-an-action-extension/">review on View Source</a> and he came to some of the same conclusions as I did.</p>
<blockquote>
I wish that View Source could do more. Notably, there is no support for search or browsing of specific HTML tags, which combined with the lack of line-wrapping makes it difficult to read source code as you need to constantly scroll horizontally on the screen (especially a problem on the iPhone’s smaller screen in portrait mode). I’m hoping that a text reflow mode will be added soon, and I wouldn’t mind the more advanced options for viewing source code found in Mac apps such as Coda.
</blockquote>
<p>Looking at the potential of View Source, I started thinking there had to be a better way to do this in iOS.</p>
<h4>Doing it my own way</h4>
<p>In all the gushing over iOS extensions, I think we (or at least I did) forgot our roots in iOS automation. Most iOS apps have a native URL that will allow you to open the app from Safari. One of my favorite apps is <a href="https://itunes.apple.com/us/app/textastic-code-editor-for/id550156166?mt=8&uo=4" title="Textastic">Textastic</a>, can <a href="http://www.textasticapp.com/v4/manual/x-callback-url.html">be used to open a webpage to see the source code</a>. </p>
<blockquote>
In addition to <em>x-callback-url</em> support, the textastic:// scheme can be used to easily download the server response of HTTP URLs.
You can use this feature to <strong>view the source code of a website</strong> or download files into Textastic.
This is what you need to do:
<ul>
<li>Make sure your iPad or iPhone has an active internet connection</li>
<li>Open a website in Safari or another browser app like Chrome</li>
<li>Tap on the address bar</li>
<li>Replace http:// with textastic://</li>
<li>Hit Return</li>
<li>Textastic will open and start to download the file at the URL. It will be saved to the root directory in the local file system. When the file is downloaded, it will be opened in the editor.</li>
</ul>
</blockquote>
<p>Now I knew there should be a way to automate viewing a page source with my existing tools. The goal was to find a workflow to take the current URL in Safari, push the URL into Textastic, and do it without having to manually edit the URL address. </p>
<h4>First attempt</h4>
<p>The first way I tried doing this was to use a bookmarklet to parse the URL with a bookmarklet and send it to Textastic. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a></p>
<pre><code>javascript:window.location='textastic://'+encodeURIComponent(window.location.host)+'/'+encodeURIComponent(window.location.pathname);
</code></pre>
<p>No matter how I tweaked it, Textastic would not open with the bookmarklet. All I got was Safari opening up Textastic. I’m not sure if this was a limitation of how Safari was trying to parse the URL from the bookmarklet or if Textastic wasn’t responding to an indirect call from Safari - aka sandboxing. </p>
<h4>Second time wins</h4>
<p>Since the direct the method wasn’t working, I fell back on the go to app for iOS automation, Pythonista. I used a similar technique to get the URL to Textastic that I’ve used to <a href="http://mygeekdaddy.net/2014/02/16/getting-pythonista-to-return-text-back-to-drafts/">pass Safari information to Drafts</a>. </p>
<p>First step is to use a bookmarklet to pass the current URL information to Pythonista: </p>
<pre><code>javascript:window.location='pythonista://ShowSource?action=run&argv='+encodeURIComponent(window.location.host)+'&argv='+encodeURIComponent(window.location.pathname)
</code></pre>
<p>The second step is to use a Pythonista script to pull the two variables passed from the bookmarklet and join them into a URL to pass to Textastic:</p>
<pre><code>import webbrowser
import sys
url = sys.argv[1]
path = sys.argv[2]
webbrowser.open('textastic://'+url+'/'+path)
</code></pre>
<p>With one click the URL is passed to Textastic and it opens up with the raw page source HTML. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_View_source_in_iOS_2014_09_22_220248.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_View_source_in_iOS_2014_09_22_220248.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:400px;" class="aligncenter size-full" /></img></a></figure>
<p>Now with the HTML file in Textastic, I have the full resources of Textastic to work with the information as I need. </p>
<hr>
<p>2014–09–24 Update: I got two responses on getting a javascript bookmarklet to open a URL directly from Safari to Textastic. </p>
<p>A comment from ‘Architect’ on the post shared the following:</p>
<pre><code>javascript:(function()%7Blocation.href='textastic'+location.href.substring(4);%7D)();
</code></pre>
<p>The other one was a reply via Twitter from Phillip Gruneich (<a href="https://twitter.com/Pgruneich">@Pgruneich</a>) on <a href="http://philgr.com/blog/review-2013-source-codes-in-textastic">his blog post</a> of the same topic:</p>
<pre><code>javascript:location.href='textastic'+location.href.substring(4)
</code></pre>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
The javascript needs to be in two parts, so the URL passed to Textastic drops the <em>http://</em>. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#92693" title="2014-09-24 22:35:20">Jason.Verly</a>:</strong> I knew there would be a way to get a javascript bookmarklet to work! Thx for passing this along. I'll make an update to the post shortly.</p>
<p><strong><a href="#92199" title="2014-09-23 11:36:31">Architect</a>:</strong> This bookmarklet works for me <code>javascript:(function()%7Blocation.href='textastic'+location.href.substring(4);%7D)();</code></p>Setting default Defer/Due time on iOS2014-09-21T22:19:41-05:002014-09-21T22:19:41-05:00Jason Verlytag:mygeekdaddy.net,2014-09-21:/2014/09/21/setting-default-deferdue-time-on-ios/<p>For many a geek, last week felt like an early Christmas. Apple released the lastest verion of iOS and many developers released updates to their flagship applications for iOS 8. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> One of my most anticipated apps was Omnigroup’s update to OmniFocus for the iPad. The updated app hit …</p><p>For many a geek, last week felt like an early Christmas. Apple released the lastest verion of iOS and many developers released updates to their flagship applications for iOS 8. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> One of my most anticipated apps was Omnigroup’s update to OmniFocus for the iPad. The updated app hit all the right buttons:</p>
<ul>
<li>Consistent UI across all three platforms - iPhone, iPad and Mac.</li>
<li>Sync perspectives - both Context and Project based from Mac [Pro version].</li>
<li>An extension for Notification Center to show all tasks due today.</li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Change_OmniFocus_Start-Due_times_2014_09_21_195958.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Change_OmniFocus_Start-Due_times_2014_09_21_195958.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>With all of the updates there are two things you still can’t do directly from the iPad:</p>
<ul>
<li>You can’t change the default Defer/Start time.</li>
<li>You can’t change the default Due time.</li>
</ul>
<p>These two settings are availalbe on OmniFocus for Mac, but not from an iOS device. I had a couple of people ask if/how they could make these changes from just an iOS device. While you can’t make the change directly from the Preferences, there are two configuration URL’s you can use to change the default times on your iOS device. </p>
<h4>Default Due Date</h4>
<p>The Due Date is what will trigger OmniFocus to state that a task is due or overdue. The URL to modify the default due time is: </p>
<blockquote>
omnifocus:///change-setting?DefaultDueTime=12:00
</blockquote>
<p>To change the default due time to 5pm, you could click the link below on your iPad or iPhone:</p>
<p><a href="omnifocus:///change-setting?DefaultDueTime=17:00">omnifocus:///change-setting?DefaultDueTime=17:00</a> </p>
<p>To update the default due time to anything else, just change time on the URL to any other 24 hour time stamp. </p>
<h4>Default Start/Defer Date</h4>
<p>The Defer Date (previously listed as Start Time) is what OmniFocus uses to hide tasks from “available” task lists. So if you defer a task for 1 week, you won’t see it in your available tasks for another week. The URL to modify the default defer time is:</p>
<blockquote>
omnifocus:///change-setting?DefaultStartTime=12:00
</blockquote>
<p>To change the default Defer Date to 7am, you could click the link below on your iPhone or iPad.</p>
<p><a href="omnifocus:///change-setting?DefaultStartTime=07:00">omnifocus:///change-setting?DefaultStartTime=07:00</a> <a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a></p>
<p>Like the Default Due data change, adjust the 24h time stamp in the URL above to change the Defer Date to be whatever you want it to be. </p>
<p>To change the Due time or Defer time to something you want, edit the URL in a text editor on your iOS device (e.g. Drafts), copy the URL and paste it into the address bar in Safari. Your iOS device will recognize the URL and request OmniFocus to make the change. OmniFocus will open and ask you to confirm the change. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Change_OmniFocus_Start-Due_times_2014_09_21_221632.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Change_OmniFocus_Start-Due_times_2014_09_21_221632.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now all new tasks will default to 7:00am as defer time. </p>
<h4>Other Configuration Links</h4>
<p><a href="http://braintags.com">Braintags.com</a> has a list of some other <a href="http://braintags.com/blog/2014/05/omnifocus-2-configuration/">OmniFocus configuration URL’s</a> to update OmniFocus on your iOS device.Note not all of these configuration URL’s will work for iOS versions of OmniFocus. <a href="#fn-3" id="fnref-3" title="see footnote" class="footnote">[3]</a></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
I guess there was a new iPhone too. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">
Special thanks to Jason Warren (<a href="https://twitter.com/JasonConnects">@JasonConnects</a>) for sharing the Default Start Time URL. <a href="#fnref-2" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-3">
If the configuration URL doesn’t work in iOS, it will <em>generally</em> not doing anything to your OmniFocus setup. YMMV. <a href="#fnref-3" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>Setting Default Defer/Due time in OmniFocus2014-09-21T00:00:00-05:002014-09-21T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-09-21:/2014/09/21/setting-default-deferdue-time-in-omnifocus/<p>For many a geek, last week felt like an early Christmas. Apple released the lastest verion of iOS and many developers released updates to their flagship applications for iOS 8. <sup id="fnref:iphone6"><a class="footnote-ref" href="#fn:iphone6">1</a></sup> One of my most anticipated apps was Omnigroup's update to OmniFocus for the iPad. The updated app hit all …</p><p>For many a geek, last week felt like an early Christmas. Apple released the lastest verion of iOS and many developers released updates to their flagship applications for iOS 8. <sup id="fnref:iphone6"><a class="footnote-ref" href="#fn:iphone6">1</a></sup> One of my most anticipated apps was Omnigroup's update to OmniFocus for the iPad. The updated app hit all the right buttons:</p>
<ul>
<li>Consistent UI across all three platforms - iPhone, iPad and Mac.</li>
<li>Sync perspectives - both Context and Project based from Mac [Pro version].</li>
<li>An extension for Notification Center to show all tasks due today.</li>
</ul>
<figure><a href="http://share.mygeekdaddy.net/_img_BLOGX_Change_OmniFocus_Start-Due_times_2014_09_21_195958.png"><img src="http://share.mygeekdaddy.net/_img_BLOGX_Change_OmniFocus_Start-Due_times_2014_09_21_195958.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>With all of the updates there are two things you still can't do directly from the iPad:</p>
<ul>
<li>You can't change the default Defer/Start time.</li>
<li>You can't change the default Due time.</li>
</ul>
<p>These two settings are availalbe on OmniFocus for Mac, but not from an iOS device. I had a couple of people ask if/how they could make these changes from just an iOS device. While you can't make the change directly from the Preferences, there are two configuration URL's you can use to change the default times on your iOS device. </p>
<h4>Default Due Date</h4>
<p>The Due Date is what will trigger OmniFocus to state that a task is due or overdue. The URL to modify the default due time is: </p>
<blockquote>
<p>omnifocus:///change-setting?DefaultDueTime=12:00</p>
</blockquote>
<p>To change the default due time to 5pm, you could click the link below on your iPad or iPhone:</p>
<p><a href="omnifocus:///change-setting?DefaultDueTime=17:00">omnifocus:///change-setting?DefaultDueTime=17:00</a> </p>
<p>To update the default due time to anything else, just change time on the URL to any other 24 hour time stamp. </p>
<h4>Default Start/Defer Date</h4>
<p>The Defer Date (previously listed as Start Time) is what OmniFocus uses to hide tasks from "available" task lists. So if you defer a task for 1 week, you won't see it in your available tasks for another week. The URL to modify the default defer time is:</p>
<blockquote>
<p>omnifocus:///change-setting?DefaultStartTime=12:00</p>
</blockquote>
<p>To change the default Defer Date to 7am, you could click the link below on your iPhone or iPad.</p>
<p><a href="omnifocus:///change-setting?DefaultStartTime=07:00">omnifocus:///change-setting?DefaultStartTime=07:00</a> <sup id="fnref:specthx"><a class="footnote-ref" href="#fn:specthx">2</a></sup></p>
<p>Like the Default Due data change, adjust the 24h time stamp in the URL above to change the Defer Date to be whatever you want it to be. </p>
<p>To change the Due time or Defer time to something you want, edit the URL in a text editor on your iOS device (e.g. Drafts), copy the URL and paste it into the address bar in Safari. Your iOS device will recognize the URL and request OmniFocus to make the change. OmniFocus will open and ask you to confirm the change. </p>
<figure><a href="http://share.mygeekdaddy.net/_img_BLOGX_Change_OmniFocus_Start-Due_times_2014_09_21_221632.png"><img src="http://share.mygeekdaddy.net/_img_BLOGX_Change_OmniFocus_Start-Due_times_2014_09_21_221632.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now all new tasks will default to 7:00am as defer time. </p>
<h4>Other Configuration Links</h4>
<p><a href="http://braintags.com">Braintags.com</a> has a list of some other <a href="http://braintags.com/blog/2014/05/omnifocus-2-configuration/">OmniFocus configuration URL's</a> to update OmniFocus on your iOS device.Note not all of these configuration URL's will work for iOS versions of OmniFocus. <sup id="fnref:ymmv"><a class="footnote-ref" href="#fn:ymmv">3</a></sup></p>
<div class="footnote">
<hr>
<ol>
<li id="fn:iphone6">
<p>I guess there was a new iPhone too. <a class="footnote-backref" href="#fnref:iphone6" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:specthx">
<p>Special thanks to Jason Warren (<a href="https://twitter.com/JasonConnects">@JasonConnects</a>) for sharing the Default Start Time URL. <a class="footnote-backref" href="#fnref:specthx" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:ymmv">
<p>If the configuration URL doesn't work in iOS, it will <em>generally</em> not doing anything to your OmniFocus setup. YMMV. <a class="footnote-backref" href="#fnref:ymmv" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Making the move to FastMail2014-09-19T00:00:00-05:002014-09-19T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-09-19:/2014/09/19/making-the-move-to-fastmail/<p>I recently wrapped a move off of various email platforms to <a href="https://www.fastmail.fm/">FastMail</a>. As I wrapped this up, I tweeted</p>
<blockquote>
<p>Google services dropped: <br>
☒ Calendar <br>
☒ Contacts <br>
☐ Email </p>
<p>The last one is today’s project.</br>— Jason Verly (@mygeekdaddy) <a href="https://twitter.com/mygeekdaddy/status/506532852851159041">September 1, 2014</a></p>
</blockquote>
<p>The response I got back on that was surprising since I thought …</p><p>I recently wrapped a move off of various email platforms to <a href="https://www.fastmail.fm/">FastMail</a>. As I wrapped this up, I tweeted</p>
<blockquote>
<p>Google services dropped: <br>
☒ Calendar <br>
☒ Contacts <br>
☐ Email </p>
<p>The last one is today’s project.</br>— Jason Verly (@mygeekdaddy) <a href="https://twitter.com/mygeekdaddy/status/506532852851159041">September 1, 2014</a></p>
</blockquote>
<p>The response I got back on that was surprising since I thought I was the last kid on the block to make the move.</p>
<p>So why did I make the move? It's funny how the little things get under your skin. The most recent thing that has been under my skin has been my email, contacts and calendars. Over time I've picked up several email accounts, some them by choice and some of them by force. I sat down one night to do a weekly review and realized how ridiculous it was to have slog through multiple accounts. So I created a project that had a very simple outcome...</p>
<p><strong>Move email to single account</strong></p>
<!--more-->
<h4>Gaining my sanity</h4>
<p>Looking around at the various accounts I had I orignally thought it was pretty straight forward decision to push everything to Google. Gmail synced nicely on my iPhone and could be setup easily on my Mac for contacts and calendars. As I started settling in I got a quick <a href="https://www.google.com/intl/en/policies/terms/">terms of service</a> update from Google. It's funny how fast we ignore the terms of services or user agreements computer companies throw at these days. We eagerly hit 'Yes', 'Ok', or 'Accept' without really know what we're getting ourselves into. On a whim I actually sat down and read through them. This is the section that got me:</p>
<blockquote>
<p>When you upload, submit, store, send or receive content to or through our Services, you give Google (and those we work with) a worldwide license to use, host, store, reproduce, modify, create derivative works (such as those resulting from translations, adaptations or other changes we make so that your content works better with our Services), communicate, publish, publicly perform, publicly display and distribute such content. The rights you grant in this license are for the limited purpose of operating, promoting, and improving our Services, and to develop new ones. This license continues even if you stop using our Services (for example, for a business listing you have added to Google Maps). Some Services may offer you ways to access and remove content that has been provided to that Service. Also, in some of our Services, there are terms or settings that narrow the scope of our use of the content submitted in those Services. Make sure you have the necessary rights to grant us this license for any content that you submit to our Services.</p>
</blockquote>
<p>Huh...</p>
<p>I had just gone toe to toe with a group that had "borrowed" a photo of mine and I was a little more sensative to the idea that Google could also "borrow" my content. I had legitimate concerns that if I emailed a great shot of mine to share with my family, it looked like Google to grab that picture and use it for themselves. That was not something I was willing to put up with for free email. </p>
<h4>What I was looking for</h4>
<p>So I set off to look at alternatives other than the big three (Gmail, Yahoo, Hotmail) with some specific requirements: </p>
<ul>
<li>I wanted to be able to use one of my personal domains with the mail host to have the exact email address I wanted. </li>
<li>The service had to use standard IMAP so I didn't experience the same issues I ran into with Gmail.</li>
<li>The service had to include an address book for my exported contacts and synced to my iPhone and Mac.</li>
<li>The service had to include an calendar that could be viewed and updated from my iPhone and Mac.</li>
</ul>
<p>I looked at using the email serviced provided by my hosting company, but some of the key items were missing and I wanted a solution that segregated my personal information. </p>
<h4>What I found</h4>
<p>After looking around I decided on FastMail. While I didn't find all my requirements with FastMail, I did find a lot of things that made me feel good about my choice:</p>
<ul>
<li>FastMail uses a secure connection for <strong>everything</strong>. If you want to browse their pricing options or review their support information, you will be on a https connection. So now I know I'm on a secure connection from start to finish when I use their web based mail client. </li>
<li>FastMail of course has email, but it easily allowed me to use my custom domain for email addresses. In addition to the custom domain, they also allow for aliases on your primary FastMail account. So now when I need to give an email address out publicly, I can give them my "spam" address and have mail rules move messages to a separate folder for less frequent review. </li>
<li>FastMail offers both Calendars and Contacts. Calendars are CalDav format and sync easily with my Mac and iPhone. Contacts are available in the web based mail client, but they don't have a way to sync to my Mac or iPhone. While Contact syncing was originally one of my requirements, it wasn't a make or break item.</li>
</ul>
<h4>Bonus features</h4>
<p>Beyond the features that <em>had</em> to be met, FastMail has some additional features that make it stand above </p>
<ul>
<li>Web Client: The web client from FastMail was the surprising bonus. When you open the web client you don't feel like it's a web page. The client has <a href="https://www.fastmail.fm/help/receive/kbshortcuts.html#mail">keyboard shortcuts</a>, <a href="https://www.fastmail.fm/help/receive/folders.html">folder management</a>, and great <a href="https://www.fastmail.fm/help/receive/search.html">search capabilities</a>. </li>
<li>Personalities: <a href="https://www.fastmail.fm/help/send/identities.html">Personalities</a> was another bonus feature that was extremely helpful while making the switch - in fact it still is. From the FastMail help:</li>
</ul>
<blockquote>
<p>A personality allows you to send email and make it appear to come from a different 'From' address. For instance, you can setup a 'Work' personality and an 'ISP' personality, and send email and make it appear to come from those addresses.</p>
</blockquote>
<p>So while I was transitioning to my inbox on FastMail, I could continue to converse with people as if I was on my old email. Look for more on this functionality soon. </p>
<ul>
<li><a href="https://www.fastmail.fm/help/technical/sieve.html">Sieve Filter Language</a>: This is the untapped potential of FastMail. FastMail has a visual app (kind of like smart lists in OS X) to setup mail rules in the web client, but FastMail also allow users to setup mail rules directly in a scripting language called <a href="http://tools.ietf.org/html/rfc5228">Sieve</a>. This can lead to some powerful rules on the ways you want to manage your incoming email. <sup id="fnref:svfiltmd"><a class="footnote-ref" href="#fn:svfiltmd">2</a></sup></li>
</ul>
<h4>Final Setup</h4>
<p>After the move to FastMail I found I had to tweak a couple of things in my setup. Here's how everything has settled down at this point: </p>
<p><strong>Email:</strong> My email setup is pretty simple since it's down to one inbox. </p>
<ul>
<li>iPhone: I use Dispatch for email because it can so easily hand off messages to other apps, like OmniFocus. In fact I use Dispatch on my iPad too because of the its great handoff features. </li>
<li>Mac: I use Mail.app as my default email program. This is temporary until I can move back to Outlook when I've finally closed a few more accounts. </li>
</ul>
<p><strong>Calendar:</strong> Calendars are one of the items I had to switch up to meet the real world. </p>
<ul>
<li>Personal Calendar: This is on FastMail with syncing back to my Mac and iOS devices. I use Fantastical on my Mac and iOS devices.</li>
<li>Shared Calendar: I have shared calendar with my family and that resides on iCloud. Ditto again with Fantastical.</li>
</ul>
<p><strong>Contacts:</strong> Contacts was one of the items I had to compromise on. </p>
<ul>
<li>FastMail: Contacts on FastMail are used for mailing in the web client and a "backup" of my contacts. </li>
<li>iCloud: Since FastMail Contacts don't sync back to my Mac or iOS device, I've put them into iCloud. Apple seems to be the least likely of the big three to potentially spam my Contacts list and has made sense to keep them there for integration with other core OS X and iOS apps. <sup id="fnref:gtdbackup"><a class="footnote-ref" href="#fn:gtdbackup">1</a></sup> </li>
</ul>
<hr>
<p>Update 2014-09-17: As I was writing this post, Gabe and Erik did a great job breaking the ice on FastMail with their latest <a href="http://technicaldifficulties.us/episodes/079-exploring-fastmail">Technical Difficulties</a> podcast. It's an easy listen for another perspective on moving over to FastMail. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:gtdbackup">
<p>I have a recurring task in OmniFocus to back up my iCloud contacts to FastMail every 2 months. It takes 5 minutes and gives me peace of mind. <a class="footnote-backref" href="#fnref:gtdbackup" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:svfiltmd">
<p>Hat tip to <a href="https://twitter.com/modernscientist">@modernscientist</a> for sharing with me <a href="https://www.evernote.com/shard/s3/sh/4852afc1-3d3d-4b0e-a7ce-3b30a16f49d4/e38095374023723002a4ec6313e2d6cf">some examples</a> on setting up seive filtering. <a class="footnote-backref" href="#fnref:svfiltmd" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Text Expander 3 creates two classes of apps2014-09-17T23:33:53-05:002014-09-17T23:33:53-05:00Jason Verlytag:mygeekdaddy.net,2014-09-17:/2014/09/17/text-expander-3-creates-two-classes-of-apps/<p>iOS 8 is out and so are a slew of new apps. One of the app updates I was looking forward to the most was Smile Software’s <a href="https://itunes.apple.com/us/app/textexpander-3-+-custom-keyboard/id917416298?mt=8&uo=4" title="text expander">Text Expander 3</a> (TE3) for iOS. Text Expander is one of my <em>must have</em> apps on both my Mac and on my …</p><p>iOS 8 is out and so are a slew of new apps. One of the app updates I was looking forward to the most was Smile Software’s <a href="https://itunes.apple.com/us/app/textexpander-3-+-custom-keyboard/id917416298?mt=8&uo=4" title="text expander">Text Expander 3</a> (TE3) for iOS. Text Expander is one of my <em>must have</em> apps on both my Mac and on my iOS devices. So when Smile announced they were also going to add a custom keyboard for iOS 8, I was excited to see what they could do. </p>
<p>And Smile did not disappoint.</p>
<p>But what you do need to be aware of is there are now two levels of support for TE3 and it uses its custom keyboard to expand snippets. The biggest difference is the ability to run Fillin Snippets. Fillin Snippets basically allows you to fill in the blank information you want inserted into predefined text block. This means we have two classes of apps in iOS 8 now:</p>
<p><strong>Fill-in Snippet Apps:</strong> Using one of my favorite GTD snippets that creates follow up tasks using a Fillin Snippet. The snippet asks who the task refers and what I’m supposed to be following up on. Using this snippet in an app with Fillin Snippets enabled, like Drafts, let’s me do this in iOS:</p>
<figure><a href="http://share.mygeekdaddy.me/fu_gtd_te3_2014-09-17.gif"><img src="http://share.mygeekdaddy.me/fu_gtd_te3_2014-09-17.gif" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p><strong>Normal Snippet Apps:</strong> Applications in iOS 8 that have don’t have Fillin Snippets enabled, but have general TE snippets enabled, work just like they did in iOS 7. However, when you try to use a Fillin Snippet in these apps they don’t work as expected. Using the same fill-in snippet in <a href="https://itunes.apple.com/us/app/byword/id482063361?mt=8&uo=4" title="byword">Byword</a>, the snippet runs and then just pastes the snippet text into the document. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a></p>
<figure><a href="http://share.mygeekdaddy.me/byword_fu_gtd_2014-09-17.gif"><img src="http://share.mygeekdaddy.me/byword_fu_gtd_2014-09-17.gif" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p>Big difference. </p>
<p>The gap of what snippets I can run with a Fillin Snippet enabled app, like <a href="https://itunes.apple.com/us/app/drafts-for-ipad-quickly-capture/id542797283?mt=8&uo=4" title="drafts">Drafts</a>, has closed substantially over what I was previously only able to do on my Mac. The one downside to TE3 is you won’t know whether or not an app has adopted Fillin Snippets from your iOS device. Smile has a running list of that use TE snippets and those that also are enabled to use Fillin Snippets. Look for apps like this:</p>
<figure><a href="http://share.mygeekdaddy.me/TextExpander_touch__iOS_Typing_Shortcuts_for_iPhone_and_iPad_2014-09-17.png"><img src="http://share.mygeekdaddy.me/TextExpander_touch__iOS_Typing_Shortcuts_for_iPhone_and_iPad_2014-09-17.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p><a href="http://www.smilesoftware.com/apps/">Text Expander 3 enabled apps</a></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
This happens regardless if <a href="http://smilesoftware.com/help/touch3/intro.html#keyboard">Full Access is enabled</a> for the keyboard. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>Tail wagging the dog in iOS development2014-09-14T21:43:01-05:002014-09-14T21:43:01-05:00Jason Verlytag:mygeekdaddy.net,2014-09-14:/2014/09/14/tail-wagging-the-dog-in-ios-development/<p>The latest round of Apple OS testing has been a unique challenge for me. For the past couple of years I would happily put the beta versions of OS X and iOS on to a device and stumble through all my apps that would break or not work properly. So …</p><p>The latest round of Apple OS testing has been a unique challenge for me. For the past couple of years I would happily put the beta versions of OS X and iOS on to a device and stumble through all my apps that would break or not work properly. So when iOS 8 came out I started down the same path, but then I found too many of my <em>must have</em> apps weren’t working. Ditto with the first couple rounds of Yosemite. So this time I decided to sit back and wait for the final release just like everyone else. </p>
<p>Except everyone else seems to be running the iOS 8 and Yosemite betas like they’re ready for prime time. I saw people complaining in forums, Twitter, and in my personal life about all the problems trying to run the betas on their day to day machines. This reached a crescendo when Omnigroup released a recent patch for OmniFocus for iPhone:</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_OmniFocus_patch_2014_09_14_172013.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_OmniFocus_patch_2014_09_14_172013.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:300px;" class="aligncenter size-full" /></img></a></figure>
<p>Wow!</p>
<p>Omnigroup releases a patch for OmniFocus for iPhone that will break the app for the majority of its users so a minority of its users can use beta software. While I understand the need to test features as iOS 8 comes out, releasing a patch to what is deemed an iOS 7 app, for a release of iOS that is clearly labeled beta, seems backwards. </p>
<p>The problem is that Omnigroup’s flub with OmniFocus for iPhone was just the most egregious example of handling an iOS 7 app against iOS 8 beta users. I’ve had several other apps either disable features or note that something was broken in the app because of making amends to please iOS 8 users. The best place to look at the position this has put developers is in the feedback they get in MAS or iTunes app store. </p>
<blockquote>
1 star - App crashes on iOS 8, please fix!!!
</blockquote>
<p>We are now seeing the tail wagging the dog in iOS app development. Sadly though, Apple is the one walking the dog and not paying attention.</p>
<p>Update: 2014-09-15</p>
<p>Omnigroup's Ken Case sent this tweet with an update on the OmniFocus for iPhone patch.</p>
<blockquote>
<p>Our apologies! OmniFocus for iPhone version 2.3.1 not meant for iOS 7; fix coming in v2.3.1: <a href="http://t.co/14xXPvhVAF">http://t.co/14xXPvhVAF</a><p>— Ken Case (@kcase) <a href="https://twitter.com/kcase/status/511506831982608384">September 15, 2014</a></p>
</blockquote>Melting the generation gap2014-09-13T00:00:00-05:002014-09-13T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-09-13:/2014/09/13/melting-the-generation-gap/<p>God bless my family genetics because my grandmother is turning 95 years old in two weeks. She's still as sharp as I can remember and gets around enought to still help with the fall canning with 4 of my aunts. So when her aged Dell computer finally died the family …</p><p>God bless my family genetics because my grandmother is turning 95 years old in two weeks. She's still as sharp as I can remember and gets around enought to still help with the fall canning with 4 of my aunts. So when her aged Dell computer finally died the family wanted to get her something to continue to keep in touch with her friends and family. The final choice was on a refurbished retina iPad (3rd Gen). I was nominated to get the iPad setup and deliver it to her after I was done. </p>
<p>So earlier today I dropped off the iPad to Grandma and sat down to show her the basics of how to use it. She asked a few questions and got the hang of it pretty quick. One of my aunts was at the house and asked me a question, so I stepped into the kitchen to let Grandma use the iPad a bit on her own. </p>
<p>When I got back I saw the most wonderful moment a dad could ever see. My 9y old son saw Grandma struggling to figure something out on the iPad, so he patiently sat down with her to show her how to use it. He answered her questions, showed her how to use the basic apps like Calendar, Mail, and Safari. They went on for 10-15 minutes until my youngest interrupted them to see what was going on. I'm still kicking myself for not getting a picture of the two them working together on her iPad. </p>
<blockquote>
<p>I tried to explain to my Grandma why she had a U2 album on her brand new iPad.</p>
<p>She didn't buy it. \<<em>rimshot</em>></p>
</blockquote>
<p>As I drove back home I was still amazed that something like an iPad could break down such a wide generational gap.</p>So who is the iPhone 6 for?2014-09-10T10:52:50-05:002014-09-10T10:52:50-05:00Jason Verlytag:mygeekdaddy.net,2014-09-10:/2014/09/10/so-who-is-the-iphone-6-for/<div class="no_form"><a href="http://share.mygeekdaddy.me/hero_large_2014-09-10.png"><img src="http://share.mygeekdaddy.me/hero_large_2014-09-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;box-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;" /></img></a></div>
<p>So the iPhone 6 and 6 Plus were announced yesterday. I followed along with the live stream (when it was working) and the live blog on Engadget. MacStories.net has a great <a href="http://www.macstories.net/news/iphone-6-and-iphone-6-plus-our-complete-overview/">summary of the iPhone 6 and 6 Plus</a>. After reading the review, I have to say I do …</p><div class="no_form"><a href="http://share.mygeekdaddy.me/hero_large_2014-09-10.png"><img src="http://share.mygeekdaddy.me/hero_large_2014-09-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;box-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;" /></img></a></div>
<p>So the iPhone 6 and 6 Plus were announced yesterday. I followed along with the live stream (when it was working) and the live blog on Engadget. MacStories.net has a great <a href="http://www.macstories.net/news/iphone-6-and-iphone-6-plus-our-complete-overview/">summary of the iPhone 6 and 6 Plus</a>. After reading the review, I have to say I do like the touches of the original iPhone in the iPhone 6 - rounded edges with the flat slab design. When I take a look at new gadgets, like a new smartphone, I know I’m not the typical consumer. I want to push the boundaries of what my device can do for me. I setup automation scripts and workflows on my iPhone that make most of my friends think I’m crazy. So when I read through the details of the new devices, you’d think Apple had made the new iPhone just for gadget geeks like us.</p>
<blockquote>
Guess what? Apple didn’t make the iPhone 6 for us…
</blockquote>
<p>The iPhone 6 is the culmination of Apple finally putting all their chess pieces in the right place and at the right time. Apple is finally able to pull together all the aspects they want to utilize to <strike>control</strike> enhance your digital life:</p>
<ul>
<li>How you pay for things (Apple Pay) <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a></li>
<li>How you purchase your media (iTunes)</li>
<li>How you consume media (iPhone)</li>
<li>How you view your information (iCloud Drive)</li>
</ul>
<p>The new iPhone 6 Plus, which I believe will be the bigger hit with the general public, hits all these of those points. Apple in the past has <a href="http://9to5mac.com/2014/09/09/the-iphone-5-ad-that-apple-wants-you-to-forget/">scoffed at the idea</a> of needing a larger device, but the purchase history over the last few years says differently. Other device makers like <a href="http://www.samsung.com/global/microsite/galaxys5/">Samsung</a>, <a href="http://www.htc.com/us/smartphones/htc-one-m8/">HTC</a>, and <a href="http://www.lg.com/global/g3">LG</a> are all pushing for larger and larger smartphones. </p>
<p>My best example is also a personal one. I have two friends who recently switched from an iPhone to another device. One of them switched to a Samsung (Galaxy S5) the other to HTC (HTC One). I asked them why they made the switch. Both of them said they wanted a bigger device to watch videos and look at pictures (how you consume media). But they’ve both been upset about how to get new content on their device (how you purchase your media) and working with other family and friends still on an iPhone (how you view your information). So while the other smartphone makers have had problems getting their own version of the iTunes Store put together or a seamless way for you to share your digital life, they all had the one thing Apple didn’t have - the screen real estate that consumers preferred. Apple wrapped up that problem with the iPhone 6 and iPhone 6 Plus. </p>
<p>Congratulations Apple, you’ve won the latest battle in the <strike>smartphone</strike> digital experience wars.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
The last point, <em>how you pay for things</em>, is one that will take a tech giant to push that button. Apple will be that company because it has the resources and influence to make Apple Pay work. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>Is iPhone 6 not for diehard iOS users2014-09-10T00:00:00-05:002014-09-10T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-09-10:/2014/09/10/is-iphone-6-not-for-diehard-ios-users/<figure><a href="http://share.mygeekdaddy.net/hero_large_2014-09-10.png"><img src="http://share.mygeekdaddy.net/hero_large_2014-09-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;box-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;" /></img></a></figure>
<p>So the iPhone 6 and 6 Plus were announced yesterday. I followed along with the live stream (when it was working) and the live blog on Engadget. MacStories.net has a great <a href="http://www.macstories.net/news/iphone-6-and-iphone-6-plus-our-complete-overview/">summary of the iPhone 6 and 6 Plus</a>. After reading the review, I have to say I do …</p><figure><a href="http://share.mygeekdaddy.net/hero_large_2014-09-10.png"><img src="http://share.mygeekdaddy.net/hero_large_2014-09-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;box-shadow:none;-webkit-box-shadow:none;-moz-box-shadow:none;" /></img></a></figure>
<p>So the iPhone 6 and 6 Plus were announced yesterday. I followed along with the live stream (when it was working) and the live blog on Engadget. MacStories.net has a great <a href="http://www.macstories.net/news/iphone-6-and-iphone-6-plus-our-complete-overview/">summary of the iPhone 6 and 6 Plus</a>. After reading the review, I have to say I do like the touches of the original iPhone in the iPhone 6 - rounded edges with the flat slab design. When I take a look at new gadgets, like a new smartphone, I know I'm not the typical consumer. I want to push the boundaries of what my device can do for me. I setup automation scripts and workflows on my iPhone that make most of my friends think I'm crazy. So when I read through the details of the new devices, you'd think Apple had made the new iPhone just for gadget geeks like us.</p>
<blockquote>
<p>Guess what? Apple didn't make the iPhone 6 for us...</p>
</blockquote>
<p>The iPhone 6 is the culmination of Apple finally putting all their chess pieces in the right place and at the right time. Apple is finally able to pull together all the aspects they want to <strike>control</strike> enhance your digital life:</p>
<ul>
<li>How you pay for things (Apple Pay) <sup id="fnref:refx1"><a class="footnote-ref" href="#fn:refx1">1</a></sup></li>
<li>How you purchase your media (iTunes)</li>
<li>How you consume media (iPhone)</li>
<li>How you view your information (iCloud Drive)</li>
</ul>
<p>The new iPhone 6 Plus, which I believe will be the bigger hit with the general public, hits all these of those points. Apple in the past has <a href="http://9to5mac.com/2014/09/09/the-iphone-5-ad-that-apple-wants-you-to-forget/">scoffed at the idea</a> of needing a larger device, but the purchase history over the last few years says differently. Other device makers like <a href="http://www.samsung.com/global/microsite/galaxys5/">Samsung</a>, <a href="http://www.htc.com/us/smartphones/htc-one-m8/">HTC</a>, and <a href="http://www.lg.com/global/g3">LG</a> are all pushing for larger and larger smartphones. </p>
<p>My best example is also a personal one. I have two friends who recently switched from an iPhone to another device. One of them switched to a Samsung (Galaxy S5) the other to HTC (HTC One). I asked them why they made the switch. Both of them said they wanted a bigger device to watch videos and look at pictures (how you consume media). But they've both been upset about how to get new content on their device (how you purchase your media) and working with other family and friends still on an iPhone (how you view your information). So while the other smartphone makers have had problems getting their own version of the iTunes Store put together or a seamless way for you to share your digital life, they all had the one thing Apple didn't have - the screen real estate that consumers preferred. Apple wrapped up that problem with the iPhone 6 and iPhone 6 Plus. </p>
<p>Congratulations Apple, you've won the latest battle in the <strike>smartphone</strike> digital experience wars.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:refx1">
<p>The last point, <em>how you pay for things</em>, is one that will take a tech giant to push that button. Apple will be that company because it has the resources and influence to make Apple Pay work. <a class="footnote-backref" href="#fnref:refx1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Terminal tips from Craig Hockenberry2014-09-06T00:00:00-05:002014-09-06T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-09-06:/2014/09/06/terminal-tips-from-craig-hockenberry/<p>When you use a Mac everyday for your job, you want to find ways to do your work faster and more effectively. Craig Hockenberry (<a href="https://twitter.com/chockenberry">@chockenberry</a>) has a great post on <a href="http://furbo.org/2014/09/03/the-terminal/">OS X command line tips</a>. He has an extensive list of tips on how to make the most of the …</p><p>When you use a Mac everyday for your job, you want to find ways to do your work faster and more effectively. Craig Hockenberry (<a href="https://twitter.com/chockenberry">@chockenberry</a>) has a great post on <a href="http://furbo.org/2014/09/03/the-terminal/">OS X command line tips</a>. He has an extensive list of tips on how to make the most of the Terminal command line. </p>
<p>One of my favorites (which I had completely forgotten about) are ways to open Finder.app from the command line:</p>
<div class="highlight"><pre><span></span><code>$ open -R .
</code></pre></div>
<p>This will open the parent directory in Terminal in a new Finder.app window. Some of the other tips on running Applescript from the command line are evern better. </p>
<p>As Craig noted, all his examples are based on the <em>bash</em> shell, so if you've configured your Terminal environment differently your mileage may vary. </p>
<p>Link: <a href="http://furbo.org/2014/09/03/the-terminal/" target="_blank">The Terminal</a></p>Migrating from GeekTool to Übersicht2014-08-10T23:00:34-05:002014-08-10T23:00:34-05:00Jason Verlytag:mygeekdaddy.net,2014-08-10:/2014/08/10/migrating-from-geektool-to-ubersicht/<p>I’ve been a big fan of GeekTool for a while. It’s been one of the subtle things that I’ve felt that separates OS X from Windows. For a while I had several widgets (called Geeklets) run by GeekTool to display various information on my desktop. A <a href="http://rocketink.net/2014/08/ubersicht.html">post …</a></p><p>I’ve been a big fan of GeekTool for a while. It’s been one of the subtle things that I’ve felt that separates OS X from Windows. For a while I had several widgets (called Geeklets) run by GeekTool to display various information on my desktop. A <a href="http://rocketink.net/2014/08/ubersicht.html">post last week</a> by Patrick Welker (<a href="https://twitter.com/_patrickwelker/">@_patrickwelker</a>) opened me up to a new way to put widgets on my desktop.</p>
<p><a href="http://tracesof.net/uebersicht/">Übersicht</a>, from <a href="http://tracesof.net">Felix Hageloh</a>, is a great update to the GeekTool concept. Like GeekTool, Übersicht will alllow a user to create self contained widgets and have them rendered on your desktop. But what makes Übersicht stand apart from GeekTool is getting the widgets to be based on HTML 5 using either Javascript or Coffeescript as the widget file. Shifting over to using HTML 5 in Übersicht generates a much more visually appealing presentation than previously possible with GeekTool.</p>
<h4>Widget Layout</h4>
<p>The basic compoents of a widget includes:</p>
<ul>
<li>command [required]: The shell command that will be used to help capture what information you want to see on your desktop.</li>
<li>refreshFrequency [required]: How often you want to run the shell command to refresh the information. The integer is listed in milliseconds.</li>
<li>style [required]: The CSS styling to render the information you want shown on your desktop.</li>
<li>render [required]: The function that is used to parse the information from the <code>command</code> to the <code>style</code> to display on your desktop.</li>
<li>update [optional]: When the widget is first run, it will take the <code>command</code> output and display the contents via the <code>render</code> section. The <code>update</code> section replace the contents displayed based on the <code>refreshFrequency</code>.</li>
</ul>
<p>An example of a simple widget to show your public IP address using a <a href="https://gist.github.com/mygeekdaddy/acdf262b804160ce7d9d">simply Python script</a>: <a href="https://gist.github.com/mygeekdaddy/2f09f6e49a6f1e0d89f5">Gist link</a></p>
<figure><a href="http://share.mygeekdaddy.me/current_ip_widget_2014-08-10.png"><img src="http://share.mygeekdaddy.me/current_ip_widget_2014-08-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>Felix Hageloh, lead on the Übersicht software project, has more details on widget development on <a href="https://github.com/felixhageloh/uebersicht/blob/master/README.md">GitHub</a>.</p>
<h4>Widget differences</h4>
<p>There are some subtle differences how GeekTool and Übersicht parse commands. GeekTool can take a shell command that you’d run in Terminal and use it for a Shell Geeklet. One common GeekTool GeekLet is displaying the availabile hard drive space on your Mac, using the following shell command:</p>
<pre><code>df -Hl | grep 'disk1' | awk '{print $4"/"$2" free ("$5" used)"}'
</code></pre>
<p>Übersicht can parse the same command, but like most other scripting languages, it needs to know where to start and when to stop when parsing information. The section of a widget, labeled <code>command</code>, needs to be encapsulated in a set of double quotes - <code>"</code>. To do this with the disk space shell command it will need to be properly escaped like this: </p>
<pre><code>df -Hl | grep 'disk1' | awk '{print $4\" used/\"$2 \" free (\"$5\" used )\"}'
</code></pre>
<blockquote>
If you get an error with your widget, and it includes actual text from your command, take a look at how well your command has been escaped.
</blockquote>
<p>Once you have the shell command working, you can start on laying out your widget.</p>
<h4>Javascript vs Coffeescript</h4>
<p>Widgets for Übersicht can be written in either Javascript or Coffeescript. Continuing on the example monitoring your hard drive space, I wrote two widgets as an example in Javascript and Coffeescript. Both widgets were written to display the same information from the following shell command:</p>
<pre><code>df -Hl | grep 'disk1' | awk '{print $4"/"$2" free ("$5" used)"}';
</code></pre>
<p>Coffeescript verson: <a href="https://gist.github.com/mygeekdaddy/606e76a937d45b2f6394">Gist link</a></p>
<figure><a href="http://share.mygeekdaddy.me/uber_coffee_hdspace_2014-08-10.png"><img src="http://share.mygeekdaddy.me/uber_coffee_hdspace_2014-08-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>Pure Javascript version: <a href="https://gist.github.com/mygeekdaddy/1e8e599bf41eabc39cd6">Gist link</a></p>
<figure><a href="http://share.mygeekdaddy.me/uber_js_hdspace_2014-08-10.png"><img src="http://share.mygeekdaddy.me/uber_js_hdspace_2014-08-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>Here’s a comparison of the output of the two scripts: </p>
<figure><a href="http://share.mygeekdaddy.me/Screenshot_8_10_14__2_55_PM_2014-08-10.png"><img src="http://share.mygeekdaddy.me/Screenshot_8_10_14__2_55_PM_2014-08-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<h4>Widget Gallery</h4>
<p>The makers of Übersicht also have a <a href="http://tracesof.net/uebersicht-widgets/">gallery of widgets</a> other users have created and were willing to share. </p>
<p>Some other widgetsI’m looking at:</p>
<ul>
<li><a href="https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/master/sys-mon-set/sys-mon-set.widget.zip">Sysmon Set</a>: a whole set of widgets to monitor your system.</li>
<li><a href="https://raw.githubusercontent.com/felixhageloh/uebersicht-widgets/master/pretty-weather/pretty-weather.widget.zip">Pretty Weather</a>: a stripped down version of the weather widget I’m currently using. Looking at replacing the predicted high temperature with the current temperature. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a></li>
</ul>
<h4>Work in progress</h4>
<p>I’ve moved over all my core GeekTool widgets to Übersicht and have started looking at some new ones too. Some progress pictures of my desktop as I’ve developed new or updated widgets for Übersicht. </p>
<p>Progress screenshot:</p>
<figure><a href="http://share.mygeekdaddy.me/desktop_ver1_2014-08-10.png"><img src="http://share.mygeekdaddy.me/desktop_ver1_2014-08-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>Additional progress screenshot:</p>
<figure><a href="http://share.mygeekdaddy.me/desktop_ver2_2014-08-10.png"><img src="http://share.mygeekdaddy.me/desktop_ver2_2014-08-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
This has caused me to learn more about the <a href="https://developer.forecast.io/">forecast.io</a> API than I ever thought possible. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#81930" title="2014-08-19 11:49:10">Jason.Verly</a>:</strong> You'll need to make some adjustments to the widget placement in the "Style" section. For some reason all the widget creators liked the bottom right corner.</p>
<p><strong><a href="#109423" title="2014-10-29 22:45:09">Jason.Verly</a>:</strong> I have some screencasts set for later this fall.</p>
<p><strong><a href="#80335" title="2014-08-13 23:14:43">CrazedLeper</a>:</strong> Ok, I installed the app and the widgets but, is there a way to customize them? I can't find a way to move those that are overlapping and some are just plopped in the middle of my screen.</p>
<p><strong><a href="#104113" title="2014-10-21 13:43:44">Jose Duran</a>:</strong> Hi, Would it be possible to get a quick explanation as to how to customize in youtube ???? also what is the program should we use to make adjustments in style ???? as long as it is impossible to do it via Debug Console. Thanks a lot</p>Work log tracking on Mac & iOS2014-07-26T13:18:44-05:002014-07-26T13:18:44-05:00Jason Verlytag:mygeekdaddy.net,2014-07-26:/2014/07/26/work-log-tracking-on-mac-ios/<p>One of the challenges I've had recently is getting a better understanding on what I'm really working on and whether or not it's something I <em>should</em> be working on. I poked around the iOS and Mac app stores looking for a task tracker. I found quite a …</p><p>One of the challenges I've had recently is getting a better understanding on what I'm really working on and whether or not it's something I <em>should</em> be working on. I poked around the iOS and Mac app stores looking for a task tracker. I found quite a few apps, but most turned out to be either time sheet/billing apps or simple to do list managers.</p>
<p>So I poked around the interwebs a bit and found a recent post on <a href="http://soitscometothis.net/post/logging-time-per-visit-with-keyboard-maestro">so, it's come this</a> related to logging patient visits.</p>
<p>The opening paragraph is what caught my eye:</p>
<blockquote>
I wanted a better idea of how much time I was spending per visit. This data could also be used when billing by time. I wrote three small macros to complete this task.
All three macros use the same trigger, ⌘⌥⌃⇧b. This brings up a menu for me to choose what part of the macro-system I want.
</blockquote>
<p>As I read through Michael's post I knew this could be the blueprint for what I wanted:</p>
<ul>
<li>Date/time of when the task was worked on.</li>
<li>Duration of how long I worked on a given task.</li>
<li>Easy start/stop method while working on my Mac.</li>
<li>Basic running list of task in a text file.</li>
</ul>
<p>It was everything I was looking for as a starting point. But I also knew I wanted to have some additional features:</p>
<ul>
<li>A dialog box to enter a description of the task I was working on. </li>
<li>A method to have the same information captured from my iPad or iPhone.</li>
<li>Validation check if a task had already been started.</li>
</ul>
<h3>WorkLog for Mac</h3>
<p>The Mac side of things was fairly straight forward. Michael had already given me a great blueprint on what I wanted. I made some minor tweaks to his Start Task <a href="http://www.keyboardmaestro.com/main/">Keyboard Maestro</a> macro. I added a dialog box to enter a task description and expanded the time detail.</p>
<p><strong>Start Work Log:</strong> The first KM macro takes the current date/time, the dialog box entry and then appends them to a file on Dropbox.</p>
<figure><a href="http://share.mygeekdaddy.me/worklog_start_timer_2014-07-24.png"><img src="http://share.mygeekdaddy.me/worklog_start_timer_2014-07-24.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p><strong>Stop Work Log:</strong> The stop timer macro is similar to the previous one. The KM macro takes the a current date/time, does a difference of the start time to calculate the task duration, and appends the text file on Dropbox.</p>
<figure><a href="http://share.mygeekdaddy.me/worklog_stop_timer_2014-07-24.png"><img src="http://share.mygeekdaddy.me/worklog_stop_timer_2014-07-24.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>Download a copy of the KM macros: <a href="http://share.mygeekdaddy.me/KM_WorkLog.kmmacros_2014-07-24.zip">WorkLog Macro</a>.</p>
<h3>WorkLog for iOS</h3>
<p>Replicating the same process for iOS was a bigger job, but something I knew that I could handle with <a href="https://itunes.apple.com/us/app/drafts-quickly-capture-notes/id502385074?mt=8&uo=4" title="Drafts">Drafts</a> and <a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&uo=4" title="Pythonista">Pythonista</a>. The iOS workflow consists of four Drafts Actions and two Pythonista scripts. The tasks are logged to the <code>WorkLogFile.md</code> document, the same as the KM macros.</p>
<h4>Drafts Actions</h4>
<p><strong>New Work Log:</strong> This is the action that starts the work log process. The Drafts action will call two other actions - Copy the note to the clipboard and then run a script in Pythonista. The script, explained below, calls on another Drafts action to append the WorkLogFile.md file on Dropbox.</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Automated_Task_Logger_R2_2014_07_25_210631.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Automated_Task_Logger_R2_2014_07_25_210631.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:350px;" /></img></a></figure>
<p><a href="drafts://x-callback-url/import_action?type=URL&name=New%20Work%20Log&url=drafts%3A%2F%2Fx-callback-url.com%2Fcreate%3Ftext%3D%5B%5Bdraft%5D%5D%26action%3D%7B%7BCopy%20to%20Clipboard%7D%7D%26afterSuccess%3DDelete%26x-Success%3D%7B%7Bpythonista%3A%2F%2FstartTimer%3Faction%3Drun%7D%7D">Install New Work Log Action</a></p>
<p><strong>Close Work Log:</strong> This is the action that ends the work log process. The Drafts action will call a Pythonista script to document the closure and calculate how long the task has been open.</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Automated_Task_Logger_R2_2014_07_25_210653.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Automated_Task_Logger_R2_2014_07_25_210653.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:350px;" /></img></a></figure>
<p><a href="drafts://x-callback-url/import_action?type=URL&name=Close%20Work%20Log&url=pythonista%3A%2F%2FstopTimer%3Faction%3Drun">Install Close Work Log Action</a></p>
<p><strong>WorkLog_Entry:</strong> This is the action that appends the <code>WorkLogFile.md</code> file with the task description and the start time. This action is what is called on from Pythonista from the <em>New Work Log</em> action.</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Automated_Task_Logger_R2_2014_07_25_211320.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Automated_Task_Logger_R2_2014_07_25_211320.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:350px;" /></img></a></figure>
<p><a href="drafts://x-callback-url/import_action?type=dropbox&name=WorkLog_Entry&path=%2FApps%2FWorkLog%2F&filenametype=2&filename=WorkLogFile&ext=md&writetype=2&template=%5B%5Bdraft%5D%5D%20started%20at%20%5B%5Bdate%7C%25Y-%25m-%25d%20%25I%3A%25M%20%25p%5D%5D">Install WorkLog Entry Action</a></p>
<p><strong>WorkLog Closure:</strong> This action documents the closure details of the current task. This action is called from stopTimer script called from the <em>Close Work Log</em> action.</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Automated_Task_Logger_R2_2014_07_25_211339.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Automated_Task_Logger_R2_2014_07_25_211339.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:350px;" /></img></a></figure>
<p><a href="drafts://x-callback-url/import_action?type=dropbox&name=WorkLog%20Closure&path=%2FApps%2FWorkLog%2F&filenametype=2&filename=WorkLogFile&ext=md&writetype=2&template=%5B%5Bdraft%5D%5D">Install WorkLog Closure Action</a></p>
<h4>Pythonista Scripts:</h4>
<p><strong>startTimer.py:</strong> This script will document the time the work task began, create a temporary 'timer.txt' file, and then return to Drafts. In the event the timer was already started on a different task it will alert the user and then return to Drafts.</p>
<script src="https://gist.github.com/mygeekdaddy/d99685a333f1f4e47b2e.js"></script>
<p><strong>stopTimer.py:</strong> This script will document the end of the work task, calculate how long the task was open, and then return to Drafts to append the <code>WorkFlowFile.md</code> file.</p>
<script src="https://gist.github.com/mygeekdaddy/1b68fa011f89a139a833.js"></script>
<h3>Putting it all together</h3>
<p>Now with the actions in place, I can go on my iOS device and start a task log entry</p>
<figure><a href="http://share.mygeekdaddy.me/2014-07-25_22_55_38_2014-07-25.gif"><img src="http://share.mygeekdaddy.me/2014-07-25_22_55_38_2014-07-25.gif" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
<p>In the event I've already started the timer for a work log, I would get an error from Pythonista.</p>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#76200" title="2014-07-26 21:17:19">Michael</a>:</strong> Very cool.</p>Schedule a Maximo Escalation from 6am to 6pm2014-07-21T00:00:00-05:002014-07-21T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2014-07-21:/2014/07/21/schedule-a-maximo-escalation-from-6am-to-6pm/<p>One of the best features of Maximo is the Escalations app. An Escalation basically looks at conditions of a record in Maximo on a regular interval and if the condition(s) are met, triggers a notification or action to be fired off. The amount of heavy lifting that Escalations can …</p><p>One of the best features of Maximo is the Escalations app. An Escalation basically looks at conditions of a record in Maximo on a regular interval and if the condition(s) are met, triggers a notification or action to be fired off. The amount of heavy lifting that Escalations can do for a Maximo Administrator is unbelievable. So over the weekend I responded to a common question regarding Escalation timing in Maximo. From the <a href="https://www.linkedin.com/groups?home=&gid=37889&trk=groups_most_popular-h-logo">Maximo Users Group on LinkedIn</a>, <a href="https://www.linkedin.com/profile/view?id=9321586&goback=%2Egde_37889_member_5895588233944772612">Sun W. Kim</a> asked the following:</p>
<blockquote>
<p>I want to set up an escalation schedule to run hourly between the hours of 6AM to 6PM. Maximo allows me to schedule hourly, but it runs 24 hours a day. In Unix, you can set up cron jobs to run specific hours of day. In Maximo, the UI options do not allow for this.</p>
</blockquote>
<p>Out of the box, Escalations are designed to run continuously on set interval. But there are valid business reasons to have an escalation only run during specific time spans. Several answers were given, but this is a breakdown of my solution - run two escalations.</p>
<h4>Two Escalation Setup</h4>
<p>The two escalation concept is simple:</p>
<ul>
<li>The first escalation does the action/notification you want to occur in Maximo. </li>
<li>The second escalation controls the first escalation's active/inactive status.</li>
</ul>
<p>The idea is to use Maximo's own monitoring process to manage when the first Escalation would fire. So in my example, I have two escalations:</p>
<figure><a href="http://share.mygeekdaddy.net/esclation_list_2014-07-21.png"><img src="http://share.mygeekdaddy.net/esclation_list_2014-07-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Escalation 1098</h4>
<p>The first escalation, 1098, is a basic notification escalation. The Escalation runs every 10 minutes to email me some information on the escalation itself. </p>
<figure><a href="http://share.mygeekdaddy.net/escalation_1098_blur_2014-07-21.png"><img src="http://share.mygeekdaddy.net/escalation_1098_blur_2014-07-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This escalation could actually do any number of things - change a record status, update a value on a record, notify a user, etc. The goal of the first escalation should be only to make sure the required action or notification takes place. I don't worry about timing of when the escalation will run, beyond the interval I want the escalation to fire.</p>
<p>Just make sure the first Escalation is triggered under the appropriate conditions.</p>
<h4>Escalation 1099</h4>
<p>The second escalation, 1099, is the one that monitors the current time of day to set the active/inactive status of the first escalation.</p>
<figure><a href="http://share.mygeekdaddy.net/escalation_1099_list_2014-07-21.png"><img src="http://share.mygeekdaddy.net/escalation_1099_list_2014-07-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The second escalation has 3 escalations points:</p>
<ol>
<li>Determine the time to set Escalation 1098 active.</li>
<li>First point to determine the time to set Escalation 1098 inactive.</li>
<li>Second point to determine the time to set Escalation 1098 inactive.</li>
</ol>
<p>The reason I needed two Escalation Points to set Escalation 1098 inactive is because of the date/time validation change at midnight. </p>
<p>The SQL to set the escalation active runs from 6am to 6pm. An example of the Escalation Point time check for SQL Server is:</p>
<div class="highlight"><pre><span></span><code><span class="n">getdate</span><span class="p">()</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">hour</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">)))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">getdate</span><span class="p">()</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">hour</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">18</span><span class="p">,</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">)))</span><span class="w"></span>
</code></pre></div>
<p>The normal reaction is to set the SQL in the Escalation Point to set Escalation 1098 inactive to be the reverse of the first a Escalation Point:</p>
<div class="highlight"><pre><span></span><code><span class="n">getdate</span><span class="p">()</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">hour</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">18</span><span class="p">,</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">)))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">getdate</span><span class="p">()</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">hour</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">)))</span><span class="w"></span>
</code></pre></div>
<p>But the SQL to inactivate the escalation runs over two day span, so using the Escalation Point above won't work (I know, I tried). The inactivation Escalation Point needs to account for the day change, so the inactivation escalation points need to look from 6pm to midnight and midnight to 6am. </p>
<p>Escalation Point 2 looks at the time from 6pm to midnight:</p>
<div class="highlight"><pre><span></span><code><span class="n">getdate</span><span class="p">()</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">hour</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">18</span><span class="p">,</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">)))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">getdate</span><span class="p">()</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"></span>
</code></pre></div>
<p>Escalation Point 3 looks at the time from midnight to 6am:</p>
<div class="highlight"><pre><span></span><code><span class="n">getdate</span><span class="p">()</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">getdate</span><span class="p">()</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">hour</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">)))</span><span class="w"></span>
</code></pre></div>
<p>All three Escalation points end up looking like this:</p>
<figure><a href="http://share.mygeekdaddy.net/escalation_1099_1_2014-07-21.png"><img src="http://share.mygeekdaddy.net/escalation_1099_1_2014-07-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<figure><a href="http://share.mygeekdaddy.net/escalation_1099_2_2014-07-21.png"><img src="http://share.mygeekdaddy.net/escalation_1099_2_2014-07-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<figure><a href="http://share.mygeekdaddy.net/escalation_1099_3_2014-07-21.png"><img src="http://share.mygeekdaddy.net/escalation_1099_3_2014-07-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Notice that the 2nd Escalation is monitoring a specific record in the Condition:</p>
<div class="highlight"><pre><span></span><code>escalation = '1098'
</code></pre></div>
<p>Because the 2nd Escalation is not scanning for various conditions on the Escalation table, but using a system date/time check, there is a negligible performance hit on the system. </p>
<h4>Escalation Actions</h4>
<p>Escalation 1099 requires two 'Set Value' actions - one to set the escalation active (ESCALATION.ACTIVE = 1) and the other to set it inactive (ESCALATION.ACTIVE = 0):</p>
<figure><a href="http://share.mygeekdaddy.net/set_esc_active_2014-07-21.png"><img src="http://share.mygeekdaddy.net/set_esc_active_2014-07-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<figure><a href="http://share.mygeekdaddy.net/set_esc_inactive_2014-07-21.png"><img src="http://share.mygeekdaddy.net/set_esc_inactive_2014-07-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Add these two Actions and apply them to the appropriate Escalation Point. </p>
<h4>Activating Escalation Pair</h4>
<p>Once both Escalations are setup, I can activate both of them and let them go to work. Escalation 1098 and 1099 were activated around 7pm last night. Shortly after activating both of them, Escalation 1098 was set to inactive. But this morning at 6am, I got the following email from Maximo:</p>
<figure><a href="http://share.mygeekdaddy.net/_img_BLOGX_Running_an_escalation_from_6am_to_6pm_2014_07_21_093425.png"><img src="http://share.mygeekdaddy.net/_img_BLOGX_Running_an_escalation_from_6am_to_6pm_2014_07_21_093425.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>So now I have an Escalation running from 6am to 6pm daily. If you want to have Escalation 1098 run from 6am to 6pm, Monday through Friday, then you need to add a 3rd Escalation to track what day of the week it is to activate/inactivate Escalation 1099, which in turn would activate/inactivate Escalation 1098. </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>Pushing Drafts into Editorial2014-07-18T23:47:37-05:002014-07-18T23:47:37-05:00Jason Verlytag:mygeekdaddy.net,2014-07-18:/2014/07/18/pushing-drafts-into-editorial/<p><a href="https://itunes.apple.com/us/app/drafts-for-ipad-quickly-capture/id542797283?mt=8&uo=4" title="drafts">Drafts</a> is one of my favorite apps and a lot of what I do gets started there. I've also started to use <a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8&uo=4" title="Editorial">Editorial</a> as my go to writing app.<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> So I finally got around to developing a couple of workflows for these two apps to work better together …</p><p><a href="https://itunes.apple.com/us/app/drafts-for-ipad-quickly-capture/id542797283?mt=8&uo=4" title="drafts">Drafts</a> is one of my favorite apps and a lot of what I do gets started there. I've also started to use <a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8&uo=4" title="Editorial">Editorial</a> as my go to writing app.<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> So I finally got around to developing a couple of workflows for these two apps to work better together. One of my favorites is pushing a note from Drafts into Editorial for final editing.</p>
<p>The basic idea of the work flow is:</p>
<ul>
<li>Take a rough outline from Drafts and push it over to Editorial. </li>
<li>Use the first line of draft to be the name of the file in Editorial. </li>
<li>Push the body of the draft over to the main document body in Editorial. </li>
</ul>
<p>I started out trying to push the draft straight to Editorial:</p>
<pre><code>editorial://new/[[title]].md?root=local&input=[[body]]
</code></pre>
<p>But for some reason the <code>[[body]]</code> from the draft wouldn't get pushed into the new Editorial document. After some testing I took another route to get the body of the draft into Editorial. The final Drafts action does several steps with one click:</p>
<pre><code>drafts://x-callback-url.com/create?text=[[body]]&action={{Copy to Clipboard}}&afterSuccess=Delete&x-Success={{editorial://new/[[title]].md?root=local&command=Get_Clipboard}}
</code></pre>
<p>This single action in Drafts does the following:</p>
<ul>
<li>Create a duplicate draft to paste the contents of the original note into the clipboard. </li>
<li>Once the duplicate note is created, delete the extra note so you only have one working copy in Drafts. </li>
<li>Open Editorial, create a new file with the first line of the draft, and then paste the clipboard into the body of the new Editorial file.</li>
</ul>
<p>The Drafts action includes an Editorial command <code>Get_Clipboard</code>, which is just a simple clipboard pull and text replacement:</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Drafts_to_Editorial_2014_07_18_230537.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Drafts_to_Editorial_2014_07_18_230537.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The action has been added to my <a href="http://mygeekdaddy.net/ios-actions/">Actions List</a> page. Click here to install the action: <a href="drafts://x-callback-url/import_action?type=URL&name=Send%20to%20Editorial&url=drafts%3A%2F%2Fx-callback-url.com%2Fcreate%3Ftext%3D%5B%5Bbody%5D%5D%26action%3D%7B%7BCopy%20to%20Clipboard%7D%7D%26afterSuccess%3DDelete%26x-Success%3D%7B%7Beditorial%3A%2F%2Fnew%2F%5B%5Btitle%5D%5D.md%3Froot%3Dlocal%26command%3DGet_Clipboard%7D%7D">Send to Editorial</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
This entire post and the update to my iOS Actions page was done from Drafts & Editorial. <a href="#fnref1" rev="footnote">↩</a>
</li>
</ol>
</div>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#104553" title="2014-10-22 18:12:28">Bud Brown</a>:</strong> Here's the one-liner you want editorial://new/[[title]].md?root=local&content=[[body]] the &input parameter is reserved to workflows in Editorial.</p>Reviewing process improvement projects2014-07-18T12:23:54-05:002014-07-18T12:23:54-05:00Jason Verlytag:mygeekdaddy.net,2014-07-18:/2014/07/18/reviewing-process-improvement-projects/<p>I'll be the first to admit that some of my best ideas don't originally come from that dark gray matter between my ears. Most of the time I've kick started my ideas from something I've heard or read elsewhere. So every now and then I'll see something that really jumps …</p><p>I'll be the first to admit that some of my best ideas don't originally come from that dark gray matter between my ears. Most of the time I've kick started my ideas from something I've heard or read elsewhere. So every now and then I'll see something that really jumps out at me. This is part of a paragraph in a <a href="http://reliabilityweb.com/index.php/maintenance_tips/measuring_the_central_hub_planning_and_scheduling_metrics/">recent article</a> I read that really caught my eye.</p>
<blockquote>
I’m reminded of a statement that a Plant Manager in a large food and beverage manufacturer once told me. He said, “Jeff, We measure what we treasure!” If so, what is it in the Maintenance organization that we treasure?
</blockquote>
<p>The reason why this stood out for me is that I've recently had to sit back and re-evaluate the progress on one of my process improvement projects. One of the things that happens in a lot process improvement projects, including mine, is you get an initial rush of progress and then you plateau.</p>
<figure><a href="http://share.mygeekdaddy.me/project_timeline_2014-07-16.png"><img src="http://share.mygeekdaddy.me/project_timeline_2014-07-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>My recent progress was stuck right in the middle of that chart. So after reading that line it struck me that maybe I wasn't really <em>measuring</em> what the plants <em>treasured</em>. I took a step back and looked at what I needed to change. After some contemplation on my project I realized the following:</p>
<ul>
<li>If the metrics being used for the process improvements aren't aligned to what the senior leadership is looking, nothing I wanted to get done was really on the radar of senior leadership. I knew I had great information on change opportunities that wasn't grabbing the attention of senior management. </li>
<li>Understanding the performance goals for a department was another avenue to keep the project moving along. Like the previous nugget, if metrics being used to guide process improvement aren't inline with the department goals, then there was very little reason for departments to try to improve. </li>
<li>Once the metrics were aligned to senior leadership and department level management, I tried to keep the metric reports simple and direct. I'm now making sure the metric can be attributed to a bottom line facet of the business. Giving a measurement report on inventory turn ratios is a great insight to the business. But giving a dollar value on how inventory turns is affecting the bottom line is what speaks to senior leadership.</li>
<li>Process improvement metrics need to waterfall from the top down. Getting senior leadership's attention will get plant management's attention. Getting plant management's attention will get department management's attentions. And so on and so on. </li>
</ul>
<p>Looking back I forgot a key rule in project management:</p>
<blockquote>
Communication is what the listener does.
</blockquote>
<p>I had great information on how and what we should be doing next, but it didn't matter to those who had to make the change or to the management overseeing the departments. Everyone understood there was an opportunity for improvement, I just hadn't focused on how the changes would benefit the company or those affected by the change. Since I've re-evaluated the metrics in my project I've had a lot more engagement from managers on getting our goals completed.</p>
<p>If you're having problems with a process improvement project, take some time and look at where things stand:</p>
<ul>
<li>Are the metrics aligned to what's important to those affected by the process change?</li>
<li>Are the expected results of the process improvement in a unit of measure that senior management can easily relate to? </li>
<li>Can you shift/add to your metric reports an aspect of the change process that's more likely to get senior leadership's attention?</li>
</ul>
<p>Get the people affected by the change to do the heavy lifting for you by letting them understand the impact of the way things are done today and the benefit of how you want to do them tomorrow in terms that matter to them.</p>The David Letterman of BIRT reports2014-07-10T22:25:35-05:002014-07-10T22:25:35-05:00Jason Verlytag:mygeekdaddy.net,2014-07-10:/2014/07/10/the-david-letterman-of-birt-reports/<p>One of the </p></p>
<p>Top 10 lists are a common request when reviewing maintenance and operation data with mid to upper level management. </p>
<ul>
<li>Top 10 oldest work orders in the backlog</li>
<li>Top 10 most expensive inventory items</li>
<li>Top 10 assets with most repairs</li>
<li>Etc, etc, etc.</li>
</ul>
<p>A problem in BIRT is …</p><p>One of the </p></p>
<p>Top 10 lists are a common request when reviewing maintenance and operation data with mid to upper level management. </p>
<ul>
<li>Top 10 oldest work orders in the backlog</li>
<li>Top 10 most expensive inventory items</li>
<li>Top 10 assets with most repairs</li>
<li>Etc, etc, etc.</li>
</ul>
<p>A problem in BIRT is that there isn’t a clean way to limit the output to just the first 10 rows returned. The immediate thought is to use the ‘visibility’ setting on the detail row and use the <em>row_num</em> as a condition to limit the number of records displayed. Unfortunately, using the row ‘visibility’ setting does not work the way you’d think it should. </p>
<h4>Row Restriction</h4>
<p>Here are the basic steps to limit the number of rows returned in the report:</p>
<ul>
<li>Create the report with all the required information. Do not worry about limiting your record set yet, make sure all the information that is needed in the report works first and that the first 10 (or 20, 50, etc) rows include the information you want to see. For example, you may need to add something like <code>order by workorder.reportdate desc</code> to your <em>Open Method</em> script to have the records have the newest WO’s listed first.</li>
<li>On the Detail Row, right click the row and add a new row below. Don’t worry, this is just temporary and will be removed later on.</li>
<li>In the new row, insert a new Aggregation field. Label it <em>row_cnt</em> or something that you’ll remember as a function to count rows.</li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/birt_row_cnt_agg_data_2014-06-19.png"><img src="http://share.mygeekdaddy.me/birt_row_cnt_agg_data_2014-06-19.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ul>
<li>On the Detail Row that has report values you want to limit, click on the entire row to set the row’s visibility.</li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/Eclipse_BIRT_RPT_2014-06-19.png"><img src="http://share.mygeekdaddy.me/Eclipse_BIRT_RPT_2014-06-19.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ul>
<li>Using the <em>row_cnt</em> aggregate field, add a visibility restriction to only see the first 10 rows.</li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/visible_row_cnt_limit_2014-06-19.png"><img src="http://share.mygeekdaddy.me/visible_row_cnt_limit_2014-06-19.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ul>
<li>Now delete the temporary Detail Row and run your report. This will remove the <em>row_cnt</em> field from the report, but it doesn’t remove or affect its use in the visibility restriction.</li>
</ul>
<p>Now when you run the report, only the first 10 records will display. Adjust the visiblity restriction as needed to show fewer or more rows in your report.</p>Multiple File Markdown Document2014-06-21T16:21:13-05:002014-06-21T16:21:13-05:00Jason Verlytag:mygeekdaddy.net,2014-06-21:/2014/06/21/multiple-file-markdown-document/<p>One of the tasks a project manager normally faces is merging lots of pieces of information together into a single document. Markdown has been the primary way I’ve been writing notes and posts for a couple of years now. One of the features I’ve been using more and …</p><p>One of the tasks a project manager normally faces is merging lots of pieces of information together into a single document. Markdown has been the primary way I’ve been writing notes and posts for a couple of years now. One of the features I’ve been using more and more is merging multiple Markdown files into a single document.<a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> This allows edits to be made to smaller “chapters” and merging them into a single document for publishing. While not as elaborate as <a href="http://share.mygeekdaddy.me/drdrang_rpt_wf_2014-06-21.jpeg">Dr. Drang’s workflow</a>, this process allows me to better manage field reports or technical documents in smaller chunks.</p>
<h4>Main Document Format</h4>
<p>The key to setting up a multiple file Markdown file is the main document. </p>
<pre><code><<[path/file_name.md]
</code></pre>
<p>So an example main document would look like this:</p>
<figure><a href="http://share.mygeekdaddy.me/main_doc_md_2014-06-21.png"><img src="http://share.mygeekdaddy.me/main_doc_md_2014-06-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Chapter Documents</h4>
<p>The multi-file system is based on linking the “chapter” files to the main document. As shown above, because the chapter files are just links to the other files they don’t have to reside in the same folder as the main document.</p>
<figure><a href="http://share.mygeekdaddy.me/mulit_file_folder_structure_2014-06-21.png"><img src="http://share.mygeekdaddy.me/mulit_file_folder_structure_2014-06-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The <em>chap_1.md</em> is just a simple Markdown file.</p>
<figure><a href="http://share.mygeekdaddy.me/chap_1_multfile_doc_2014-06-21.png"><img src="http://share.mygeekdaddy.me/chap_1_multfile_doc_2014-06-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Pulling it all together</h4>
<p>Once all the documents are in place, I normally use <a href="http://markedapp.com">MarkedApp</a> to publish the main document into whatever format I need - PDF, DOCX, HTML, etc. Again, since I used reference links to the chapter files, parsing the main document in Marked pulls the text from the chapter files into the render of the main document.<a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a></p>
<p>Previewing the main document example from above allows me to proof the document and look for any formatting or file errors.</p>
<figure><a href="http://share.mygeekdaddy.me/marked_app_preview_2014-06-21.png"><img src="http://share.mygeekdaddy.me/marked_app_preview_2014-06-21.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>In this case, it shows I have an issue with the <em>chap_3.md</em> file. Either the files does not exist or is not in the path I specified in the main document. I can go back, make any needed corrections, and then publish the document. </p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
Markedapp has a <a href="http://markedapp.com/help/Just_for_Writers/Multi-File_Documents.html">great reference on multi-file document usage</a>, so this post is mainly for my easy personal reference. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">
Not all Markdown editors can parse multi-file documents. At the time of this post, two popular editors, Byword and MultiMarkdown Composer, would not parse multi-file documents. <a href="#fnref-2" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>Two methods to pass values in BIRT2014-06-18T14:11:43-05:002014-06-18T14:11:43-05:00Jason Verlytag:mygeekdaddy.net,2014-06-18:/2014/06/18/two-methods-to-pass-values-in-birt/<p>I was recently asked the following: </p>
<blockquote>
<p>I'm starting to learn BIRT and have recently taken over report writing at my company. I'm confused about the best way to pass information to a sub-report. I've looked at some of our existing reports and they don't do it the same way. </p>
</blockquote>
<p>I …</p><p>I was recently asked the following: </p>
<blockquote>
<p>I'm starting to learn BIRT and have recently taken over report writing at my company. I'm confused about the best way to pass information to a sub-report. I've looked at some of our existing reports and they don't do it the same way. </p>
</blockquote>
<p>I responded back that there are two primary method to pass information from a main report to a sub-report. </p>
<h4>IBM Method</h4>
<p>I call this technique the IBM Method because it's how IBM would teach a new user of BIRT to pass information to a sub-report and is typically the technique seen in any out of the box report from IBM. An example of the <em>Open Method</em> script on a sub-report is shown below: </p>
<div class="highlight"><pre><span></span><code><span class="n">JobTaskdataSet</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MXReportDataSetProvider</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">this</span><span class="o">.</span><span class="n">getDataSource</span><span class="p">()</span><span class="o">.</span><span class="n">getName</span><span class="p">(),</span><span class="w"> </span><span class="n">this</span><span class="o">.</span><span class="n">getName</span><span class="p">());</span><span class="w"></span>
<span class="n">JobTaskdataSet</span><span class="o">.</span><span class="n">open</span><span class="p">();</span><span class="w"></span>
<span class="k">var</span><span class="w"> </span><span class="n">sqlText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="nb nb-Type">String</span><span class="p">();</span><span class="w"></span>
<span class="n">sqlText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"select jobtask.jpnum as jptask_jpnum, jobtask.jptask, jobtask.description as jptask_desc, "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" jobtask.taskduration as jptask_dur "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" from jobtask "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" where jobtask.jpnum = '"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">"pmseq_jpnum"</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"'"</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="s2">" and jobtask.siteid = '"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">"siteid"</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"'"</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" order by jobtask.jptask "</span><span class="w"></span>
<span class="p">;</span><span class="w"></span>
<span class="n">JobTaskdataSet</span><span class="o">.</span><span class="n">setQuery</span><span class="p">(</span><span class="n">sqlText</span><span class="p">);</span><span class="w"></span>
</code></pre></div>
<p>The key in the IBM Method is a report writer will explicitly set the comparison of a field in the sub-report against a value passed from the main report. For example: </p>
<div class="highlight"><pre><span></span><code>+ " and jobtask.siteid = '" + rows[0]["siteid"] + "'"
</code></pre></div>
<p>In this case, the field <em>jobtask.siteid</em> is being explicitly compared against the value <em>"siteid"</em> from main report. </p>
<h4>QBR Method</h4>
<p>I call this technique the QBR Method because of the when a Detailed report is created in Maximo, it will use the method described below in the system generated .rtpdesign file. Below is the <em>Open Method</em> script from a QBR report that included information from the PO and POLINES tables. Because the report included information from the two different tables, Maximo forced the report to be a Detailed report. The report that is created by Maximo will have a main and sub-report datasets. The dataset below is from the sub-report for the POLINE information. </p>
<div class="highlight"><pre><span></span><code><span class="n">dataSet_poline</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">MXReportDataSetProvider</span><span class="o">.</span><span class="n">create</span><span class="p">(</span><span class="n">this</span><span class="o">.</span><span class="n">getDataSource</span><span class="p">()</span><span class="o">.</span><span class="n">getName</span><span class="p">(),</span><span class="w"> </span><span class="n">this</span><span class="o">.</span><span class="n">getName</span><span class="p">());</span><span class="w"></span>
<span class="n">dataSet_poline</span><span class="o">.</span><span class="n">open</span><span class="p">();</span><span class="w"></span>
<span class="k">var</span><span class="w"> </span><span class="n">sqlText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="nb nb-Type">String</span><span class="p">();</span><span class="w"></span>
<span class="n">sqlText</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"select poline.polinenum,poline.description,poline.orderqty,poline.orderunit,</span>
<span class="o">+</span><span class="w"> </span><span class="s2">" poline.unitcost, poline.linecost,poline.gldebitacct,poline.requestedby "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" from poline "</span><span class="w"> </span>
<span class="o">+</span><span class="w"> </span><span class="s2">" where "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">" poline.ponum = ? "</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" and poline.siteid = ?"</span><span class="w"></span>
<span class="o">+</span><span class="w"> </span><span class="s2">" order by poline.polinenum "</span><span class="w"></span>
<span class="p">;</span><span class="w"></span>
<span class="n">dataSet_poline</span><span class="o">.</span><span class="n">setQuery</span><span class="p">(</span><span class="n">sqlText</span><span class="p">);</span><span class="w"></span>
<span class="n">dataSet_poline</span><span class="o">.</span><span class="n">setQueryParameterValue</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">"p_ponum"</span><span class="p">]);</span><span class="w"> </span>
<span class="n">dataSet_poline</span><span class="o">.</span><span class="n">setQueryParameterValue</span><span class="p">(</span><span class="mi">2</span><span class="p">,</span><span class="w"> </span><span class="n">rows</span><span class="p">[</span><span class="mi">0</span><span class="p">][</span><span class="s2">"p_siteid"</span><span class="p">]);</span><span class="w"></span>
</code></pre></div>
<p>In the QBR Method, the Maximo generated rptdesign file will implicitly set the comparison of a field in the sub-report against a value passed from the main report. For example: </p>
<div class="highlight"><pre><span></span><code> + " and poline.siteid = ?"
</code></pre></div>
<p>In this case, the field <em>poline.siteid</em> is being compared against a parameter value. Further down in the report, the parameter is defined not as one an end user would enter, but is explicitly set against a value from the main report: </p>
<div class="highlight"><pre><span></span><code>dataSet_poline.setQueryParameterValue(2, rows[0]["p_siteid"]);
</code></pre></div>
<p>In the QBR Method, the sub-report field is set against a parameter value and that parameter value is set against a value from the main report. In the example above, the field <em>poline.siteid</em> is implicitly set to the main report value via the report parameter. </p>
<h4>Differences between methods</h4>
<p>So what are the functional differences between the two methods? Nothing. While the QBR Method uses two steps (main report value -> paramenter -> sub-report value) and the IBM Method uses one step (main report value -> sub-report value), in the end they both accomplish the same thing. While there could be a performance hit on a report that is run against thousands of records or run by hundreds of employees multiple times an hour, those are edge cases. For a normal Maximo user, they should see no difference between the two methods. </p>
<h4>What about other methods</h4>
<p>I originally stated that the IBM Method and the QBR Method are the two main techniques to pass information from a main report to a sub-report. There are other methods that are used to pass information along. Two examples of other methods used to pass information within the report include: </p>
<ul>
<li>The <em>Asset Cost Rollup</em> report actually pulls information in the <em>Initialize Method</em> script instead of the <em>Open Method</em>. </li>
<li>The <em>Projected PM Labor</em> report pulls information on the <em>Fetch Method</em> script in both the main report and sub-report datasets. </li>
</ul>
<p>Take a look at the rptdesign files of these two reports in BIRT to see details on how these two reports were written.</p>Working around Apple2014-06-17T17:33:24-05:002014-06-17T17:33:24-05:00Jason Verlytag:mygeekdaddy.net,2014-06-17:/2014/06/17/working-around-apple/<p><a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&uo=4" title="pythonista">Pythonista</a> and <a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8&uo=4" title="Editorial">Editorial</a> have become two of the staples in my day to day workflow. Recently there have been some ripples in Apple's perception of these two apps:</p>
<blockquote class="twitter-tweet" lang="en">I’ve just resubmitted Editorial 1.1.1. It can no longer download or open .py files from Dropbox – fingers crossed …</blockquote><p><a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&uo=4" title="pythonista">Pythonista</a> and <a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8&uo=4" title="Editorial">Editorial</a> have become two of the staples in my day to day workflow. Recently there have been some ripples in Apple's perception of these two apps:</p>
<blockquote class="twitter-tweet" lang="en">I’ve just resubmitted Editorial 1.1.1. It can no longer download or open .py files from Dropbox – fingers crossed.</p>— Ole Zorn (@olemoritz) <a href="https://twitter.com/olemoritz/statuses/475453986263158784">June 8, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<blockquote class="twitter-tweet" lang="en">Just submitted Pythonista 1.5 within Apple's 48h deadline. “Open in” menu integration is gone, I hope this is enough.</p>— Ole Zorn (@olemoritz) <a href="https://twitter.com/olemoritz/statuses/477265243450933248">June 13, 2014</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>Apple raised concerns about the ability for both of these apps to use the “Open In” menu function to get files from other sources, like Dropbox. While this functionality has been in both apps for some time, Apple went back and said both apps break the App Store policy.
To meet Apple's requests, Ole Zorn (<a href="https://twitter.com/olemoritz">@olemoritz</a>), creator of Pythonista and Editorial, removed the ability to use the “Open In” menu functionality. While this change appear to have satisfied Apple, it broke quite a few work processes for people who used Dropbox as their central repository for scripts and files - including me. Thankfully the beauty of using apps that can run Python is that they have a way of working around Apple's change request.
Ole has shared a Python script to use a UI file picker to bring files back into Pythonista (v1.5+) or Editorial (v1.1+) from Dropbox. The script, listed below, was shared by Ole on GitHub:
<script src="https://gist.github.com/omz/fb180c58c94526e2c40b.js"></script>
<a href="https://gist.github.com/omz/fb180c58c94526e2c40b#file-dropbox-file-picker-py">This script</a> can be run either directly in Pythonista or used as an <a href="http://www.editorial-workflows.com/workflow/6366299429011456/IRERjtyaHrA">Editorial workflow</a> to pull files from Dropbox back to the local folder of the app.
So instead of opening a file in Dropbox and pushing it over to an app, like this:
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Working_around_Apple_2014_06_17_161508.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Working_around_Apple_2014_06_17_161508.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
I can run the script, or workflow, and pull the file I want back into the app like this:
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Working_around_Apple_2014_06_17_163109.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Working_around_Apple_2014_06_17_163109.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
I think the functionality offered with the Dropbox UI Picker script is a better fit for both apps. When I need to get a file I can pull it back into Pythonista or Editorial without leaving the app I'm working in. This keeps my focus on the script or post I'm working on instead of bouncing around from Dropbox's app back to the one I'm working in.
So for now I've future proofed both Pythonista and Editorial from any problems of losing the “Open In” menu functionality.
Thanks Ole!Coaches Feedback2014-06-10T21:13:50-05:002014-06-10T21:13:50-05:00Jason Verlytag:mygeekdaddy.net,2014-06-10:/2014/06/10/coaches-feedback/<p>One of the joys I've had the last couple of summers has been coaching my son's baseball team. I volunteered, I got the job, and I've stuck with it for 4 years now. I've tried to do the right things, emphasize the basics, and encourage each player to try their …</p><p>One of the joys I've had the last couple of summers has been coaching my son's baseball team. I volunteered, I got the job, and I've stuck with it for 4 years now. I've tried to do the right things, emphasize the basics, and encourage each player to try their best. And in all that time I've only received thanks and praise from my players' parents. </p>
<p>Until tonight. </p>
<p>Tonight I got called out by a parent from the opposing team. Now I didn't get called out directly, it was more like 'guilt by association'. One of the opposing team's coaches was trying to correct what a player had done wrong in the field.<sup id="fnref:refx_comm"><a class="footnote-ref" href="#fn:refx_comm">1</a></sup> The parent was upset their son got called out and yelled at the coach. The two of them got into a heated debate and then the upset parent screamed, 'Both of you need to get your heads out of your ass!' (pointing over in my direction) Hence the guilt by association. As upset as I was about getting told to pull my head from where the sun doesn't shine, I knew I was in the right for one main reason: </p>
<blockquote>
<p>I volunteered to coach a team. Period.</p>
</blockquote>
<p>If that parent was so upset about how his son was being treated, they had every chance in the world to volunteer to help coach on their son's team. Every coach I've worked with has taken on a coaching role for the love of the game, the joy in watching the kids play, and knowing we've made an impact on these kids lives - forever. So the next time your upset about your kid getting put on the bench or being told to pay attention, just remember... you could have been the one doing it instead. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:refx_comm">
<p>Some would say 'incorrect'. I would say go somewhere else. ↩ <a class="footnote-backref" href="#fnref:refx_comm" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Simple email rule for Outlook (Mac)2014-06-06T13:16:57-05:002014-06-06T13:16:57-05:00Jason Verlytag:mygeekdaddy.net,2014-06-06:/2014/06/06/simple-email-rule-for-outlook-mac/<p>Sometimes it's the simple things we tend to overlook. We miss changing one step in our daily routine or delegating a task that may save us hours over the course of a week or month.</p>
<p>My weakness lately has been managing email.</p>
<p><strong>Outlook 2011 for Mac:</strong></p>
<figure><a href="http://share.mygeekdaddy.me/delete_email_rule_2014-06-06.png"><img src="http://share.mygeekdaddy.me/delete_email_rule_2014-06-06.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The email rule above …</p><p>Sometimes it's the simple things we tend to overlook. We miss changing one step in our daily routine or delegating a task that may save us hours over the course of a week or month.</p>
<p>My weakness lately has been managing email.</p>
<p><strong>Outlook 2011 for Mac:</strong></p>
<figure><a href="http://share.mygeekdaddy.me/delete_email_rule_2014-06-06.png"><img src="http://share.mygeekdaddy.me/delete_email_rule_2014-06-06.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The email rule above will look at any message marked 'Unread' in the 'Deleted' folder and will permanently delete them. This is awesome sauce for my peace of mind.</p>
<p><strong>Outlook 2010 for Windows:</strong></p>
<p style="color:red; font-weight:bold;font-size:36px; text-align:center; width: 100px; background-color:rgb(220,220,220); padding:10px;display:block; margin-left: auto; margin-right:auto;box-shadow: 5px 5px 5px #888888;border-radius: 5px;">?</p>
<p>At this point I haven't been able to find a way to do this via the mail rules built into Outlook, without resorting to a VB macro.</p>Update Maximo WF via Person Groups2014-06-03T10:19:53-05:002014-06-03T10:19:53-05:00Jason Verlytag:mygeekdaddy.net,2014-06-03:/2014/06/03/update-maximo-wf-via-person-groups/<p>One of the most powerful features of Maximo is sometimes the one least used... Workflow.</p>
<blockquote>
Workflow features let you automate repetitive business and record management processes. This provides a means for greater efficiency and accountability throughout your enterprise.<sup id="fnref-2814-ref1"><a href="#fn-2814-ref1" rel="footnote">1</a></sup>
</blockquote>
<p>One of the most common workflows are approval processes - work order …</p><p>One of the most powerful features of Maximo is sometimes the one least used... Workflow.</p>
<blockquote>
Workflow features let you automate repetitive business and record management processes. This provides a means for greater efficiency and accountability throughout your enterprise.<sup id="fnref-2814-ref1"><a href="#fn-2814-ref1" rel="footnote">1</a></sup>
</blockquote>
<p>One of the most common workflows are approval processes - work order, purchase request, etc. A common step in an approval workflow (WF) is checking to see who reported/requested a given record and then direct the next actions to be taken on that record, based on that check. Here's a simple work order WF that checks who reported the work order to automatically set the work order status.</p>
<figure><a href="http://share.mygeekdaddy.me/basic_wf_workorder_2014-06-03.png"><img src="http://share.mygeekdaddy.me/basic_wf_workorder_2014-06-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The Condition Node (yellow diamond) checks to see who reported the WO. If the work order was requested by either <em>REYNOLDSM01'</em> or <em>'WASHBURNEZ01'</em>, the WF will set the work order to 'APPR' status, otherwise the WF will set the status to 'WSCH'.</p>
<figure><a href="http://share.mygeekdaddy.me/cond3_check_2014-06-03.png"><img src="http://share.mygeekdaddy.me/cond3_check_2014-06-03.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So what happens if the people responsible for the approval changes?</p>
<h4>Opt 1: Update the WF</h4>
<p>The out of the box solution is to make a process revision, update the Condition Node, re-validate, and reactivate the WF. The problem with this method is WF administration is usually left to a high level administrator or an IT Dept.</p>
<p>So the administrator updates the Condition Node from:</p>
<pre><code>:reportedby = 'REYNOLDSM01' or :reportedby = 'WASHBURNEZ01'
</code></pre>
<p>to</p>
<pre><code>:reportedby = 'REYNOLDSM01' or :reportedby = 'FRYEK01'
</code></pre>
<p>This process would happen each time the list of people who should have their work orders automatically set to 'APPR' needs to change. While the update is simple, the modification exposes the WF to other adjustments. This can be a challenge in heavily regulated industries - life science, pharmaceuticals, food processing, nuclear, etc.</p>
<h4>Opt 2: Use Person Groups</h4>
<p>An alternative is to use Person Groups in the Condition Node to check who reported the work order.</p>
<pre><code>:reportedby in (select resppartygroup from persongroupteam where persongroup = 'FF_001')
</code></pre>
<p>In this case, the <code>reportedby</code> is checked against members of a given Person Group. As the Person Group is updated, a Person is either added or removed, the WF is essentially updated as well. The benefit to this method is the WF is not exposed to a process revision or the potential to other unwanted changes. Local site administrators, or power users, can manage the Person Group list of who should have their work order approved without having to alter the core WF process.</p>
<h4>Workflow Reference Docs</h4>
<p>Some of the reference documents listed below are from v7.5, but are still 90% applicable to v7.1 Maximo users.</p>
<ul>
<li><a href="http://pic.dhe.ibm.com/infocenter/tivihelp/v49r1/index.jsp?topic=%2Fcom.ibm.mbs.doc%2Fgp_wkflow%2Ft_implement_wf_proc.html">Implementing Workflows in Maximo</a></li>
<li><a href="http://pic.dhe.ibm.com/infocenter/tivihelp/v49r1/topic/com.ibm.mbs.doc/pdfs/pdf_mbs_workflow.pdf">Maximo Implementation Guide (v7.5)</a></li>
<li><a href="http://pic.dhe.ibm.com/infocenter/tivihelp/v32r1/topic/com.ibm.srm.doc_721/pdf_processing/out/srm_workflow.pdf">Advanced Workflow Implementations</a></li>
</ul>
<div class="footnotes">
<hr />
<ol>
<li id="fn-2814-ref1">
<a href="http://pic.dhe.ibm.com/infocenter/tivihelp/v49r1/topic/com.ibm.mbs.doc/pdfs/pdf_mbs_workflow.pdf">Workflow Implementation Guide</a>, Page 1, Copyright IBM Corp. 2008, 2013 <a href="#fnref-2814-ref1" rev="footnote">↩</a>
</li>
</ol>
</div>How to Tag tasks in OmniFocus2014-05-29T13:51:41-05:002014-05-29T13:51:41-05:00Jason Verlytag:mygeekdaddy.net,2014-05-29:/2014/05/29/how-to-tag-tasks-in-omnifocus/<p>Last week <a href="http://www.omnigroup.com/about/">The Omni Group</a> released <a href="http://www.omnigroup.com/omnifocus">OmniFocus 2</a>, an update to their GTD task management software. One of the longest threads on the OmniFocus 1 forums has been a plea for the inclusion of tagging actions. With the release of OmniFocus 2, the <a href="https://discourse.omnigroup.com/t/multiple-contexts-per-task/985">same thread</a> has been picked right where …</p><p>Last week <a href="http://www.omnigroup.com/about/">The Omni Group</a> released <a href="http://www.omnigroup.com/omnifocus">OmniFocus 2</a>, an update to their GTD task management software. One of the longest threads on the OmniFocus 1 forums has been a plea for the inclusion of tagging actions. With the release of OmniFocus 2, the <a href="https://discourse.omnigroup.com/t/multiple-contexts-per-task/985">same thread</a> has been picked right where it left off.</p>
<p>Guess what? You can do tags in OmniFocus today!</p>
<h4>Sample Project:</h4>
<p>Here’s an sample project I have in OmniFocus:</p>
<figure><a href="http://share.mygeekdaddy.me/Projects_2014-05-29.png"><img src="http://share.mygeekdaddy.me/Projects_2014-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>In the long description (that’s what I call it) of the task, I added tags with the ‘#’ symbol in front them. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> This allows me to have an action to have multiple tags, but still under a single context. I use Contexts as part of my weekly review, but use tags to quickly find and organize actions. The two main ways I do this is through Searching or Perspectives.</p>
<h4>Searching:</h4>
<p>In OmniFocus 2, the search function will do a literal search of the text entered in the search box. So when I search for the word <em>wordpress</em>, I get multiple results:</p>
<figure><a href="http://share.mygeekdaddy.me/Projects_2_2014-05-29.png"><img src="http://share.mygeekdaddy.me/Projects_2_2014-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>But now if I search for <em>#wordpress</em>, I only get my ‘tagged’ action items:</p>
<figure><a href="http://share.mygeekdaddy.me/Screenshot_5_29_14__11_58_AM_2014-05-29.png"><img src="http://share.mygeekdaddy.me/Screenshot_5_29_14__11_58_AM_2014-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now I can search across all of my projects for tasks with a given set of tags. </p>
<h4>Perspectives:</h4>
<p>The other way I’ve used tags is with a specific perspective. In the example below I have set up a perspective to show just my <em>#CSS</em> tags. </p>
<figure><a href="http://share.mygeekdaddy.me/Screen_Shot_2014-05-29_at_11_45_40_AM_2014-05-29.png"><img src="http://share.mygeekdaddy.me/Screen_Shot_2014-05-29_at_11_45_40_AM_2014-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So now when I click on my <em>#CSS</em> perspective, I get a list of tasks that only include this tag. </p>
<figure><a href="http://share.mygeekdaddy.me/_CSS_Tasks_perspective_2014-05-29.png"><img src="http://share.mygeekdaddy.me/_CSS_Tasks_perspective_2014-05-29.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The follow up question I get, after showing how I tag in OmniFocus, is how to get a list of tags used in OmniFocus or a method to control what tags are used. I simply state that what I showed them is one option for tagging in OmniFocus. I’m sure there would be a way to use Applescript or Python to parse all the tags used in the OmniFocus database and present a list, but that’s outside of how I’m using tags at this time. </p>
<p>Otherwise, ask Brett (<a href="https://twitter.com/ttscoff">@ ttscoff</a>), I’m sure he’s come up with something for tagging in OmniFocus by now. </p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
I used the ‘#’ symbol as an example only. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#63489" title="2014-06-06 13:32:21">Jason.Verly</a>:</strong> My point is that I've got a way to specify my searches by using a tag in the task note. Is this a full blown tagging method? Absolutely not and I hoped I made that point in my post. Long term I hope OmniFocus will have a full fledged tagging service as you describe.</p>
<p><strong><a href="#62332" title="2014-06-05 13:57:44">Andy Logan</a>:</strong> Except of course that these really aren't tags. The reason the thread popped up again, and I've been participating, is that what you're suggesting isn't tagging, it's text search. Tagging would allow me to autocomplete and filter with proper tools inside OF, not have to build custom perspectives. I agree, this works if you have a very limited set of tags you want to use and don't mind having tons of perspectives to manage. If you are looking for a greater number of tags or want to use built in filtering tools it scales poorly. Then you have to setup text completion or buy a tool, which you then need to manage your tags in. Given the re-write and the number of features deleted plus having to buy pro just to keep the features you had in OF1, this is a huge disappointment.</p>
<p><strong><a href="#54703" title="2014-05-30 10:14:57">Lurlene</a>:</strong> Good day! I know this is somewhat off topic but I was wondering if you knew where I could find a captcha plugin for my comment form? I'm using the same blog platform as yours and I'm having trouble finding one? Thanks a lot!</p>Compact Layout in OmniFocus 22014-05-22T11:49:14-05:002014-05-22T11:49:14-05:00Jason Verlytag:mygeekdaddy.net,2014-05-22:/2014/05/22/compact-layout-in-omnifocus-2/<p>One of the things I loved about OmniFocus was the ability to customize the layout (colors, fonts, etc) to suit my needs. Changing the layout allowed me to customize the “feel” of OmniFocus to be more inviting. This got me to feel more comfortable and want to come back again …</p><p>One of the things I loved about OmniFocus was the ability to customize the layout (colors, fonts, etc) to suit my needs. Changing the layout allowed me to customize the “feel” of OmniFocus to be more inviting. This got me to feel more comfortable and want to come back again - a challenge I had in the past when trying to get my weekly review done on a regular basis. I’ve been beta testing OmniFocus 2 for a while now and one of the significant changes is the screen layout. While OmniFocus 2 does not have (yet?) the same screen/layout customizations as OmniFocus 1, it was revealed today that OmniFocus 2 does have an alternate layout option. </p></p>
<p><strong>OmniFocus 1 Layout:</strong></p>
<p>This is a sample project, with tasks, in my OmniFocus 1 customized skin:</p>
<figure><a href="http://share.mygeekdaddy.me/OMF1_sample_layout_2014-05-22.png"><img src="http://share.mygeekdaddy.me/OMF1_sample_layout_2014-05-22.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>Default Layout:</strong></p>
<p>During the beta process for OmniFocus 2, I heard through the feedback that The Omni Group want to give OmniFocus a cleaner look.</p>
<figure><a href="http://share.mygeekdaddy.me/OmniFocus_default_layout_2014-05-22.png"><img src="http://share.mygeekdaddy.me/OmniFocus_default_layout_2014-05-22.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>While the look is cleaner, it uses <em>a lot</em> more screen space than my previous skin. This started to feel less inviting and I noticed I would do task management in OmniFocus 2, but do my reviews in OmniFocus 1. Not exactly the intent of the update. </p>
<p><strong>Compact Layout:</strong></p>
<p>I learned earlier today about an option to enable a “compact” screen layout. </p>
<figure><a href="http://share.mygeekdaddy.me/OmniFocus_compact_layout_2014-05-22.png"><img src="http://share.mygeekdaddy.me/OmniFocus_compact_layout_2014-05-22.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This screen was more in line to how I want to use OmniFocus - single line, great use of space, and check box on the left. To switch to the compact layout, enter the following URL in Safari:</p>
<pre><code>omnifocus:///change-preference?ContentLayout=compact
</code></pre>
<p><strong>Warning:</strong></p>
<p>Ken Case gave a little bit of warning on the two layouts on the new <a href="http://discourse.omnigroup.com/t/alternate-layout-which-displays-everything-on-one-line-with-status-circles-on-the-left/1697">OmniFocus forums</a>: </p>
<blockquote>
Some known issues off the top of my head with this prototype layout:
<ul>
<li>When the window is narrow enough that text starts to wrap, the status circle and note icon should stay aligned with the top row of text in the task title. (Right now, the status circle floats to the center of the entire task, while the note icon floats to the bottom.)</li>
<li>The flag icon which hangs off the corner of the status circle is pretty ridiculously small.</li>
</ul>
</blockquote>
<p>To switch back to the default layout, enter the following URL in Safari:</p>
<pre><code>omnifocus:///change-preference?ContentLayout
</code></pre>
<p>So far my use with the compact layout has made my yearning for OmniFocus 1’s skin less and less. I did a quick review to test out the compact layout and it felt much more comfortable.</p>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#63484" title="2014-06-06 13:30:22">Jason.Verly</a>:</strong> I found the focus point is not the smaller circle, but down and to the right a bit - like 4 o'clock. I submitted a bug report to Omni Group on the issue.</p>
<p><strong><a href="#44724" title="2014-05-23 11:43:50">Zachary</a>:</strong> Where do you enter the url?</p>
<p><strong><a href="#54609" title="2014-05-30 08:11:39">Jason.Verly</a>:</strong> Enter the URL in Safari. OmniFocus has a URL scheme that picks up the preference change from Safari.</p>
<p><strong><a href="#57868" title="2014-06-01 14:53:32">Zachary</a>:</strong> Thanks. I had some adware that was preventing this from working. Looks good now. Thanks.</p>
<p><strong><a href="#59806" title="2014-06-03 11:23:33">Dwayne</a>:</strong> Good tips. I somehow managed to get on the compact layout and couldn't figure out how to get it back. The downside I encountered from the compact layout was that I couldn't check a task off - I had to right-click and select 'Complete' because the checkbox wouldn't work.</p>Adding Contextual Information to Maximo2014-05-17T21:20:01-05:002014-05-17T21:20:01-05:00Jason Verlytag:mygeekdaddy.net,2014-05-17:/2014/05/17/adding-contextual-information-to-maximo/<p>One of the common traps I have with newer users is getting frustrated because they don’t know Maximo as well as I do. I get calls about how can they see a certain field, where to look up ceratin information, or how to know what state a transaction is …</p><p>One of the common traps I have with newer users is getting frustrated because they don’t know Maximo as well as I do. I get calls about how can they see a certain field, where to look up ceratin information, or how to know what state a transaction is in. Maximo generally gives that information <em>somewhere</em> in the application, but not always where a user can easily see it or intuitively know where to find it. </p>
<p>I finally sat back and realized my frustration wasn’t the fault of my user community and I needed to take a different perspective on helping them. Generally the problem the user was having wasn’t a real error, but lack of clarity on information they wanted to quickly see or understand. Sitting back I realized I needed to not change screens but add context to the information already availabile. </p>
<h4>Contextual Information:</h4>
<p>The idea of contextual information is to give users a sense of information or detail, without adding the complexity of having to review the actual underlying data. The first example I worked through with one site was giving Buyers a better picture of what PO lines had been fully received. My original pushback to them was the details were already in Maximo, just open the PO line detail and look under the ‘Receipts’ group. But after I understood the workflow the Buyers were trying to implement, opening the detail was counter productive. They wanted to be able to quickly scan a PO, especially with multiple PO lines, to see what lines were partially received, fully received, or had no receipts. </p>
<p>So working with the sites, I gave them the following solution:</p>
<figure><a href="http://share.mygeekdaddy.me/Purchase_Orders_CondUI_copy_2014-05-14.jpg"><img src="http://share.mygeekdaddy.me/Purchase_Orders_CondUI_copy_2014-05-14.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>The Setup:</h4>
<p>Getting this setup in Maximo requires a power user or administrator with access to the following applications:</p>
<ul>
<li>Conditional Expression Manager</li>
<li>Application Designer</li>
</ul>
<p><strong>Step 1: Conditional Expression</strong> The glue that holds all of the contextual information together is the conditional expression that tests what state a PO line is in. </p>
<pre><code>ORDERQTY > RECEIVEDQTY and RECEIVEDQTY is not null
</code></pre>
<figure><a href="http://share.mygeekdaddy.me/Conditional_Expression_Manager_1122_2014-05-14.png"><img src="http://share.mygeekdaddy.me/Conditional_Expression_Manager_1122_2014-05-14.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The logic behind this conditional expression is we want the condition to be true is two parts:</p>
<ol>
<li>When the Order Qty (how many we want to receive) is still greater then the Received Qty (how many we have received) will be true when a PO line is partially received.</li>
<li>When <code>RECEIVEDQTY is not null</code> will exclude false positives of PO lines that are yet to be received.</li>
</ol>
<p><strong>Step 2: Receipt Status Box</strong> The next step is to add the ‘Receipts Complete’ check box that’s used in the PO Line Details ‘Receipts’ section. Open Application Designer and add the check box to the end of the PO Line Table. Make sure the attribute is <code>RECEIPTSCOMPLETE</code>.</p>
<figure><a href="http://share.mygeekdaddy.me/Application_Designer_PO_Line_2014-05-14.png"><img src="http://share.mygeekdaddy.me/Application_Designer_PO_Line_2014-05-14.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>Step 3: Set Sig Option</strong> For <a href="http://www-01.ibm.com/support/docview.wss?uid=swg27036651&aid=1">conditional formatting</a> to work, it has to be tied to a <a href="https://www.ibm.com/developerworks/community/wikis/home?lang=en#!/wiki/IBM%20Maximo%20Asset%20Management/page/Conditionally%20changing%20user%20interface%20properties">signature option</a> that is enabled in Security Groups as part of the access to an application. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> In this example I used the existing ‘READ’ signature option that would have to be enabled in Security Groups for someone to be able to read/see purchase orders in the Purchasing app. </p>
<figure><a href="http://share.mygeekdaddy.me/Application_Designer_sig_opt_2014-05-14.png"><img src="http://share.mygeekdaddy.me/Application_Designer_sig_opt_2014-05-14.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>Step 4: Conditional Properties</strong> The last step is to configure the conditional properties for the ‘Receipts Complete’ check box object.</p>
<ul>
<li>Add a security group the conditional property will be used by. In this case I used the ‘Buyer’ group since that’s the only group in our process that will be in Purchasing at this depth.</li>
<li>Add the Conditional Expression created in Step 1. Make sure to check ‘Reevaluate’.</li>
<li>Add the property to be altered by the Conditional Expression check. Since I was only interested in finding out when the condition was true, only that side was added. Leaving the false condition property means that nothing will be changed if the condition is false.</li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/Application_Designer_sig_opt_detail_2014-05-14.png"><img src="http://share.mygeekdaddy.me/Application_Designer_sig_opt_detail_2014-05-14.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Summary:</h4>
<p>So now when users look at a multiline purchase order, they can easily understand which PO lines are partially received, fully received, or have not been received at all. The plan moving forward will be to look at other ways to give users a quicker context of the information they are looking for:</p>
<ul>
<li>Overdue PM’s work orders.</li>
<li>Training for users on information that will change from optional to mandatory.</li>
</ul>
<p>Got any more ideas? Hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a> and I’ll add a tutorial on the best one submitted. Use the hashtag <span style="color:rgb(120,120,120)"><strong>#TUGTutorial</strong></span>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
If you want to read more, go check out Bruno Portaluri’s <a href="http://maximodev.blogspot.com/p/conditional-expressions.html">Maximo Dev Blog</a>. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#68311" title="2014-06-10 15:08:49">Reviews on Adonis Golden Ratio</a>:</strong> Thanks for the marvelous posting! I actually enjoyed reading it, you're a great author. I will be sure to bookmark your blog and will come back later on. I want to encourage you continue your great writing, have a nice evening!</p>Problems with CSS2014-05-07T21:44:46-05:002014-05-07T21:44:46-05:00Jason Verlytag:mygeekdaddy.net,2014-05-07:/2014/05/07/problems-with-css/<p>It's been pointed out some of the CSS on my site does not play well with some browsers.</p>
<p>The way the site should look all the time (Safari on OS X 10.9):</p>
<figure><a href="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.52.01_PM_2014-05-05.png"><img src="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.52.01_PM_2014-05-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Firefox on OS X 10.9:</p>
<figure><a href="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.45.57_PM_2014-05-05.png"><img src="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.45.57_PM_2014-05-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Internet Explorer 11 on Windows 7:</p>
<figure><a href="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.39.41_PM_2014-05-05.png"><img src="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.39.41_PM_2014-05-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Internet Explorer 8 on Windows …</p><p>It's been pointed out some of the CSS on my site does not play well with some browsers.</p>
<p>The way the site should look all the time (Safari on OS X 10.9):</p>
<figure><a href="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.52.01_PM_2014-05-05.png"><img src="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.52.01_PM_2014-05-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Firefox on OS X 10.9:</p>
<figure><a href="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.45.57_PM_2014-05-05.png"><img src="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.45.57_PM_2014-05-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Internet Explorer 11 on Windows 7:</p>
<figure><a href="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.39.41_PM_2014-05-05.png"><img src="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_at_3.39.41_PM_2014-05-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Internet Explorer 8 on Windows XP: <sup id="fnref-2794-ie8"><a href="#fn-2794-ie8" rel="footnote">1</a></sup></p>
<figure><a href="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_sdfs_2014-05-05.png"><img src="http://share.mygeekdaddy.me/Screen_Shot_2014-05-05_sdfs_2014-05-05.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>So yes, I obviously have some CSS cleaning to do. Just please know I'm working on it and hope you'll see improvements over the next couple of weeks.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-2794-ie8">
Yes, it really is that ugly. <a href="#fnref-2794-ie8" rev="footnote">↩</a>
</li>
</ol>
</div>Easy hack for unbound BIRT report2014-04-29T18:55:30-05:002014-04-29T18:55:30-05:00Jason Verlytag:mygeekdaddy.net,2014-04-29:/2014/04/29/easy-hack-for-unbound-birt-report/<p>IBM recently posted a KB doc on <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21664473">unbound parameters in BIRT rreport</a>. The gist of the KB doc was this: </p>
<blockquote>
<p>There is a subtle difference in the way bound vs unbound parameters are used in reports. For bound parameters, if you select a value from the lookup you will see …</p></blockquote><p>IBM recently posted a KB doc on <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21664473">unbound parameters in BIRT rreport</a>. The gist of the KB doc was this: </p>
<blockquote>
<p>There is a subtle difference in the way bound vs unbound parameters are used in reports. For bound parameters, if you select a value from the lookup you will see that the value will appear with an "=" sign in front of it on the request page. For example a site parameter that is using the site lookup would appear as "=BEDFORD" after you have selected BEDFORD from the list of sites. If you run your report with this, the report will show the results for the selected site. However, if the site parameter is unbound (and there are some examples of these in our out-of-the-box reports) and you type in "=BEDFORD' as your parameter value, you will see no data on the report. </p>
</blockquote>
<p>The best example I have for an out of the box unbound report is the "Issues and Returns Transaction". The report has two parameters, with one of them against the MATUSETRANS.SITEID field. But since this report runs from the Inventory module, there isn't a way to bound the MATUSETRANS.SITEID to the INVENTORY.SITEID field. So as the KB doc states, if a user tries to enter <code>=BEDFORD</code>, the report will fail. The out of the box parameter for the MATUSETRANS.SITEID parameter is: </p>
<div class="highlight"><pre><span></span><code>maximoDataSet.setQueryParameterValue(1, params["site"].toUpperCase());
</code></pre></div>
<p>Modify the parameter to this: </p>
<div class="highlight"><pre><span></span><code>maximoDataSet.setQueryParameterValue(1, params["site"].replace("=" , "").toUpperCase());
</code></pre></div>
<p>Adding <code>.replace("=" , "")</code> will take any instances of where a user enters <code>=BEDFORD</code>, strips out the <code>=</code> if it's present, and just passes <code>BEDFORD</code>.</p>Is Fantastical worth $10?2014-04-02T21:32:06-05:002014-04-02T21:32:06-05:00Jason Verlytag:mygeekdaddy.net,2014-04-02:/2014/04/02/is-fantastical-worth-10/<p>Earlier today Flexibits released a version of <a href="https://itunes.apple.com/us/app/fantastical-2-for-ipad-calendar/id830708155?mt=8&uo=4" title="Fantastical 2">Fantastical for the iPad</a>. I immediately hit the 'Buy' button for the app. Fantastical has become my de facto calendar app for sometime now. I use it with <a href="https://itunes.apple.com/us/app/drafts-for-ipad-quickly-capture/id542797283?mt=8&uo=4" title="Drafts">Drafts</a>, the natural language is amazing, and the layout works for me.<sup id="fnref-2601-agenda"><a href="#fn-2601-agenda" rel="footnote">1</a></sup></p>
<p>So I …</p><p>Earlier today Flexibits released a version of <a href="https://itunes.apple.com/us/app/fantastical-2-for-ipad-calendar/id830708155?mt=8&uo=4" title="Fantastical 2">Fantastical for the iPad</a>. I immediately hit the 'Buy' button for the app. Fantastical has become my de facto calendar app for sometime now. I use it with <a href="https://itunes.apple.com/us/app/drafts-for-ipad-quickly-capture/id542797283?mt=8&uo=4" title="Drafts">Drafts</a>, the natural language is amazing, and the layout works for me.<sup id="fnref-2601-agenda"><a href="#fn-2601-agenda" rel="footnote">1</a></sup></p>
<p>So I got asked about the value of the app and if $10 was justifiable?</p>
<blockquote class="twitter-tweet" data-conversation="none" lang="en"><a href="https://twitter.com/mygeekdaddy">@mygeekdaddy</a> is it work the $10? What justifies the purchase from your perspective?</p>— Jason Warren (@JasonConnects) <a href="https://twitter.com/JasonConnects/statuses/451508149384933376">April 2, 2014</a></blockquote>
<p>It's a simple questions that doesn't have a simple answer. I'll be honest, I've been living with Fantastical 2 for iPhone on my iPad since mid-December. Does it work? Yes. Does it work well? No.
And there's the rub.
Both versions work on my iPad and the difference for me has been the fact that I've started to do more and more on my iPad and less and less on my iPhone. On my iPad I'll do schedule planning with my wife, weekly reviews, project planning at work, etc. On my iPhone all I'm doing is entering events via Drafts to Fantastical. I don't see my calendar on my iPhone unless it's an event over the weekend or I'm out and about.
Today's calendar in Fantastical 2 for iPhone:
<figure><a href="http://share.mygeekdaddy.me/_img_2014_04_02_204231.png"><img src="http://share.mygeekdaddy.me/_img_2014_04_02_204231.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:300px;" /></img></a></figure>
Today's calendar in Fantastical 2 for IPad:
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Fantastical_iPad_2014_04_02_204608.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Fantastical_iPad_2014_04_02_204608.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:450px;" /></img></a></figure>
<strong>Overview:</strong> The two examples above are stripped down versions of my current calendars.<sup id="fnref-2601-deadpool"><a href="#fn-2601-deadpool" rel="footnote">2</a></sup> Flexibits did a great job of knowing how someone would probably use their calendar. For the iPhone version its a quick snapshot of events and reminders that are coming up today. If I need to see tomorrow, or other dates, its a simple flick of the day stream.
On the iPad, Flexibits used the screen size to give a calendar app that feels more like a power calendar app. I can easily move from monthly view to work week view and then pan around to see what's happening next week. This is going to make my weekly reviews even easier because the screen size allows me to see so much more.
Functionally the two apps have been behaving identically. All my current <a href="http://mygeekdaddy.net/2014/02/26/running-page-of-url-actions/">Drafts actions</a> to Fantastical work with the iPad version. The natural language event entry works in both. And the look and feel of each apps makes you comfortable switch from one to another and back again.
<strong>Bottom line:</strong> I've probably spent more time and money chasing down the latest and greatest app than I'd ever care to admit.<sup id="fnref-2601-wife"><a href="#fn-2601-wife" rel="footnote">3</a></sup> Fantastical is far more functional than the default iOS calendar app. The work I do requires me to have an accurate calendar. If that's the world you live, having a great calendar app will probably pay for itself. If all you have on calendar is family birthdays and holidays, then maybe the iOS Calendar is more your speed.
So is $10 worth a calendaring app? Maybe.
<div class="footnotes">
<hr />
<ol>
<li id="fn-2601-agenda">
Ok, Agenda's UI is better in IMO, but it has some weird latency problems if it's not opened right away in the morning for a refresh. <a href="#fnref-2601-agenda" rev="footnote">↩</a>
</li>
<li id="fn-2601-deadpool">
And yes... knowing which day a new comic comes out is important. <a href="#fnref-2601-deadpool" rev="footnote">↩</a>
</li>
<li id="fn-2601-wife">
Or at least let my wife know about. <a href="#fnref-2601-wife" rev="footnote">↩</a>
</li>
</ol>
</div>Effective versus efficient2014-04-02T17:08:29-05:002014-04-02T17:08:29-05:00Jason Verlytag:mygeekdaddy.net,2014-04-02:/2014/04/02/effective-versus-efficient/<p>One of the long standing debates I've had with other reliability peers over the years is the use of <em>effective</em> versus <em>efficient</em>. This came up again when someone tweeted the following: </p>
<blockquote>
<p>Effective means it <a href="https://twitter.com/search?q=%23works&src=hash">#works</a>. Efficient means it <a href="https://twitter.com/search?q=%23works&src=hash">#works</a> well. Compliant means it does not <a href="https://twitter.com/search?q=%23work&src=hash">#work</a> at all</p>
<p>— Francesco Metalli …</p></blockquote><p>One of the long standing debates I've had with other reliability peers over the years is the use of <em>effective</em> versus <em>efficient</em>. This came up again when someone tweeted the following: </p>
<blockquote>
<p>Effective means it <a href="https://twitter.com/search?q=%23works&src=hash">#works</a>. Efficient means it <a href="https://twitter.com/search?q=%23works&src=hash">#works</a> well. Compliant means it does not <a href="https://twitter.com/search?q=%23work&src=hash">#work</a> at all</p>
<p>— Francesco Metalli (@fmetalli) <a href="https://twitter.com/fmetalli/statuses/451442860542685184">April 2, 2014</a></p>
</blockquote>
<p>I disagreed with his statement and replied back. </p>
<blockquote>
<p><a href="https://twitter.com/fmetalli">@fmetalli</a> <a href="https://twitter.com/fmsReliability">@fmsReliability</a> I disagree. Effective means it's done right. Efficient means it's done effortlessly.</p>
<p>— Jason Verly (@mygeekdaddy) <a href="https://twitter.com/mygeekdaddy/statuses/451452988226154496">April 2, 2014</a></p>
</blockquote>
<p>I followed up with. </p>
<blockquote>
<p><a href="https://twitter.com/fmetalli">@fmetalli</a> <a href="https://twitter.com/fmsReliability">@fmsReliability</a> However, I can have people do something effortlessly wrong. Effective > Efficient</p>
<p>— Jason Verly (@mygeekdaddy) <a href="https://twitter.com/mygeekdaddy/statuses/451453237321666560">April 2, 2014</a></p>
</blockquote>
<p>This goes back to my first job, I was three months out of college and in a review meeting on the first project I was going to be leading. The review meeting included a senior engineer, the engineering manager, the plant manager, and the VP of operations. Halfway through my presentation the senior engineer sat up and plainly stated to the entire group, </p>
<blockquote>
<p>"You have no clue what you're talking about." </p>
</blockquote>
<p>I'm about to pass out in front of this group because the senior engineer, who had about 40y of experience, has just called me out in front of everyone. The point he raised was that I had stated the project being considered was the most efficient design option from the three I had reviewed. The review meeting concluded and the senior engineer asked that I stop by his office after lunch. I came back from lunch and knocked on the engineer's door. Sitting on his desk was a care worn dictionary opened to the 'E' section. He asked me to sit down and look up the word <em>efficient</em>. I did and found: </p>
<blockquote>
<p>Efficient: capable of producing desired results without wasting materials, time, or energy.<sup id="fnref:refx_effic"><a class="footnote-ref" href="#fn:refx_effic">1</a></sup></p>
</blockquote>
<p>He then asked me to look up the word <em>effective</em>. I did that too and found: </p>
<blockquote>
<p>Effective: producing a result that is wanted; having an intended effect.<sup id="fnref:refx_effec"><a class="footnote-ref" href="#fn:refx_effec">2</a></sup></p>
</blockquote>
<p>I sat there with a blank look on my face, uncertain of what to do next. The engineer then asked me how could I be so certain my choice was the most efficient when it hadn't even been built yet. I didn't think it was possible, but my face got an even more blank expression. The engineer then smiled and told me to relax. He explained that my first priority should be ensuring that whatever choice is made, it is the most effective process. Once the process is up and running, then you can focus on making it the most efficient process. He said you can't be effective and do things wrong, but you can efficiently make mistakes all day long. </p>
<p>Lesson learned... First make sure it's effective, then make sure it's efficient.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:refx_effic">
<p><a href="http://www.merriam-webster.com/dictionary/efficient">http://www.merriam-webster.com/dictionary/efficient</a> <a class="footnote-backref" href="#fnref:refx_effic" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:refx_effec">
<p><a href="http://www.merriam-webster.com/dictionary/effective">http://www.merriam-webster.com/dictionary/effective</a> <a class="footnote-backref" href="#fnref:refx_effec" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Quick fix to pip install error2014-03-19T22:55:00-05:002014-03-19T22:55:00-05:00Jason Verlytag:mygeekdaddy.net,2014-03-19:/2014/03/19/quick-fix-to-pip-install-error/<p>I recently created some python scripts that I wanted to run periodically to update some information for me. I got the scripts running the way I wanted and decided to move them over to my Mac Mini where I knew they could run uninterrupted throughout the day. One of the …</p><p>I recently created some python scripts that I wanted to run periodically to update some information for me. I got the scripts running the way I wanted and decided to move them over to my Mac Mini where I knew they could run uninterrupted throughout the day. One of the steps I had to take was update my Python environment on my Mac Mini to match my MBP. After installing a few modules I ran into a problem with the PIL/Pillow module. After several attempts at running <code>pip install Pillow</code>, I would end up the with following error:</p>
<div class="highlight"><pre><span></span><code><span class="n">clang</span><span class="o">:</span><span class="w"> </span><span class="n">error</span><span class="o">:</span><span class="w"> </span><span class="n">unknown</span><span class="w"> </span><span class="n">argument</span><span class="o">:</span><span class="w"> </span><span class="s1">'-mno-fused-madd'</span><span class="w"> </span><span class="o">[-</span><span class="n">Wunused</span><span class="o">-</span><span class="n">command</span><span class="o">-</span><span class="n">line</span><span class="o">-</span><span class="n">argument</span><span class="o">-</span><span class="n">hard</span><span class="o">-</span><span class="n">error</span><span class="o">-</span><span class="k">in</span><span class="o">-</span><span class="n">future</span><span class="o">]</span><span class="w"></span>
<span class="n">clang</span><span class="o">:</span><span class="w"> </span><span class="n">note</span><span class="o">:</span><span class="w"> </span><span class="k">this</span><span class="w"> </span><span class="n">will</span><span class="w"> </span><span class="n">be</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">hard</span><span class="w"> </span><span class="n">error</span><span class="w"> </span><span class="o">(</span><span class="n">cannot</span><span class="w"> </span><span class="n">be</span><span class="w"> </span><span class="n">downgraded</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="n">a</span><span class="w"> </span><span class="n">warning</span><span class="o">)</span><span class="w"> </span><span class="k">in</span><span class="w"> </span><span class="n">the</span><span class="w"> </span><span class="n">future</span><span class="w"></span>
<span class="n">error</span><span class="o">:</span><span class="w"> </span><span class="n">command</span><span class="w"> </span><span class="s1">'cc'</span><span class="w"> </span><span class="n">failed</span><span class="w"> </span><span class="k">with</span><span class="w"> </span><span class="n">exit</span><span class="w"> </span><span class="n">status</span><span class="w"> </span><span class="mi">1</span><span class="w"></span>
</code></pre></div>
<p>Hmm…. I’m the first to admit I’m a total newbie when it comes to deciphering install errors like this, so I poked around stackexchange for an answer. Sure enough, someone had already posted something similiar: <sup id="fnref:refx_pipstckech"><a class="footnote-ref" href="#fn:refx_pipstckech">1</a></sup></p>
<blockquote>
<p>The Apple LLVM compiler in Xcode 5.1 treats unrecognized command-line options as errors. This issue has been seen when building both Python native extensions and Ruby Gems, where some invalid compiler options are currently specified. Projects using invalid compiler options will need to be changed to remove those options. To help ?ease that transition, the compiler will temporarily accept an option to downgrade the error to a warning:</p>
<p><code>-Wno-error=unused-command-line-argument-hard-error-in-future</code></p>
</blockquote>
<p>Further reading from the Xcode release notes shows:</p>
<blockquote>
<p>As of Apple LLVM compiler version 5.1 (clang-502) and later, the optimization level <code>-O4</code> no longer implies link time optimization (LTO). In order to build with LTO explicitly use the <code>-flto</code> option in addition to the optimization level flag. (15633276)</p>
<ul>
<li>The Apple LLVM compiler in Xcode 5.1 treats unrecognized command-line options as errors. This issue has been seen when building both Python native extensions and Ruby Gems, where some invalid compiler options are currently specified.</li>
</ul>
<p>Projects using invalid compiler options will need to be changed to remove those options. To help ease that transition, the compiler will temporarily accept an option to downgrade the error to a warning: </p>
<p><code>-Wno-error=unused-command-line-argument-hard-error-in-future</code></p>
<p><strong>Note:</strong> This option will not be supported in the future.</p>
<p>To workaround this issue, set the <code>ARCHFLAGS</code> environment variable to downgrade the error to a warning. For example, you can install a Python native extension with:</p>
<p><code>$ ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future easy_install ExtensionName</code></p>
<p>Similarly, you can install a Ruby Gem with:</p>
<p><code>$ ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future gem install GemName</code></p>
</blockquote>
<p>So now the proper method to do a ‘pip install’ is:</p>
<div class="highlight"><pre><span></span><code>ARCHFLAGS=-Wno-error=unused-command-line-argument-hard-error-in-future pip install pillow
</code></pre></div>
<p>Boom! Pillow installed with no problems and my python script loaded with no issues. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:refx_pipstckech">
<p>Answer from StackExchange - <a href="http://stackoverflow.com/questions/22312583/cant-install-mysql-gem-on-os-x">Can’t install mysql gem on OS X</a> <a class="footnote-backref" href="#fnref:refx_pipstckech" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Automating GTD with Drafts2014-03-18T13:18:24-05:002014-03-18T13:18:24-05:00Jason Verlytag:mygeekdaddy.net,2014-03-18:/2014/03/18/automating-gtd-with-drafts/<p>The first step I took when I revamped my GTD system was how I was capturing and managing my tasks and ideas. In <a href="http://mygeekdaddy.net/2014/03/03/fixing-my-gtd-system/">a previous post,</a> I gave an overview of my new GTD system and found the number one problem I had was dumping everything into OmniFocus. OmniFocus became …</p><p>The first step I took when I revamped my GTD system was how I was capturing and managing my tasks and ideas. In <a href="http://mygeekdaddy.net/2014/03/03/fixing-my-gtd-system/">a previous post,</a> I gave an overview of my new GTD system and found the number one problem I had was dumping everything into OmniFocus. OmniFocus became my place for collecting and doing, which caused a drag on my overall system. By allowing myself to mix the two steps together I made a mess of doing a weekly review because I had to think if an OmniFocus entry was an action or an idea that needed further processing on. I’ve changed my habit to collect into Drafts first and defer notes to either OmniFocus, Evernote, Fantastical, or the delete bucket.</p>
<p>Here are some of the steps I’ve taken to automate or streamline my Collection phase.</p>
<h4>Drafts setup</h4>
<p>The first thing I’ve done is standardize on the tabs I’ve got setup in Drafts. This way I have the same action, on the same tab, regardless of what device I’m using. </p>
<ul>
<li>I - Actions Tab: Any action that would use or manipulate the content of the note. This is where I keep actions like adding an event to Fantastical or a task to OmniFocus.</li>
<li>II - Communication Tab: Any action that may be used for dedicated communication actions. This is where I have a dedicated task to email my wife, my <a href="http://mygeekdaddy.net/2014/03/06/get-professional-email-signatures-in-drafts/">Markdown email action</a>, etc.</li>
<li>III - Dropbox Tab: Any action that uses a Dropbox type of action. I have actions like dedicated running log files on Dropbox, create a new text file in my overall system notes folder, etc.</li>
<li>IIII - Evernote & Send To: Any action that uses Evernote type of action or sending a note to a dedicated app (e.g. Byword or Editorial)</li>
<li>Hidden: This is where I’ll keep iterative actions that can’t be run directly. For example, if an action goes out to app, returns some text, and then runs another action. That second action isn’t one I’d run directly, so it stays on the Hidden tab.</li>
</ul>
<p>If you’re a multiple iOS device user, I have a <a href="http://mygeekdaddy.net/2014/03/10/setup-drafts-on-multiple-ios-devices/">quick tip on getting multiple iOS devices</a> setup with the same actions and tab settings. </p>
<h4>Collecting in iOS</h4>
<p>There are several tools I use with Drafts as part of my collection steps in iOS. Listed below is a summary of how each one is set up.</p>
<p><strong>Safari Fav Bar:</strong> I’m doing a lot more of my work on my iPad lately and the screen space allows Safari to have a toolbar visible.<a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> This means that some of my custom book marklets are now available while browsing.</p>
<p><strong>Web Clipper:</strong> One of my regular tools is a book marklet in Safari to call on a Pythonista script to return information back to Drafts. This is useful </p>
<p>Book marklet:</p>
<pre><code>javascript:window.location='pythonista://ImportToDrafts?action=run&argv='+encodeURIComponent(document.title)%20+'&argv='+encodeURIComponent(document.location.href)
</code></pre>
<p>Pythonista script:</p>
<pre><code>import webbrowser
import clipboard
import urllib
import sys
title = sys.argv[1]
url = sys.argv[2]
note = clipboard.get()
full_note = ''.join([title,'\n\n', url, '\n\n', note])
full_note = urllib.quote(full_note.encode('utf-8'))
webbrowser.open('drafts://x-callback-url/create?text=' + full_note)
</code></pre>
<p>So now when I’m on a web page in Safari, I can highlight some portion of text I want to keep, click my Drafts book marklet, and poof… the clipped text and URL are in Drafts. </p>
<p>Here’s an example of a webpage I’m clipping:</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_automating_Drafts_for_GTD_2014_03_10_131324.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_automating_Drafts_for_GTD_2014_03_10_131324.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>And here’s the corresponding note in Drafts:</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_automating_Drafts_for_GTD_2014_03_10_131342.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_automating_Drafts_for_GTD_2014_03_10_131342.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Key Drafts Actions</h4>
<p>I’ve shared most of my key <a href="http://mygeekdaddy.net/2014/02/26/running-page-of-url-actions/">Drafts actions before</a>, but here are my essential Drafts actions. </p>
<p><strong>Fantastical:</strong> I enter all my calendar and reminder events through Fantastical, even though the iPad doesn’t have a native Fantastical app. The natural language processing with Fantastical makes this one of the easiest ways to enter events. </p>
<pre><code>fantastical2://x-callback-url/parse/?sentence=[[line|1]]&notes=[[line|2..]]&add=1&x-source=Drafts&x-success={{drafts://}}&x-cancel={{drafts://}}
</code></pre>
<p>Click here to install Drafts Action: <a href="drafts://x-callback-url/import_action?type=URL&name=Fantastical&url=fantastical2%3A%2F%2Fx-callback-url%2Fparse%2F%3Fsentence%3D%5B%5Bline%7C1%5D%5D%26notes%3D%5B%5Bline%7C2..%5D%5D%26add%3D1%26x-source%3DDrafts%26x-success%3D%7B%7Bdrafts%3A%2F%2F%7D%7D%26x-cancel%3D%7B%7Bdrafts%3A%2F%2F%7D%7D">Fantastical</a></p>
<p><strong>OmniFocus:</strong> OmniFocus is still my default task/action list management app. The only downside I still have with OmniFocus is that it doesn’t support a full x-callback-url action, so when a note is added to OmniFocus I stay in OmniFocus. </p>
<p>Click here to install Drafts Action: <a href="drafts://x-callback-url/import_action?type=URL&name=OmniFocus&url=omnifocus%3A%2F%2F%2Fadd%3Fname%3D%5B%5Btitle%5D%5D%26note%3D%5B%5Bbody%5D%5D">OmniFocus</a></p>
<p><strong>Evernote:</strong> Evernote is has become my idea and digital reference file box. This action uses Drafts <code>[[line|n]]</code> tag to use the first line as the title of the note, line two for the tags I want to apply to the note, and the rest of the Drafts note as the document to be saved in Evernote.</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_automating_Drafts_for_GTD_2014_03_18_124823.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_automating_Drafts_for_GTD_2014_03_18_124823.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Click here to install Drafts Action: <a href="drafts://x-callback-url/import_action?type=evernote&name=Add%20To%20Evernote&title=%5B%5Bline%7C1%5D%5D%20-%20%5B%5Bdate%5D%5D&notebook=_Inbox&tags=%5B%5Bline%7C2%5D%5D&markdown=0&writetype=0&template=%5B%5Bline%7C3..%5D%5D">Add to Evernote</a></p>
<h4>Note Management</h4>
<p>The next step I took was to turn on <a href="https://agiletortoise.zendesk.com/hc/en-us/articles/200689794-Drafts-Sync">note syncing in Drafts</a>. This allows a note created on my iPhone to be available for processing on my iPad later in the day. In addition to note syncing, I turned on the badge count. Now I have a clear way to see if I still have unprocessed information in Drafts when I sit down to do my weekly review. If Drafts shows any unprocessed notes, I know I need to clean that up before doing a my full weekly review.</p>
<h4>Next step</h4>
<p>The next post will explore some of the ways I’ve automated my task management processes in OmniFocus. </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>On your iPad, click on Settings -> Safari and turn on the ‘Show Favorites Bar’ setting. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
-----
#### Comments from original WP Post:
**[Thomas Tack](#78774 "2014-08-08 07:55:19"):** Dear Jason, Thank you for your inspiring contributions to Automating GTD with Drafts. Now that Fantastical for iPad is around, I just wondered if their is a way to do the other way round, i.e. to integrate all day specific events from Fantastical into Drafts as part of an automated daily planning tool. On the Fantastical page I have found the followeing code snippet, but have to admit that I am not a code geek to see a clue to use it correctly: fantastical2://show?date=yyyy-mm-dd — Jumps to the specified date. You can also use a natural language date such as "Tuesday" or "next month" and Fantastical will do its best to show the date. Do you see a chance to use this approach - or perhaps another walkaround - to integrate Fantatical events into Drafts? Thank you so very much for your opinion in advance Thomas
**[http://articleboard.info](#63112 "2014-06-06 05:12:42"):** Hi, I check your blogs regularly. Your writing style is witty, keep up the good work!
**[Jason.Verly](#73735 "2014-07-10 22:28:14"):** Let me go through the process again and make sure I don't have a tweak to my setup that isn't captured in the post. I should have time this weekend to go through everything and reply back.
**[Jason.Verly](#79512 "2014-08-10 23:06:34"):** I've been looking at something similar to that via Launch Center Pro. It's still cooking but I hope to have a post on it in the next week or so.
**[Jason.Verly](#71063 "2014-06-21 16:32:04"):** iOS will occasionally ask if you want to open Pythonista when calling it from a bookmarklet - it's a security feature in iOS. How are you syncing your bookmarklets from Mac to iPad? The steps after getting the bookmarklet in place and the script in Pythonista would be: 1\. Open web page in iOS Safari and highlight/copy text on webpage. 2\. While still in iOS Safari, click the bookmarklet to clip page to Drafts. 3\. iOS may ask if you want to open Pythonista. 4\. The script will run in Pythonista and then open Drafts. 5\. Drafts will open with a new note with the web pages URL and the clipped text.
**[Marlisa Post](#76993 "2014-07-31 15:36:50"):** Hi Jason, I'm running into almost the same problem as Joe. When I use the bookmarklet, I get a draft with the correct title and url, but the body is the pythonista code. I did check my quotes to make sure they weren't smart quotes. Any thoughts? Very useful tool! Thank you for sharing it. Thanks for any help, Marlisa
**[Jason.Verly](#74904 "2014-07-18 16:27:26"):** I've done testing on a couple of devices from the directions as written. The only hiccup I found was on a device that was locked down by a friend's employer. His device had a custom configuration profile that prevented something with the Pythonista app to work properly. We did some additional testing on his device and found some other weird responses to internet programming and web clipping.
**[Joe Lafferty](#70694 "2014-06-19 01:49:13"):** Hi Jason, I tried clipping the website. 1\. installed pythonista 2\. copied the script as you have it above 3\. installed the bookmarklet on my Safari Mac desktop by copying and pasting the code above (I also tried a second time by setting up bookmarkelt directly in iPad safari) 4\. open webpage on iPad & highlight text in webpage 5\. sometimes it asked me if I want to open this in pythonista - then it opens pythonista and says on the same page, or now it tells me 'safari cannot open the page because the address is invalid' I'm pretty good with mac's etc, been a long time since I did any programming! this script/workflow looked just what I was looking for, but can't seem to get past base 1... any ideas? Joe
**[Jason.Verly](#75287 "2014-07-21 13:02:54"):** The only thing I'd double check is some the of the single quotes in the code. Depending on how you copy/pasted the text, the code can sometimes come back with a "smart quote" instead of the standard ASCI single quote. I could a mix of them in the code you pasted in your last reply. Otherwise the book marklet and python script are a match.
**[Joe Lafferty](#75233 "2014-07-21 04:55:55"):** thanks for attempts Jason. I triple checked your code and found i had missed the last line of the pythonista script! for some reason it did not appear in the text box - so I'm copying and pasting here to double check I'm not missing some other part of the code as i still can't get it to work... First problem I encountered was in cutting and pasting the ' figures were changed into a different format and the code crashed. I cut and pasted via TextWrangler and this seems to be sorted. now it's opening drafts, adding the title and url, but ending with the bookmarklet as body text in drafts but not the highlighted text from the webpage. can i double check that the bookmarklet is correct and the script? i've pasted below incase I'm missing something very simple! thanks for your patience, I programmed in Basic 40 years ago, but done no programming since!! \-- javascript:window.location='pythonista://ImportToDrafts?action=run&argv='+encodeURIComponent(document.title)%20+'&argv='+encodeURIComponent(document.location.href) import webbrowser import clipboard import urllib import sys title = sys.argv[1] url = sys.argv[2] note = clipboard.get() full_note = ''.join([title,'\n\n', url, '\n\n', note]) full_note = urllib.quote(full_note.encode('utf-8')) webbrowser.open('drafts://x-callback-url/create?text=' + full_note)
**[Jason.Verly](#79510 "2014-08-10 23:04:54"):** Sorry for the late reply. Joe noticed that he didn't quite capture all of the text from the post: bookmarklet: javascript:window.location='pythonista://ImportToDrafts?action=run&argv;='+encodeURIComponent(document.title)%20+'&argv;='+encodeURIComponent(document.location.href) Pythonista script: import webbrowser import clipboard import urllib import sys title = sys.argv[1] url = sys.argv[2] note = clipboard.get() full_note = ''.join([title,'\n\n', url, '\n\n', note]) full_note = urllib.quote(full_note.encode('utf-8')) webbrowser.open('drafts://x-callback-url/create?text=' + full_note) Make sure you have both completely captured. If you did, let me know if you are getting a specific error or pop message when the process breaks.
**[Joe Lafferty](#73591 "2014-07-10 00:21:33"):** Hi Jason, I've copied & pasted the text of both the bookmarklet & pythonista script but still can't get it to work. When I highlight text on safari then touch the 'clip to drafts' bookmarklet, I either get 'no script loaded' or if I then open the 'ImportToDrafts.py' script, return to safari and try again all that happens when I try and clip is pythonista opens up & stays on the script field. Any ideas? Joe
**[Joe Lafferty](#65423 "2014-06-08 06:15:22"):** I tried you're pythonista script but I get an error on line six, indexerror list index is out of range-any ideas? Never used python before...
**[Candelaria](#65446 "2014-06-08 06:53:15"):** Howdy! I could have sworn I've been to this blog before but after browsing through some of the post I realized it's new to me. Nonetheless, I'm definitely delighted I found it and I'll be bookmarking and checking back often!
**[Joe Lafferty](#80086 "2014-08-13 01:39:18"):** Dear Jason, I don't often give up, but I have on this. I've now OT it to work as far as clipping the site opening drafts, but what is captured is part of the script & whatever is in my clipboard! (See example below with last sentence being what was in my clipboard). Thanks anyway, I'm just sorry I wasn't able to get it working... Joe \--clip via bookmarklet below Linn Records - The Mahler Project http://www.linnrecords.com/collection-the-mahler-project.aspx?utm_source=Linn+Email&utm_campaign=f3b8fb14f3-LinnRecords_SFSMahlerCycle8_6_2014&utm_medium=email&utm_term=0_517fad5333-f3b8fb14f3-317339629 I've now OT it to work as far as clipping the site opening drafts, but what is captured is part of the script & whatever is in my clipboard!
**[Jason.Verly](#68369 "2014-06-10 16:05:56"):** When you run the bookmarklet it, it assumes you've copied text from the webpage you're viewing. If you don't copy a section of the page then you may get the index error because one of the arguments passed in the python script is empty.
**[Joe Lafferty](#73995 "2014-07-12 11:24:45"):** Cheers Jason!Setup Drafts on multiple iOS devices2014-03-10T12:49:20-05:002014-03-10T12:49:20-05:00Jason Verlytag:mygeekdaddy.net,2014-03-10:/2014/03/10/setup-drafts-on-multiple-ios-devices/<p>Here is a quick tip if you happen to be a multiple iOS device user. Drafts has a built in backup and restore function to manage your custom actions and the tab setup. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Multiple_iOS_device_setup_for_Drafts_2014_03_10_123800.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Multiple_iOS_device_setup_for_Drafts_2014_03_10_123800.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>You can use the backup/restore function to create a psudo Drafts Actions image. </p>
<ol>
<li>Setup <strong>one</strong> iOS …</li></ol><p>Here is a quick tip if you happen to be a multiple iOS device user. Drafts has a built in backup and restore function to manage your custom actions and the tab setup. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Multiple_iOS_device_setup_for_Drafts_2014_03_10_123800.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Multiple_iOS_device_setup_for_Drafts_2014_03_10_123800.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>You can use the backup/restore function to create a psudo Drafts Actions image. </p>
<ol>
<li>Setup <strong>one</strong> iOS device with <strong>all</strong> the actions and tab settings the way you want.</li>
<li>When the first device is setup just the way you want, create a backup of your Drafts actions. </li>
<li>Now on your other iOS device(s), do a restore from the backup you did from the first device. </li>
</ol>
<p>This restore will work on any iOS device - e.g. iPhone -> iPad. If the devices are not using the same Dropbox folder, just share the backup file from the <code>..\Apps\Drafts\Settings</code> folder on Dropbox.</p>
<p>Now every iOS device will have the same actions and tab settings for Drafts. </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>Get professional email signatures in Drafts2014-03-06T13:54:47-06:002014-03-06T13:54:47-06:00Jason Verlytag:mygeekdaddy.net,2014-03-06:/2014/03/06/get-professional-email-signatures-in-drafts/<p>One of the features most new users of Markdown don't realize is that it's original purpose was not for text files, but a simpler HTML markup language: <sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></p>
<blockquote>
<p>Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text …</p></blockquote><p>One of the features most new users of Markdown don't realize is that it's original purpose was not for text files, but a simpler HTML markup language: <sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></p>
<blockquote>
<p>Markdown is a text-to-HTML conversion tool for web writers. Markdown allows you to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML).</p>
</blockquote>
<p>I know a lot of people use Markdown for their text file system. Since Markdown can also use straight HTML markup, you have some unique flexibility in using a mix of straight text and HTML tags in your Markdown documents. One of the ways I've used this flexibility is getting a better email signature for my emails out of Drafts. Since the email Drafts will be processed as MD text to HTML, the signature can also use a mix of MD and HTML mark up. </p>
<p><strong>Step 1: Create the MD signature</strong></p>
<p>The first step is getting a working version of your signature text in Drafts or some other MD editor. Since Drafts will parse the body of the note and the signature, the signature can also be a mix of text and HTML. So now a signature in an email sent from Drafts could include a hosted image, text color, etc. </p>
<p>This is a sample signature for the 'MD Email' action:</p>
<pre><code>----------------
<span style="color: #f19c37">Jason Verly</span>
__Acme, Inc.__
<span style="color: #595959">123 Main Street</span>
<span style="color: #595959">Minneapolis, MN 56248</span>
Jason.Verly@acmeinc.com
P: 612-567-3218
C: 319-867-5309
</code></pre>
<p><strong>Step 2: Create MD Email action</strong> </p>
<p>The next step is to create an action in Drafts that will send email via Markdown. The key here is to make sure the 'Send as Markdown HTML' setting is triggered.</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Fancy_signatures_in_email_using_Drafts_2014_03_06_132411.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Fancy_signatures_in_email_using_Drafts_2014_03_06_132411.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>From there the email template of the action should use something similar to this:</p>
<pre><code>[[body]]
----------------
<span style="color: #f19c37">Jason Verly</span>
__Acme, Inc.__
<span style="color: #595959">123 Main Street</span>
<span style="color: #595959">Minneapolis, MN 56248</span>
Jason.Verly@acmeinc.com
P: 612-567-3218
C: 319-867-5309
</code></pre>
<p><strong>Step 3:Test email action</strong></p>
<p>Now that the action has been created and saved, you can send an email using MD syntax. In Drafts I created the following note to be sent as an email using the MD Email action:</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Fancy_signatures_in_email_using_Drafts_2014_03_06_132840.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Fancy_signatures_in_email_using_Drafts_2014_03_06_132840.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The 'MD Email' action is setup to use the first line of the note as the email's subject and the rest of the note as the body of the message. Clicking on the 'MD Email' action, I get the text of my note and the signature converted from Markdown to HTML. Note that the email signature now includes bold text and different colored text. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Fancy_signatures_in_email_using_Drafts_2014_03_06_133051.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Fancy_signatures_in_email_using_Drafts_2014_03_06_133051.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Voila! Now you have a great looking signature line on all your email from your iOS device. </p>
<p><a href="drafts://x-callback-url/import_action?type=email&name=MD%20Email&to=&cc=&bcc=&subjecttype=1&subject=&markdown=1&background=0&fromprefix=&template=%5B%5Bbody%5D%5D%0A%0A----------------%09%0A%3Cspan%20style%3D%22color%3A%20%23f19c37%22%3EJason%20Verly%3C%2Fspan%3E%0A__Acme%2C%20Inc.__%0A%3Cspan%20style%3D%22color%3A%20%23595959%22%3E123%20Main%20Street%3C%2Fspan%3E%0A%3Cspan%20style%3D%22color%3A%20%23595959%22%3EMinneapolis%2C%20MN%2056248%3C%2Fspan%3E%0AJason.Verly%40acmeinc.com%0AP%3A%20612-567-3218%0AC%3A%20319-867-5309%0A">Install Sample MD Action</a></p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
<p>Direct quote from John Gruber's <a href="http://daringfireball.net/projects/markdown/">Markdown site</a>. <a href="#fnref1" rev="footnote">↩</a></p>
</li>
</ol>
</div>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#56570" title="2014-05-31 15:20:54">internetowy kurs fotografii</a>:</strong> I do not know if it's just me or if perhaps everyone else encountering issues with your website. It appears as if some of the text on your content are running off the screen. Can somebody else please provide feedback and let me know if this is happening to them as well? This might be a issue with my web browser because I've had this happen before. Many thanks</p>
<p><strong><a href="#59726" title="2014-06-03 10:00:28">Jason.Verly</a>:</strong> Thanks for the feedback. The problem is the site and how the site gets rendered in some browsers. Can you let me know what OS and browser you're using?</p>Fixing my GTD System2014-03-03T13:50:06-06:002014-03-03T13:50:06-06:00Jason Verlytag:mygeekdaddy.net,2014-03-03:/2014/03/03/fixing-my-gtd-system/<p>That's it, I've had it. I've declared GTD bankruptcy and I'm starting over. </p>
<p>Why?</p>
<p>I've slowly realized that I've started doing things wrong. For quite some time the backbone of my GTD system has been OmniFocus. But with the recent buzz about using text …</p><p>That's it, I've had it. I've declared GTD bankruptcy and I'm starting over. </p>
<p>Why?</p>
<p>I've slowly realized that I've started doing things wrong. For quite some time the backbone of my GTD system has been OmniFocus. But with the recent buzz about using text file based systems, like TaskPaper,<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> to manage task and project lists, I decided maybe I needed to look at my own system again. As I started taking a look at what I was doing I realized I wasn't prescribing to David Allen's “clean edges” mentality. David's idea is that where and how you manage information should be handled with distinct categories. Looking at my system I began to realize I was mixing my categories in order to fit everything into OmniFocus. </p>
<p>Actually… my system was an utter mess. </p>
<h4>Right tool, right task</h4>
<p>In my old system, the idea was OmniFocus would be just for tasks. This may seem like a no brainer but over time I started mixing my inboxes. OmniFocus became my task list, my thought collector, and my project planning app. While those three are related, mixing them all into OmniFocus caused problems in actually getting things done. I'd put due dates on ideas I wanted to think about, but didn't have any actionable steps. I'd have an actual project named so similar to a project I was planning, because I put all my ideas into OmniFocus, that tasks would get inter-mingled. </p>
<p>I finally sat back and looked at the three phases I have in my work:</p>
<ul>
<li>Actual project tasks and action lists</li>
<li>Project planning/staging</li>
<li>Ideas and thought collections</li>
</ul>
<p>These were three distinct phases of how I wanted to get things done for me so I looked at having three distinct apps to keep “clean edges”. I ended up with the following setup:</p>
<ul>
<li>OmniFocus - Action Lists: OmniFocus continues to be where I put my active projects and action lists. If I have something I have to get started this week (Start By) or needs to be finished by next Wed (Due By), these action lists are in OmniFocus. This allows me to put other to do items, like shopping lists or geo-fenced actions in OmniFocus as well. OmniFocus is where I go for my next action, or wonder what I should being doing next, and know I will find only actionable items.</li>
<li>Evernote - Project Planning - Evernote is where I keep ideas and reference information of current projects or a project I <em>may</em> do in the future. This was the number one problem with my previous system. Previously I would dump my “need to do” actions in with my “some day/maybe” stuff.<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup> Evernote is now my repository of “stuff” I may do some day, but not feel guilty about not looking at as part of my weekly review. <sup id="fnref3"><a href="#fn3" rel="footnote">3</a></sup></li>
<li>Drafts - Thought Collection: Drafts is where I will collect any thoughts or ideas for further processing at a later time. I have Drafts setup on all my iOS devices<sup id="fnref4"><a href="#fn4" rel="footnote">4</a></sup> and so I'm quickly able to grab ideas as they come to me. From Drafts I can move the idea if it's actionable to OmniFocus or part of a larger project plan/long term process to Evernote. Or it could sit in Drafts until the idea has percolated to the point it can be moved or completely dropped.<br></li>
</ul>
<h4>System of Tools</h4>
<p>Beyond these three apps, I've looked at how I can further use the tools I have on hand right now to either automate or make my process more powerful. Some of the other apps or tools I use include: </p>
<ul>
<li><a href="https://www.dropbox.com/">Dropbox</a>: Notes and file sharing among iOS and OS X devices.</li>
<li><a href="http://www.apple.com/icloud/">iCloud</a>: Syncs bookmarks across my iOS devices.</li>
<li><a href="http://support.omnigroup.com/omnifocus-mail-drop">Mail Drop</a>: The Omni Group has a great service to send email to a predefined mail address and convert the message to an action in OmniFocus. </li>
<li><a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&uo=4" title="Pythonista">Pythonista</a>: Pythonista is slowly becoming the glue that holds all my GTD building blocks together. Read further on for an example.</li>
<li><a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8&uo=4" title="Editorial">Editorial</a>: As Pythonista has grown, so has my use of it's sister program Editorial. </li>
<li><a href="https://itunes.apple.com/us/app/fantastical-2-calendar-reminders/id718043190?mt=8&uo=4" title="Fantastical">Fantastical 2</a>: Fantastical is my <em>only</em> calendar app now. The ease of entry with natural language and being able to select specific reminder lists from Drafts is what makes this app one of the best. In fact I use the iPhone version on my iPad because there isn't one available for iPad yet.</li>
</ul>
<h4>The glue that binds</h4>
<p>As I previously mentioned, a lot of my processes are starting to revolve around using Pythonista. One of the core workflow processes uses just two simple steps. One is a simple javascript bookmark I put in my Safari favorites and the other is a script in Pythonista:</p>
<p><strong>JavaScript Bookmark:</strong> This javascript is placed in a bookmark and used to collect information from a web page and run a Pythonista script. </p>
<pre><code>javascript:window.location='pythonista://ImportToDrafts?action=run&argv='+encodeURIComponent(document.title) +'&argv='+encodeURIComponent(document.location.href)
</code></pre>
<p><strong>Pythonista Script:</strong> The script below is called upon by the bookmark above. When the script runs it takes the text I copied from the web page, the URL, and Title and formats the information into a clean note. </p>
<pre><code>import webbrowser
import clipboard
import urllib
import sys
title = sys.argv[1]
url = sys.argv[2]
note = clipboard.get()
full_note = ''.join([title,'\n\n', url, '\n\n', note])
full_note = urllib.quote(full_note.encode('utf-8'))
webbrowser.open('drafts://x-callback-url/create?text=' + full_note)
</code></pre>
<p>For example: I want to take the highlighted text on the web page and put it into a Drafts note:</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Fixing_my_GTD_system_2014_03_03_123958.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Fixing_my_GTD_system_2014_03_03_123958.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I would simply do the following:</p>
<ol>
<li>Open the web page in Safari and highlight/copy the text.</li>
<li>From either my short cuts or favorites, run the javascript bookmark to “Clip to Drafts”. The javascript bookmark will collect the URL and web page title and pass it on to the Pythonista script “ImportToDrafts”.</li>
<li>Pythonista now takes the URL and Title values passed from the javascript and the clipboard contents to transform the text pieces into a new note.</li>
<li>After the javascript and python scripts run, the new note is cleanly formatted and passed to Drafts.</li>
</ol>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Fixing_my_GTD_system_2014_03_03_124200.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Fixing_my_GTD_system_2014_03_03_124200.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Boom! Now I can make a choice to further push this into Evernote or OmniFocus, or simply hold onto the information as an idea for further processing at a later time. </p>
<h4>iOS vs OS X</h4>Running page of URL Actions2014-02-26T18:17:24-06:002014-02-26T18:17:24-06:00Jason Verlytag:mygeekdaddy.net,2014-02-26:/2014/02/26/running-page-of-url-actions/<p>This post will be duplicated as a running page as an archive of my key x-callback-url actions for various iOS apps. Each action has an install link or a text copy of the x-callback-url snippet. </p>
<h3>Drafts Actions</h3>
<h4>Drafts</h4>
<p><strong>paste_draft:</strong> This action will paste whatever text is in the current note …</p><p>This post will be duplicated as a running page as an archive of my key x-callback-url actions for various iOS apps. Each action has an install link or a text copy of the x-callback-url snippet. </p>
<h3>Drafts Actions</h3>
<h4>Drafts</h4>
<p><strong>paste_draft:</strong> This action will paste whatever text is in the current note into the clipboard. <a href="drafts://x-callback-url/import_action?type=URL&name=paste_draft&url=drafts%3A%2F%2Fx-callback-url%2Fcreate%3Ftext%3D%5B%5Bclipboard%5D%5D">Install</a></p>
<pre><code>drafts://x-callback-url/create?text=[[clipboard]]
</code></pre>
<p><strong>URL Encode:</strong> This action will percent encode the current note.<a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> <a href="drafts://x-callback-url/import_action?type=URL&name=URL_Encode2&url=drafts%3A%2F%2Fx-callback-url%2Fcreate%3Ftext%3D%7B%7B%5B%5Bdraft%5D%5D%7D%7D">Install</a></p>
<pre><code>drafts://x-callback-url/create?text={{[[draft]]}}
</code></pre>
<p><strong>Markdown Email:</strong> The Action will create an email, using the note as the basis for the message. The first line of the note will be the email’s subject and the rest of the note as the email’s body. The action will also process the note for any Markdown markups. This allows the Action to send email with <em>italic</em> or <strong>bold</strong> text. <a href="drafts://x-callback-url/import_action?type=email&name=MD%20Email&to=&cc=&bcc=&subjecttype=1&subject=%5B%5Btitle%5D%5D&markdown=1&background=0&fromprefix=me%40icloud.com&template=%5B%5Bbody%5D%5D">Install</a></p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Logging_Drafts_Actions_2014_02_22_220359.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Logging_Drafts_Actions_2014_02_22_220359.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<h4>Dropbox</h4>
<p><strong>Prepend Running File:</strong> This action will take the text in the note and prepend a file on Dropbox. Each note will include the date and time the note was pretended to the file. Note: This action requires an internet connection to work. <a href="drafts://x-callback-url/import_action?type=dropbox&name=Prepend%20Dropbox%20File&path=%2FApps%2FDrafts%2F&filenametype=2&filename=Dropbox%20Log%20File&ext=md&writetype=1&template=%5B%5Bdraft%5D%5D%0A%0A%5B%5Btime_short%5D%5D%0A%0A------">Install</a></p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_iOS_URL_actions_2014_02_25_093222.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_iOS_URL_actions_2014_02_25_093222.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<h4>Editorial</h4>
<p><strong>Note to Uppercase:</strong> This is more of an example of the syntax used to call upon Editorial, trigger a workflow inside Editorial, and then return the text output back to a new note in Drafts. In this example the Action will open Editorial, run the <em>UPPERCASE</em> workflow that is saved in Editorial, and return the output to a new note in Drafts. If the <em>UPPPERCASE</em> workflow doesn’t exist the process will stop. <a href="drafts://x-callback-url/import_action?type=URL&name=Editorial%3A%20UPPERCASE&url=editorial%3A%2F%2F%3Finput%3D%5B%5Bdraft%5D%5D%26command%3D%7B%7BUPPERCASE%7D%7D%26x-success%3D%7B%7Bdrafts%3A%2F%2Fx-callback-url%2Fcreate%3Ftext%3D%5B%5Boutput%5D%5D%7D%7D">Install</a></p>
<pre><code>editorial://?input=[[draft]]&command={{UPPERCASE}}&x-success={{drafts://x-callback-url/create?text=[[output]]}}
</code></pre>
<h4>Fantastical 2:</h4>
<p><strong>Fantastical:</strong> This Action takes the first line of a note and parses that in Fantastical 2 as a new event. The Action then takes any remaining text in the Drafts note and adds it to the Notes section of the Fantastical event. Using a line like <em>Remind me to</em> will create a reminder instead. <a href="drafts://x-callback-url/import_action?type=URL&name=Fantastical&url=fantastical2%3A%2F%2Fx-callback-url%2Fparse%2F%3Fsentence%3D%5B%5Bline%7C1%5D%5D%26notes%3D%5B%5Bline%7C2..%5D%5D%26add%3D1%26x-source%3DDrafts%26x-success%3D%7B%7Bdrafts%3A%2F%2F%7D%7D%26x-cancel%3D%7B%7Bdrafts%3A%2F%2F%7D%7D">Install</a></p>
<pre><code>fantastical2://x-callback-url/parse/?sentence=[[line|1]]&notes=[[line|2..]]&add=1&x-source=Drafts&x-success={{drafts://}}&x-cancel={{drafts://}}
</code></pre>
<h4>OmniFocus</h4>
<p><strong>New Task in OmniFocus:</strong> The Action will use the first line of a note to create the task description and then use the rest of the note as the task note. Because OmniFocus doesn’t support a full x-callback-url, the Action doesn’t return you back to Drafts. <a href="drafts://x-callback-url/import_action?type=URL&name=OmniFocus&url=omnifocus%3A%2F%2F%2Fadd%3Fname%3D%5B%5Btitle%5D%5D%26note%3D%5B%5Bbody%5D%5D">Install</a></p>
<pre><code>omnifocus:///add?name=[[title]]&note=[[body]]
</code></pre>
<p><strong>OmniFocus Mail Drop:</strong> The Email Action will use an OmniFocus maildrop address to send a note in the background to create a new OmniFocus task. Like the previous Action, it will use the first line of the note to create the email subject line, which ends up being the task description in OmniFocus. The rest of the note is used as the email body, which ends up being the task note. <a href="drafts://x-callback-url/import_action?type=email&name=OmniFocus%20Maildrop&to=YOUR_MAILDROP%40sync.omnigroup.com&cc=&bcc=&subjecttype=1&subject=%5B%5Btitle%5D%5D&markdown=0&background=1&fromprefix=&template=%5B%5Bbody%5D%5D">Install</a></p>
<p>Note: This Action requires an internet connection and utilizes Agile Tortoise’s email account. <strong>Do not</strong> use this action for any sensitive information. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_iOS_URL_actions_2014_02_25_094053.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_iOS_URL_actions_2014_02_25_094053.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<h3>TextTool:</h3>
<p>All actions listed in this section require the user to have TextTool installed on their iOS device. </p>
<p><strong>Encode Note:</strong> The Action will take the text of the note and run it through TextTool’s ‘Encode’ action. The encoded text is then returned to a new note in Drafts. <a href="drafts://x-callback-url/import_action?type=URL&name=Texttool_Encode&url=texttool%3A%2F%2Fx-callback-url%2Ftransform%3Ftext%3D%5B%5Bdraft%5D%5D%26method%3Dencode%26x-success%3D%7B%7Bdrafts%3A%2F%2Fx-callback-url%2Fcreate%3Ftext%3D%5B%5Boutput%5D%5D%7D%7D">Install</a></p>
<pre><code>texttool://x-callback-url/transform?text=[[draft]]&method=encode&x-success={{drafts://x-callback-url/create?text=[[output]]}}
</code></pre>
<p><strong>Decode Note:</strong> This Action will run the note through TextTool’s Decode action. After the text is processed it will return the decoded text to a new note in Drafts. <a href="drafts://x-callback-url/import_action?type=URL&name=Texttool_Decode&url=texttool%3A%2F%2Fx-callback-url%2Ftransform%3Ftext%3D%5B%5Bdraft%5D%5D%26method%3Ddecode%26x-success%3D%7B%7Bdrafts%3A%2F%2Fx-callback-url%2Fcreate%3Ftext%3D%5B%5Boutput%5D%5D%7D%7D%26x-cancel%3D%7B%7Bdrafts%3A%2F%2F%7D%7D">Install</a></p>
<pre><code>texttool://x-callback-url/transform?text=[[draft]]&method=decode&x-success={{drafts://x-callback-url/create?text=[[output]]}}&x-cancel={{drafts://}}
</code></pre>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#78146" title="2014-08-05 16:32:28">Johna615</a>:</strong> My spouse and I stumbled over here by a different internet address and thought I might check items out. I like what I see so i am just following you. Appear forward to checking out your web page again. dckegfkakebb</p>Random Fantastical for Mac tip2014-02-26T12:20:58-06:002014-02-26T12:20:58-06:00Jason Verlytag:mygeekdaddy.net,2014-02-26:/2014/02/26/random-fantastical-for-mac-tip/<p>Random Tip: I love using Fantastical for my calendar events. But recently I was having a problem on my work Mac with Outlook starting by itself when my Mac first booted up. I searched and searched and finally found a fix via an answer on a <a href="http://answers.microsoft.com/en-us/mac/forum/macoffice2011-macoutlook/how-do-i-disable-outlook-2011-to-auto-start-up/a7dafa3f-7fea-47c0-bae4-5570b8e12c75">Microsoft forum</a>:</p>
<blockquote>
<p>Do you …</p></blockquote><p>Random Tip: I love using Fantastical for my calendar events. But recently I was having a problem on my work Mac with Outlook starting by itself when my Mac first booted up. I searched and searched and finally found a fix via an answer on a <a href="http://answers.microsoft.com/en-us/mac/forum/macoffice2011-macoutlook/how-do-i-disable-outlook-2011-to-auto-start-up/a7dafa3f-7fea-47c0-bae4-5570b8e12c75">Microsoft forum</a>:</p>
<blockquote>
<p>Do you have Fantastical or another application set to run at startup that interacts with your mail or calendar of Outlook. That’ll cause it to start even if Outlook is not explicitly setup in the Login Items of your account.</p>
</blockquote>
<p>Hallelujah! Now my Mac doesn’t turn into a goobered mess when it boots because it’s trying to start Outlook and everything else at once. </p>Simple URL encoding in Drafts2014-02-17T21:40:58-06:002014-02-17T21:40:58-06:00Jason Verlytag:mygeekdaddy.net,2014-02-17:/2014/02/17/simple-url-encoding-in-drafts/<p>My recent posts on Drafts and Pythonista have focused using tools I have versus searching for tools I could use. A simple example in these posts has been on steps to conduct percent/URL encoding text. </p>
<p>Well <a href="https://twitter.com/hiilppp">@hiilppp</a> has found the simplest and most elegant solution to URL encode a …</p><p>My recent posts on Drafts and Pythonista have focused using tools I have versus searching for tools I could use. A simple example in these posts has been on steps to conduct percent/URL encoding text. </p>
<p>Well <a href="https://twitter.com/hiilppp">@hiilppp</a> has found the simplest and most elegant solution to URL encode a note in Drafts: </p>
<div class="highlight"><pre><span></span><code><span class="nl">drafts</span><span class="p">:</span><span class="o">//</span><span class="n">x</span><span class="o">-</span><span class="n">callback</span><span class="o">-</span><span class="n">url</span><span class="o">/</span><span class="k">create</span><span class="vm">?</span><span class="nc">text</span><span class="o">=</span><span class="err">{{</span><span class="o">[</span><span class="n">[draft</span><span class="o">]</span><span class="err">]}}</span><span class="w"></span>
</code></pre></div>
<p>How has this not been posted more often?</p>Sharing text with Drafts & Pythonista - Part 22014-02-17T14:21:45-06:002014-02-17T14:21:45-06:00Jason Verlytag:mygeekdaddy.net,2014-02-17:/2014/02/17/sharing-text-with-drafts-pythonista-part-2/<p>Sometimes when you come up with a solution, someone else has already found a more elegant solution. Case in point, my recent post on <a href="http://mygeekdaddy.net/2014/02/16/getting-pythonista-to-return-text-back-to-drafts/">sharing text between Drafts and Pythonista</a>. Shortly after sharing the post I got some feedback on the post and ultimately a tweet from the sensei of …</p><p>Sometimes when you come up with a solution, someone else has already found a more elegant solution. Case in point, my recent post on <a href="http://mygeekdaddy.net/2014/02/16/getting-pythonista-to-return-text-back-to-drafts/">sharing text between Drafts and Pythonista</a>. Shortly after sharing the post I got some feedback on the post and ultimately a tweet from the sensei of scripting himself:</p>
<blockquote>
<p><a href="https://twitter.com/mygeekdaddy">@mygeekdaddy</a> You can pass text back and forth without using the clipboard: <a href="http://www.leancrew.com/all-this/2013/08/sorting-with-pythonista/">http://www.leancrew.com/all-this/2013/08/sorting-with-pythonista/</a></p>
<p>— Dr. Drang (@drdgrang) <a href="https://twitter.com/drdrang/statuses/435082449417023488">February 16, 2014</a></p>
</blockquote>
<p>Digging into the link <a href="https://twitter.com/drdrang">@drdrang</a> included in his tweet, I found it was a post he made about the same topic back in August. As I read through his post he noted that the origin of his solution actually came from <a href="https://twitter.com/hiilppp">@hiilppp</a> and a <a href="https://gist.github.com/hiilppp/6139407">gist</a> that hiilppp had posted a while back on GitHub. </p>
<p>As shown above, the script shows the basic syntax of using Pythonista’s <code>&argv=[[draft]]</code> action to pass text from Drafts, then using <code>sys.argv</code> to read the text block from Drafts into the python script and then using a shortened x-callback-url to pass the modfied text back to Drafts. It’s short, it’s elegant and it gives me the big red button I wanted.</p>
<p>So does this invalidate my solution? </p>
<blockquote>
<p>Hell no! </p>
</blockquote>
<p>My original solution ultimately boiled down to what I’ve used in my scripting and what works for me. If I learn something new along the way, which I did in this case, I can take that little nugget and use it again down the road. Dr Drang is absolutely correct that the <code>sys.argv</code> method he and hiilppp shared is a cleaner way to manage text between Drafts and Pythonista. The comments<sup id="fnref:ref_123"><a class="footnote-ref" href="#fn:ref_123">1</a></sup> I received on the post tried to intimate that a solution that works, but is not the the <em>best</em> solution available, should never be shared is just plain ridiculous. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:ref_123">
<p>I have no issue posting comments that contradict or offer opposing viewpoints to my own. Calling me an idiot (or worse) will get your comment deleted and your IP address blocked. <a class="footnote-backref" href="#fnref:ref_123" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Getting Pythonista to return text back to Drafts2014-02-16T00:04:10-06:002014-02-16T00:04:10-06:00Jason Verlytag:mygeekdaddy.net,2014-02-16:/2014/02/16/getting-pythonista-to-return-text-back-to-drafts/<p>Drafts has become my digital text hub for my iOS devices. But one of the downsides of iOS automation, and relying on URL schemes, is when you find an app you want to use doesn’t support a full x-callback-url scheme. I do some text transformations in <a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&uo=4" title="Pythonista">Pythonista</a>, but Pythonista …</p><p>Drafts has become my digital text hub for my iOS devices. But one of the downsides of iOS automation, and relying on URL schemes, is when you find an app you want to use doesn’t support a full x-callback-url scheme. I do some text transformations in <a href="https://itunes.apple.com/us/app/pythonista/id528579881?mt=8&uo=4" title="Pythonista">Pythonista</a>, but Pythonista doesn’t support a full x-callback-url scheme. So here’s a small work around I use to get my transformed text from Pythonista back into Drafts.</p>
<h4>The Old Way</h4>
<p>Let’s start off with the script I need to run in Pythonista: </p>
<div class="highlight"><pre><span></span><code><span class="c1"># pythonista script - encode.py</span>
<span class="kn">import</span> <span class="nn">clipboard</span>
<span class="kn">import</span> <span class="nn">urllib</span>
<span class="n">basetxt</span> <span class="o">=</span> <span class="n">clipboard</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
<span class="n">encodetxt</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">quote</span><span class="p">(</span><span class="n">basetxt</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span>
<span class="n">clipboard</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">encodetxt</span><span class="p">)</span>
</code></pre></div>
<p>Pretty basic script - get the contents of the clipboard, percent encode the text, and then paste the encoded text back into the clipboard. So to do a simple text transformation, like this one, I would need to do the following: paste the text into the clipboard, go to Pythonista, run the script, go back to Drafts, and then paste the clipboard back into a new note. </p>
<p>That’s the old way of business. </p>
<h4>The New Way</h4>
<p>Assuming the snippet was saved in Pythonista, an action in Drafts could be written to run the Pythonista script like this:</p>
<div class="highlight"><pre><span></span><code>pythonista://encode?action=run
</code></pre></div>
<p>This Drafts action would take the text in the clipboard, open Pythonista, run the script, and paste the transformed text back into the clipboard. I still needed to paste the text into the clipboard, return to Drafts, and paste the text back into a new note.</p>
<p>Close… but I just want one big red button. </p>
<p>Pythonista allows scripts to call out URL’s and open them using the <code>webbrowser</code> module. So here’s a modified version of the script:</p>
<div class="highlight"><pre><span></span><code><span class="c1"># pythonista script - encode.py</span>
<span class="kn">import</span> <span class="nn">clipboard</span>
<span class="kn">import</span> <span class="nn">urllib</span>
<span class="kn">import</span> <span class="nn">webbrowser</span>
<span class="n">basetxt</span> <span class="o">=</span> <span class="n">clipboard</span><span class="o">.</span><span class="n">get</span><span class="p">()</span>
<span class="n">encodetxt</span> <span class="o">=</span> <span class="n">urllib</span><span class="o">.</span><span class="n">quote</span><span class="p">(</span><span class="n">basetxt</span><span class="p">,</span> <span class="s1">''</span><span class="p">)</span>
<span class="n">clipboard</span><span class="o">.</span><span class="n">set</span><span class="p">(</span><span class="n">encodetxt</span><span class="p">)</span>
<span class="n">webbrowser</span><span class="o">.</span><span class="n">open</span><span class="p">(</span><span class="s1">'drafts://x-callback-url/create?text&afterSuccess=Delete&action=paste_draft'</span><span class="p">)</span>
</code></pre></div>
<p>In this case we’re using Drafts x-callback-url scheme to have Pythonista re-open Drafts, create a new note, and then run a specific action. In this case, the <code>paste_draft</code> action will create a new note in Drafts from the contents of the clipboard.<sup id="fnref:1sdf"><a class="footnote-ref" href="#fn:1sdf">1</a></sup> So now that I got Pythonista to return the text to Drafts, I just needed to modify the way I was triggering the Pythonista action in Drafts. I did this by chaining together an action that would create a new note from the current note and paste the contents of the new note to the clipboard. Once that was done, I could use the <em>x-success</em> parameter to trigger Pythonista to run the encode script, which would return the encoded text back to Drafts. The full action looks like this:</p>
<div class="highlight"><pre><span></span><code><span class="nl">drafts</span><span class="p">:</span><span class="o">//</span><span class="n">x</span><span class="o">-</span><span class="n">callback</span><span class="o">-</span><span class="n">url</span><span class="o">/</span><span class="k">create</span><span class="vm">?</span><span class="nc">text</span><span class="o">=[</span><span class="n">[draft</span><span class="o">]</span><span class="err">]</span><span class="o">&</span><span class="k">action</span><span class="o">=</span><span class="err">{{</span><span class="n">Copy</span><span class="w"> </span><span class="k">to</span><span class="w"> </span><span class="n">Clipboard</span><span class="err">}}</span><span class="o">&</span><span class="n">afterSuccess</span><span class="o">=</span><span class="k">Delete</span><span class="o">&</span><span class="n">x</span><span class="o">-</span><span class="n">success</span><span class="o">=</span><span class="err">{{</span><span class="nl">pythonista</span><span class="p">:</span><span class="o">//</span><span class="n">encode</span><span class="vm">?</span><span class="k">action</span><span class="o">=</span><span class="n">run</span><span class="err">}}</span><span class="w"></span>
</code></pre></div>
<h4>Piecing it all together</h4>
<p>So now the only step I have to take to percent encode a note in Drafts is to trigger the <code>encode</code> action and wait for the process to complete. When it’s all done I’ll have a new note with all my text percent encoded. To do this I put the following pieces in place:</p>
<ol>
<li>In Pythonista, copy/paste the 2nd version of the <code>encode.py</code> script and save the script.</li>
<li>In Drafts, make sure the <code>encode</code> action is installed. This action is the big red button. Click to install <a href="drafts://x-callback-url/import_action?type=URL&name=encode&url=drafts%3A%2F%2Fx-callback-url%2Fcreate%3Ftext%3D%5B%5Bdraft%5D%5D%26action%3D%7B%7BCopy%20to%20Clipboard%7D%7D%26afterSuccess%3DDelete%26x-success%3D%7B%7Bpythonista%3A%2F%2Fencode%3Faction%3Drun%7D%7D">encode</a> action for Drafts.</li>
<li>In Drafts, make sure the <code>paste_draft</code> action is installed. You can place the action in the Hidden section and still have the action be called upon by other actions. Click to install <a href="drafts://x-callback-url/import_action?type=URL&name=paste_draft&url=drafts%3A%2F%2Fx-callback-url%2Fcreate%3Ftext%3D%5B%5Bclipboard%5D%5D">paste_draft</a> action for Drafts.</li>
</ol>
<hr>
<p><em>Update:</em> I’ve posted a <a href="http://mygeekdaddy.net/2014/02/17/sharing-text-with-drafts-pythonista-part-2/">part 2</a> to this article after the <a href="https://twitter.com/drdrang">@drdrang</a> pointed out an alternate solution. </p>
<hr>
<p>Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:1sdf">
<p>The <code>&afterSuccess=Delete</code> is included because the URL is asking to create two new notes, one blank and one from the <code>paste_draft</code> action. I wanted to make sure the un-needed blank note got deleted. <a class="footnote-backref" href="#fnref:1sdf" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>Unofficial Guide to IBM Pulse 20142014-01-29T15:21:29-06:002014-01-29T15:21:29-06:00Jason Verlytag:mygeekdaddy.net,2014-01-29:/2014/01/29/unofficial-guide-to-ibm-pulse-2014/<p>IBM Pulse <a href="http://www-01.ibm.com/software/tivoli/pulse/">kicks off on Feb 23rd</a> at the MGM Grand in Las Vegas. As part of getting prepared, I wanted to share a few tips I’ve learned over the years to make attending IBM Pulse even better.</p>
<h4>Planning before your arrive:</h4>
<ol>
<li>Be prepared to walk: IBM Pulse is …</li></ol><p>IBM Pulse <a href="http://www-01.ibm.com/software/tivoli/pulse/">kicks off on Feb 23rd</a> at the MGM Grand in Las Vegas. As part of getting prepared, I wanted to share a few tips I’ve learned over the years to make attending IBM Pulse even better.</p>
<h4>Planning before your arrive:</h4>
<ol>
<li>Be prepared to walk: IBM Pulse is held at the MGM Grand. If you’ve ever been to the hotel before you know there’s quite a bit of floor space with the restaurants, shops, clubs, and casino floor. If you’ve ever been to IBM Pulse, you know that it’s peanuts compared to the walk to the Expo Center and convention hall. So bring a comfortable pair of shoes and be prepared to wear them.</li>
<li>Plan on the extras: As you start to pack for your trip, make sure you have a little extra room in your luggage. Typically there will be some conference items you’ll want to take back. Packing your luggage to the hilt on the way to Pulse out won’t leave any room for the extras you picked up and want to bring home.</li>
<li>Remember your business cards: Bring <em>a lot</em> of business cards. I admit that I’ve messed up with this tip before, but I paid the price for it too. When you get there, hand them out to everyone you talk to. You’ll be amazed at the contacts you’ll make doing it.</li>
<li>Don’t plan on outlets: I know we’re all supposed to come to IBM Pulse for the presentations and learning, but sometimes work comes first. In the event you need to get some work done, in the past, IBM has done a good job with wireless networks for attendees. Unfortunately the hotel/convention center did not plan on you charging you’re laptop, iPad, or smartphone. Make sure you charge these devices before you arrive and at night in your room.</li>
</ol>
<h4>What to do when you’re there:</h4>
<ol>
<li>Meet the Experts: This is the #1 reason why I attend IBM Pulse. In the Expo Center is an area setup with IBM employees who are the architects, developers, and support personnel for Maximo. Here’s your chance to reach out to the product experts face to face and get some of your questions answered. Make sure you give them a business card with your question on it if you can’t get an answer while at Pulse.</li>
<li>TUC Lounge: As a member of the Tivoli User Community (you are a member, right?), There’s a spot to hangout in the Expo Center and meet other Maximo community members. Make sure you say hi to Franny!</li>
<li>Make a new friend: When I first started attending Pulse, I was focused on the information I wanted to get out of the presentations, Meet the Experts, etc, that I forgot the best resource of information may be the person you’re sitting next to. Take time to personally network and make some new friends.</li>
<li>End of session questions: At the end of a presentation session you are truly interested in, go up to the speaker and introduce yourself. Exchange business cards and include any additional questions you have on the back. The presentation speaker is generally getting over a rush from talking and will not remember names or questions as they are wrapping up their talk.</li>
<li>Deferred refreshments - IBM does a great job with the amenities at Pulse, but sometimes the frequency of getting your caffeine rush doesn’t coincide with the conference snack schedule. When they put out the pop and snacks… take two. Put one in your bag for later. You’ll thank me.</li>
<li>Take a test: IBM offers one free certification exam at IBM Pulse. Find an hour to take the test.</li>
<li>Visit the lab: IBM has lab sessions that walk you through some mid to upper level exercises that can applied to real world examples - e.g. implement an Escalation to send an email when a record is changed. Take an hour or two and sit down in the lab. Remember to grab a CD of the lab sessions too.</li>
<li>Visit the bookstore: IBM Pulse has a small bookstore that has titles you normally won’t see at Barnes & Noble at some nice conference discounts. Take a few minutes to walk through and see what might interest you.</li>
</ol>
<h4>Going home:</h4>
<ol>
<li>Getting out of McCarran: Flights out of McCarran can sometimes get nerve wracking because of delays at security screening. Make sure you are at the airport checking your luggage at least <em>90 min</em> before your flight.</li>
<li>Reach out: When you get home, reach out to anyone you may have met at IBM Pulse. A simple reminder of who you are and thank you will go a long way when you want to call that someone in another 2–3 months asking them more questions or guidance.</li>
<li>Think of next year: After taking it all in… think about presenting next year.</li>
</ol>
<p>Got any more tips? Drop me a tweet at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>, hashtag #ibmpulsetip, and I’ll add the tip and who sent them to the list.</p>
<p>Hope to see you at IBM Pulse!</p>
<hr>
<p>Bonus Tip: If you have to get your caffeine fix, and the MGM Grand shops don’t stock your favorite fizzy drink (aka Diet Mt Dew), there is a Walgreens about 5–10 min walk north of the MGM Grand on Las Vegas Blvd.</p>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#6383" title="2014-04-20 05:44:56">Selina</a>:</strong> Hey there, I think your website might be having browser compatibility issues. When I look at your website in Firefox, it looks fine but when opening in Internet Explorer, it has some overlapping. I just wanted to give you a quick heads up! Other then that, excellent blog!</p>
<p><strong><a href="#15095" title="2014-04-29 19:00:47">Jason.Verly</a>:</strong> Thanks for letting me know. I'll take a look at some of my CSS settings against IE.</p>Roll your own AirDrop with Pythonista2014-01-20T13:10:15-06:002014-01-20T13:10:15-06:00Jason Verlytag:mygeekdaddy.net,2014-01-20:/2014/01/20/roll-your-own-airdrop-with-pythonista/<p>It's always fun when two, seemingly unrelated topics, slowly merge together to give me a new idea. The first one I've been working on for some time has been a simpler way to quickly share code snippets between my Mac and my iPad. Yes, I know that's …</p><p>It's always fun when two, seemingly unrelated topics, slowly merge together to give me a new idea. The first one I've been working on for some time has been a simpler way to quickly share code snippets between my Mac and my iPad. Yes, I know that's what Dropbox is for, but I wanted something with less overhead for quick a cut/copy/paste workflow. So when Apple discussed the idea of AirDrop a lot of people thought it sounded too good to be true. Now that Mavericks and iOS 7 have shipped, it appears the pundits were right.<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> </p>
<p>So while this was rattling through my head, I read <a href="http://olemoritz.net/custom-homescreen-icons-with-pythonista.html">a post by Ole Zorn</a> on how he could use Pythonista to run a local web server, <a href="http://omz-software.com/pythonista/docs/library/simplehttpserver.html#module-SimpleHTTPServer">using SimpleHTTPServer</a>, to install short cuts on an iOS device. Go ahead and read his post… I can wait.</p>
<p>So after seeing Ole's post, I started to play around with the <code> SimpleHTTPServer</code> module and put this together:</p>
<pre><code>import SimpleHTTPServer
import SocketServer
import webbrowser
PORT = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", PORT), Handler)
print "serving at port", PORT
httpd.serve_forever()</code></pre>
<p>Running this script in Pythonista on my iPad will turn the it into a mini web server.<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup> Taking a peak at my iPad IP address (192.168.1.127), I go over to my Mac and open the URL <code><a href="http://192.168.1.127:8000">http://192.168.1.127:8000</a></code> and I see the following: </p>
<figure><a href="http://share.mygeekdaddy.me/ipad_list_on_mac_2014-01-19.png"><img src="http://share.mygeekdaddy.me/ipad_list_on_mac_2014-01-19.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>When the script is run in Pythonista, it treats the folder the script was started from as the root folder of the web server. So what I end up seeing is a list of the files in my Pythonista app. Here I can open one of the files, cut/copy portions of a script, and save it on my Mac. The iPad can even serve up proper HTML:</p>
<figure><a href="http://share.mygeekdaddy.me/ipad_html_page_2014-01-19.png"><img src="http://share.mygeekdaddy.me/ipad_html_page_2014-01-19.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now using the same concept, I can reverse the process and run a mini web server on my Mac to get files onto my iOS device. Open Terminal and go to the folder you want to share and run the following command:</p>
<pre><code>python -m SimpleHTTPServer 8000
</code></pre>
<p>This basically tells Python to load the <code>SimpleHTTPServer</code> module as a script, passing the value <code>8000</code> as a parameter. Now open Safari, enter the URL <code><a href="http://127.0.0.1:8000">http://127.0.0.1:8000</a></code>, and you get the following:</p>
<figure><a href="http://share.mygeekdaddy.me/Running_on_Mac_2014-01-19.png"><img src="http://share.mygeekdaddy.me/Running_on_Mac_2014-01-19.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Since the script was run from the <code>boxdrop</code> folder, it treats the <code>boxdrop</code> folder as the root folder for the web server. So in the Finder window you can see there are four files:</p>
<ul>
<li>date_time.py</li>
<li>GTD & OmniFocus Guide.pdf</li>
<li>IMG_0010-1.png</li>
<li>REFX - Clear Websphere Cache.md</li>
</ul>
<p>Now open Safari on my iPad and I can see the list includes the four files and the typically hidden <code>.DS_Store</code> file.</p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Roll_your_own_AirDrop_2014_01_19_222310.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Roll_your_own_AirDrop_2014_01_19_222310.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>From here I can open the <code>date_time.py</code> script from Mac on my iPad. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Roll_your_own_AirDrop_2014_01_19_223311.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Roll_your_own_AirDrop_2014_01_19_223311.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>So now if there is a code snippet on my iPad that I want to pull back to my Mac, I just run a modified version of the previous web server script. I use this one because now I can see what my IP address is inside of Pythonista.</p>
<pre><code>import SimpleHTTPServer
import SocketServer
import webbrowser
import socket
ip_addr = socket.gethostbyaddr(socket.getfqdn())[2]
port = 8000
Handler = SimpleHTTPServer.SimpleHTTPRequestHandler
httpd = SocketServer.TCPServer(("", port), Handler)
print "Serving on IP address: ", ip_addr
print "Serving on port: ", port
httpd.serve_forever()</code></pre>
<p>From here I could use Ole's short cut technique and put this script as a short cut on my iPad.</p>
<blockquote>
<p>So where does this get me?</p>
</blockquote>
<p>Frankly I'm not sure. While these <em>hacks</em> allow for the simple snippet sharing I was looking for, there feels like there is quite a bit of potential still untapped. I'm hoping this opens the door to others to explore and develop more elegant tools. </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
<p>Why you cannot AirDrop between OS X and iOS is beyond me. <a href="#fnref1" rev="footnote">↩</a></p>
</li>
<li id="fn2">
<p>I used this trick to cut/paste the code from my iPad to OS X while writing this post. <a href="#fnref2" rev="footnote">↩</a></p>
</li>
</ol>
</div>Fixing Finder.app InfoPlist.string2014-01-17T21:59:19-06:002014-01-17T21:59:19-06:00Jason Verlytag:mygeekdaddy.net,2014-01-17:/2014/01/17/fixing-finderapp-infopliststring/<p>In my post about <a href="http://mygeekdaddy.net/2013/10/24/change-mavericks-finder-app-sort-order/">Changing OS X Finder.app sort order</a>, one of the critical steps is modifying the InfoPlist.strings file inside the Finder.app package. I’ve been contacted that in some instances the file may be corrupted - as seen below:</p>
<figure><a href="http://share.mygeekdaddy.me/corrupted_infoplist_file_2014-01-17.jpg"><img src="http://share.mygeekdaddy.me/corrupted_infoplist_file_2014-01-17.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>You can do the following in the …</p><p>In my post about <a href="http://mygeekdaddy.net/2013/10/24/change-mavericks-finder-app-sort-order/">Changing OS X Finder.app sort order</a>, one of the critical steps is modifying the InfoPlist.strings file inside the Finder.app package. I’ve been contacted that in some instances the file may be corrupted - as seen below:</p>
<figure><a href="http://share.mygeekdaddy.me/corrupted_infoplist_file_2014-01-17.jpg"><img src="http://share.mygeekdaddy.me/corrupted_infoplist_file_2014-01-17.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:500px;" /></img></a></figure>
<p>You can do the following in the event you find your InfoPlist.strings file in a similar state:</p>
<ol>
<li>Download a generic copy of a “fixed” InfoPlist.strings: <a href="http://share.mygeekdaddy.me/InfoPlist.strings.txt">Download File</a>. This is just a text file with the altered Folder key already completed. You may need to right click the download link and do a <em>Save As</em>. Otherwise the file may open in your browser and you’ll see the raw text.</li>
<li>Open your corrupted InfoPlist.strings file with one of text editors I originally mentioned (BBEdit, Text Wrangler or TextTastic). Any other editor may not read/write the file correctly. OS X’s TextEdit, the generic editor included with Mavericks, will definitely corrupt your InfoPlist.string file.<a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a></li>
<li>Open the generic version you download and copy every line in the file.</li>
<li>Open the corrupted version and paste over <strong>everything</strong>.</li>
<li>Save the changes and close the file.</li>
<li>Open Terminal and run the <code style="border: none;border: 1px solid #d2d2d2;background-color: #f8f8f8;padding: 2px;font-size: 13px;border-radius: 4px;margin: 0 0 12px;margin: 0 0 0.857142857rem;">sudo killall Finder</code> command to restart Finder.</li>
</ol>
<p>The sort order for Folders vs other files should now work as I originally described. </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Another option is to change the extension of the downloaded text file to just <em>InfoPlist.strings</em> and copy the file over the version inside the Finder.app package. After overwriting the file, run <code>sudo killalll Finder</code> to restart Finder.app. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol>
</div>Insert MD link using Keyboard Maestro2014-01-17T14:08:05-06:002014-01-17T14:08:05-06:00Jason Verlytag:mygeekdaddy.net,2014-01-17:/2014/01/17/insert-md-link-using-keyboard-maestro/<p>I’ve started to split my time between my Mac (mostly work) and my iPad (mostly home). Splitting my time between two different platforms has forced me to sometimes have two different tools sets. <a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8&uo=4" title="Editorial">Editorial</a> has been my de facto editor on my iPad pretty much since it was released …</p><p>I’ve started to split my time between my Mac (mostly work) and my iPad (mostly home). Splitting my time between two different platforms has forced me to sometimes have two different tools sets. <a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8&uo=4" title="Editorial">Editorial</a> has been my de facto editor on my iPad pretty much since it was released. <a href="https://itunes.apple.com/us/app/byword/id420212497?mt=12&uo=4" title="Byword">Byword</a> is my favorite editor on my Mac, but it lacks the of the automation functionality that Editorial on the iPad has. </p>
<p>One of my key Editorial functions I missed was an easy way to insert MD syntax links from the current browser window. So here’s a simple <a href="http://www.keyboardmaestro.com/main/">Keyboard Maestro</a> macro to insert the current Safari URL as a MD link in Byword (or your favorite MD editor). </p>
<figure><a href="http://share.mygeekdaddy.me/km_macro_safari_md_link_2014-01-17.png"><img src="http://share.mygeekdaddy.me/km_macro_safari_md_link_2014-01-17.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Just open the page you want to link to in Safari, go back to Byword, and then hit the hotkey combo. The KM macro will then ask you for the text you will use as the text for the link, pull in the current URL, then combine the two and paste it in Byword as MD link syntax.</p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>Building your own 'special' Maximo query2014-01-09T23:46:34-06:002014-01-09T23:46:34-06:00Jason Verlytag:mygeekdaddy.net,2014-01-09:/2014/01/09/building-your-own-special-maximo-query/<p>One of the top prizes for any Maximo users is having that "special" query that they know will absolutely find everything they are looking for. Recently I was asked to get a list of <strong>every</strong> PM in part of the a plant. The Maintenance Manager wanted the list to include …</p><p>One of the top prizes for any Maximo users is having that "special" query that they know will absolutely find everything they are looking for. Recently I was asked to get a list of <strong>every</strong> PM in part of the a plant. The Maintenance Manager wanted the list to include PM's against Locations, Assets, and/or Routes. He complained that the only way he'd been able to previously get the information was by getting four different lists and trying to merge them together in Excel.</p>
<p>I asked him what he really needed and the quick reply was, 'I need all the PM's'. So I asked him what does his packet of information look like <sup id="fnref:buildqry_1"><a class="footnote-ref" href="#fn:buildqry_1">1</a></sup> when we get the query to work right. We sat down and looked at what he was trying to do and came up with the following:</p>
<ul>
<li>Get all PM's of Locations within the Location hierachy of an area of the plant.</li>
<li>Get all PM's of Assets belonging to Locations within the Location hierarchy of an area of the plant.</li>
<li>Get all PM's that were part of Route Stops that had Locations or Assets within the Location hiearchy of an area of the plant. </li>
</ul>
<p>This quick back and forth took no more than 2 minutes after we <em>both</em> slowed down to look at what was needed. We then started tackling each bullet item to get a portion of his overall search query. From there we can glue them all together for a final query. </p>
<h4>Location Hierarchy</h4>
<p>The first one we tackled was all of the Locations in the area of the plant. The Maintenance Manager had first tried using the "Search Location Hierarchy". I love this box because it can give just about any Maximo user a built-in demonstration of a sub-select query in Maximo. Because the Location Hierarchy and Location Parent records reside on tables, other than the <code>LOCATIONS</code> table, Maximo will give the sub-select query if a user looks at the Where Clause in the Advanced Search. </p>
<p>After determining where in the plant his was focused on, we ended up with the following query:</p>
<div class="highlight"><pre><span></span><code>siteid = 'BEDFORD' and exists(select 1 from locancestor where ancestor = 'UTILITIES' and siteid = pm.siteid and location=pm.location)
</code></pre></div>
<h4>Asset Hierarchy</h4>
<p>The next one we tackled was getting all the PM's for any assets that belonged to a Location within the plant area. This one got trickier because while the PM module can search by <code>PM.ASSETNUM</code>, it won't allow you to search for assets related to Locations in a hierarchy. For this step I explained we needed to use an <em>IN</em> SQL statement. The IN statement basically returns records found "in" a given list of related records. But remember, we're looking for Assets in a Location in a Location Hierarchy. Notice I needed to use the work "in" twice? That means we'll need to use a nested IN statement with our query. After working with him a few minutes we came up with the following:</p>
<div class="highlight"><pre><span></span><code>siteid = 'BEDFORD and assetnum in (select assetnum from asset where siteid=pm.siteid and location in (select location from locancestor where ancestor = 'UTILITIES' and siteid = asset.siteid and location=asset.location))
</code></pre></div>
<h4>Routed Locations & Assets</h4>
<p>The last step was to get PM's that use a Route and the Route Stop has a Location in the hierarchy or is associated with an Asset in a Location in the hierarchy. As soon as he made the declaration of needing "this" <strong>or</strong> "that", it was a tip that this last query may actually be two. When we further broke down the last bullet item it turns out we needed two queries. Why? Because Route Stops can be either based on a Location or an Asset. After a little discussion we figured that we needed to get a list of Route Stops with Locations in the Location Hierarchy <em>and</em> Assets in Route Stops in Locations in the Location Hierarchies. That's going to require two queries that have multiple IN statements. </p>
<p>After some quick work we came up with the following: </p>
<div class="highlight"><pre><span></span><code>siteid='BEDFORD' and (route in (select route from route_stop where siteid=pm.siteid and location in (select location from locancestor where ancestor = 'UTILITIES' and siteid = route_stop.siteid and location = route\_stop.location))or route in (select route from route_stop where siteid=pm.siteid and assetnum in (select assetnum from asset where siteid=route_stop.siteid and location in (select location from locancestor where ancestor = 'UTILITIES' and siteid = asset.siteid and location=asset.location))))
</code></pre></div>
<h4>Final Query</h4>
<p>Gluing the three queries all together got us this:</p>
<div class="highlight"><pre><span></span><code>siteid='BEDFORD' and (
exists(select 1 from locancestor where ancestor = 'UTILITIES' and siteid = pm.siteid and location=pm.location)
or assetnum in (select assetnum from asset where siteid=pm.siteid and location in (select location from locancestor where ancestor = 'UTILITIES' and siteid = asset.siteid and location=asset.location))
or route in (select route from route\_stop where siteid=pm.siteid and location in (select location from locancestor where ancestor = 'UTILITIES' and siteid = route\_stop.siteid and location=route\_stop.location))
or route in (select route from route\_stop where siteid=pm.siteid and assetnum in (select assetnum from asset where siteid=route\_stop.siteid and location in (select location from locancestor where ancestor = 'UTILITIES' and siteid = asset.siteid and location=asset.location))) )
</code></pre></div>
<p>From here anyone can substitute either the Locancestor value to find other PM records or modify the usage of the PM tables details for use in another app - e.g. find all work orders in an area of a plant. </p>
<p><strong>Note:</strong> Your browswer may change the formatting of the query above and change the single quotes to "smart quotes" <sup id="fnref:buildqry_2"><a class="footnote-ref" href="#fn:buildqry_2">2</a></sup></p>
<h4>Summary</h4>
<p>When tackling complex search queries, try to take a step back and break down what you're trying to find:</p>
<ul>
<li>Write a sentence, or two, that coud explain to <em>someone else</em> what you're trying to search for. If your co-worker can't figure out what you mean, you may be missing some details. </li>
<li>Look for keywords like <em>in</em>, <em>with</em>, <em>or</em>, <em>and</em> in your sentence. This can indicate what kind of query you may need to create.</li>
<li>Break down your queries into segments and then "glue" them back together to make the more complex query. Going for a home run on the first attempt means you'll most likely end up with a <code>BMXAA4210E - Database error number 1234 has occurred</code> error.</li>
</ul>
<div class="footnote">
<hr>
<ol>
<li id="fn:buildqry_1">
<p>The proverbial 'What does "Done" look like' Q&A. ↩ <a class="footnote-backref" href="#fnref:buildqry_1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:buildqry_2">
<p>Personally, I don't think smart quotes are all that brilliant. <a class="footnote-backref" href="#fnref:buildqry_2" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Maximize OS X App Windows2014-01-01T13:18:37-06:002014-01-01T13:18:37-06:00Jason Verlytag:mygeekdaddy.net,2014-01-01:/2014/01/01/maximize-os-x-app-windows/<p>I’ve been a Mac user for several years now and there are still things I cannot let go of from my Windows days. The first is how <a href="http://mygeekdaddy.net/2013/10/24/change-mavericks-finder-app-sort-order/">Finder.app sorts files and folders</a> and the other is how none of the colored buttons will maximize an app to full …</p><p>I’ve been a Mac user for several years now and there are still things I cannot let go of from my Windows days. The first is how <a href="http://mygeekdaddy.net/2013/10/24/change-mavericks-finder-app-sort-order/">Finder.app sorts files and folders</a> and the other is how none of the colored buttons will maximize an app to full screen consistently. Using <a href="http://www.keyboardmaestro.com/main/">Keyboard Maestro</a>, here’s a quick and easy way to get an app to maximize to the full screen size.</p>
<figure><a href="http://share.mygeekdaddy.net/maximize_app_size_2014-01-01.png"><img src="http://share.mygeekdaddy.net/maximize_app_size_2014-01-01.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>A couple of notes on the macro: </p>
<ul>
<li>Because I use a couple of different Macs, the screen resoulution is different with each system. I sync my macros across my Macs, so the screen size can’t be hard coded like my <a href="http://theothersideof.mygeekdaddy.net/2012/make-os-x-window-management-easier/">original macro</a>.</li>
<li>On my MBP, the screen size is given as a list <code>0, 0, 1440, 900</code>. Because I need to use the 3rd and 4th value in the list, the resize step asks to use the 3rd and 4th values in the list.</li>
<li>I want to keep the menu bar visible, so 22 pixels is subtraced, <code>screensize[4]–22</code>, from the overall size of the screen resize. This is also why the screen is moved to position <code>0, 22</code> and not position <code>0, 0</code>.</li>
</ul>
<p>From there you assign the macro to a simple key combo or F-key (I use F3). You can download a zipped copy of the KM macro here: <a href="http://share.mygeekdaddy.me/full_size_window_app.kmmacros.zip">Full Size Window Macro</a></p>Holiday project for kids2013-12-20T13:47:58-06:002013-12-20T13:47:58-06:00Jason Verlytag:mygeekdaddy.net,2013-12-20:/2013/12/20/holiday-project-for-kids/<p>Who wouldn’t love a project that involves Python, a Raspberry Pi, and Christmas lights? One of my favorite tutorial sites, <a href="http://hub.tutsplus.com">tuts+</a>, has out done themselves with their recent tutorial. Now tuts+ has a tutorial on <a href="http://computers.tutsplus.com/tutorials/control-your-christmas-lights-with-a-raspberry-pi--mac-58672">using a Raspberry Pi to control Christmas lights</a>.</p>
<blockquote>
<p>You’ll be able to control …</p></blockquote><p>Who wouldn’t love a project that involves Python, a Raspberry Pi, and Christmas lights? One of my favorite tutorial sites, <a href="http://hub.tutsplus.com">tuts+</a>, has out done themselves with their recent tutorial. Now tuts+ has a tutorial on <a href="http://computers.tutsplus.com/tutorials/control-your-christmas-lights-with-a-raspberry-pi--mac-58672">using a Raspberry Pi to control Christmas lights</a>.</p>
<blockquote>
<p>You’ll be able to control the lights with a simple Python program, which is easily modifiable for different patterns or triggers. You could also setup your Pi for remote control and be able to control your Christmas lights with an iPad or mobile phone.</p>
</blockquote>
<p>Overall the project, from scratch, will be about $125 (YMMV on what deal you can find on the parts). Using a Raspberry Pi has been a great way to get kids into tech because it involves a little hardware, a little software, but a whole lot of visual feedback when it works. Perfect holdiay project with the kids!</p>Clarifying the Types of Maximo reports2013-12-17T10:56:09-06:002013-12-17T10:56:09-06:00Jason Verlytag:mygeekdaddy.net,2013-12-17:/2013/12/17/clarifying-the-types-of-maximo-reports/<p>In a previous post on <a href="http://mygeekdaddy.net/2013/12/10/how-to-schedule-a-date-parameter-report/">How to schedule a date parameter report</a>, I included in a footnote on the example report I used that the report would be classified as a Type 3 report.</p>
<blockquote>5. This report fits the Type 3 definition (<a href="http://www-01.ibm.com/support/docview.wss?uid=swg21305009&aid=1">see pg 28</a>), so make sure to check …</blockquote><p>In a previous post on <a href="http://mygeekdaddy.net/2013/12/10/how-to-schedule-a-date-parameter-report/">How to schedule a date parameter report</a>, I included in a footnote on the example report I used that the report would be classified as a Type 3 report.</p>
<blockquote>5. This report fits the Type 3 definition (<a href="http://www-01.ibm.com/support/docview.wss?uid=swg21305009&aid=1">see pg 28</a>), so make sure to check the box ‘Use Where Clause’.</blockquote>
<p>I got several follow up questions on what is a Type 3 report and what other types of reports are there. The report types actually comes from IBM KB document <a href="http://www-01.ibm.com/support/docview.wss?uid=swg21305009&aid=1">IBM Maximo Asset Management / Designing v7 Reports</a>. In the document, IBM describes three types of reports:</p>
<ul>
<li>Type 1 - Parameterized Reports</li>
<li>Type 2 - Application Reports</li>
<li>Type 3 - Paramter & Application Reports</li>
</ul>
<h4>Type 1 - Parameterized Reports</h4>
<p>Type 1 reports require the user to enter parameter value(s) into the request page for the report to run. The parameters may, or may not, be required and could include values like SiteID, Person, record status, date fields, etc. Once the values are collected, the report will use the parameter values to filter results against the <em>entire</em> Maximo database. This occurs even if the user has run a query, or entered a custom Where Clause, in Maximo to limit the record results.</p>
<p>For example, in the <em>Inventory Adjustment Transactions</em> report, the parameters are passed from the request page and then used to modify the <em>[Where]</em> parameter itself:</p>
<figure><a href="http://share.mygeekdaddy.me/parameter_type1_report_2013-12-17.png"><img src="http://share.mygeekdaddy.me/parameter_type1_report_2013-12-17.png" style="display:block; margin-left: auto; margin-right:auto; width:600px;" /></img></a></figure>
<p>Example of Type 1 reports: Security Group Access, Inventory Adjustment Transactions, </p>
<h4>Type 2 - Application Reports</h4>
<p>Type 2 reports have no parameter values and will utilize any selected records, or custom Where Clause statements from the Maximo application, and pass these back to the report for the records that will displayed. </p>
<p>For example, in the <em>Work Order List</em> report, the report just uses the conditions passed from the Maximo application to the <em>[Where]</em> parameter. </p>
<figure><a href="http://share.mygeekdaddy.me/noparameter_type2_report_2013-12-17.png"><img src="http://share.mygeekdaddy.me/noparameter_type2_report_2013-12-17.png" style="display:block; margin-left: auto; margin-right:auto; width:600px;" /></img></a></figure>
<p>Example of Type 2 reports: Work Order List, Purchase Order List, QBR reports. <a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> </p>
<h4>Type 3 - Paramter & Application Reports</h4>
<p>Type 3 reports utilize a parameter and the selected records to help filter report results. To do this, the report will have the ‘Use Where Clause’ flag checked when the report is imported into Maximo. </p>
<figure><a href="http://share.mygeekdaddy.me/usewhereclause_type3_report_2013-12-17.png"><img src="http://share.mygeekdaddy.me/usewhereclause_type3_report_2013-12-17.png" style="display:block; margin-left: auto; margin-right:auto; width:600px;" /></img></a></figure>
<p>When the ‘Use Where Clause’ is checked, Maximo enables the report to use both the parameter value(s) and the Where Clause that is passed from the Maximo application. A report has to have at least one parameter before Maximo will allow the ‘Use Where Clause’ checkbox. </p>
<p>Example of Type 3 reports: Custom BIRT reports or modified OOB reports.</p>
<h4>Parameter Impact</h4>
<p>One way to see this in action is to show what <em>[Where]</em> parameters are used in a report. QBR reports do this happens automatically, but you can add this to a custom BIRT report, or modify an existing report, with the following:</p>
<ol>
<li><p>On the report footer create a new Data element, with a <em>String</em> data type.</p></li>
<li><p>In the Data element’s Expresssion copy/paste the following expression:</p>
<p>if (!BirtStr.trim(params[“where”]).equalsIgnoreCase(“1=1”)) { params[“where”]; }</p></li>
<li><p>Save the report and import it into Maximo. </p></li>
</ol>
<p>Now when the report is run, the footer will include any dynamic clauses that were passed from Maximo, to the BIRT report, when the final output of the BIRT report is generated. So going back to the example report in the <a href="http://mygeekdaddy.net/2013/12/10/how-to-schedule-a-date-parameter-report/">How to schedule a date parameter report</a>, if I use the following Where Clause in Maximo:</p>
<pre><code>(historyflag = 0 and siteid = 'BEDFORD' and getdate() - orderdate > 90)
</code></pre>
<p>The report will pick up that filter and use it when the report is run, as shown in the report footer.</p>
<figure><a href="http://share.mygeekdaddy.me/passing_where_param_report_2013-12-17.png"><img src="http://share.mygeekdaddy.me/passing_where_param_report_2013-12-17.png" style="display:block; margin-left: auto; margin-right:auto; width:600px;" /></img></a></figure>
<h4>Reference Information</h4>
<p>More information can be found in the following documents:</p>
<ul>
<li><a href="https://www-304.ibm.com/support/docview.wss?uid=swg21421371&aid=1">IBM Maximo v7 Report Planning Guide</a></li>
<li><a href="http://pic.dhe.ibm.com/infocenter/tivihelp/v3r1/topic/com.ibm.mam.doc_7.1/pdf/mam71_report_dev_guide.pdf">IBM Maximo v7.1 Report Development Guide</a></li>
<li><a href="http://www-01.ibm.com/support/docview.wss?uid=swg21498572&aid=1">IBM Maximo v7.5 Report Developement Guide (BIRT 2.3.2)</a></li>
<li><a href="http://www-01.ibm.com/support/docview.wss?uid=swg21605970&aid=1">IBM Maximo v7.5 Report Developement Guide (BIRT 3.7.1)</a></li>
<li><a href="https://www.ibm.com/developerworks/community/forums/html/topic?id=8a78882a-3d57-4834-84be-82e1ad3a7d89">IBM developerWorks - Dynamic Date Range Paramgters</a></li>
<li><a href="https://www.ibm.com/developerworks/community/wikis/home?lang=en#/wiki/IBM%20Maximo%20Asset%20Management/page/Both%20Application_Parameterized%20Reports">IBM devloperWorks - Parameterized Reports</a></li>
</ul>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>QBR Reports not using a Filtering field. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol>
</div>How to schedule a date parameter report2013-12-10T11:56:25-06:002013-12-10T11:56:25-06:00Jason Verlytag:mygeekdaddy.net,2013-12-10:/2013/12/10/how-to-schedule-a-date-parameter-report/<p>One of the challenges I typically have when creating new reports is making sure it can be used as many ways as possible. One of the toughest is giving a report the flexibility for a date range selection but also being able to use it as a scheduled report. This …</p><p>One of the challenges I typically have when creating new reports is making sure it can be used as many ways as possible. One of the toughest is giving a report the flexibility for a date range selection but also being able to use it as a scheduled report. This post will show one way to do both. </p>
<h4>Normal Date Selection</h4>
<p>Using an out of the box report with a date selection parameter, like in the <em>inventory_transactions_adjustments.rptdesign</em>, the date parameter is required and the <em>Open Method</em> sets a date selection based on the database type.</p>
<div class="highlight"><pre><span></span><code><span class="nt">if</span><span class="o">(</span><span class="nt">params</span><span class="cp">[</span><span class="s2">"startdate"</span><span class="cp">]</span><span class="p">.</span><span class="nc">value</span><span class="o">)</span><span class="w"> </span><span class="p">{</span><span class="w"> </span>
<span class="w"> </span><span class="err">if(maximoDataSet.isOracle())</span><span class="w"> </span><span class="err">{</span><span class="w"> </span>
<span class="w"> </span><span class="err">params</span><span class="cp">[</span><span class="s2">"where"</span><span class="cp">]</span><span class="err">+=</span><span class="w"> </span><span class="err">"</span><span class="w"> </span><span class="err">and</span><span class="w"> </span><span class="err">to_date(to_char(invtrans.transdate,'YYYYMMDD</span><span class="w"> </span><span class="n">HH24</span><span class="p">:</span><span class="n">MI</span><span class="o">:</span><span class="n">SS</span><span class="s1">'),'</span><span class="n">YYYYMMDD</span><span class="w"> </span><span class="n">HH24</span><span class="o">:</span><span class="n">MI</span><span class="o">:</span><span class="n">SS</span><span class="err">'</span><span class="p">)</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="s2">" </span>
<span class="s2"> + MXReportSqlFormat.getStartDayTimestampFunction(params</span><span class="cp">[</span><span class="s2">"startdate"</span><span class="cp">]</span><span class="s2">); </span>
<span class="s2"> } </span>
<span class="s2"> else if(maximoDataSet.isSQLServer()) { </span>
<span class="s2"> params</span><span class="cp">[</span><span class="s2">"where"</span><span class="cp">]</span><span class="s2">+= "</span><span class="w"> </span><span class="n">and</span><span class="w"> </span><span class="n">invtrans</span><span class="o">.</span><span class="n">transdate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="s2">" </span>
<span class="s2"> + MXReportSqlFormat.getStartDayTimestampFunction(params</span><span class="cp">[</span><span class="s2">"startdate"</span><span class="cp">]</span><span class="s2">); </span>
<span class="s2"> } </span>
<span class="s2"> else if(maximoDataSet.isDB2()) { </span>
<span class="s2"> params</span><span class="cp">[</span><span class="s2">"where"</span><span class="cp">]</span><span class="s2">+= "</span><span class="w"> </span><span class="n">and</span><span class="w"> </span><span class="nf">timestamp</span><span class="p">(</span><span class="n">invtrans</span><span class="err">.</span><span class="n">transdate</span><span class="p">)</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="err">"</span><span class="w"> </span>
<span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="n">MXReportSqlFormat</span><span class="o">.</span><span class="nf">getStartDayTimestampFunction</span><span class="p">(</span><span class="n">params</span><span class="cp">[</span><span class="s2">"startdate"</span><span class="cp">]</span><span class="p">);</span><span class="w"> </span>
<span class="w"> </span><span class="p">}</span><span class="w"> </span>
<span class="err">}</span><span class="w"></span>
</code></pre></div>
<p>While the Maximo user can select the date range for the information the report will return, it's difficult to get a regular update (e.g. a weekly summary) using the same report. In most cases I previously would have recreated the report so the date range was fixed to an agreed upon range so it could be scheduled to run on a recurring basis. Now I've got two reports, doing basically the same thing, which typically ends up with a phone call from a confused user asking which one to use.</p>
<h4>Fall Back Date Selection</h4>
<p>Looking at the conditional statement above, we can see the BIRT report uses <em>if/then</em> statements in the <em>Open Method</em> to determine which statement should be used, based on the SQL database environment. I use the same technique to get a fall back date selection in my enterprise reports. Below are the steps in a basic custom report to show a list of purchase orders, based on the record's order date.</p>
<p>Just like in other reports that use a date selection, the report needs to have a parameter to pass the date value to the selection query. [1] In my example there are two parameters in the report:</p>
<div class="highlight"><pre><span></span><code>startdate
enddate
</code></pre></div>
<p>One of the differences when setting up these parameters is to <em>not</em> set them as required: </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Schedule_a_date_range_report_2013_11_27_195046.png ()"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Schedule_a_date_range_report_2013_11_27_195046.png ()" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>By not setting the parameter checkbox, <em>Is Required</em>, it will allow the report to be scheduled and pass a default date/time value to the parameter because the Maximo UI will not be triggered to have to have a date value on the Request Page.</p>
<p>The next step is to update the <em>Open Method</em> by adding two new variables</p>
<div class="highlight"><pre><span></span><code><span class="k">var</span><span class="w"> </span><span class="n">start_date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="nb nb-Type">String</span><span class="p">();</span><span class="w"></span>
<span class="k">var</span><span class="w"> </span><span class="n">end_date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new</span><span class="w"> </span><span class="nb nb-Type">String</span><span class="p">();</span><span class="w"></span>
</code></pre></div>
<p>Then add the conditional statements for the date range selections:</p>
<div class="highlight"><pre><span></span><code><span class="k">if</span><span class="w"> </span><span class="ss">(</span><span class="nb">params</span>[<span class="s2">"startdate"</span>].<span class="nv">value</span><span class="ss">)</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">start_date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">" and po.orderdate >= "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">MXReportSqlFormat</span>.<span class="nv">getStartDayTimestampFunction</span><span class="ss">(</span><span class="nb">params</span>[<span class="s2">"startdate"</span>]<span class="ss">)</span><span class="c1">; }</span><span class="w"></span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">start_date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">" and po.orderdate >= dateadd(month,datediff(month,1,getdate()) +0,0) "</span><span class="c1">; }</span><span class="w"></span>
<span class="k">if</span><span class="w"> </span><span class="ss">(</span><span class="nb">params</span>[<span class="s2">"enddate"</span>].<span class="nv">value</span><span class="ss">)</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">end_date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">" and po.orderdate <= "</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">MXReportSqlFormat</span>.<span class="nv">getEndDayTimestampFunction</span><span class="ss">(</span><span class="nb">params</span>[<span class="s2">"enddate"</span>]<span class="ss">)</span><span class="c1">; }</span><span class="w"></span>
<span class="w"> </span><span class="k">else</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">end_date</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">" and po.orderdate < dateadd(month,datediff(month,1,getdate()) +1,0) "</span><span class="c1">; }</span><span class="w"></span>
</code></pre></div>
<p>Using the <em>StartDate</em> statement as an example, what I've done is set the condifional statement to fall back to a default date range in the event a date was not entered when the report is run. So when the conditional statement <code>if (params["enddate"].value)</code> finds no value being passed from the <code>startdate</code> parameter, it will pass the SQL string <code>and po.orderdate >= dateadd(month,datediff(month,1,getdate()) +0,0)</code> to the report's selection query. </p>
<p>If a date value is given, so the parameter <em>startdate</em> has a value, the conditional statement will process the date value in the <code>and po.orderdate >= " + MXReportSqlFormat.getStartDayTimestampFunction(params["startdate"]);</code>. The same thing happens for the end date range value.</p>
<p>The last part is adding the two variables into the SQL selection query. Due to the way the conditional statements are written, I can just add the variables to the end of the SQL statement in the <em>Open Method</em> like this:</p>
<div class="highlight"><pre><span></span><code>sqlText = "select po.ponum, po.description, po.orderdate from po"
+ " where" + params["where"]
+ start_date
+ end_date
;
</code></pre></div>
<p>Notice that I just added the variables to the end of the report. The wording used in the conditional statements allow the variables to be passed as additional <em>and</em> clauses to the SQL query. </p>
<p>So the full <em>Open Method</em> looks like this:</p>
<figure><a href="http://share.mygeekdaddy.me/open_method_full_2013-12-10.png"><img src="http://share.mygeekdaddy.me/open_method_full_2013-12-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<h4>Registering Report</h4>
<p>When you register the report in Maximo, Maximo will make some assumptions on how you want to have the report deployed. You'll need deselect the reqiured field for the date parameters and add the <em>datelookup</em>, similar to this:</p>
<figure><a href="http://share.mygeekdaddy.me/Report_Administration-5_2013-12-09.png"><img src="http://share.mygeekdaddy.me/Report_Administration-5_2013-12-09.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Set the order sequence for each parameter and generate the request page. [5]</p>
<h4>Running the report</h4>
<p>Now when a user runs the report, they'll be presented with a normal request page. </p>
<figure><a href="http://share.mygeekdaddy.me/Purchase_Orders_2013-12-10.png"><img src="http://share.mygeekdaddy.me/Purchase_Orders_2013-12-10.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Note the date fields are empty and they don't have required field star. If the user wants to select dates, they can use the calendar date lookups and run the report as most other date selection report. If the dates are left empty, the report automatically pulls in all records from the 1st of the month to the end of the month.</p>
<p>Looking at the debug log file, you can see the SQL selection when running the report without a date value in the parameters:</p>
<div class="highlight"><pre><span></span><code><span class="nv">select</span><span class="w"> </span><span class="nv">po</span>.<span class="nv">ponum</span>,<span class="w"> </span><span class="nv">po</span>.<span class="nv">description</span>,<span class="w"> </span><span class="nv">po</span>.<span class="nv">orderdate</span><span class="w"> </span>
<span class="nv">from</span><span class="w"> </span><span class="nv">po</span><span class="w"> </span>
<span class="nv">where</span><span class="w"> </span><span class="nv">po</span>.<span class="nv">siteid</span><span class="o">=</span><span class="s1">'BEDFORD'</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">po</span>.<span class="nv">orderdate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"> </span>
<span class="nv">and</span><span class="w"> </span><span class="nv">po</span>.<span class="nv">orderdate</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>A new holiday classic2013-12-08T10:04:56-06:002013-12-08T10:04:56-06:00Jason Verlytag:mygeekdaddy.net,2013-12-08:/2013/12/08/a-new-holiday-classic/<p>Just in time for the holidays, <em>Bad Religion</em> has released a Christmas album. If you're expecting a mis-mash of your favorite carols you will be disappointed. The guys put their spin on all the holiday classics - Little Drummer Boy, O Come All Ye Faithful (with a great guitar solo, and …</p><p>Just in time for the holidays, <em>Bad Religion</em> has released a Christmas album. If you're expecting a mis-mash of your favorite carols you will be disappointed. The guys put their spin on all the holiday classics - Little Drummer Boy, O Come All Ye Faithful (with a great guitar solo, and God Rest Ye Merry Gentlemen. <sup id="fnref:xmas_1"><a class="footnote-ref" href="#fn:xmas_1">1</a></sup></p>
<p>Bad Religion - Christmas Songs: $7.99 in <a href="https://itunes.apple.com/us/album/christmas-songs/id701162374">iTunes</a></p>
<div class="footnote">
<hr>
<ol>
<li id="fn:xmas_1">
<p>Best version is still by Bare Naked Ladies ↩ <a class="footnote-backref" href="#fnref:xmas_1" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>More great updates to Marked 22013-12-04T13:41:15-06:002013-12-04T13:41:15-06:00Jason Verlytag:mygeekdaddy.net,2013-12-04:/2013/12/04/more-great-updates-to-marked-2/<p>Brett (<a href="https://twitter.com/ttscoff">@ ttscoff</a>) continues to amaze me with updates he's putting into his <a href="http://marke%20d2app.com/">Marked 2 app</a>. The latest update makes sharing your Markdown documents even better. </p>
<blockquote>
<p>The most exciting improvement is the ability to add customizable headers and footers for printing and PDF export. You can insert variables for Title, Date …</p></blockquote><p>Brett (<a href="https://twitter.com/ttscoff">@ ttscoff</a>) continues to amaze me with updates he's putting into his <a href="http://marke%20d2app.com/">Marked 2 app</a>. The latest update makes sharing your Markdown documents even better. </p>
<blockquote>
<p>The most exciting improvement is the ability to add customizable headers and footers for printing and PDF export. You can insert variables for Title, Date, Time, Page Number and Page Total in whatever string format you want to use. Just head for Marked → Preferences → Print to see the options.</p>
</blockquote>
<p>Not using Marked 2? Then do yourself a favor and at least <a href="http://marked2app.com/download/Marked.zip">download a trial version</a> and test it out yourself. </p>The Talk: Family & Social Media2013-11-29T14:06:33-06:002013-11-29T14:06:33-06:00Jason Verlytag:mygeekdaddy.net,2013-11-29:/2013/11/29/the-talk-family-social-media/<p>One of the tried and true seasonal rituals is upon us, having family asking for tech support at holiday gatherings.<a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> We all have our horror stories of some of the strange things we’ve seen while attempting to help family or friends with their <a href="http://www.microsoft.com/en-us/windows/endofsupport.aspx">outdated Windows computers</a>, teaching them …</p><p>One of the tried and true seasonal rituals is upon us, having family asking for tech support at holiday gatherings.<a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> We all have our horror stories of some of the strange things we’ve seen while attempting to help family or friends with their <a href="http://www.microsoft.com/en-us/windows/endofsupport.aspx">outdated Windows computers</a>, teaching them some <a href="http://www.macworld.com/article/1150675/ipad_tips.html">new tricks on their new tablet</a>, or helping them with their <a href="http://www.damnyouautocorrect.com">new smartphone</a>.</p>
<blockquote>
<p>This isn’t about helping others, this is about helping <strong>you</strong>. </p>
</blockquote>
<p>One of the common tendancies I’ve noticed over the past couple of years is to get a rush of social media invites, or follows, just after holiday events. You know how it goes - your nephew googled your name and found your less than family friendly Twitter account, a 2nd cousin you haven’t seen in 23 years makes a New Year’s resolution to reconnect with family this year, etc. Here’s a few things to think about this holiday season:</p>
<ul>
<li><em>How do you separate your social media experiences?</em> Think about the boundaries you have in your mind for your different social media accounts and what each account means to you. Try to define the type of social interactions you want to have on one platform versus another.</li>
<li><em>Will you honestly follow back any family members?</em> So they found you. Now what? Can you honestly tell yourself you’re going to ignore their request? This is a discussion you have to have with yourself.</li>
<li><em>Are you prepared to explain yourself to others?</em> This is where the rubber meets the road. A family member found you on Twitter and follows you. Then over a holiday dinner they bluntly ask you why you never followed them back.</li>
</ul>
<p>Thinking about answers to the first two questions will help you when you run into the third. </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>If my family is reading this, know that that I say this with love, but this post totally pertains to you too. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol>
</div>Caveat to Finder.app Sort Order2013-11-25T09:26:21-06:002013-11-25T09:26:21-06:00Jason Verlytag:mygeekdaddy.net,2013-11-25:/2013/11/25/caveat-to-finderapp-sort-order/<p>I've had feedback from a small number of users about problems with trying to set up <a href="http://mygeekdaddy.net/2013/10/24/change-mavericks-finder-app-sort-order/">Finder.app to sort by Folders first</a> and then other documents. If you're having problems, double check if Finder is trying to utilize the 'Arrange By' filter. To check open Finder and …</p><p>I've had feedback from a small number of users about problems with trying to set up <a href="http://mygeekdaddy.net/2013/10/24/change-mavericks-finder-app-sort-order/">Finder.app to sort by Folders first</a> and then other documents. If you're having problems, double check if Finder is trying to utilize the 'Arrange By' filter. To check open Finder and go to <em>View</em> → <em>Arrange By</em> and make sure it's set to none. </p>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Caveat_to_Finder.app_Sort_Order_2013_11_25_092304.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Caveat_to_Finder.app_Sort_Order_2013_11_25_092304.png" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<p>Drop me a note in the comments if this still isn't working for you. </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#21333" title="2014-05-04 01:55:23">R. Blake Kessler</a>:</strong> Hi! Thanks for all of your work on this. I followed your directions closely. The only exception was that I used TextWrangler (which manages the permissions itself) to do the editing: I only added a single space to the line: Folder to make it read: Folder Later, when that didn't work, I checked my English language settings / U.S. English as you recommended, and checked the permissions as well to make sure the changes were saved and consistent and that System was once again the only user with read/write permissions. I repeated the sudo command after each set of changes, and saw all of the Finder windows disappear. I did verify that Arrange is set to None in both places where that is possible. So far the display of my Finder windows has not changed. New windows come up sorted by Name, with folders interspersed among the files by alphabetical order. At the top of the box it says "Name," and clicking on that reverses the alphabetical order. New windows come up with "None" as the sort order in the settings, despite the Name bar at the top under the settings bar.</p>
<p><strong><a href="#21338" title="2014-05-04 02:02:47">R. Blake Kessler</a>:</strong> Sorry, your web site engine did not preserve the text strings as I entered them, probably because it thought they were HTML. If this doesn't work either, they were exactly as you described, with 1 space inserted after the first STRING and greater-than sign. Before: "Folder" After: " Folder"</p>
<p><strong><a href="#27911" title="2014-05-08 17:00:21">Jason.Verly</a>:</strong> Sorry for the late response on resetting Finder.app post. I'll read through your comment in more detail tonight and reply back with any suggestions.</p>
<p><strong><a href="#28246" title="2014-05-08 22:21:01">Jason.Verly</a>:</strong> It looks like all you'll need to do is make your sort by the 'Kind' column. http://share.mygeekdaddy.me/finder_sort_order_2014-05-08.png</p>Use Editoral to create OmniFocus tasks2013-11-23T00:14:18-06:002013-11-23T00:14:18-06:00Jason Verlytag:mygeekdaddy.net,2013-11-23:/2013/11/23/use-editoral-to-create-omnifocus-tasks/<p>One of the activité du jour is to create a way to use one application from another. <a href="http://www.geekswithjuniors.com/ios-url-schemes">iOS URL schemes</a> are a common way of doing this. Here's my take on using Editorial to add tasks to OmniFocus. <sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></p>
<figure><a href="http://share.mygeekdaddy.me/_img_Untitled_2013_11_22_234057.png"><img src="http://share.mygeekdaddy.me/_img_Untitled_2013_11_22_234057.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>Import workflow: <a href="http://editorial-app.appspot.com/workflow/5779658033332224/nW89Iw6l2uQ">Editorial → OmniFocus</a></p>
<p></br>
Got any questions? Feel free to …</p><p>One of the activité du jour is to create a way to use one application from another. <a href="http://www.geekswithjuniors.com/ios-url-schemes">iOS URL schemes</a> are a common way of doing this. Here's my take on using Editorial to add tasks to OmniFocus. <sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></p>
<figure><a href="http://share.mygeekdaddy.me/_img_Untitled_2013_11_22_234057.png"><img src="http://share.mygeekdaddy.me/_img_Untitled_2013_11_22_234057.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>Import workflow: <a href="http://editorial-app.appspot.com/workflow/5779658033332224/nW89Iw6l2uQ">Editorial → OmniFocus</a></p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
<p>While I'm sure there's a better way to handle the caret movement, the WF works as needed. <a href="#fnref1" rev="footnote">↩</a></p>
</li>
</ol>
</div>Update to Editorial FTP Image Upload2013-11-21T22:23:06-06:002013-11-21T22:23:06-06:00Jason Verlytag:mygeekdaddy.net,2013-11-21:/2013/11/21/update-to-editorial-ftp-image-upload/<p>I've been using Editorial (<a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8">iTunes Link</a>) as my primary editor due to the custom workflows you can create. One of my key workflows is my <a href="http://mygeekdaddy.net/2013/09/01/editorial-worflow-ftp-image-upload/">FTP Image Upload</a>. I've finally got around to making some tweaks:</p>
<ul>
<li>Image selection is now done with the iOS Photos image selector. </li>
<li>The …</li></ul><p>I've been using Editorial (<a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8">iTunes Link</a>) as my primary editor due to the custom workflows you can create. One of my key workflows is my <a href="http://mygeekdaddy.net/2013/09/01/editorial-worflow-ftp-image-upload/">FTP Image Upload</a>. I've finally got around to making some tweaks:</p>
<ul>
<li>Image selection is now done with the iOS Photos image selector. </li>
<li>The image is rescaled to 1000px wide. If the image is less than 1000px, nothing happens. </li>
<li>Image is inserted into document has CSS style to align it center to the page and not rely on assumed CSS code. </li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/_img_BLOGX_Editorial_WF_FTP_Image_Selection_2013_11_21_215324.png"><img src="http://share.mygeekdaddy.me/_img_BLOGX_Editorial_WF_FTP_Image_Selection_2013_11_21_215324.png" title="" id="" style="display:block; margin-left:auto; margin-right:auto; width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>Import workflow: <a href="http://editorial-app.appspot.com/workflow/5881349973999616/AGvZPR5iUEs">FTP Image Upload</a> </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>Learning from my mistakes2013-11-19T14:31:42-06:002013-11-19T14:31:42-06:00Jason Verlytag:mygeekdaddy.net,2013-11-19:/2013/11/19/learning-from-my-mistakes/<p>There will probably be a point in your work life, whether you’re a professional or a tradesperson, where you will mentor a younger you. It could be as simple as helping the new guy get the lay of the land, an apprenticeship program, or being a true mentor.</p>
<p>So …</p><p>There will probably be a point in your work life, whether you’re a professional or a tradesperson, where you will mentor a younger you. It could be as simple as helping the new guy get the lay of the land, an apprenticeship program, or being a true mentor.</p>
<p>So here’s what I passed along to a young engineer after he got called out by his new wife.</p>
<blockquote>
<p>Work-Home balance is a crock of shit.<br />
Your boss doesn’t like to cuddle.<br />
The CEO won’t kiss you goodnight.<br />
When you move on from this job… no one will really miss you. </p>
</blockquote>
<p>Harsh? Maybe. But it’s what I wish I had been told at 25 instead of learning it the hard 15y later.</p>Change Mavericks Finder app sort order2013-10-24T16:09:51-05:002013-10-24T16:09:51-05:00Jason Verlytag:mygeekdaddy.net,2013-10-24:/2013/10/24/change-mavericks-finder-app-sort-order/<p><strong><em>Update:</em></strong> <em>Posted additional steps at bottom of post for those having problems with the original steps not taking hold.</em> Apple has finally released the latest update to their OS X operating system - <a href="http://www.apple.com/osx/">Mavericks</a>. I’ve never been impressed that by default Finder.app sorts folders and files with the same …</p><p><strong><em>Update:</em></strong> <em>Posted additional steps at bottom of post for those having problems with the original steps not taking hold.</em> Apple has finally released the latest update to their OS X operating system - <a href="http://www.apple.com/osx/">Mavericks</a>. I’ve never been impressed that by default Finder.app sorts folders and files with the same priority. My brain has been hardwired from years of working in Windows that folders should come first. OS X, including Mavericks, treats folders and files the same. So when you sort a folder by ‘type’, <em>Folders</em> show up just after <em>Files</em> and before <em>Internet Locations</em> (those are OS X’s <a href="http://wozwas.tumblr.com/post/6533369145/system-extensions-list">default file type</a> listings). Here is a recap of how to change Finder.app in Mavericks to sort file and folders like Windows Explorer. </p>
<h2>Required Tools</h2>
<p>To make the changes described below, you’ll need a text editor beyond the default TextEdit application provided by Apple. Some common, and easy to obtain, applications include: </p>
<ul>
<li><a href="http://www.barebones.com/products/bbedit/bbedit10.html">BBEdit</a> - My default editor ($)</li>
<li><a href="http://developer.apple.com/technologies/xcode.html">Plist Editor</a> - Part of Apple’s Xcode tool set</li>
<li><a href="http://www.barebones.com/products/textwrangler/">Text Wrangler</a> - BBEdit’s little brother, still very good</li>
<li>And a recent back up<sup id="fnref:refx_223423"><a class="footnote-ref" href="#fn:refx_223423">1</a></sup></li>
</ul>
<h2>Update Steps</h2>
<p>The steps to update OS X Mavericks install are pretty easy to follow. </p>
<ul>
<li>Open Finder and navigate to /System/Library/Coreservices folder and locate the Finder application. </li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/finderapp_coreservices.png"><img src="http://share.mygeekdaddy.me/finderapp_coreservices.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ul>
<li>Once the folder is open, right click on the Finder.app file and click on ‘Show Package Contents’. The package contents of the Finder.app will open like it was a folder and show additional folders and files that make up the Finder.app application.</li>
<li>Once the package contents are opened, navigate to “Contents/Resources/English.lproj” folder.<sup id="fnref:refx_27897923"><a class="footnote-ref" href="#fn:refx_27897923">2</a></sup></li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/english_proj_file.png"><img src="http://share.mygeekdaddy.me/english_proj_file.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ul>
<li>Locate the file “InfoPlist.strings” file. This is the file that contains the structure on how Finder.app sorts records.</li>
<li>Verify that you have write access to the “InfoPlist.strings” first. Right click the file and select “Get Info”. This will show if you have access to change the file. Change your access to “Read/Write” and save the changes. The easiest way to do this is change the ‘Everybody’ group to ‘Read/Write’ access. If you’re using BBEdit, it will manage the read access to the file as you open it.</li>
<li>Open the “InfoPlist.strings” file in one of the editors listed above. If you happen to use one that is not setup for editing a Plist string file, you’ll most likely end up with an error message when attempting to open it.</li>
<li>Locate the “Folder” entry in the “InfoPlist.strings” file and simple add a space to the following line (note the space has been added): <code>Folder</code>.</li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/infolistpstrings.png"><img src="http://share.mygeekdaddy.me/infolistpstrings.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ul>
<li>Save the changes to the “InfoPlist.strings” file.</li>
<li>Do another ‘Get Info’ on the “InfoPlist.strings” to remove your ‘Read/Write’ authority and save the file again.</li>
<li>Open a Terminal and run the following command - <code>sudo killall Finder</code>.</li>
</ul>
<p>Now open the Finder app and look at how your folders and files are sorted by clicking on ‘Kind’. All of your folders will now be listed first, in alphabetical order, followed by the kind of file in alphabetical order. </p>
<p><strong><em>Update:</em></strong> <em>I’ve had some feedback that after following the steps above, the sort order was not changed. If the sort order doesn’t work for you, please try the following:</em></p>
<ul>
<li>Make sure you have a good back-up of your system before beginning.</li>
<li>Verify you have admin rights on your Mac. If you don’t, you’ll need to work with the person that does.</li>
<li>Before beginning, make sure your language settings are US English. I’m working on another update to the post for non-US users. </li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/language_settings.png"><img src="http://share.mygeekdaddy.me/language_settings.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ul>
<li>Go to folder /System/Library/CoreServices and located the Finder.app file.</li>
<li>Right click on Finder.app file and open the file with “Show Package Contents”</li>
<li>One the package is opened, go to /Contents/Resources folder and find the English.lproj folder.</li>
<li>Select the English.lproj folder and hit Cmd-I (or right click the folder for ‘Get Info’) to bring up the permissions on the folder. </li>
</ul>
<figure><a href="http://share.mygeekdaddy.me/english_lproj_folder-3.png"><img src="http://share.mygeekdaddy.me/english_lproj_folder-3.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ul>
<li>Unlock the permissions and add your user account to the list with Read & Write priveleges.</li>
<li>Now open the English.lproj folder and locate the InfoPlist.strings file and do the same thing to its permissions.</li>
<li>Make the change to the Folder string as described above and save the file.</li>
<li>Set the R/W access on the InfoPlist.strings file as they were originally found by removing your user accounts access to the file.</li>
<li>Set the R/W access to the English.lproj folder as they were originally found as well.</li>
<li>Close all applications.</li>
<li>Run the <code>sudo killall Finder</code> command.</li>
<li>Open Finder and verify that the new sort order is working.</li>
</ul>
<p>If you’ve been having problems, please leave a comment and let me know if the updated steps worked for you. </p>
<hr>
<p><em>Update 2013-11-25:</em> I've posted a caveat to these steps here: <a href="http://mygeekdaddy.net/2013/11/25/caveat-to-finder-app-sort-order/">Caveat to Finder.app Sort Order</a>. This should address the small percentage of users still having issues getting the sort order to work.</p>
<hr>
<p><em>Update: 2014-01-17:</em> I added a new post on <a href="http://mygeekdaddy.net/2014/01/17/fixing-finder-app-infoplist-string/">Fixing Finder.app InfoPlist.strings</a> in the event your file is found to be corrupted. Add a comment if you run into any problems.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:refx_223423">
<p>Why? One, you should always have a good back-up of your computer, so here’s as good of an excuse as any to get your back-ups up to date. Two, the changes are to core system files. There’s always a remote chance that something could go wrong and you don’t want to have the prettiest door stop in neighborhood. <a class="footnote-backref" href="#fnref:refx_223423" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:refx_27897923">
<p>Note this assumes English is set as your primary language in the System Preferences -> Language & Region. <a class="footnote-backref" href="#fnref:refx_27897923" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Did Apple miss the mark with iPad Air?2013-10-23T22:03:15-05:002013-10-23T22:03:15-05:00Jason Verlytag:mygeekdaddy.net,2013-10-23:/2013/10/23/did-apple-miss-the-mark-with-ipad-air/<p>I’ve been working<a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> on an iPad 2 for a little over 2 years now. As the iPad 3 and iPad 4 were announced, I saw each iteration improve, but never enough for me to plunk down my credit card. Just like before, the iPad Air is a little …</p><p>I’ve been working<a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> on an iPad 2 for a little over 2 years now. As the iPad 3 and iPad 4 were announced, I saw each iteration improve, but never enough for me to plunk down my credit card. Just like before, the iPad Air is a little better than the iPad 4, not leaps and bounds better, but better. And there’s the rub, the iPad Air is better than the iPad 4, but did Apple really do enough with this realease? Here are some things I think Apple missed with the iPad Air.</p>
<ul>
<li>Camera: As much as the tech community snickers at people taking pictures with their iPad, if it’s the only camera you got, then it’s better than nothing. I’ve captured plenty of family moments with my iPad because it’s what I had with me. The iPad Air is using the same 5MP camera as the iPad 3. Apple could have easily bumped this to an 8MP camera, like the one currently used on the iPhone 4s, and made their <a href="http://www.apple.com/ipad-air/videos/#video-air">iPad Air montage</a> a little more believable.</li>
<li>Touch ID: With the release of the iPhone 5s, it seemed a natural fit for Apple’s other flagship iOS device to have Touch ID. Security discussions aside, using Touch ID to unlock my phone is great. With one hand I can get into my phone, get to most of my common tasks, and then put it back into my pocket. Having Touch ID missing on the iPad Air feels like a gap in the evolution Apples has set for iOS devices. It also leaves a big question mark on how soon we’ll see a mid-cycle update to the iPad Air line.<a href="#fn:2" id="fnref:2" title="see footnote" class="footnote">[2]</a></li>
<li>Storage: As more and more people are relying on the <a href="http://www.macstories.net/stories/automating-ios-how-pythonista-changed-my-workflow/">iPad as their primary device</a>,<a href="#fn:3" id="fnref:3" title="see footnote" class="footnote">[3]</a> storage is becoming a premium on a full size iPad, even at 128GB. Not seeing a bump in storage seemed like the biggest miss of all. Dropbox and iCloud are heavy hitters in my day to day workflow, but sometimes the on device storage limits can be a real deal breaker when trying to get things done. Even Steve Wozniak <a href="http://www.cultofmac.com/250911/woz-is-unimpressed-by-apples-new-ipads">stated his disappointment</a> on Apple not increacing the storage capacity. If the Touch ID doesn’t cause a mid-cycle refresh, expanding the on device storage might.</li>
</ul>
<p>Apple has always done magical math about their product designs against the profit margins they’ll garner.<a href="#fn:4" id="fnref:4" title="see footnote" class="footnote">[4]</a> This makes me wonder how soon these three points will be addressed by Apple? This fall I made the jump to an iPhone 5s from my previous iPhone 4. Why? I had finally seen enough evolution in the hardware specs to justify the upgrade. So beyond the form factor update, is there really enough to make the typical consumer excited about this upgrade? Or do we have to wait for the the iPad Air 2 to see some new innovation in the iPad line?</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>I mean I use my iPad for writing, creating, task management… I use it to get work done. Ok, maybe some Angry Birds too. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:2">
<p>My guess… before WWDC 2014. <a href="#fnref:2" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:3">
<p>Just ask Federico (<a href="http://twitter.com/viticci">@viticci</a>) - <a href="http://www.macstories.net/stories/automating-ios-how-pythonista-changed-my-workflow/">Pythonista</a> & <a href="http://www.macstories.net/stories/editorial-for-ipad-review/">Editorial</a>. <a href="#fnref:3" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:4">
<p>Hence the reason why the iPad 2 still kicking it on the product line up and the iPad 4 was put to pasture. <a href="#fnref:4" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol>
</div>Mac Word 2011 User Guide2013-10-22T09:27:02-05:002013-10-22T09:27:02-05:00Jason Verlytag:mygeekdaddy.net,2013-10-22:/2013/10/22/mac-word-2011-user-guide/<p>Sometimes the most useful thing you’ll find comes from a random Google search. I was looking for a way to reset the total pages for a section in Mac Word 2011 and found this:</p>
<figure><a href="http://share.mygeekdaddy.me/umich_word_2011_howto.png"><img src="http://share.mygeekdaddy.me/umich_word_2011_howto.png" title="" id="" style="width:500px;" class="aligncenter size-full" /></img></a></figure>
<p>Turns out universities do a better job explaining how to use Mac Word 2011 than …</p><p>Sometimes the most useful thing you’ll find comes from a random Google search. I was looking for a way to reset the total pages for a section in Mac Word 2011 and found this:</p>
<figure><a href="http://share.mygeekdaddy.me/umich_word_2011_howto.png"><img src="http://share.mygeekdaddy.me/umich_word_2011_howto.png" title="" id="" style="width:500px;" class="aligncenter size-full" /></img></a></figure>
<p>Turns out universities do a better job explaining how to use Mac Word 2011 than Microsoft does. Full PDF can be found here: <a href="http://www.lib.umich.edu/files/services/exploratory/pdfs/wordfordissmac2011.pdf">U of Mich Word 2011 Guide</a>.</p>How to fix 1Password Dropbox syncing2013-10-19T11:35:30-05:002013-10-19T11:35:30-05:00Jason Verlytag:mygeekdaddy.net,2013-10-19:/2013/10/19/how-to-fix-1password-dropbox-syncing/<p>All I wanted to do was read Hawkeye. </p>
<p>It was such a simple task for a Friday night, but my Marvel app barked that it needed my new password. So I fired up 1Password to get the new password and realized it was the old one. I checked another device …</p><p>All I wanted to do was read Hawkeye. </p>
<p>It was such a simple task for a Friday night, but my Marvel app barked that it needed my new password. So I fired up 1Password to get the new password and realized it was the old one. I checked another device and it had the new password, but was missing a new account I had entered earlier in the day. I went back to my iPad and it didn't have the new account either. </p>
<p>Holy $@#%! </p>
<p>After calming down, I did a quick search and started <a href="http://discussions.agilebits.com/discussion/16408/dropbox-sync-not-working/p3#Form_Comment">scanning the 1Password forums</a>. I found some of the needed steps in post #63, but they didn't quite work for me. So here's how I fixed 1Password syncing.</p>
<ol>
<li>I had 5 devices I needed to correct (3 OS X and 2 iOS) all on <strong>version 4.x</strong> of 1Password. In any event, scan your devices for what appears to be the best version of your 1Password keychain<sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> on an OS X device and take it offline. Dropbox management isn't on par on iOS as it is on OS X, so the following steps are easier from a Mac. </li>
<li>Set syncing of the keychain of your good copy to a local folder so 1Password is sync'd locally and ignores the Dropbox copy. You want to enable syncing so you have an easily locate a copy of your keychain. </li>
<li>Open Dropbox and create a new secure note in the good copy as a test to prove that syncing is working later.</li>
<li>On all of your other devices, open up 1Password and disable syncing. Do not enable local syncing either. </li>
<li>Turn off wifi/network access for all of your devices.<br></li>
<li>Go back to the OS X device that has the good copy of your keychain and do the following:
<ul>
<li>Make sure wifi/network access is on.</li>
<li>Open your Dropbox folder and delete the <code>1Password.agilekeychain</code> in the Dropbox root folder or any other folder you may have used, e.g. \Apps\1Password or something else. </li>
<li>Create a <code>1Password</code> folder in the root of your Dropbox folder.</li>
<li>Open 1Password and set the syncing back to Dropbox. 1Password will recognize the new folder in Dropbox and run home to mommy and put the keychain in there. </li>
</ul></li>
<li>On an iOS device:
<ul>
<li>Make sure wifi/cellular is still turned off. </li>
<li>Delete the 1Password app by holding down on the icon until you get the 'x' to remove it. </li>
<li>Turn on wifi/cellular service to the device. </li>
<li>Open the iOS App Store app and download 1Password again. </li>
<li>Open 1Password and set it up again with Dropbox syncing. </li>
<li>Again, 1Password will recognize the <code>1Password</code> folder and default to picking up the keychain there. </li>
<li>Open 1Password and the note you previously entered will be there. </li>
<li>Repeat same steps on any other iOS device(s).</li>
</ul></li>
<li>On your other OS X device(s):
<ul>
<li>DO NOT use the 1Password 3 uninstall utility.<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup></li>
<li>Make sure wifi/network access is still off on OS X device. </li>
<li>Make sure 1Password is closed. </li>
<li>From the first OS X device, use the following steps to reset 1Password: <a href="http://learn.agilebits.com/1Password4/Mac/en/KB/start-over.html">Agilebits 1Password Reset</a>.</li>
<li>Enable wifi/network access. </li>
<li>Open 1Password and set it up with Dropbox syncing. </li>
<li>1Password again will find the <code>1Password</code> folder and sync with that keychain. </li>
<li>Open 1Password and the note you previously entered will be there. </li>
<li>Repeat the same steps for any other OS X device(s). </li>
</ul></li>
<li>At this point all of your devices will be in sync. </li>
<li>Enter a new test note on one of the other devices to verify syncing is working. </li>
</ol>
<p>I've been running this way for most of the morning and have not had any syncing discrepancies.</p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
<p>The 1Password keychain is the special file that holds all of your password information. Ususally listed as '1Password.agilekeychain'. <a href="#fnref1" rev="footnote">↩</a></p>
</li>
<li id="fn2">
<p>Using that utility will open a world of hurt I won't try to fix. <a href="#fnref2" rev="footnote">↩</a></p>
</li>
</ol>
</div>The true effect of Reactive Maintenance2013-10-11T10:16:55-05:002013-10-11T10:16:55-05:00Jason Verlytag:mygeekdaddy.net,2013-10-11:/2013/10/11/the-true-effect-of-reactive-maintenance/<p>The Maximo Manufacturing User’s Group wrapped up their October meeting last week. I’ve been spending the last couple of days wrapping my head around some of the key discussion topics the group had. The biggest one I’ve been thinking about is the effect reactive maintenance has on …</p><p>The Maximo Manufacturing User’s Group wrapped up their October meeting last week. I’ve been spending the last couple of days wrapping my head around some of the key discussion topics the group had. The biggest one I’ve been thinking about is the effect reactive maintenance has on a crew’s true availability. The general statement made in the discussion was:</p>
<blockquote>
<p>You need to recognize that reactive maintenance takes away from the real availability of your crew.<a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a></p>
</blockquote>
<p>Statements like this are what I call a BFOTO.<a href="#fn:2" id="fnref:2" title="see footnote" class="footnote">[2]</a> Think about. Reactive maintenance, by its own definition, are maintenance activities that are being accomplished in reaction to a set of unplanned/unscheduled events. </p>
<!--more-->
<p>Two popular definitions of reactive maintenance and reactive work are:</p>
<blockquote>
<p><strong>Reactive Maintenance:</strong> Maintenance repair work done as an immediate response to failure events normally without planing, always unscheduled. Synonymous with <em>breakdown</em> and <em>emergency maintenance</em>. <a href="#fn:3" id="fnref:3" title="see footnote" class="footnote">[3]</a></p>
<p><strong>Reactive Work:</strong> Maintenance work that breaks into the weekly schedule, including emergency work (to correct safety concerns, immediate hazars, etc.) <a href="#fn:3" title="see footnote" class="footnote">[3]</a></p>
</blockquote>
<p>Part of the dilema most maintenance organizations get into is what gets defined as <em>emergency work</em>. </p>
<blockquote>
<p><strong>Emergency Maintence Task:</strong> A maintenance task carried out in order to avert an immediate safety or environmental hazard, or to correct a failure. Also emergency repairs or emergency work. <a href="#fn:4" id="fnref:4" title="see footnote" class="footnote">[4]</a></p>
</blockquote>
<p>Here’s a more ‘real world’ definition of <em>emergency work</em>:</p>
<blockquote>
<p><strong>Emergency Maintence Task:</strong> A maintenance task carried out to keep my boss’s butt out of a sling and prevent me from getting yelled at by the Plant Manager. <a href="#fn:5" id="fnref:5" title="see footnote" class="footnote">[5]</a></p>
</blockquote>
<p>Taking these definitions aside, almost anyone in Maintenance wants to do the right thing and keep the plant running. So when new requests come into to address an foreseen issue in the plant, and the organization doesn’t have a solid planning/scheduling process in place, jobs like these get done as soon as Maintenance is notified. The problem is reactive work like this is interrupting the scheduled work that was already in place for the week. </p>
<p>Here’s a few examples of the impact I’m talking about:</p>
<ul>
<li>A facility has 400 work orders scheduled for the current work week. During the course of the week 100 new requests are made, but only 20 of those requests were acted upon during the current work week. The crew should be considered 5% reactive.</li>
<li>A facility has 400 work orders scheduled for the current work week. During the course of the week 100 new requests are made and all 100 requests are acted upon. The crew should be considered 25% reactive. <a href="#fn:6" id="fnref:6" title="see footnote" class="footnote">[6]</a></li>
<li>A facility has 400 work orders scheduled for the current work week. During the course of the week 100 new requests are made and all 100 requests are acted upon. However, because of the 100 new requests were completed, 75 of the originally scheduled jobs didn’t get done. The crew should now be considered 30% reactive.</li>
</ul>
<p>So how do we measure “reactive maintneance”? The basic equation I’ve been working with is this:</p>
<pre><code># of WO's created during work week / # of originally scheduled WO's
</code></pre>
<p>The general idea is to look at all the work created and acted upon during the current work week over the work that was originally scheduled to be completed that work week. A basic SQL query could look like this: <a href="#fn:7" id="fnref:7" title="see footnote" class="footnote">[7]</a></p>
<pre><code>select (
select count(wonum)*1.0 from workorder where siteid = 'BEDFORD' and istask=0 and reportdate > dateadd( week, datediff( week, 0, getdate() ), -2 ) and workorder.targstartdate >= dateadd( week, datediff( week, 0, getdate() ), -2 ) and workorder.targstartdate < dateadd( week, datediff( week, 0, getdate() ), +5 )
) / (
select count(wonum) from workorder where siteid = 'BEDFORD' and istask=0 and reportdate < dateadd( week, datediff( week, 0, getdate() ), -2 ) and workorder.targstartdate >= dateadd( week, datediff( week, 0, getdate() ), -2 ) and workorder.targstartdate < dateadd( week, datediff( week, 0, getdate() ), +5 )
) as reactivework from dummy_table
</code></pre>
<p>There are several key parts for the query to work:</p>
<ol>
<li>The <em>workorder.targstartdate</em> field, or possibly the <em>workorder.schedstartdate</em> field, needs to be actively used in your work order management process. If we aren’t stating when a job will start, we can’t compare it against any other work.</li>
<li>The query uses the code <code>dateadd( week, datediff( week, 0, getdate() ), –2 )</code> to get the first day of the work week. This allows the query to be re-used and not have a fixed date for the beginning of the work week.</li>
<li>The query is based on the assumption that a plant’s work is scheduled one week in advance. In the denominator of the query, the query will omit any work order that was reported during the current work week, regardless of when the work is targeted/scheduled to start.</li>
</ol>
<p>Several other parameters could be added to futher refine the calculation - e.g. exclude any ‘W’ status work orders since they aren’t actively being worked on. </p>
<p>So when we have 20%–30%–40% of the work we accomplished in last 7 days created within those 7 days, we need to recognize that part of our crew’s work time is no longer truly available to be scheduled for work because one of two things: the work won’t get done (missed) or the work gets deferred (rescheduled). </p>
<p>In either case we didn’t get done what we needed to get done. </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Hat tip to Dave Reiber on this discussion thread in the meeting. Most of what I wrote about came from his discussion points. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:2">
<p>Blinding flash of the obvious. <a href="#fnref:2" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:3">
<p>Gulati, Kahn, Baldwin; <em>The Professional’s Guide to Maintenance and Reliability Terminology</em>(ReliabilityWeb.com 2010); 230. <a href="#fnref:3" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:4">
<p>Gulati, Kahn, Baldwin; <em>The Professional’s Guide to Maintenance and Reliability Terminology</em>(ReliabilityWeb.com 2010); 92. <a href="#fnref:4" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:5">
<p>You know that’s really how it’s defined. <a href="#fnref:5" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:6">
<p>This is also an indication that the crew was either underscheduled or significant overtime was expended during the work week. <a href="#fnref:6" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:7">Review of Sony DCS-QX1002013-10-09T23:03:37-05:002013-10-09T23:03:37-05:00Jason Verlytag:mygeekdaddy.net,2013-10-09:/2013/10/09/review-of-sony-dcs-qx100/<p>There’s been plenty of buzz lately about smartphones and the shift to using it as your primary camera. I’ve been using a DSLR as my primary camera, a Canon T2i, for some time now. When Sony announced the idea of introducing a lens, that could be paired to …</p><p>There’s been plenty of buzz lately about smartphones and the shift to using it as your primary camera. I’ve been using a DSLR as my primary camera, a Canon T2i, for some time now. When Sony announced the idea of introducing a lens, that could be paired to a smartphone, I was intrigued with the idea that it could replace my DSLR. </p>
<figure><a href="http://share.mygeekdaddy.me/IMG_0538_2013-10-08.jpg"><img src="http://share.mygeekdaddy.me/IMG_0538_2013-10-08.jpg" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<p>Sony has released two versions of this concept, the DSC-QX10 and the DSC-QX100 (pictured above). The idea is to attach a DSLR level lens and sensor to a smartphone. Thus giving a person a smaller footprint than a DSLR, but having the same image quality. I took the QX100 through some field testing to see if the concept lives up to the real world. </p>
<h4>Camera contents</h4>
<p>The contents of the camera package were pretty straight forward. The QX100 included:</p>
<ul>
<li>DSC-QX100 camera</li>
<li>Camera battery</li>
<li>Charger</li>
<li>micro USB cord for charging and/or connecting to a PC.</li>
<li>Single leaf <a href="http://www.docs.sony.com/release/DSC-QX10_QX100_qs.pdf">user manual</a></li>
</ul>
<p>The QX100 includes a microSD/Memory Card slot to store captured images. You will need a card to capture and retrieve larger images. Without a microSD card, the QX100 will only capture and transfer over 2MP images. </p>
<h4>Connecting to smartphone</h4>
<p>Connecting the QX100 to my iPhone was pretty straight forward. The QX100 has its own wifi SSID and password. Simply turn on the QX100, enable the wifi on your smartphone, and enter the password. Once the wifi is connect, open the Sony PlayMemories app to sync the camera to your smartphone. </p>
<figure><a href="http://share.mygeekdaddy.me/IMG_3728_2013-10-08.jpg"><img src="http://share.mygeekdaddy.me/IMG_3728_2013-10-08.jpg" title="" id="" style="width:200px;" class="aligncenter size-full" /></img></a></figure>
<p>Once the app is open, you will get a live view from the QX100 on your smartphone’s screen. </p>
<p><figure><a href="http://share.mygeekdaddy.me/IMG_3543_2013-10-08.jpg"><img src="http://share.mygeekdaddy.me/IMG_3543_2013-10-08.jpg" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure></p>
<p>Once connected the camera can be operated from either the physical button on the camera body or the soft button on the smartphone screen. The QX100 can transfer a 2MP image after each shot or that can be turned off. Users can manually select images, full size images, to be pulled off the QX100 and saved to your smartphone. While the process was manual, it was very quick thanks to the internal wifi process. </p>
<p>I believe that a future version of the Sony PlayMemories app will allow this function to happen with full size images in the background with iOS 7. </p>
<h4>Camera functions</h4>
<p>The QX100 has a variety of settings that make it an attractive option over your smartphone camera. The unit has eight image settings: </p>
<figure><a href="http://share.mygeekdaddy.me/IMG_3761_2013-10-07.jpg"><img src="http://share.mygeekdaddy.me/IMG_3761_2013-10-07.jpg" title="" id="" style="width:225px;" class="aligncenter size-full" /></img></a></figure>
<p>The 3:2 ratio is the common DSLR ratio and was the default I used for most of my test pictures. Also note the UI of the app on the iPhone 5s, it is still iOS 6. Again, I think some nice improvements to the app could be coming with background functionality in iOS 7. </p>
<p>The camera has four camera function settings:</p>
<figure><a href="http://share.mygeekdaddy.me/IMG_3730_2013-10-07.jpg"><img src="http://share.mygeekdaddy.me/IMG_3730_2013-10-07.jpg" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<ul>
<li>Intelligent Auto: Auto adjust exposure and ISO to get the best picture.</li>
<li>Superior Auto: Same as Intelligent Auto, but the camera will take a series of images and then select the best one to be saved.</li>
<li>Program Auto: Similar to a DSLR set to P-mode.</li>
<li>Aperture Priority: Allows camera shooter to set the camera’s aperture and exposure.</li>
</ul>
<p>The PlayMemories app also allowed for some settings to be adjusted from the smartphone screen.</p>
<figure><a href="http://share.mygeekdaddy.me/IMG_3760_2013-10-08.jpg"><img src="http://share.mygeekdaddy.me/IMG_3760_2013-10-08.jpg" title="" id="" style="width:200px;" class="aligncenter size-full" /></img></a></figure>
<p>The lens itself has a variable focal length, depending on the image setting: <a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a></p>
<ul>
<li>28–100mm @ 3:2 image ratio</li>
<li>29–105mm @ 16:9 image ratio</li>
<li>29–105mm @ 4:3 image ratio</li>
<li>30–108mm @ 1:1 image ratio</li>
</ul>
<p>The lens has a variable minimal apeture range of f/1.8 (wide) to f/4.9 (tele). The lens seemed to fall off from f/1.8 to a smaller aperture fairly quickly when zooming out. I don’t have any tests to show the curve, but it did not seem to be linear. </p>
<h4>Operation</h4>
<p>The QX100 has three primary physical buttons - the power switch, image trigger and lens zoom.</p>
<figure><a href="http://share.mygeekdaddy.me/IMG_3715_2013-10-09.jpg"><img src="http://share.mygeekdaddy.me/IMG_3715_2013-10-09.jpg" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<figure><a href="http://share.mygeekdaddy.me/IMG_3718_2013-10-09.jpg"><img src="http://share.mygeekdaddy.me/IMG_3718_2013-10-09.jpg" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<p>Holding the QX–100 comfortably is similar to a DSLR, your left hand holds the lens and your right hand holds/controls your smartphone. </p>
<figure><a href="http://share.mygeekdaddy.me/IMG_3714_2013-10-09.jpg"><img src="http://share.mygeekdaddy.me/IMG_3714_2013-10-09.jpg" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<p>Getting comfortable with the QX100 never really happened. Notice where my fingers are (above pic) in relation to the buttons, they’re under my hand. A more functional way to hold the camera would be like this:</p>
<figure><a href="http://share.mygeekdaddy.me/IMG_3717_2013-10-07.jpg"><img src="http://share.mygeekdaddy.me/IMG_3717_2013-10-07.jpg" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<figure><a href="http://share.mygeekdaddy.me/IMG_3716_2013-10-09.jpg"><img src="http://share.mygeekdaddy.me/IMG_3716_2013-10-09.jpg" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<p>With this position I could control the zoom and take a picture with one hand, except now the photos would be portrait, not landscape. This isn’t a software function, it’s in the hardware due to the fixed orientation of the camera sensor in the QX100 body.</p>
<p>Taking pictures, hand position aside, was pretty straight forward. You use the screen on your smartphone to preview your shot and then push the button to take the picture. The image trigger had a soft press where you could go half way down on the button and get the QX100 to focus and adjust for exposure. This function is similar to any DSLR I’ve used before. </p>
<p>While taking pictures was relatively easy, the software would someitmes lose sync to my iPhone and look like this:</p>
<figure><a href="http://share.mygeekdaddy.me/IMG_3739_2013-10-07.jpg"><img src="http://share.mygeekdaddy.me/IMG_3739_2013-10-07.jpg" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>Time to change how we read ebooks2013-10-09T16:16:45-05:002013-10-09T16:16:45-05:00Jason Verlytag:mygeekdaddy.net,2013-10-09:/2013/10/09/time-to-change-how-we-read-ebooks/<p>It comes like clockwork each fall, the leaves change color, temperaures cool down, and tech companies release their new gadgets on the world.</p>
<p>Ahhhh… the smell of new devices in the fall. </p>
<p>This fall is turning out to be a bountiful harvest of new devices - Apple, Samsung, Google, Amazon, and …</p><p>It comes like clockwork each fall, the leaves change color, temperaures cool down, and tech companies release their new gadgets on the world.</p>
<p>Ahhhh… the smell of new devices in the fall. </p>
<p>This fall is turning out to be a bountiful harvest of new devices - Apple, Samsung, Google, Amazon, and Microsoft have all annouced new/updated devices to be released this season. So with the release of so many good content consumption devices, I believe it’s time they all take a page out Apple’s playbook <a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> and have their ebook readers make less of an effort of trying to have ebooks feel like we’re reading a physical book and focus more on the document consumption process. <a href="#fn:2" id="fnref:2" title="see footnote" class="footnote">[2]</a></p>
<p>One of the selling points all these companies will advertise this holiday season is how nice it will be to read an ebook on their device over every other device. And there’s the problem. They’re all stuck, trying to trick us into feeling like we’re reading a real book when we’re not. When I read a physical book, I have to turn the pages because that’s the medium it comes in. I could just as easily read <em>The Hobbit</em> off a giant scroll to experience one long continuous story. <a href="#fn:3" id="fnref:3" title="see footnote" class="footnote">[3]</a> Printed pages aren’t necessarily my choice, it’s just the medium publishers have given me to read (consume) the book. So why should an ebook have to be relegated to the same staunchy standards of yesteryear?</p>
<p>Ebook readers (or reading apps) should treat the book like one document, with the option to scroll through the book, like reading a <a href="http://www.macstories.net/stories/editorial-for-ipad-review/">really really long web post</a>. The document may have chapters, but for an ebook that’s an easy step in the document setup. I don’t want to turn a page in my electronic documents (ebook, PDF, etc) anymore. More often than you’d expect, a critical idea or plot point comes at the turn of a page. Scrolling through a document just feels more continuous and isn’t that what the tech companies what us to do - feel more connected to the content we have on the device?</p>
<p>The other aspect of ebooks vs physical books is the ability to place notes in the margins or highlight specfic sections. Highlights, or notes, in a book should flow together based on the topic, not when it was taken. If I read a really good book again, I want see any new ideas tied to discoveries or thoughts I’ve already had on a similar subject. While most ebook readers allow these tasks, the management of these marks still appears to be an afterthought. For example, Amazon’s Kindle Reader offers highlighting and note taking, but keeps the notes in the order they are written, not in order of the book. Seeing my new note regarding a passage in Chapter 2, next to my last note in Chapter 34, does me no good - there is no continuity in the thoughts being captured or comments being written. In this case break the rule about being less like a book and be more like a book - sort notes in the order they appear. In a physical book, if I highlight a passage on page 120, and then something new clicks on page 121, becuse I’m reading the book a second time, both passages will now stand out and be connected on a subconscious level. Scattered notes in ebook readers can’t make that same connection. Maybe not everyone wants to see their notes this way, but at least have the option to do so.</p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Even Apple could stand to take a look at their own notes again. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:2">
<p>I had a whole rant on skeuomorphism in here and then the editor in me woke up. <a href="#fnref:2" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:3">
<p>Part of me thinks that would be a great way to read a story like <em>The Hobbit</em>. <a href="#fnref:3" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol>
</div>Thoughts on iPhone 5c impact2013-09-25T08:50:58-05:002013-09-25T08:50:58-05:00Jason Verlytag:mygeekdaddy.net,2013-09-25:/2013/09/25/thoughts-on-iphone-5c-impact/<p>Last week Apple released iOS 7 and a pair of new iPhones, the iPhone 5c and the iPhone 5s. As impressive as the iPhone 5s is, the release of the iPhone 5c and the up coming refresh of Apple’s iPad line is what has been on my mind. </p>
<p>Why …</p><p>Last week Apple released iOS 7 and a pair of new iPhones, the iPhone 5c and the iPhone 5s. As impressive as the iPhone 5s is, the release of the iPhone 5c and the up coming refresh of Apple’s iPad line is what has been on my mind. </p>
<p>Why? </p>
<p>With the release of the iPhone 5c, Apple has finally brought parity to it’s primary product lines. When you talk to the average consumer, <a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> they will relate to Apple’s products in general terms - iPod, iPhone, Mac. But when you start talking to those who are a little more tech savvy, you start seeing a stratification of similar product lines - iPhone 5s vs iPhone 5c or Mac Book Pro vs Mac Book Air. People in the second group start differentiating the benefits of Apple’s products based power vs weight, screen resolution, form factor, etc. So now there are two groups of buyers Apple has to contend with. Like any successful company, Apple is giving their buyers a choice, but a choice that will ideally still keep the buyer under Apple’s wing. </p>
<p>And this is where I believe Apple has made the right choice bringing the iPhone 5c to the mix. Apple now has a device for the general consumer and professional/power user in every major product category they currently offer. Here’s a breakdown comparison.</p>
<table>
<colgroup>
<col style="text-align:center;"/>
<col style="text-align:center;"/>
<col style="text-align:center;"/>
</colgroup>
<thead>
<tr>
<th style="text-align:center;">Device</th>
<th style="text-align:center;">Prosumer</th>
<th style="text-align:center;">Consumer</th>
</tr>
</thead>
<tbody>
<tr>
<td style="text-align:center;">Desktop</td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/MacPro_PFH_PRINT_130607_HERO_2013-09-24.jpg"><img src="http://share.mygeekdaddy.me/MacPro_PFH_PRINT_130607_HERO_2013-09-24.jpg" alt="Mac Pro" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p>Mac Pro</p></td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/imac_2013-09-24.jpg"><img src="http://share.mygeekdaddy.me/imac_2013-09-24.jpg" title="iMac" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p>iMac</p></td>
</tr>
<tr>
<td style="text-align:center;">Laptop</td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/mbp_2013-09-24.jpg"><img src="http://share.mygeekdaddy.me/mbp_2013-09-24.jpg" title="Mac Book Pro" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p>Mac Book Pro</p></td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/mba_2013-09-24.jpg"><img src="http://share.mygeekdaddy.me/mba_2013-09-24.jpg" title="Mac Book Air" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p>Mac Book Air</p></td>
</tr>
<tr>
<td style="text-align:center;">Tablet</td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/compare_hero_ipad_retina_2013-09-24.jpg"><img src="http://share.mygeekdaddy.me/compare_hero_ipad_retina_2013-09-24.jpg" title="iPad Retina" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p>iPad Retina</p></td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/rfb-2012ipadmini-4G-black_2013-09-24.jpg"><img src="http://share.mygeekdaddy.me/rfb-2012ipadmini-4G-black_2013-09-24.jpg" title="iPad Mini" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p> iPad Mini</p></td>
</tr>
<tr>
<td style="text-align:center;">Phone</td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/iphone5s-hero-xl-2013_2013-09-24.png"><img src="http://share.mygeekdaddy.me/iphone5s-hero-xl-2013_2013-09-24.png" title="iPhone 5s" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p>iPhone 5s</p></td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/iphone5c-selection-hero-2013_2013-09-24.png"><img src="http://share.mygeekdaddy.me/iphone5c-selection-hero-2013_2013-09-24.png" title="iPhone 5c" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p>iPhone 5c<p></td>
</tr>
<tr>
<td style="text-align:center;">Media Player</td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/hero_ipodtouch10102012_2013-09-25.png"><img src="http://share.mygeekdaddy.me/hero_ipodtouch10102012_2013-09-25.png" title="iPod Touch" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p>iPod Touch</p></td>
<td style="text-align:center;"><figure><a href="http://share.mygeekdaddy.me/iPod_nano_6Up_Overlap_EarPod_PRINT_130906_HERO_2013-09-25.jpg"><img src="http://share.mygeekdaddy.me/iPod_nano_6Up_Overlap_EarPod_PRINT_130906_HERO_2013-09-25.jpg" title="iPod Nano" id="" style="height:200px;" class="aligncenter size-full" /></img></a></figure><p>iPod Nano</p></td>
</tr>
</tbody>
</table>
<p>Yes, you can do Photoshop on a Mac Book Air and Editorial works just fine on the iPad mini, but looking at the features and capabilities of a prosumer vs consumer device, one can get a feel of how Apple is starting to offer a choice in each product line. It’s easy to see the differentiation in the product lines and by having a choice is a win-win for Apple. What will be interesting to see is how Apple intends to keep this differentiation going in the next iPad release. </p>
<p></br>
Got any thoughts on this? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a> to continue the discussion.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>The average person is not reading this blog. Sad, but true. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol>
</div>Managing my digital buckets2013-09-19T12:30:21-05:002013-09-19T12:30:21-05:00Jason Verlytag:mygeekdaddy.net,2013-09-19:/2013/09/19/managing-my-digital-buckets/<p>Sometimes the obvious isn't so obvious in our day to day routines. When you scan the headlines of most productivity sites you will see a common mantra:</p>
<blockquote>
<p>Do more with less. </p>
</blockquote>
<p>There's a lot to be said about that simple phrase and it's something I've finally taken to heart. One …</p><p>Sometimes the obvious isn't so obvious in our day to day routines. When you scan the headlines of most productivity sites you will see a common mantra:</p>
<blockquote>
<p>Do more with less. </p>
</blockquote>
<p>There's a lot to be said about that simple phrase and it's something I've finally taken to heart. One of the down sides of being an early adopter is I can get sucked into a really cool new service and end up with a new bucket of information to manage. I now have buckets from all over the place - my primary email address, my back up email address, my .Mac/.Me/.iCloud email addresses <sup id="fnref:sdfadf"><a class="footnote-ref" href="#fn:sdfadf">1</a></sup>, an original Hotmail email address and the list goes on. </p>
<p>So in an attempt to regain my digitial sanity I finally made some changes on how I manage these buckets. On my everyday devices I moved to <strong>one</strong> email account and <strong>one</strong> calendar and made sure any notifications or account updates (e.g. web hosting alerts, online billing notices, etc) are all directed to this email account. Other notices that I receive (e.g. iTunes purchase notices, non critical mailing lists<sup id="fnref:234sdf"><a class="footnote-ref" href="#fn:234sdf">2</a></sup>, etc.) are shunted to a secondary email account. The secondary email account and all these other buckets are then reviewed only once a week during my weekly review.</p>
<p>Part of my sanity check also included moving away from Apple's default apps in OS X to dedicated apps for specific buckets. My current choices have been Outlook for email and Fantastical for my calendar. I know a few OS X users may have a disdain for Outlook, but it's what I need to use at work. So now any scripts or automation methods I develop/use with Outlook at work can be applied at home, or vice versa. Fantastical was an easy choice because entering new events is the easiest in Fantastical over any of the other tools I currently own. </p>
<p>Now day to day I have one email address, one calender, and one phone number. I can honestly say I feel a lot less flustered about my digitial buckets and have been much more engaged when something new does drop in my lap. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:sdfadf">
<p>A mess I hope Apple fixes soon. <a class="footnote-backref" href="#fnref:sdfadf" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:234sdf">
<p>Pushing non-critical mailing lists to another email address should be a good indicator to unsubscribe from that list. <a class="footnote-backref" href="#fnref:234sdf" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Thoughts on OmniFocus 2 for iPhone2013-09-18T12:19:06-05:002013-09-18T12:19:06-05:00Jason Verlytag:mygeekdaddy.net,2013-09-18:/2013/09/18/thoughts-on-omnifocus-2-for-iphone/<p><a href="http://www.omnigroup.com/about/">The Omni Group</a> have released an updated version of OmniFocus, OmniFocus 2 for iPhone. I’ve only started to use the updated version, so this won’t be a full “review” of the update. David Sparks DOES have a nice <a href="http://macsparky.com/blog/2013/9/omnifocus-for-iphone-20">review of OmniFocus 2 for iPhone</a>. David addresses comments I …</p><p><a href="http://www.omnigroup.com/about/">The Omni Group</a> have released an updated version of OmniFocus, OmniFocus 2 for iPhone. I’ve only started to use the updated version, so this won’t be a full “review” of the update. David Sparks DOES have a nice <a href="http://macsparky.com/blog/2013/9/omnifocus-for-iphone-20">review of OmniFocus 2 for iPhone</a>. David addresses comments I’ve seen on Twitter regarding OmniFocus 2 for iPhone pricing. <a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a></p>
<blockquote>
<p>I’m pretty sure I paid $25 for OmniFocus for iPhone version 1. That was five years ago. Over the past five years I’ve used the heck out of this app (which ended up costing me $5 per year to own). For the price of one cup of coffee per year I’m more productive and kicking ass with this application.</p>
</blockquote>
<p>I look at software from companies like The Omni Group as a tool not a toy. I invest in the work they do, so I can be more effective in the work I do. Paying $5 a year to have a leg up on your peers should be the easiest decision you make today. </p>
<p><a href="https://itunes.apple.com/us/app/omnifocus-2-for-iphone/id690305341?mt=8">OmniFocus 2 for iPhone</a> is available now in iTunes store for $19.99.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>And the fact the iTunes App Store has no ability to do upgrade pricing. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol>
</div>Fix Little Snitch and Mavericks DP 8/GM2013-09-16T22:13:47-05:002013-09-16T22:13:47-05:00Jason Verlytag:mygeekdaddy.net,2013-09-16:/2013/09/16/fix-little-snitch-and-mavericks-dp-8gm/<blockquote><em>Update 2014-03-19:</em> Little Snitch v3.x addresses the issues discussed below. If you're on v3.x and still having problems, I recommend contacting Ob Dev support.</blockquote>
<p>Apple released an update to OS X Mavericks Developer Preview (DP 8) today and it appears to break Little Snitch. After restarting OS X …</p><blockquote><em>Update 2014-03-19:</em> Little Snitch v3.x addresses the issues discussed below. If you're on v3.x and still having problems, I recommend contacting Ob Dev support.</blockquote>
<p>Apple released an update to OS X Mavericks Developer Preview (DP 8) today and it appears to break Little Snitch. After restarting OS X DP 8 I got the following message:</p>
<figure><a href="http://share.mygeekdaddy.net/Initial_LS_Error_Msg_2013-09-16.png"><img src="http://share.mygeekdaddy.net/Initial_LS_Error_Msg_2013-09-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>I open Little Snitch and LS revealed a little more detail.</p>
<figure><a href="http://share.mygeekdaddy.net/LS_Version_Mismatch_2013-09-16_2013-09-16.png"><img src="http://share.mygeekdaddy.net/LS_Version_Mismatch_2013-09-16_2013-09-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Finally, looking at the log files I found the following:</p>
<div class="highlight"><pre><span></span><code><span class="mi">9</span><span class="o">/</span><span class="mi">16</span><span class="o">/</span><span class="mi">13</span><span class="w"> </span><span class="mi">7</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mf">10.000</span><span class="w"> </span><span class="n">PM</span><span class="w"> </span><span class="n">kernel</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span><span class="w"> </span><span class="n">Kext</span><span class="w"> </span><span class="n">at</span><span class="o">.</span><span class="n">obdev</span><span class="o">.</span><span class="n">nke</span><span class="o">.</span><span class="n">LittleSnitch</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">exclude</span><span class="w"> </span><span class="n">list</span><span class="p">,</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">loadable</span><span class="w"></span>
<span class="mi">9</span><span class="o">/</span><span class="mi">16</span><span class="o">/</span><span class="mi">13</span><span class="w"> </span><span class="mi">7</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mf">10.000</span><span class="w"> </span><span class="n">PM</span><span class="w"> </span><span class="n">kernel</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span><span class="w"> </span><span class="n">Can</span><span class="s1">'t load kext at.obdev.nke.LittleSnitch - not found.</span>
<span class="mi">9</span><span class="o">/</span><span class="mi">16</span><span class="o">/</span><span class="mi">13</span><span class="w"> </span><span class="mi">7</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mf">10.744</span><span class="w"> </span><span class="n">PM</span><span class="w"> </span><span class="n">com</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">kextd</span><span class="p">[</span><span class="mi">12</span><span class="p">]:</span><span class="w"> </span><span class="n">Failed</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="nb">load</span><span class="w"> </span><span class="o">/</span><span class="n">Library</span><span class="o">/</span><span class="n">Extensions</span><span class="o">/</span><span class="n">LittleSnitch</span><span class="o">.</span><span class="n">kext</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="n">libkern</span><span class="o">/</span><span class="n">common</span><span class="p">)</span><span class="w"> </span><span class="n">general</span><span class="o">/</span><span class="n">unspecified</span><span class="w"> </span><span class="n">error</span><span class="o">.</span><span class="w"></span>
<span class="mi">9</span><span class="o">/</span><span class="mi">16</span><span class="o">/</span><span class="mi">13</span><span class="w"> </span><span class="mi">7</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mf">10.745</span><span class="w"> </span><span class="n">PM</span><span class="w"> </span><span class="n">com</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">kextd</span><span class="p">[</span><span class="mi">12</span><span class="p">]:</span><span class="w"> </span><span class="n">Load</span><span class="w"> </span><span class="n">at</span><span class="o">.</span><span class="n">obdev</span><span class="o">.</span><span class="n">nke</span><span class="o">.</span><span class="n">LittleSnitch</span><span class="w"> </span><span class="n">failed</span><span class="p">;</span><span class="w"> </span><span class="n">removing</span><span class="w"> </span><span class="n">personalities</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">kernel</span><span class="o">.</span><span class="w"></span>
<span class="mi">9</span><span class="o">/</span><span class="mi">16</span><span class="o">/</span><span class="mi">13</span><span class="w"> </span><span class="mi">7</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mf">11.000</span><span class="w"> </span><span class="n">PM</span><span class="w"> </span><span class="n">kernel</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span><span class="w"> </span><span class="n">Kext</span><span class="w"> </span><span class="n">at</span><span class="o">.</span><span class="n">obdev</span><span class="o">.</span><span class="n">nke</span><span class="o">.</span><span class="n">LittleSnitch</span><span class="w"> </span><span class="k">is</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="n">exclude</span><span class="w"> </span><span class="n">list</span><span class="p">,</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="n">loadable</span><span class="w"></span>
<span class="mi">9</span><span class="o">/</span><span class="mi">16</span><span class="o">/</span><span class="mi">13</span><span class="w"> </span><span class="mi">7</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mf">11.000</span><span class="w"> </span><span class="n">PM</span><span class="w"> </span><span class="n">kernel</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span><span class="w"> </span><span class="n">Can</span><span class="s1">'t load kext at.obdev.nke.LittleSnitch - not found.</span>
<span class="mi">9</span><span class="o">/</span><span class="mi">16</span><span class="o">/</span><span class="mi">13</span><span class="w"> </span><span class="mi">7</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mf">11.222</span><span class="w"> </span><span class="n">PM</span><span class="w"> </span><span class="n">com</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">kextd</span><span class="p">[</span><span class="mi">12</span><span class="p">]:</span><span class="w"> </span><span class="n">Failed</span><span class="w"> </span><span class="n">to</span><span class="w"> </span><span class="nb">load</span><span class="w"> </span><span class="o">/</span><span class="n">Library</span><span class="o">/</span><span class="n">Extensions</span><span class="o">/</span><span class="n">LittleSnitch</span><span class="o">.</span><span class="n">kext</span><span class="w"> </span><span class="o">-</span><span class="w"> </span><span class="p">(</span><span class="n">libkern</span><span class="o">/</span><span class="n">common</span><span class="p">)</span><span class="w"> </span><span class="n">general</span><span class="o">/</span><span class="n">unspecified</span><span class="w"> </span><span class="n">error</span><span class="o">.</span><span class="w"></span>
<span class="mi">9</span><span class="o">/</span><span class="mi">16</span><span class="o">/</span><span class="mi">13</span><span class="w"> </span><span class="mi">7</span><span class="p">:</span><span class="mi">50</span><span class="p">:</span><span class="mf">11.223</span><span class="w"> </span><span class="n">PM</span><span class="w"> </span><span class="n">com</span><span class="o">.</span><span class="n">apple</span><span class="o">.</span><span class="n">kextd</span><span class="p">[</span><span class="mi">12</span><span class="p">]:</span><span class="w"> </span><span class="n">Load</span><span class="w"> </span><span class="n">at</span><span class="o">.</span><span class="n">obdev</span><span class="o">.</span><span class="n">nke</span><span class="o">.</span><span class="n">LittleSnitch</span><span class="w"> </span><span class="n">failed</span><span class="p">;</span><span class="w"> </span><span class="n">removing</span><span class="w"> </span><span class="n">personalities</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">kernel</span><span class="o">.</span><span class="w"></span>
</code></pre></div>
<p>Apparently DP 8 is starting to lock down kernel extensions and Little Snitch got caught in the cross fire. I did a little googling and found the <a href="http://forums.obdev.at/viewtopic.php?f=1&t=8625">following on ObDev’s forum</a>:</p>
<blockquote><a href="http://forums.obdev.at#p25816">Re: LS nightly stops working in Mavericks Preview 8</a>
by <strong><a href="./memberlist.php?">udo</a></strong> » Tue Sep 17, 2013 2:27 am
I had the same problem after updating to Preview 8, looks like Apple is locking down OS X even more tightly now. However, they still allow us to edit the system config files, so if you’re feeling adventurous log on to the Terminal as root and go to /System/Library/Extensions/AppleKextExcludeList.kext/
…then open the Info.plist file and delete the entry pertaining to LittleSnitch. Restart the computer and LS should start up normally. Chances are you’ll have to do this after each system update from now on though.</blockquote>
<p>Yep, kernel extensions appear to be getting locked down in DP 8.</p>
<p>To fix Little Snitch, until ObDev releases an updated build, do the following steps: </p>
<ol>
<li>Open Finder and go to <code>/System/Library/Extensions/</code></li>
<li>Locate the <code>AppleKextExcludeList.kext</code> file and right click to <em>Show Package Contents</em>.</li>
<li>Locate the <code>Info.plist</code> file located in the <code>Contents</code> folder.</li>
<li>Open the <code>Info.plist</code> with an editor like BBEdit or Textastic. You may get warnings and requests for your passward because the file is locked. Go ahead and unlock the file to make the needed edits.</li>
<li>Locate the Little Snitch kernel extention in the <code>OSKextExcludeList</code> section and remove the highlighted lines shown below. </li>
</ol>
<figure><a href="http://share.mygeekdaddy.net/kext_files_to_modify_2013-09-16.png"><img src="http://share.mygeekdaddy.net/kext_files_to_modify_2013-09-16.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<ol>
<li>Save the file and restart your Mac.When you’re Mac restarts, Little Snitch will load without any complaints. Just like the forum thread stated, unless ObDev does an update to fix Little Snitch first, if another DP is released, you may have to do this again.</li>
</ol>
<hr>
<p><strong><em>UPDATE (2013-10-23)</em></strong>: With the final release of Mavericks on 2013-10-22, there still appears to be a cat and mouse game with OS X 10.9 and Little Snitch. The steps above are a good work around until another update from ObDev is released.</p>How to work with engineers2013-09-13T20:31:48-05:002013-09-13T20:31:48-05:00Jason Verlytag:mygeekdaddy.net,2013-09-13:/2013/09/13/how-to-work-with-engineers/<p>I ususally cringe a little bit when I hear the term ‘engineer’ applied to software design. <a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> But a recent article on <a href="https://medium.com">Medium</a>, <a href="https://medium.com/the-year-of-the-looking-glass/a3163ff1eced">How to Work with Engineers</a> could be equally applied to any engineering job. </p>
<p>One of the frustrating things I’ve worked through on projects is getting the …</p><p>I ususally cringe a little bit when I hear the term ‘engineer’ applied to software design. <a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a> But a recent article on <a href="https://medium.com">Medium</a>, <a href="https://medium.com/the-year-of-the-looking-glass/a3163ff1eced">How to Work with Engineers</a> could be equally applied to any engineering job. </p>
<p>One of the frustrating things I’ve worked through on projects is getting the customer to really understand what their asking for. I’ve sat in design review meetings, after the customer had requested that I make an absolute bullet proof process, only to sit through their shock and awe response to the price tag. This article could literally be turned into a checklist of what an engineer should discuss with customers in the project scoping meeting. </p>
<p>In the end, there is one line that sums it all up.</p>
<blockquote>
<p>All this is to say: engineers are the shit.</p>
</blockquote>
<p>Yes… yes we are. </p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Dr. Drang will back me up on this. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol>
</div>Letting Brett do all the heavy lifting2013-09-11T21:59:00-05:002013-09-11T21:59:00-05:00Jason Verlytag:mygeekdaddy.net,2013-09-11:/2013/09/11/letting-brett-do-all-the-heavy-lifting/<p><em>Note 2014-11-14:</em> This post referenced a move from a previously used subdomain to my <em>MyGeekDaddy.net</em> domain. Consider this historic reference only.</p>
<p>I’m in a transition phase where I’m starting to move from a <a href="http://theothersideof.mygeekdaddy.net">subdomain</a> on my site back to the primary domain. Part of the moving experience …</p><p><em>Note 2014-11-14:</em> This post referenced a move from a previously used subdomain to my <em>MyGeekDaddy.net</em> domain. Consider this historic reference only.</p>
<p>I’m in a transition phase where I’m starting to move from a <a href="http://theothersideof.mygeekdaddy.net">subdomain</a> on my site back to the primary domain. Part of the moving experience is trying to recreate older posts back into Markdown for archiving. I looked at several ways to make archiving the posts simple. Go figure Brett Terpstra (<a href="https://twitter.com/ttscoff">@ ttscoff</a>) has already made a tool to do this - <a href="http://heckyesmarkdown.com">Marky the Markdownifier</a>.</p>
<p>The steps to using the tool are pretty simple:</p>
<ol>
<li>Open <a href="http://heckyesmarkdown.com">Marky the Markdownifier</a> and paste in the URL you want to convert from HTML to Markdown. <a href="#fn:1" id="fnref:1" title="see footnote" class="footnote">[1]</a></li>
<li>Click Go.</li>
<li>Marky will convert the webpage to Markdown.</li>
<li>Copy/paste the converted Markdown into your favorite text editor.</li>
<li>Done.</li>
</ol>
<p>An example of this is my post on <a href="http://theothersideof.mygeekdaddy.net/2012/change-sort-order-in-os-x-ml/">changing the sort method in Finder.app</a>. <a href="#fn:2" id="fnref:2" title="see footnote" class="footnote">[2]</a> A snap shot post.</p>
<figure><a href="http://share.mygeekdaddy.me/change_finder_webpage.png"><img src="http://share.mygeekdaddy.me/change_finder_webpage.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Presto chango and I get this:</p>
<pre><code>[Source](http://theothersideof.mygeekdaddy.net/2012/change-sort-order-in-os-x-ml/ "Permalink to Change Finder sort order in OS X ML | The Other Side of MyGeekDaddy")
# Change Finder sort order in OS X ML | The Other Side of MyGeekDaddy
# [The Other Side of MyGeekDaddy][1]
# Change Finder sort order in OS X ML
Sep 19, 2012
Apple has recently released another update to its OS X operation system – [Mountain Lion][3]. This release has brought another round of Windows users to the Mac fold and like before, some of them don’t like how Apple wants you to look at your files. Windows users for the longest time have had files and folders sorted separately. Apple OS X treats them the same, so when you sort a folder by ‘type’, folders show up just after Files and before Internet Locations (those are OS X’s [default file type][4] listings). Here is a recap of how to change Finder’s sort methods to be more like Windows.
## Required Tools
To make the changes described below, you’ll need a text editor beyond the default TextEdit application provided by Apple. Some common, and easy to obtain, applications include:
* [BBEdit][5] – My default editor ($)
* [Plist Editor][6] – Part of Apple’s Xcode tool set
* [Text Wrangler][7] – BBEdit’s little brother, still very good
The last item is a **good back-up**. Why? One, you should always have a good back-up of your computer, so here’s as good of an excuse as any to get your back-ups up to date. Two, the changes are to core system files. There’s always a remote chance that something could go wrong and you don’t want to have the prettiest door stop in neighborhood.</code></pre>
<p>So now I can make an archive copy of the post in Markdown, make any needed updates, and repost to the new site. </p>
<p>You just gotta love what Brett does!</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn:1">
<p>Do yourself a favor and just install the handy bookmarklet. <a href="#fnref:1" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
<li id="fn:2">
<p>A version for Mavericks OS X coming soon. <a href="#fnref:2" title="return to article" class="reversefootnote"> ↩</a></p>
</li>
</ol>
</div>Editorial for iPad guide in iBooks2013-09-06T12:59:47-05:002013-09-06T12:59:47-05:00Jason Verlytag:mygeekdaddy.net,2013-09-06:/2013/09/06/editorial-for-ipad-guide-in-ibooks/<p>Federico Vittici (<a href="http://twitter.com/viticci">@viticci</a>), creator of one of the <a href="http://www.macstories.net/stories/editorial-for-ipad-review/">best guides</a> on using <a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8">Editorial for iPad</a> has now come out with an iBook on using Editorial -
<a href="https://itunes.apple.com/us/book/writing-on-ipad-text-automation/id697865620?mt=11">Writing On The iPad: Text Automation with Editorial</a>. <sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></p>
<blockquote>
<p>Ole Zorn knows how to push the boundaries of iOS. His latest app, Editorial for iPad …</p></blockquote><p>Federico Vittici (<a href="http://twitter.com/viticci">@viticci</a>), creator of one of the <a href="http://www.macstories.net/stories/editorial-for-ipad-review/">best guides</a> on using <a href="https://itunes.apple.com/us/app/editorial/id673907758?mt=8">Editorial for iPad</a> has now come out with an iBook on using Editorial -
<a href="https://itunes.apple.com/us/book/writing-on-ipad-text-automation/id697865620?mt=11">Writing On The iPad: Text Automation with Editorial</a>. <sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup></p>
<blockquote>
<p>Ole Zorn knows how to push the boundaries of iOS. His latest app, Editorial for iPad, redefines the market of text editors for iOS, and, in many ways, sets a new standard for iOS automation and desktop-class apps. Editorial makes me want to work from my iPad.</p>
</blockquote>
<p>Even though Federico has his review guide on Macstories.net for free, if you want to explore this app in greater depth, skip one Espresso and buy the book. You're supporting the great efforts by Federico to put out some amazing stuff on the interwebs.<sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup></p>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
<p>Excerpt From: Viticci, Federico. “Writing On The iPad: Text Automation with Editorial.” v1.0. Federico Viticci, 2013. iBooks. This material may be protected by copyright. <a href="#fnref1" rev="footnote">↩</a></p>
</li>
<li id="fn2">
<p>Federico will probably claim blasphemy for skipping your Espresso, so just buy the book anyway. <a href="#fnref2" rev="footnote">↩</a></p>
</li>
</ol>
</div>Editorial Worflow - FTP Image Upload2013-09-01T00:36:54-05:002013-09-01T00:36:54-05:00Jason Verlytag:mygeekdaddy.net,2013-09-01:/2013/09/01/editorial-worflow-ftp-image-upload/<p>Getting started with Editorial has been a challenge. Not because it's a bad app, on the contrary, Editorial is such an expansive app that it's taken me a while to get my arms around it. <sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> To say I'm impressed so far would be an understatement. Both …</p><p>Getting started with Editorial has been a challenge. Not because it's a bad app, on the contrary, Editorial is such an expansive app that it's taken me a while to get my arms around it. <sup id="fnref1"><a href="#fn1" rel="footnote">1</a></sup> To say I'm impressed so far would be an understatement. Both Gabe (<a href="https://twitter.com/macdrifter">@macdrifter</a>) and Federico (<a href="http://twitter.com/viticci">@viticci</a>) have done a great job reviewing the Editorlal app, so I don't plan on duplicating their efforts. <sup id="fnref2"><a href="#fn2" rel="footnote">2</a></sup> <sup id="fnref3"><a href="#fn3" rel="footnote">3</a></sup></p>
<p>What I've really worked on so far is trying to recreate various workflows I currently have on my Mac and replicate them in Editorial. The first major conversion I've completed is <a href="http://theothersideof.mygeekdaddy.net/2013/use-automator-to-automatically-ftp-images/">my automagic FTP image upload</a> workflow. On my Mac, the process works basically like this:</p>
<ul>
<li>Select a file and move it to a specific folder.</li>
<li>The selected file is then renamed to a unique file name. Usually involving a date/time stamp.</li>
<li>The file is then uploaded to my site via Transmit, Automator and a Hazel rule.</li>
<li>The URL for the image is then pasted to the clipboard via an Applescript.</li>
<li>I can then paste the URL into a MD file with a Text Expander snippet. </li>
</ul>
<p>The Editorial workflow I have setup works basically the same way:</p>
<ul>
<li>Copy an image either from Photos or from a web page into the clipboard.</li>
<li>Open the document you want to insert the image into in Editorial and run the <em>FTP Image</em> workflow.</li>
<li>The <em>FTP Image</em> workflow will:
<ul>
<li>Resize the image to 500px width</li>
<li>Upload the resized image via FTP to the website</li>
<li>Set the full path URL to the clipboard</li>
<li>Insert MD image link into document.<br></li>
</ul></li>
</ul>
<p>So right now on my Mac, to get an image “automagically” uploaded onto my site, I need to use at least 4 or 5 different software packages. </p>
<p>On my iPad… I only need one. <strong>Now that's amazing.</strong></p>
<p>Feel free to try the workflow - <a href="http://editorial-app.appspot.com/workflow/5717271485874176/n1pqMh7spv8">FTP Image Upload</a>.<sup id="fnref4"><a href="#fn4" rel="footnote">4</a></sup> <sup id="fnref5"><a href="#fn5" rel="footnote">5</a></sup></p>
<hr>
<p><strong>Update (2013-09-04):</strong> I made an update to the <a href="http://editorial-app.appspot.com/workflow/5717271485874176/n1pqMh7spv8">FTP Image Upload</a>. The update will strip out unicode characters from the document title variable <em>DocTitleVar</em>. </p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn1">
<p><a href="https://twitter.com/drdrang/status/367809989772992512">Like Dr Drang</a>, I wasn't one of the beautiful people to beta test Editorial for the past 6 months. <a href="#fnref1" rev="footnote">↩</a></p>
</li>
<li id="fn2">
<p>Gabe's review can be found <a href="http://www.macdrifter.com/2013/08/editorial-for-ipad-a-landmark-in-ios-text-editors.html">here</a>. <a href="#fnref2" rev="footnote">↩</a></p>
</li>
<li id="fn3">
<p>Federico's review can be found <a href="http://www.macstories.net/stories/editorial-for-ipad-review/">here</a> (and soon to be iBook too) <a href="#fnref3" rev="footnote">↩</a></p>
</li>
<li id="fn4">
<p>Gabe's <a href="http://www.macdrifter.com/2013/08/password-handling-in-editorial-scripts.html">recent post</a> on keychain and his <a href="http://www.macdrifter.com/2013/08/ftp-upload-with-editorial.html">FTP Upload WF</a> post were both instrumental in getting this workflow completed. I appreciate all his efforts on giving back to geeks everywhere. <a href="#fnref4" rev="footnote">↩</a></p>
</li>
<li id="fn5">
<p>Link is for the updated workflow. <a href="#fnref5" rev="footnote">↩</a></p>
</li>
</ol>
</div>Why does A to B to C to D mean A equals D?2013-08-18T21:41:09-05:002013-08-18T21:41:09-05:00Jason Verlytag:mygeekdaddy.net,2013-08-18:/2013/08/18/why-does-a-to-b-to-c-to-d-mean-a-equals-d/<p>The Target Corporation has been in the news in recent weeks due to their recent political activities. I live in Minnesota, so I hear a bit more than most about the Target Corp because they’re headquartered in Minneapolis. Being headquartered here, Target is taking a more active role in …</p><p>The Target Corporation has been in the news in recent weeks due to their recent political activities. I live in Minnesota, so I hear a bit more than most about the Target Corp because they’re headquartered in Minneapolis. Being headquartered here, Target is taking a more active role in state politics due to the recent Supreme Court ruling that allows public companies to support political groups the same way unions and non-profits have been able to do for almost 63 years. Several other companies are also taking advantage of the new campaign laws - Best Buy, Polaris, Pentair - just to name a few.</p></p>
<p>Being a business, Target did what any business could now do and donated funds to a pro-business group called Minnesota Forward. This particular group is focused on encouraging the creation of jobs and highlighting issues related to business owners in the State of Minnesota. Now in the grand spectrum of political parties available these days, the Minnesota Forward agenda aligns most closely with the Republican party. So with Minnesota Forward’s agenda aligned with the Republican party agenda, it should be no surprise that Minnesota Forward threw its support for the 2010 gubernatorial candidate to Republican candidate Rep Tom Emmer.</p>
<p>Rep Tom Emmer is a conservative Republican that is vying for a win in the 2010 gubernatorial race due to the impending departure of current Minnesota Governor Tim Palenty. As with any candidate, Rep Tom Emmer has stated his belief and support on a variety of topics that most would agree are typical Republican party line items - lower taxes, increase business employment, pro-life and anti-gay marriage. Great, that’s Rep Tom Emmer’s personal choice to believe and support those items.</p>
<p>Now because of these chain of events, some people are arguing that people should boycott Target because they oppose gay marriage. </p>
<p><strong>Huh?</strong> </p>
<p>Let’s recap what’s happened so far:</p>
<blockquote>
A: Target donates $150,000 to Minnesota Forward.<br>
B: Minnesota Forward is a pro-business political group.<br>
C: Minnesota Forward endorses its support to Rep Tom Emmer for the Republican candidacy in the 2010 gubernatorial race.<br>
D: Rep Tom Emmer opposes the support of gay marriage.
</blockquote>
<p>Therefore, in the logic proposed by the boycott advocates, A to B to C to D means A equals D. <em>Really?</em> The arguement is because Target supported a pro-business political group that they are also opposed to gay marriage. <strong>Really?</strong> If that’s the case, then Greenpeace must support the killing of endangered species.</p>
<blockquote>
A: Greenpeace uses boats and cars as part of their efforts.<br>
B: Those cars and boats use gas and diesel to operate.<br>
C: Gas and diesel come from oil.<br>
D: The gulf oil spill killed endangered species.
</blockquote>
<p>A equals D, therefore Greenpeace must want to kill endangered species.</p>
<p></br></p>
<p>Next stop, school supply run to the big red bullseye.</p>Methods for date selection in BIRT2013-08-18T13:31:36-05:002013-08-18T13:31:36-05:00Jason Verlytag:mygeekdaddy.net,2013-08-18:/2013/08/18/methods-for-date-selection-in-birt/<p>A while back I wrote about how to <a href="http://theothersideof.mygeekdaddy.net/2013/javascript-date-functions-in-birt/">use Javascript to calculate date functions in BIRT</a>. In this post I will show different methods that can be used to automatically calculate dates so it can be scheduled as a rolling date report. The example I will use is for a …</p><p>A while back I wrote about how to <a href="http://theothersideof.mygeekdaddy.net/2013/javascript-date-functions-in-birt/">use Javascript to calculate date functions in BIRT</a>. In this post I will show different methods that can be used to automatically calculate dates so it can be scheduled as a rolling date report. The example I will use is for a report to run every day and show a given date range summary - e.g. WO costs month to date. Since this report needs to run everyday, the report itself should determine what the first and last day of the month is. </p>
<h4 id="aidhardcodehardcodeselectioninopenmethoda"><a id="hardcode">Hard code selection in Open Method</a></h4>
<p>The easiest way to do your date selection is hard code it in the query itself. Typically this can be done with date specific SQL for your database type. For example, using a selection statement for SQL Server to automatically show dates from 1 week ago could be coded liked this:</p>
<figure><a href="http://share.mygeekdaddy.me/wotrack_sql_hardcode-8-7-2013.png"><img src="http://share.mygeekdaddy.me/wotrack_sql_hardcode-8-7-2013.png" title="" id="" style="width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>In this example, the following lines hard code the selection query to basically one week ago.</p>
<pre><code>+ " and workorder.reportdate >= (dateadd(day, -14, convert(varchar, getdate(), 101))) "
+ " and workorder.reportdate < (dateadd(day, -7, convert(varchar, getdate(), 101))) "
</code></pre>
<p>While this is a quick and easy, there is no way to reuse the calculated date. The next two methods calculate the same date value, but allow a report writer to reuse the information. </p>
<!--more-->
<h4 id="aidopen_methoddateselectionintheopenmethodmxreportsqlformata"><a id="open_method">Date selection in the Open Method (MXReportSqlFormat)</a></h4>
<p>This method uses some of the custom classes in the BIRT Report Designer and Maximo to calculate and reuse the information. </p>
<figure><a href="http://share.mygeekdaddy.me/dateselect_in_open_method-8-7-2013.png"><img src="http://share.mygeekdaddy.me/dateselect_in_open_method-8-7-2013.png" title="" id="" style="width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>The code for the <em>open method</em>:</p>
<pre><code>maximoDataSet = MXReportDataSetProvider.create(this.getDataSource().getName(), this.getName());
maximoDataSet.open();
var sqlText = new String();
var currDate = new Date();
var firstdate = new Date(currDate.getFullYear(), currDate.getMonth(), 1);
var lastdate = new Date (new Date(currDate.getFullYear(), currDate.getMonth() +1 , 1) - 1);
sqlText = "select workorder.workorderid, workorder.wonum, workorder.description, workorder.woclass, workorder.status, "
+ " workorder.assetnum, workorder.worktype, workorder.wopriority, workorder.lead, workorder.reportdate, "
+ " workorder.location, workorder.jpnum, workorder.parent, workorder.siteid, workorder.schedstart, workorder.schedfinish "
+ " from workorder "
+ "where " + params["where"]
+ " and workorder.istask = 0 "
+ " and workorder.reportdate >= " + MXReportSqlFormat.getTimestampFunction(firstdate)
+ " and workorder.reportdate < " + MXReportSqlFormat.getTimestampFunction(lastdate)
+ " order by workorder.siteid, workorder.wonum"
;
maximoDataSet.setQuery(sqlText);
</code></pre>
<p>When you a run a report using this date selection method, you can include a <a href="http://share.mygeekdaddy.me/initialize_method_debug_example-8-16-2013.png">DEBUG statement</a> on the <em>initialize method</em> to see what is actually getting parsed by BIRT. When you look at the debug output you would see the following:</p>
<pre><code>Wed Aug 07 21:33:39 CDT 2013 INFO DataSet [dataSet]: select workorder.workorderid,
workorder.wonum, workorder.description, workorder.woclass, workorder.status,
workorder.assetnum, workorder.worktype, workorder.wopriority, workorder.lead,
workorder.reportdate, workorder.location, workorder.jpnum, workorder.parent, workorder.siteid,
workorder.schedstart, workorder.schedfinish from workorder where workorder.istask = 0
and workorder.reportdate >= { ts '2013-07-01 00:00:00.000' }
and workorder.reportdate < { ts '2013-07-31 23:59:59.999' } order by workorder.siteid, workorder.wonum
Wed Aug 07 21:33:39 CDT 2013 INFO DataSet [dataSet] close called.
</code></pre>
<p>You can see BIRT took the calculated values from the <em>firstdate</em> and <em>lastdate</em> variables and then converted them to a date string. The beauty of this method is that since the date/time values for <em>firstdate</em> and <em>lastdate</em> are variables, the report can be reused against any Maximo install - SQL Server, Oracle or DB2.</p>
<h4 id="aidjavascriptdateselectionintheinitializemethodakapurejavascripta"><a id="javascript">Date selection in the Initialize Method (aka pure Javascript)</a></h4>
<p>This method uses just Javascript to calculate the first of the month and last day of the month and then transform those dates to a format that can be used by BIRT. Looking at the <em>initialize method</em> on the report you find some of the javascript that is calculating the first and last dates.</p>
<figure><a href="http://share.mygeekdaddy.me/wotrack_init_method-8-7-2013.png"><img src="http://share.mygeekdaddy.me/wotrack_init_method-8-7-2013.png" title="" id="" style="width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>The trick here is the fact that javascript doesn't handle objects the same as BIRT can, <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> so that's why each variable is updated with a string version of the calculated date. The actual code for the <em>initialize method</em> is :</p>
<pre><code>importPackage(Packages.com.ibm.tivoli.maximo.report.script);
mxReportScriptContext = MXReportScriptContext.initialize(reportContext);
mxReportScriptContext.setDefaultLogLevel("DEBUG");
mxReportScriptContext.setDefaultLogFile("/temp/my_report.log");
var now = new Date();
var first_month = new Date(now.getFullYear(), now.getMonth(), 1);
first_month = first_month.getFullYear() + "-" + (first_month.getMonth()+1) + "-" + first_month.getDate() + " 00:00";
var end_month = new Date (new Date(now.getFullYear(), now.getMonth() +1 , 1) - 1);
end_month = end_month.getFullYear() + "-" + (end_month.getMonth()+1) + "-" + end_month.getDate() + " 23:59";
</code></pre>
<p>Again, using the log output when the report is run, we can see how BIRT parses the selection to Maximo:</p>
<pre><code>Wed Aug 07 23:21:54 CDT 2013 INFO DataSet [dataSet]: select workorder.workorderid,
workorder.wonum, workorder.description, workorder.woclass, workorder.status,
workorder.assetnum, workorder.worktype, workorder.wopriority, workorder.lead,
workorder.reportdate, workorder.location, workorder.jpnum, workorder.parent, workorder.siteid,
workorder.schedstart, workorder.schedfinish from workorder workorder.istask = 0
and workorder.reportdate >= '2013-7-1 00:00' and workorder.reportdate < '2013-7-31 23:59'
order by workorder.siteid, workorder.wonum
Wed Aug 07 23:21:54 CDT 2013 INFO DataSet [dataSet] close called.
</code></pre>
<p>Now because these variables were created on the <em>initialize method</em>, these variables can be reused in the report. In the example below, the variable was added to a Data element and then included in the report header.</p>
<figure><a href="http://share.mygeekdaddy.me/variable_in_data_element-8-7-2013.png"><img src="http://share.mygeekdaddy.me/variable_in_data_element-8-7-2013.png" title="" id="" style="width:600px;" class="aligncenter size-full" /></img></a></figure>
<p>Because the variable is assigned in a Data element, the format of the date can be set when the field is placed in the report header.</p>Methods to pull job task long text to WO print2013-08-13T13:51:14-05:002013-08-13T13:51:14-05:00Jason Verlytag:mygeekdaddy.net,2013-08-13:/2013/08/13/methods-to-pull-job-task-long-text-to-wo-print/<p>One of the complexities of Maximo and BIRT is the fact that you can get the same task accomplished multiple ways. Think about how many ways a work order can be generated. The same can be said with how many ways a report writer can present information in a report …</p><p>One of the complexities of Maximo and BIRT is the fact that you can get the same task accomplished multiple ways. Think about how many ways a work order can be generated. The same can be said with how many ways a report writer can present information in a report. I was recently asked the following: </p>
<blockquote class="twitter-tweet"><p><a href="https://twitter.com/mygeekdaddy">@mygeekdaddy</a> Have you a way to disp JPtask LD on WOPRINT? LOJ on LD worked in JPdetails but not in woprint. Thx.</p>— scottegiles (@scottegiles) <a href="https://twitter.com/scottegiles/statuses/360427689523421185">July 25, 2013</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>
<p>I replied back that two quick ways was to either do a sub-select on the dataset for the long description<a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> of the job task or add a new dataset and nest that as a sub-table in the Job Task.<a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> Using the out of the box <em>woprint.rptdesign</em> report, I’ll show a couple of ways a report writer can get the long description of a Job Task from the <em>JOBPLANS</em> table.</p>
<!--more-->
<h4>Out of the box taskDataSet</h4>
<p>Before getting started, let’s take a look at the default query used in the <em>open method</em> in the <em>taskDataSet</em> of the woprint.rptdesign file.</p>
<blockquote>
sqlText = “select workorder.taskid, workorder.description, workorder.status, woactivity.pointnum, ”<br />
+ “workorder.measurementvalue, workorder.measuredate, workorder.observation ”<br />
+ “from workorder left outer join ”<br />
+ “woactivity on workorder.wonum = woactivity.wonum and workorder.siteid = woactivity.siteid ”
+ “where workorder.parent = ‘“ + rows[0][“wonum”].replace(/’/g,”’‘“) + ”’ and workorder.istask = 1 and workorder.siteid = ‘“<br />
+ rows[0][“siteid”] + ”’”<br />
+ “ order by workorder.taskid”
</blockquote>
<p>When a job plan is either directly inserted into a work order, or used in the PM WOGen process, the job tasks on the job plan become the work tasks on the main work order. So one way we can think about this is:</p>
<pre><code>jobptask.jptask = workorder.taskid
</code></pre>
<p>For example, a sample WO has the following tasks:</p>
<figure><a href="http://share.mygeekdaddy.net/sample_work_order_with_job_plan_2013-07-31.png"><img src="http://share.mygeekdaddy.net/sample_work_order_with_job_plan_2013-07-31.png" title="" id="" style="width:500px;" class="aligncenter size-full" /></img></a></figure>
<p>Note these are the same as the job tasks of the job plan that was directly copied over:</p>
<figure><a href="http://share.mygeekdaddy.net/Job_Plan_Screen_Shot-7-31-2013.png"><img src="http://share.mygeekdaddy.net/Job_Plan_Screen_Shot-7-31-2013.png" title="" id="" style="width:500px;" class="aligncenter size-full" /></img></a></figure>
<p>Maximo actually does copy the long description text of the job task to the work order task, we just have to make it visible. Here’s a couple of ways to do this.</p>
<h4>Sub-Select on taskDataSet</h4>
<p>The easiest method would be to do a sub-select in the <em>taskDataSet</em>. </p>
<pre><code>sqlText = "select workorder.taskid, workorder.description, workorder.status, woactivity.pointnum, "
+ " workorder.measurementvalue, workorder.measuredate, workorder.observation, "
+ " (select ldtext from longdescription where ldownertable='workorder' and ldkey=workorder.workorderid) as ldtext "
+ " from workorder "
+ " left outer join woactivity on workorder.wonum = woactivity.wonum and workorder.siteid = woactivity.siteid "
+ " where workorder.parent = '" + rows[0]["wonum"].replace(/'/g,"''") + "'"
+ " and workorder.istask = 1 "
+ " and workorder.siteid = '" + rows[0]["siteid"] + "'"
+ " order by workorder.taskid"
</code></pre>
<p>The 1:1 relationship of <code>ldkey=workorder.workorderid</code> works because the selected records are the work order task records via the selection: </p>
<pre><code> + " where workorder.parent = '" + rows[0]["wonum"].replace(/'/g,"''") + "'"
</code></pre>
<p>With the query update to the <em>open method</em> complete, modify the <em>fetch method</em> to include the long description by adding the following line:</p>
<pre><code>row["ldtext"] = taskDataSet.getString("ldtext");
</code></pre>
<figure><a href="http://share.mygeekdaddy.net/fetch_method_change-8-1-2013.png"><img src="http://share.mygeekdaddy.net/fetch_method_change-8-1-2013.png" title="" id="" style="width:500px;" class="aligncenter size-full" /></img></a></figure>
<p>Now the <em>fetch method</em> will pull the long description as part of the selection query. Last, add the <code>ldtext</code> field to output columns list.</p>
<figure><a href="http://share.mygeekdaddy.net/birt_output_column_selection-8-1-2013.png"><img src="http://share.mygeekdaddy.net/birt_output_column_selection-8-1-2013.png" title="" id="" style="width:500px;" class="aligncenter size-full" /></img></a></figure>
<p>Now the add the field into the report and the long description of the job task will print on the work order.</p>
<h4>Include Long Description in taskDataSet</h4>
<p>The next method would be to include the <em>ldtext</em> field from the <em>LONGDESCRIPTION</em> table directly into the <em>open method</em> selection query. </p>
<pre><code>sqlText = "select workorder.taskid, workorder.description, workorder.status, woactivity.pointnum, "
+ " workorder.measurementvalue, workorder.measuredate, workorder.observation, longdescription.ldtext "
+ " from workorder "
+ " left outer join woactivity on workorder.wonum = woactivity.wonum and workorder.siteid = woactivity.siteid "
+ " left outer join longdescription on longdescription.ldownertable='WORKORDER' and longdescription.ldownercol='DESCRIPTION' "
+ " and longdescription.ldkey=workorder.workorderid "
+ " where workorder.parent = '" + rows[0]["wonum"].replace(/'/g,"''") + "'"
+ " and workorder.istask = 1 "
+ " and workorder.siteid = '" + rows[0]["siteid"] + "'"
+ " order by workorder.taskid"
</code></pre>
<p>Follow the same steps in the previous method to add the <code>ldtext</code> field to the report.</p>
<h4>Add Long Description DataSet</h4>
<p>The last way <a href="#fn-3" id="fnref-3" title="see footnote" class="footnote">[3]</a> would be to add a brand new dataset to the report to display the long description of the of the work order tasks, similar to how the <em>taskDataSet</em> was created for the overall report. While this is a viable option, based on the simplicity of the first two solutions, most report writers would opt to modify the <em>open method</em> to pull the long description into the report. </p>
<h4>Conclusion</h4>
<p>Like a lot of things in Maximo, there is more than one way to get something done. So no one should be surprised the same thing happens in BIRT. Over the next couple of posts I’ll continue to explore some common report writing methods that have multiple ways to get the end goal accomplished.</p>
<p>A copy of the modified <em>woprint.rptdesign</em> file can be found <a href="http://share.mygeekdaddy.net/woprint-8-1-2013.rptdesign">here</a>.</p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
That’s the easy way. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">Golden rule on nested BIRT datasets2013-07-26T13:29:00-05:002013-07-26T13:29:00-05:00Jason Verlytag:mygeekdaddy.net,2013-07-26:/2013/07/26/golden-rule-on-nested-birt-datasets/<p>Sometimes even the "experts" need to be slapped back into reality. This week I got slapped so hard I felt bad for originally claiming my problem was a bug in BIRT. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> Typically <a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> when you design a BIRT report, the report is based on information from an associated Maximo …</p><p>Sometimes even the "experts" need to be slapped back into reality. This week I got slapped so hard I felt bad for originally claiming my problem was a bug in BIRT. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> Typically <a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> when you design a BIRT report, the report is based on information from an associated Maximo application - e.g. WO Print report is associatied with WO Tracking. So when you create an <em>open method</em> for the report that would typically run against the WO Track app, it could look like this:</p>
<pre><code>sqlText = "select workorder.wonum, workorder.description, workorder.reportdate, "
+ " workorder.pmnum, workorder.orgid, workorder.targstartdate, workorder.siteid, "
+ " workorder.status, workorder.statusdate from workorder "
// Include the Maximo where clause
+ " where " + params["where"]
+ " and ( (workorder.pmnum is null and (workorder.wrtype is null or workorder.wrtype <> 'QA') "
+ " and workorder.reportdate >= (dateadd(day, -14, convert(varchar, getdate(), 101))) "
+ " and workorder.reportdate < (dateadd(day, -7, convert(varchar, getdate(), 101)))) "
+ " and workorder.istask=0 "
+ " or (workorder.pmnum is not null AND workorder.worktype not in ('PROD', 'QAQC') "
+ " and workorder.targstartdate >= (dateadd(day, -14, convert(varchar, getdate(), 101))) "
+ " and workorder.targstartdate < (dateadd(day, -7, convert(varchar, getdate(), 101))) )) "
+ " and workorder.istask = 0 "
</code></pre>
<p>The critical line is <code>+ " where " + params["where"]</code>, because this is the magic sauce on how the BIRT report is getting parameter information from the application. However, when you add an additional dataset to your report, the tables that dataset is using may, or more likely, may not have any association. So in this example, the second dataset in the report is pulling information from the <em>LABTRANS</em> table could look like this:</p>
<pre><code>sqlText = "select labtrans.startdate, labtrans.laborcode, labtrans.regularhrs, labtrans.siteid, labtrans.orgid, "
+ "labtrans.refwo, isnull(substring(labtrans.gldebitacct, 4, 4), '9999') as gldebitacct, glcomponents.comptext "
+ " from labtrans "
+ " join glcomponents on (glcomponents.orgid = labtrans.orgid) and (glcomponents.compvalue=isnull(substring(labtrans.gldebitacct, 4, 4), '9999')) and glcomponents.glorder=1 "
+ " where " + params["where"]
+ " and labtrans.siteid = '" + rows[0]["siteid"] + "'"
+ " and labtrans.startdate >= (dateadd(day, -14, convert(varchar, getdate(), 101))) "
+ " and labtrans.startdate < (dateadd(day, -7, convert(varchar, getdate(), 101))) "
</code></pre>
<p>There is a problem with this SQL context when the report is run in the BIRT Report Designer versus running the report in Maximo. The line <code>+ " where " + params["where"]</code> comes into play again. In the BIRT Report Designer this code snippet does nothing because the report is getting passed a 1=1 condition for the where clause.</p>
<figure><a href="http://share.mygeekdaddy.me/one_to_one_whereclause-2013-07-26.png"><img src="http://share.mygeekdaddy.me/one_to_one_whereclause-2013-07-26.png" title="" id="" style="width:300px;" class="aligncenter size-full" /></img></a></figure>
<p>But when the report is run in Maximo, the <code>+ " where " + params["where"]</code> in the second dataset tries to pull in parameter information too. Since the second dataset is based on tables not directly related to the application it's running in the second dataset will fail to pull in any infromation at all. The proper method is to remove the <code>+ " where " + params["where"]</code> and hard code the <em>where</em> statement. </p>
<pre><code>sqlText = "select labtrans.startdate, labtrans.laborcode, labtrans.regularhrs, labtrans.siteid, labtrans.orgid, "
+ "labtrans.refwo, isnull(substring(labtrans.gldebitacct, 4, 4), '9999') as gldebitacct, glcomponents.comptext "
+ " from labtrans "
+ " join glcomponents on (glcomponents.orgid = labtrans.orgid) and (glcomponents.compvalue=isnull(substring(labtrans.gldebitacct, 4, 4), '9999')) and glcomponents.glorder=1 "
+ " where labtrans.siteid = '" + rows[0]["siteid"] + "'"
+ " and labtrans.startdate >= (dateadd(day, -14, convert(varchar, getdate(), 101))) "
+ " and labtrans.startdate < (dateadd(day, -7, convert(varchar, getdate(), 101))) "
</code></pre>
<p>So the golden rule is:</p>
<blockquote>
Don't use <code>+ " where " + params["where"]</code> on secondary datasets.
</blockquote>
<p></br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
Shout out of thanks to Pam & Brian for indulging my delusions. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">
Sometimes there's <a href="http://theothersideof.mygeekdaddy.net/2012/how-to-run-birt-reports-against-no-print-maximo-apps/">an exception to the rule</a>. <a href="#fnref-2" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>Moving on...2013-07-23T22:33:02-05:002013-07-23T22:33:02-05:00Jason Verlytag:mygeekdaddy.net,2013-07-23:/2013/07/23/moving-on/<p>I know I haven’t posted in a while and that’s part of what I want to talk about tonight. I’ve been struggling with two concerns about the family blog for some time now. The first one has been the lack of consistent writing on my part. I …</p><p>I know I haven’t posted in a while and that’s part of what I want to talk about tonight. I’ve been struggling with two concerns about the family blog for some time now. The first one has been the lack of consistent writing on my part. I’ve been spending a lot more time on my tech writing and brushing up on some of my programming skills. On top of that, this summer has been a whirlwind with Sam’s baseball, Evan’s t-ball, getting time to ride, other activities, etc. Finding time to put together updates just isn’t making it to the top of the priority list anymore.</p>
<p>The second, and the one I struggled with even more, is the boys are growing up and my concerns on what impact these posts could have on them. Sam now has an iPod that can search the internet. That means Sam’s friends most likely have iPods that can search the internet. At some point someone in his circle of friends is going to get the idea of Googling themselves to see what comes up. Most of the posts I make here are all inside baseball family stuff. Which means everything I post here is nothing Sam wants his friends to see. I don’t want a post that was made in good fun for family come back at the expense of Sam or Evan.</p>
<p>So… as you can see what this is probably leading to is that I will longer be posting to the blog anymore. I will of course be be archiving the site so I can threaten Sam and Evan that I’ll show all their friends their naked butt pictures anytime they get out of line.</p>
<p>A couple of house cleaning items before I wrap up:</p>
<ul>
<li>Facebook is not going to be my alternative place to post. I probably show up on Facebook less often than I do here.</li>
<li>I plan to continue posting pictures to my Flickr account, but with a private family group. I will send out invites later next week so family members can access the group.</li>
<li>Holly and I will attempt to send out random updates via email. Extended family should drop Holly or I a note if you want to be included.</li>
</ul>Use Automator to automatically FTP images2013-07-08T13:55:45-05:002013-07-08T13:55:45-05:00Jason Verlytag:mygeekdaddy.net,2013-07-08:/2013/07/08/use-automator-to-automatically-ftp-images/<p>One of the common steps I have to take with writing posts is getting images pre-loaded to my site so the all the image links can be set properly as I write in my <a href="https://itunes.apple.com/us/app/byword/id482063361?mt=8">Byword</a>. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> For a while I have wanted a way to automatically FTP images to my …</p><p>One of the common steps I have to take with writing posts is getting images pre-loaded to my site so the all the image links can be set properly as I write in my <a href="https://itunes.apple.com/us/app/byword/id482063361?mt=8">Byword</a>. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> For a while I have wanted a way to automatically FTP images to my site and I finally have a working system. <a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> Here are the steps to create your own system. </p>
<h4 id="softwareneeded:">Software needed:</h4>
<p>You will need the following on your Mac: </p>
<ul>
<li>OS X Automator (built in to current OS X versions) <a href="#fn-3" id="fnref-3" title="see footnote" class="footnote">[3]</a></li>
<li>FTP client <a href="#fn-4" id="fnref-4" title="see footnote" class="footnote">[4]</a></li>
<li>Dedicated FTP folder on your site</li>
</ul>
<h4 id="prepwork">Prep Work</h4>
<p>There is a couple of things to make sure you have done or may need to do. Review this quick checklist before opening Automator.</p>
<ul>
<li>Determine the folder you will use on your Mac as your default upload folder. This folder will be the folder Automator will monitor to upload images to your site.</li>
<li>Determine how/where you want to save the images to your site. This could be a subdomain like <code>http://share.example.com</code> or a dedicated folder like <code>http://example.com/images</code>. Just think about how you want this done because you're committing to a strategic process for your site.</li>
<li>Make sure your FTP account credentials are correct. <a href="#fn-5" id="fnref-5" title="see footnote" class="footnote">[5]</a></li>
</ul>
<!--more-->
<h4 id="automator">Automator</h4>
<p>The automatic portion of the work is utilizing a Folder Action via Automator. Use the following steps to create the Folder Action in Automator.</p>
<ol>
<li>Open Automator and choose the Folder Action item. This will create a blank Folder Action<a href="#fn-6" id="fnref-6" title="see footnote" class="footnote">[6]</a> for you.<figure><a href="http://share.mygeekdaddy.me/Automator_WF_Selection_2013-07-03.png"><img src="http://share.mygeekdaddy.me/Automator_WF_Selection_2013-07-03.png" title="" id="" style="width:500px;" class="aligncenter size-full" /></img></a></figure></p></li>
<li><p>Set the folder to the default upload folder you determined as part of your prep work. Mine happens to be <code>~/Pictures/ftp_upload/</code>. </p></li>
<li>Start adding the following Actions in order:
<ul>
<li>Replace Text</li>
<li>Add Date or Time</li>
<li>Get Folder Contents</li>
<li>Copy to Clipboard</li>
<li>Upload Files (using FTP client action)</li>
<li>Run Applescript <em>(first script)</em></li>
<li>Run Applescript <em>(second script)</em></li>
</ul></li>
<li><p>Fill in each of the Actions with the following. Note that on the <em>Replace Text</em> action, the 'Find:' box has a space in it. The idea is rename the image as one continuous string to avoid the unicode <em>%20</em> filename fillers. <a href="#fn-7" id="fnref-7" title="see footnote" class="footnote">[7]</a> <figure><a href="http://share.mygeekdaddy.me/Automator-FTP-Folder-WF_2013-07-03.png"><img src="http://share.mygeekdaddy.me/Automator-FTP-Folder-WF_2013-07-03.png" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure></p></li>
<li><p>In the first <em>Run Applescript</em> action, the 2nd line, <code>set trimFilename to ((characters 40 thru -1 of theFilename) as string)</code> is used to strip the folder path from the file name. You will need to adjust the first numeric value (40 in my example) so only the name of the file is left in the string.
The idea is to take the first 40 characters from:
<pre><code>/Users/mygeekdaddy/Pictures/ftp_upload2/IMG_7819-Edit.jpg
</code></pre>
And leave just:
<pre><code>IMG_7819-Edit.jpg
</code></pre>
Use the following Applescript to test your string trim setting.<a href="#fn-8" id="fnref-8" title="see footnote" class="footnote">[8]</a>
<pre><code>set theFilename to the clipboard
set trimFilename to ((characters 40 thru -1 of theFilename) as string)
return trimFilename
</code></pre></li>
<li>In the second <em>Run Applescript</em> action, to easily get the correct path syntax, do the following sub-tasks:<a href="#fn-9" id="fnref-9" title="see footnote" class="footnote">[9]</a>
<ol>
<li>Open the Applescript editor on one side of your screen and Finder on another.<figure><a href="http://share.mygeekdaddy.me/Script_Recording_Base_Position_2013-07-03.png"><img src="http://share.mygeekdaddy.me/Script_Recording_Base_Position_2013-07-03.png" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure></p></li>
<li><p>In the Applescript editor, click on Record button.</p></li>
<li><p>In Finder window, under Devices, click on your Mac computer name and then click through the folders until you open the default ftp folder where you'll copy the images to on your Mac.</p></li>
<li><p>When you get your ftp upload folder in Finder, click stop in the Applescript editor.</p></li>
<li><p>Now you will have an Applescript method to access your ftp upload folder. <figure><a href="http://share.mygeekdaddy.me/Applescript_Finder_Target_2013-07-03.png"><img src="http://share.mygeekdaddy.me/Applescript_Finder_Target_2013-07-03.png" title="" id="" style="width:500px;" class="aligncenter size-full" /></img></a></figure></p></li>
<li><p>Copy the last <code>set target</code> statement and use that as the syntax inside the second <em>Run Applescript</em> action for the Action Folder to set the folder in which the image files should be sent to the Trash. </p></li>
</ol></li>
</ol>
<p>Now you can test your Action Folder by pasting an image into your selected ftp upload folder. If you keep Finder open to your ftp upload folder you can literally watch as the magic happens. After the Automator action runs, you can just hit paste in your favorite editor and get the URL of the image you just uploaded to your site:
<blockquote>
<a href="http://share.mygeekdaddy.me/some_random_image_2013-07-06.png">http://share.mygeekdaddy.me/some_random_image_2013-07-06.png</a>
</blockquote>
</br>
Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
All my posts are written MD and converted to HTML. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">
Working != most efficient. Improvements are very likely to be made. <a href="#fnref-2" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-3">
From my research, this WF should work as far back as Leopard (v10.5.x). <a href="#fnref-3" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-4">
I'd recommend Fetch of Transmit, both are known to play nicely with Automator. <a href="#fnref-4" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-5">
Make a mental note that updating or changing your FTP account credentials will break this Automator action. <a href="#fnref-5" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-6">
Folder Actions will be saved in <code>~/Library/Workflows/Applications/Folder Actions</code>, unless changed when first created. <a href="#fnref-6" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-7">
The idea is to change <code>My Image Name.png</code> to <code>My_Image_Name.png</code>, instead of <code>My%20Image%20Name%20.png</code>. <a href="#fnref-7" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-8">
Copy the full path and file name (e.g. <code>/Users/mygeekdaddy/Pictures/ftp_upload2/IMG_7819-Edit.jpg</code>) and test the code in the Applescript editor to get it right. <a href="#fnref-8" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-9">Simple Keyboard Maestro web clipper2013-06-27T13:57:05-05:002013-06-27T13:57:05-05:00Jason Verlytag:mygeekdaddy.net,2013-06-27:/2013/06/27/simple-keyboard-maestro-web-clipper/<p>One of the common tasks I have to do is cite either a regulatory website (EPA, OSHA, etc) or a local statute. When forwarding a citation, invarably someone is going to ask <em>where</em> exactly did I get that from. Instead of digging up the citation and going back to look …</p><p>One of the common tasks I have to do is cite either a regulatory website (EPA, OSHA, etc) or a local statute. When forwarding a citation, invarably someone is going to ask <em>where</em> exactly did I get that from. Instead of digging up the citation and going back to look for it, I now give them the a complete reference of the citation using a web clipper macro in Keyboard Maestro. For example, the following text from a <a href="http://theothersideof.mygeekdaddy.net/2013/update-to-techtool-pro/">previous post</a>:</p></p>
<figure><a href="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/06/km_webclipper_example.png"><img src="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/06/km_webclipper_example.png" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<p>This paragraph would be captured and pasted as:</p>
<blockquote>
Update to TechTool Pro | The Other Side of MyGeekDaddy
http://theothersideof.mygeekdaddy.net/2013/update-to-techtool-pro/
If you’re like me, you’re probably the go to person that family and friends look to for computer fix-it solutions. If you happen to work on Macs, then I’m guessing TechTool Pro is in your toolbox. Micromat has announced that updated one of my favorite utlilities with Tech Tools 7.
2013–06–27
</blockquote>
<p>Using a keyboard combination of ⌃⌥⌘-X, the clipper will take the highlighted text, the URL, the page title, and the current date and combine them into a text block on the clipboard.</p>
<figure><a href="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/06/km_webclipper.png"><img src="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/06/km_webclipper.png" title="" id="" style="width:400px;" class="aligncenter size-full" /></img></a></figure>
<p>The Applescript for the clipper is:</p>
<pre><code>tell application "Safari"
activate
set theURL to URL of front document
set selectedText to (do JavaScript "(''+getSelection())" in document 1)
set theTitle to name of front document
set theDate to do shell script "date +'%Y-%m-%d'"
set the clipboard to theTitle & return & return & theURL & return & return & selectedText & return & return & theDate as string
end tell
</code></pre>40 Terminal commands for OS X2013-06-24T20:48:12-05:002013-06-24T20:48:12-05:00Jason Verlytag:mygeekdaddy.net,2013-06-24:/2013/06/24/40-terminal-commands-for-os-x/<p>I just love it when a site does all the work for you. In this case <a href="http://mac.tutsplus.com">Mactuts+</a> has a list of 40 Terminal commands to tweak your OS X environment. One gem on the list is:</p></p>
<pre><code>curl ipecho.net/plain; echo
</code></pre>
<p>This command will return your external IP address.</p>
<p>Link …</p><p>I just love it when a site does all the work for you. In this case <a href="http://mac.tutsplus.com">Mactuts+</a> has a list of 40 Terminal commands to tweak your OS X environment. One gem on the list is:</p></p>
<pre><code>curl ipecho.net/plain; echo
</code></pre>
<p>This command will return your external IP address.</p>
<p>Link: Mactuts+ <a href="http://mac.tutsplus.com/tutorials/terminal/40-terminal-tips-and-tricks-you-never-thought-you-needed/">40 Terminal tips and tricks you never thought you needed</a></p>Mixing my favorite hobbies2013-06-22T13:53:54-05:002013-06-22T13:53:54-05:00Jason Verlytag:mygeekdaddy.net,2013-06-22:/2013/06/22/mixing-my-favorite-hobbies/<p>One of my favorite hobbies is <a href="http://www.flickr.com/photos/mygeekdaddy">photography</a>. But when you get a bunch of geeks hacking their cameras, then it really gets fun. <a href="http://www.magiclantern.fm">Magic Lantern</a> is doing just that for certain Canon DSLR users.<a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a>. </p>
<p>Some of the neat things they’ve been able to do so far:<a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a></p>
<ul>
<li>ISO …</li></ul><p>One of my favorite hobbies is <a href="http://www.flickr.com/photos/mygeekdaddy">photography</a>. But when you get a bunch of geeks hacking their cameras, then it really gets fun. <a href="http://www.magiclantern.fm">Magic Lantern</a> is doing just that for certain Canon DSLR users.<a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a>. </p>
<p>Some of the neat things they’ve been able to do so far:<a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a></p>
<ul>
<li>ISO Settings: Magic Lantern opens up more <a href="http://magiclantern.wikia.com/wiki/ISO">ISO settings</a> on the camera. This alone may be worth the price of hacking your camera.</li>
<li>HDR Bracketing: By default, most Canon cameras will shoot 3 images bracketed at a maximum of +/- 2 EV. Magic Latern will analyze the first image and then take the appropriate number of images to get the entire dynamic range.</li>
<li>Intervalometer: Normally this is an add-on device for DSLR’s, but the internal intervalometer with Magic Lantern is quite impressive. Using a submenu, Magic Lantern’s intervalometer can be set to shoot ‘X’ pictures, over a ‘Y’ duration, with a start delay of up to 8 hours.</li>
<li>Motion Detect: When camera is set to Live View, the camera will detect motion due to brightness changes and automatically take a picture.</li>
</ul>
<p>Note the common warning posted through out the site:</p>
<blockquote>
<strong>Warning</strong><br />
This code changes low-level sensor parameters. In the technical doc you can see how this method messes with the feedback loop for optical black, for example. Therefore, it’s safe to assume it can fry the sensor or do other nasty things.
We don’t pay for repairs. Use it at your own risk.
</blockquote>
<p></br></p>
<p>Look for more on Magic Lantern in the months to come.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
Current firmware works on the 5D Mark II, 50D, T1i (500D), T2i (550D), and the T3i (600D). <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">
For a full list of what Magic Lantern can do, check out the <a href="http://wiki.magiclantern.fm/userguide">ML User Guide</a>. <a href="#fnref-2" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>Making the move to Mac at work2013-06-20T12:50:30-05:002013-06-20T12:50:30-05:00Jason Verlytag:mygeekdaddy.net,2013-06-20:/2013/06/20/making-the-move-to-mac-at-work/<p>I’ve been an Apple user for a while now and I use the term ‘Apple user’ for a reason. I’ve had an iPod, in various incarnations, since it only had a Firewire connection. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> I’ve moved on to various versions of the iPhone since its original release …</p><p>I’ve been an Apple user for a while now and I use the term ‘Apple user’ for a reason. I’ve had an iPod, in various incarnations, since it only had a Firewire connection. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> I’ve moved on to various versions of the iPhone since its original release. And between those two devices, I made the move to Mac about 5 years ago. So while I use a Mac as my preferred platform, I was an Apple user first. With the use of an iPhone and a Mac as my primary personal systems, my workflow started to depend on these tools. </p>
<p>So now I’ve made the move to a Mac at work too. This hasn’t been as easy of a change as I thought it would be. Like a lot of businesses, my company’s prevalent computing platform is based on Microsoft software. Making the transition from PC to Mac has required me to update my workflow and toolset to effectively work in a Microsoft centric office. Here is a list of what I did to comfortably move from a PC to a Mac at work.</p>
<h4>Microsoft Office:</h4>
<p>While the Mac has a plethora of options for dealing with documents and spreadsheets, the fact is most businesses rely on Microsoft Office - including mine. Planning to install Microsoft Office should probably be on anyone’s checklist if they are moving from a PC to a Mac. However, Office for Mac comes with its own little twists and here’s what I’ve done so far to correct them.</p>
<ul>
<li>I do a lot of work with regulations and standards, so one of the first things I needed to do was modify the <em>Language & Text</em> settings to stop changing (c) into ©.</li>
<li>Keeping smart quotes enabled is just asking for trouble when you bounce between Microsoft applications, HTML, and straight text formats. Turn off Smart Quotes and you will have one less headache to deal with.</li>
<li>Office applications allow for custom keyboard shortcuts. Take a look at the default shortcuts and make any updates as needed.</li>
</ul>
<p>One quick note, Mac Outlook 2011 <em>does not</em> have the ability to create or <a href="http://answers.microsoft.com/en-us/mac/forum/macoffice2011-macoutlook/how-do-i-request-a-read-receipt-in-outlook-2011/f005f57c-5fa4-42ce-b3e7-2d0068712c97">track email read receipts</a>. If this is a standard part of your business or workflow, you may need investigate some other options.</p>
<h4>Alternatives to PC Applications:</h4>
<p>While <em>what</em> I do is not always Microsoft centric, quite a few of the tasks I need to do day to day involve a Microsoft related product. One of my primary duties is facilitating the corporate use of a software application called Maximo. So quite often I’ll need to login into a SQL Server, or remote into a Windows Server, to do a variety of tasks. Here are some alternative methods to manage your Microsoft centric tasks.</p>
<p><strong>Microsoft SQL Server Admin:</strong><br />
While there is no SQL Server tool for OS X from Microsoft, you can use the <a href="http://www.oracle.com/technetwork/developer-tools/sql-developer/downloads/index.html">Oracle SQL Developer platform</a> as a way to do most of your tasks with SQL Server. Gokhan Atil, an Oracle DBA, has a great post on how to use the <a href="http://www.gokhanatil.com/2011/09/configuring-oracle-sql-developer-for-microsoft-sql-server-and-mysql.html">Oracle SQL Developer app for MS SQL Server management</a>. Look for more on this toolkit as I get more familiar with the application.</p>
<p><strong>Remote Desktop Control:</strong><br />
The first route most people will take is to use the free Microsoft RDP client. While the Microsoft RDP client is barebones and does the job, do yourself (and your sanity) a favor and look at some other options. Here are two good RDP clients for Mac.</p>
<ul>
<li>iTap: The folks at <a href="http://hlw-software.com">HWL Software</a> do nothing but make RDP clients for iOS, Android and OS X. This is my personal favorite and I’ve been using the iOS version for a couple of years. The OS X version is just as nice and easy to use. Located in the <a href="https://itunes.apple.com/us/app/itap-mobile-rdp/id498936621?mt=12">Apple App Store (not affiliate link)</a>.</li>
<li>Jump Desktop: I haven’t tried Jump Desktop myself, but it was recommended by David Sparks (<a href="http://twitter.com/macsparky">@macsparky</a>) on a recent Mac Power Users (MPU) podcast. The fact that David personally uses the software was enough for me to include it as an option. Jump Desktop is also located in the <a href="https://itunes.apple.com/us/app/jump-desktop-remote-desktop/id364876095?mt=8">Apple App Store (not affiliate link)</a>.</li>
</ul>
<p><strong>VPN Software:</strong><br />
This is a tricky one because VPN software is typically dictated by your network infrastructure. I’ll bet that there’s a good chance that your company has some Cisco equipment installed, and if so, Cisco makes a nice Mac VPN client. </p>
<h4>Fixing Finder</h4>
<p>While I may be a Mac user, I have it hardwired in my brain to sort my Folders alphabetically first and everything else by filetype. I have steps that I’ve updated with each iteration of OS X on how to <a href="http://theothersideof.mygeekdaddy.net/2012/making-finder-app-sort-like-windows-explorer">make Finder.app sort the way I want</a>. Changing the sort order in OS X seems to strike a nerve with some OS X purists. <a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> </p>
<h4>Mac Environment Adjustments:</h4>
<p>Once I got the Mac environment setup, there are a few things I wanted carry over from my personal Mac. Here’s a list of the tweaks I made:</p>
<p><strong>Move screenshots:</strong><br />
I love that OS X has a built in <a href="http://support.apple.com/kb/PH11229?viewlocale=en_US&locale=en_US">screenshot utility</a>, but I don’t like idea of dumping screenshots onto a user’s desktop. I personally prefer to have all my screenshots inside a dedicated folder, typically <em>~/Pictures/Screenshots</em>. To change where OS X saves screenshots, launch Terminal and use the following commands to put your screenshot images into a folder called ‘Screenshots’, under the Pictures folder.</p>
<pre><code>cd ~/Pictures
mkdir Screenshots
defaults write com.apple.screencapture location ~/Pictures/Screenshots
</code></pre>
<p>To have the changes take effect, type:</p>
<pre><code>killall SystemUIServer
</code></pre>
<p>Now all of your screenshots will be saved in the <em>~/Pictures/Screenshots</em> folder.</p>
<p><strong>Fixing Home & End buttons:</strong><br />
I liked the way Windows uses the <em>Home</em> and <em>End</em> buttons on a full size keyboard and the way OS X was using them was driving me crazy. OS X allows you to remap keys on your keyboard by adding a custom keyboard binding. Using a text editor (not TextEdit, it saves as RTF), create a file with the following information (just copy/paste below, including curly braces):</p>
<pre><code>{
/* Remap Home / End keys to be correct */
"\UF729" = "moveToBeginningOfLine:"; /* Home */
"\UF72B" = "moveToEndOfLine:"; /* End */
"$\UF729" = "moveToBeginningOfLineAndModifySelection:"; /* Shift + Home */
"$\UF72B" = "moveToEndOfLineAndModifySelection:"; /* Shift + End */
}
</code></pre>
<p>Save the file as <em>DefaultKeyBinding.dict</em>. Now open Finder and go to <em>~/Library/KeyBindings</em>. If the <em>KeyBindings</em> folder isn’t there, just create it. Copy the <em>DefaultKeyBinding.dict</em> file into the folder. Now the next time you restart your Mac, the <em>Home</em> and <em>End</em> keys will work like they do in Windows. <a href="#fn-3" id="fnref-3" title="see footnote" class="footnote">[3]</a></p>
<p><strong>Stop using dashboard:</strong>
I don’t use the Dashboard and find it annoying when moving between different desktops in OS X. To turn off Dashboard open a Terminal window and enter the following commands:</p>
<pre><code>defaults write com.apple.dashboard mcx-disabled -boolean YES
killall Dock
</code></pre>Figuring it out in the end...2013-06-20T00:23:54-05:002013-06-20T00:23:54-05:00Jason Verlytag:mygeekdaddy.net,2013-06-20:/2013/06/20/figuring-it-out-in-the-end/<p>I coach my 8y old's baseball team. Most nights I have a good time working with the kids and coaching through their games. Our league has pretty good set of rules to keep the play of the game fair and to protect the kids. One of the rules the coaches …</p><p>I coach my 8y old's baseball team. Most nights I have a good time working with the kids and coaching through their games. Our league has pretty good set of rules to keep the play of the game fair and to protect the kids. One of the rules the coaches discussed before the season was the following:</p>
<blockquote>
<p>In the event the baseball is hit past the outfield players or is lost in landscaping, due to the lack of a backstop on most fields, the batter shall not advance past 2nd base.</p>
</blockquote>
<p>I have seen opposing teams honor this rule by either stopping their players at 2nd base or ushering them back when the play was over and explaining to their player what happened.</p>
<p>Tonight was not one of those nights. </p>
<p>Tonight our team got to witness the lowest common denominator of sportsmanship I've seen all year. I'll be the first to admit the opposing team we played tonight was a talented team, but they also wanted to make sure we knew it. Their players ran as many bases as possible, made negative comments about plays by our team, and were just plain rude when our team did make a good out. </p>
<p>When the game was over, the other coaches and I commented about how the game went and how we couldn't believe how the opposing coaches let things go. I left the game upset and frustrated, so I went for a ride to help cool off. I can usually get a lot of thinking done when I'm on a ride and feel better just about anything, but tonight I came home feeling worse. </p>
<p>And you know what made it worse?</p>
<p><strong>When I realized I didn't say a goddamn thing.</strong></p>
<p>I was just as complicit in letting our team get snubbed as the coaches on the opposing team who were encouraging it. I'm hoping the kids on my team didn't take the game tonight to heart, because what happened wasn't their fault. I'll have to appreciate that while I didn't correct things at the time they happened, at least I figured it out in the end. </p>
<blockquote>
<p>Lesson learned: Speak up when it matters, not when you think it's convenient.</p>
</blockquote>Getting to a common ground2013-06-14T12:52:30-05:002013-06-14T12:52:30-05:00Jason Verlytag:mygeekdaddy.net,2013-06-14:/2013/06/14/getting-to-a-common-ground/<p>It’s lunch time on a Friday and my mind is going 100 mph after a great discussion with some members of the <a href="http://tivoli-ug.org/ug/local/na/usa/279/">Maximo Manufacturing Users Group</a>.<a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> Today’s topic was an open discussion on Metrics and KPI’s. While the overall discussion was good as always, a small …</p><p>It’s lunch time on a Friday and my mind is going 100 mph after a great discussion with some members of the <a href="http://tivoli-ug.org/ug/local/na/usa/279/">Maximo Manufacturing Users Group</a>.<a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> Today’s topic was an open discussion on Metrics and KPI’s. While the overall discussion was good as always, a small part of the talk has stuck with me. A discussion on a key metric a participant is using is the percent of planned jobs completed against all jobs completed. </p>
<p>While I agree this is a great metric, it was the follow up question that was the real home run.</p>
<blockquote>
What is considered a planned work order?
</blockquote>
<p>The call went quiet for a good 15 seconds while everyone pondered that one. The discussion picked up on ideas and thoughts on what a planned work order should be, but I spoke to one of the participants after the meeting and we both commented that we had the same initial reaction - a planned work order is just is planned. Hmm… I don’t know about your setup, but I haven’t been offered the <em>Read My Mind Analytics</em> module for Maximo yet. </p>
<p>So what does a planned work order look like so analytics can be applied? Some of the criteria on what a ‘planned work order’ that was discussed included:</p>
<ul>
<li>The work order is assigned to a mechanic on Labor Plans tab</li>
<li>The work order is assigned to a craft for scheduling on Labor Plans tab</li>
<li>The work order utilizes a Job Plan for work to be completed, in lieu of ad hoc job steps.</li>
<li>The work order includes all parts required for task completion</li>
<li>The work order has a Scheduled Start date</li>
</ul>
<p>Eventually this leads back to thinking about what fields should be required information to enter and process a work order. Things like:</p>
<ul>
<li>GL account</li>
<li>Work order type</li>
<li>Schedule and/or Target dates</li>
<li>Supervisor</li>
<li>Lead</li>
</ul>
<p>What has got my mind going is if two reliability professionals’ initial reaction to this question is that ‘a planned work order is just planned’, imagine how someone removed from maintenance operations is going to think about this?<a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> As I got off the phone, I started to think about other aspects of our maintenance operations that could still ambiguous to others in our company. </p>
<p>Here’s a short list I have so far:</p>
<ul>
<li>What is an overdue PM?</li>
<li>How should we measure your backlog?</li>
<li>What is considered ‘on time completion’ of a job?</li>
<li>What is considered equipment downtime?</li>
<li>When is a work order considered to properly scheduled?</li>
</ul>
<p>So what terms does your maintenance group need to define to get to a common ground with yourselves and other departments? I look forward to working with members of the Manufacturer’s User Group to lay some ground work on creating base definitions. </p>
<p>Want to talk about this more? Drop a comment or hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
I highly recommend joining this Maximo user group. They are some of the brightest minds on Maximo and asset reliability I get to speak with on a regular basis. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">
That’s assuming a topic like this is even on their radar, which it probably isn’t. <a href="#fnref-2" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>The engineering behind science...2013-06-12T10:12:11-05:002013-06-12T10:12:11-05:00Jason Verlytag:mygeekdaddy.net,2013-06-12:/2013/06/12/the-engineering-behind-science/<p>It's stuff like this that I know I could get the boys way into science.</p>
<iframe width="500" height="281" src="http://www.youtube.com/embed/7NXfyCezUFk?rel=0" frameborder="0" allowfullscreen></iframe>
<p>It's also stuff like this that I could possibly blow up the house or give my wife a heart attack.</p>Debunking the ice cube myth2013-05-29T20:59:11-05:002013-05-29T20:59:11-05:00Jason Verlytag:mygeekdaddy.net,2013-05-29:/2013/05/29/debunking-the-ice-cube-myth/<p>I see kindred spirit in Dr. Drang <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> in trying to give simple answers to divisive topics… like ice cubes. My background as an engineer has led to countless ‘discussions’ <a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> with my wife that have basically ended up with her just rolling her eyes at me and walking away …</p><p>I see kindred spirit in Dr. Drang <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> in trying to give simple answers to divisive topics… like ice cubes. My background as an engineer has led to countless ‘discussions’ <a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> with my wife that have basically ended up with her just rolling her eyes at me and walking away. Dr. Drang takes on the myth of the effect of ice cube size effectiveness. I like the fact that Dr. Drang even gives specifics, like the heat of fusion for ice. <a href="#fn-3" id="fnref-3" title="see footnote" class="footnote">[3]</a> </p>
<p>Full post can be found here: <a href="http://www.leancrew.com/all-this/2013/05/big-ice-cubes/">Big ice cubes</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
Yes, he’s been a popular fellow here. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">
I mostly get in trouble with making sure all the facts are straight first. <a href="#fnref-2" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-3">
Or as we normal engineers say, 144 BTU/lb. <a href="#fnref-3" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>It's not you, it's me...2013-05-28T12:57:43-05:002013-05-28T12:57:43-05:00Jason Verlytag:mygeekdaddy.net,2013-05-28:/2013/05/28/its-not-you-its-me/<p>One of my favorite people on the web today, Dr. Drang (<a href="https://twitter.com/drdrang">@drdgrang</a>), recently gave some thoughts on <a href="leancrew_1">blogging and readability</a> based on <a href="mattg_1">another post</a> by Matt Gemmell (<a href="https://twitter.com/mattgemmell">@mattgemmell</a>). While I agree with quite a bit of what Dr. Drang had to add, it did get me to think about the …</p><p>One of my favorite people on the web today, Dr. Drang (<a href="https://twitter.com/drdrang">@drdgrang</a>), recently gave some thoughts on <a href="leancrew_1">blogging and readability</a> based on <a href="mattg_1">another post</a> by Matt Gemmell (<a href="https://twitter.com/mattgemmell">@mattgemmell</a>). While I agree with quite a bit of what Dr. Drang had to add, it did get me to think about the subtle ways I can make what I write here the primary focus to my readers. </p>
<p>The first step I've taken is to scale back the 'bling' I've previously had on the site. The site now runs a modified version of WordPress's default TwentyTwelve theme. I've made some minor under the hood changes and significant CSS updates. I love work I've done so far that I plan to keep the theme up to date and available on <a href="https://github.com/mygeekdaddy/wp_mygeekdaddy">GitHub</a>.</p>
<p>The next step I've taken is to strip down the page layout when a reader is viewing a specific post. Why? If I'm really trying to focus on a good article, but the site has a lot of stuff (ads, widgets, etc), I'll tend to run the <a href="http://www.instapaper.com/extras">Instapaper Text bookmarklet</a> so I can focus on just the article. But when I hit the home page of a site, there may be some interesting information in the other 'stuff' people have in their sidebars. So when someone is viewing a specific post, the sidebars are suppressed so the reader can focus on the post - note the differences below. </p>
<figure><a href="http://share.mygeekdaddy.me/two_modes_of_reading.png"><img src="http://share.mygeekdaddy.me/two_modes_of_reading.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>As far as some of the comments that Matt made on blog layout/design, I tend to agree with Dr. Drang about some of the absolutes that Matt brought up, especially narrow 3 column blogs. As I continued to read through Matt's ideas on blog layout and some of the design concepts he talks about, I think Matt slightly contradicted himself by stating:</p>
<blockquote>
...I think that blogs are for their authors first, and their readership second.
</blockquote>
<p>On this point I completely agree. </p>
<p>I believe the design of a blog is an extension of the writer, with the sometimes misunderstood hope that the writer's taste doesn't drive anyone away from seeing the actual content. I've laid out my site based on my personal tastes, how I prefer to navigate a website, and about topics that interest me. </p>
<p>And in the end that's why I continue to do this... for me.</p>Using Drafts to create DOCX templates2013-05-23T23:22:22-05:002013-05-23T23:22:22-05:00Jason Verlytag:mygeekdaddy.net,2013-05-23:/2013/05/23/using-drafts-to-create-docx-templates/<p>Two important items came across my desk in the last day or so. The first was a post by David Sparks (<a href="https://twitter.com/macsparky">@Macsparky</a>) regarding a new iOS app called <a href="http://click.linksynergy.com/fs-bin/stat?id=TQ5lwGfcQQI&offerid=146261&type=3&subid=0&tmpid=1826&RD_PARM1=https%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Fmakedoc%252Fid608833658%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30">makeDoc</a>. I did a <a href="http://theothersideof.mygeekdaddy.net/2013/getting-md-to-docx/">quick post</a> on using makeDoc app. I cannot believe how such a simple app has filled gaps in …</p><p>Two important items came across my desk in the last day or so. The first was a post by David Sparks (<a href="https://twitter.com/macsparky">@Macsparky</a>) regarding a new iOS app called <a href="http://click.linksynergy.com/fs-bin/stat?id=TQ5lwGfcQQI&offerid=146261&type=3&subid=0&tmpid=1826&RD_PARM1=https%253A%252F%252Fitunes.apple.com%252Fus%252Fapp%252Fmakedoc%252Fid608833658%253Fmt%253D8%2526uo%253D4%2526partnerId%253D30">makeDoc</a>. I did a <a href="http://theothersideof.mygeekdaddy.net/2013/getting-md-to-docx/">quick post</a> on using makeDoc app. I cannot believe how such a simple app has filled gaps in my workflow. The functional use of makeDoc app has already pushed it to my iPad’s home screen. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> </p>
<p>The second piece was how Hilton Lipschitz (<a href="https://twitter.com/hiltmon">@hiltmon</a>) used MMD to create a <a href="http://www.hiltmon.com/blog/2013/05/23/letterhead-markdown-style">letterhead document via Markdown</a>:</p>
<blockquote>
I thought that letterheads went the way of the dodo about the same time fax machines and US Mail both died out. I was wrong. It turns out, sometimes to make something “official” (whatever the heck that means) you need it on letterhead. And since it’s 2013, a PDF version is acceptable.
Now I could have just dragged a logo into a Pages document, added the letterhead text, written the document, manually formatted it, PDF’d it and emailed it. But since I am probably going to do more of these, I decided to integrate letterheads into my regular Markdown process.
</blockquote>
<p>My first thought was just to make a couple of common forms in MD format and create Text Expander (TE) snippets for them. Then I realized I could take this one step further by combining the two. Here’s a new workflow I have for some common templates I need to use at work:</p>
<ol>
<li>Open Drafts on my iPad and run the TE snippet for a template in MD format. This will include images/graphics I may need to have in the form.</li>
<li>Add any custom or updated information to the form as needed.</li>
<li>With a new URL action in Drafts, copy of the MD text to the clipboard and open makeDoc app.</li>
<li>Click the icon to copy the clipboard into makeDoc app as MD text.</li>
<li>Voila! A new .docx document I can send internally as needed with the email option in makeDoc.</li>
</ol>
<p></br>
The custom action for Drafts is <a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a>:</p>
<pre><code>drafts://x-callback-url.com/create?text=[[draft]]&action={{Copy to Clipboard}}&afterSuccess=Delete&x-success={{makedoc:}}
</code></pre>
<p>Got any questions? Feel free to hit me up on Twitter at <a href="http://twitter.com/mygeekdaddy">@MyGeekDaddy</a>.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
It’s very close to making it to my dock bar too. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">
makeDoc app barks it’s getting unsupported format, but the app still takes the MD text. Not sure what’s happening there. <a href="#fnref-2" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>Quick trip to NYC...2013-05-23T14:54:20-05:002013-05-23T14:54:20-05:00Jason Verlytag:mygeekdaddy.net,2013-05-23:/2013/05/23/quick-trip-to-nyc/<p>There are only a few things in life that make me think I need to hop on a plane tomorrow and go check something out. </p>
<p>This is one of them. </p>
<blockquote>
<p>The LEGO Group today unveiled the world's largest LEGO model, a 1:1 replica of the LEGO Star Wars …</p></blockquote><p>There are only a few things in life that make me think I need to hop on a plane tomorrow and go check something out. </p>
<p>This is one of them. </p>
<blockquote>
<p>The LEGO Group today unveiled the world's largest LEGO model, a 1:1 replica of the LEGO Star Wars X-wing starfighter, in New York's Times Square.</p>
</blockquote>
<p>Full article can be found on <a href="http://starwars.com/news/massive-lego-x-wing-takes-off-in-times-square.html">Star Wars.com</a></p>Grouping on a NULL field in BIRT2013-05-08T21:33:46-05:002013-05-08T21:33:46-05:00Jason Verlytag:mygeekdaddy.net,2013-05-08:/2013/05/08/grouping-on-a-null-field-in-birt/<p>One of the trickiest things a report writer has to deal with is using a data field that may, or may not, contain data. Chon Neth <a href="https://twitter.com/maximotimes">(@MaximoTimes)</a> has a great tip on how to <a href="http://maximotimes.com/maximo/quick-tip-check-for-null-with-birt-reports-in-expression-data-binding/">manage NULL data fields</a>. But what happens when you want to group on a field that …</p><p>One of the trickiest things a report writer has to deal with is using a data field that may, or may not, contain data. Chon Neth <a href="https://twitter.com/maximotimes">(@MaximoTimes)</a> has a great tip on how to <a href="http://maximotimes.com/maximo/quick-tip-check-for-null-with-birt-reports-in-expression-data-binding/">manage NULL data fields</a>. But what happens when you want to group on a field that may have NULL data?</p>
<p>For example, a common report task is grouping work orders on those that were generated by a PM and those that weren't. So the report would have the data field <em>WORKORDER.PMNUM</em> and you want to group on that field. If you create a group of just:</p>
<pre><code>row["pmnum"]
</code></pre>
<p>The report would have a single group of work orders that have a NULL value for <em>WORKORDER.PMNUM</em> and then each PM number would be listed in its own group. But we what we wanted was essential two groups - work orders with a PM number and work orders without. So how do you get a group to just show work order that do or do not have a PM number?</p>
<p>One of the easy ways is to group on a field that may contain NULL data is to use a javascript conditional check.<sup id="fnref-2587-fn_nonull"><a href="#fn-2587-fn_nonull" rel="footnote">1</a></sup> Using the following Group Details will collect work orders that either do or do not have a PM number.</p>
<figure><a href="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/05/nullGroupDetail.jpg"><img src="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/05/nullGroupDetail.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>The <em>Group On</em> function will be:</p>
<pre><code>(row["pmnum"] == null) == true;
</code></pre>
<p>Now when the report is generated, the report will group the records by any work order that doesn't have a PM number and all records that do. </p>
<p><strong>Bonus Tip:</strong> Now because the group is based on a NULL conditional check, having a text header to describe the group should also use a conditional check. Create a new <em>Data</em> element and place it in the group header from above.</p>
<figure><a href="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/05/nullGroupHeading.jpg"><img src="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/05/nullGroupHeading.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>Click the Expression Builder button and enter the following:</p>
<figure><a href="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/05/nullGroupHeading_detail.jpg"><img src="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/05/nullGroupHeading_detail.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>The Expression is written as:</p>
<pre><code>if (dataSetRow["pmnum"] == null)
{ 'Corrective Work' }
else { 'Preventative Work' };
</code></pre>
<p>If the data row is null, the <em>Data</em> element will print 'Corrective Work', the <em>else</em> clause picks up any data row that does have a PM number and therefore will print 'Preventative Work'.</p>
<p></br>
Got any questions? Feel free to hit me up on Twitter at [@MyGeekDaddy][mgdtwitter].</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-2587-fn_nonull">
Of course the easiest way is to not group on a field that may have NULL data. <a href="#fnref-2587-fn_nonull" rev="footnote">↩</a>
</li>
</ol>
</div>Mental musings on snot rockets and bowties2013-05-04T14:07:00-05:002013-05-04T14:07:00-05:00Jason Verlytag:mygeekdaddy.net,2013-05-04:/2013/05/04/mental-musings-on-snot-rockets-and-bowties/<p>Living in Minnesota makes spring one of my favorite seasons. Not because it's getting warmer, but because I've got bored of the normal winter activities and it's time for something different.<sup id="fnref:969467"><a class="footnote-ref" href="#fn:969467">1</a></sup> One of the rites of spring where I live is getting the first ride in on a local …</p><p>Living in Minnesota makes spring one of my favorite seasons. Not because it's getting warmer, but because I've got bored of the normal winter activities and it's time for something different.<sup id="fnref:969467"><a class="footnote-ref" href="#fn:969467">1</a></sup> One of the rites of spring where I live is getting the first ride in on a local bike trail. This trail is used by cyclists, joggers, and walkers, so something usually happens when you get a bunch of people out on the trail for one of the first nice days. Now as nice as the weather has been, cycling in Minnesota, in April, can cause some <em>unique</em> nasal conditions. And as a result, most cyclists will need to clear their nasal passages in the middle of a ride.<sup id="fnref:790375"><a class="footnote-ref" href="#fn:790375">2</a></sup> </p>
<p>My mistake? </p>
<p>Doing it in front of two colleges girls who were casually walking the trail. As I continued to ride past them I heard one of them say:</p>
<blockquote>
<p>Umm, no. Did you see what he just did? Not cool.</p></p>
</blockquote>
<p>Normally when I go for a ride my mind will wander aimlessly for however long I'm out. I've had, and sometimes lost, some of the best ideas I've ever imagined while riding my bike. Now I'm not sure what interest these two young ladies had in me before I did this unmentionable act, but apparently snot rockets aren't cool. So now that I've been informed that snot rockets aren't cool, I started to make a mental list about is cool and what isn't.</p>
<p>So from the ride I learned:</p>
<ul>
<li>Bow ties are cool.</li>
<li>Snot rockets aren't cool.<sup id="fnref:753928"><a class="footnote-ref" href="#fn:753928">3</a></sup></li>
<li>Being a dad is cool.</li>
<li>Moving to the left, when someone says 'On your left' isn't cool.</li>
<li>Being married for 10 years is cool.</li>
<li>Realizing how fast it went isn't cool.</li>
<li>Beating a Yukon Denali to the next intersection is cool.</li>
<li>Acting like a child because another cyclist beat you to the next intersection isn't cool.</li>
</ul>
<p>...and the first ride in spring is <em>always</em> cool.</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:969467">
<p>This of course leads to being bored of spring and happy for summer to arrive. Thus the never ending cycle of living in a state of four seasons. <a class="footnote-backref" href="#fnref:969467" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:790375">
<p>Or otherwise known as the snot rocket. <a class="footnote-backref" href="#fnref:790375" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:753928">
<p>But they really are. <a class="footnote-backref" href="#fnref:753928" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
</ol>
</div>Been there, done this...2013-05-03T19:03:45-05:002013-05-03T19:03:45-05:00Jason Verlytag:mygeekdaddy.net,2013-05-03:/2013/05/03/been-there-done-this/<figure><a href="http://assets.amuniversal.com/14b376203c0f01300ca9001dd8b71c47?width=900.0"><img class="aligncenter size-full" id="" src="http://assets.amuniversal.com/14b376203c0f01300ca9001dd8b71c47?width=900.0" style="width:500px;" title="" /></a></figure>
<p>Pretty sure my wife and I have had this conversation before.</p>Meet the new Avengers...2013-05-03T06:06:02-05:002013-05-03T06:06:02-05:00Jason Verlytag:mygeekdaddy.net,2013-05-03:/2013/05/03/meet-the-new-avengers/<p><iframe width="500" height="281" src="http://www.youtube.com/embed/baQBTWd49j4?rel=0" frameborder="0" allowfullscreen></iframe></p>
<p>One of the coolest things I’ve seen from PBS PR team in a while. I challenged a few online friends to name the characters referenced in the clip. Sadly, most could only get two or three.</p>Gracefully trimming fields in BIRT2013-04-23T22:11:54-05:002013-04-23T22:11:54-05:00Jason Verlytag:mygeekdaddy.net,2013-04-23:/2013/04/23/gracefully-trimming-fields-in-birt/<p>There are times when report requirements can put a report writer in a box. For example, a recent request came in with the following requirements: </p>
<ul>
<li>Portrait orientation</li>
<li>No text wrapping</li>
<li>Include workorder.wonum, workorder.description, workorder.worktype, workorder.status, workorder.statusdate, sum(wplabor.regularhrs)</li>
</ul>
<p>Oops. No text wrapping <strong>and</strong> the …</p><p>There are times when report requirements can put a report writer in a box. For example, a recent request came in with the following requirements: </p>
<ul>
<li>Portrait orientation</li>
<li>No text wrapping</li>
<li>Include workorder.wonum, workorder.description, workorder.worktype, workorder.status, workorder.statusdate, sum(wplabor.regularhrs)</li>
</ul>
<p>Oops. No text wrapping <strong>and</strong> the Description field needs to be included?<sup id="fnref:234234"><a class="footnote-ref" href="#fn:234234">1</a></sup> Typically this is where a report writer has to decide on how to deal with wordy work order descriptions. An example of a common task that food industries have to do on a regular basis is sanitize tools that are used in food production areas. So an expected work order description could be: </p>
<blockquote>
<p>WEEKLY TOOL SANITATION FOR MILK RECEIVING AND PASTEURIZED PRODUCTS BAYS</p>
</blockquote>
<p>This description happens to be 'just' 71 characters long. Initial testing of the report showed that the <em>workorder.description</em> field would be too much if it was left at full length. A common way to trim a text string would be to just show 'x' number of characters starting from the left, like this: </p>
<div class="highlight"><pre><span></span><code>BirtStr.left(row["description"], 35)
</code></pre></div>
<p>This results in the following work order description: </p>
<blockquote>
<p>WEEKLY TOOL SANITATION FOR MILK RE</p>
</blockquote>
<p>While that works, leaving the <em>workorder.description</em> field to stop suddenly can raise questions by the recipient of the report: </p>
<ul>
<li>Did the report not get formatted correctly?</li>
<li>Is there an issue with the Maximo data?</li>
<li>Did someone do a sloppy job entering the work order?</li>
</ul>
<p>Not the thoughts you want running through a Plant Manager, a Maintenance Manager, or worse. A common phrase you hear in programming is making sure a program exits gracefully. Instead of just trimming the field, here's an easy method to make sure a long text field ends gracefully. Instead of including <code>BirtStr.left(row["description"], 35)</code> in a <em>Dynamic Text</em> element, use the following code:<sup id="fnref:23aasdfae"><a class="footnote-ref" href="#fn:23aasdfae">2</a></sup></p>
<div class="highlight"><pre><span></span><code><span class="k">if</span><span class="w"> </span><span class="ss">(</span><span class="nv">BirtStr</span>.<span class="nv">charLength</span><span class="ss">(</span><span class="nv">row</span>[<span class="s2">"description"</span>]<span class="ss">)</span><span class="w"> </span><span class="o">></span><span class="w"> </span><span class="mi">35</span><span class="ss">)</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">BirtStr</span>.<span class="nv">left</span><span class="ss">(</span><span class="nv">row</span>[<span class="s2">"description"</span>],<span class="w"> </span><span class="mi">33</span><span class="ss">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'...'</span><span class="w"></span>
<span class="w"> </span>}<span class="w"></span>
<span class="k">else</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="nv">row</span>[<span class="s2">"description"</span>]<span class="w"></span>
<span class="w"> </span>}<span class="w"></span>
</code></pre></div>
<p>The <code>If-Else</code> statement will take a look at and the length of the field, and if it exceeds 35 characters, it will trim it back to 33 characters and then append it with '...'. Now when the <em>workorder.description</em> field is printed on the report it will show up as: </p>
<blockquote>
<p>WEEKLY TOOL SANITATION FOR MILK ...</p>
</blockquote>
<p>This better indicates to the recipient that while not all the text is present, Maximo should have additional details if needed. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:234234">
<p>Out of the box in Maximo 7.5 the WORKORDER.DESCRIPTION field is 100 characters. <a class="footnote-backref" href="#fnref:234234" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:23aasdfae">
<p>The numbers used in this example come from a report I did where gracefully trimming a description field to 33 characters fit perfectly in a field width of 2.75", using the San Serif font at 8 points. YMMV. <a class="footnote-backref" href="#fnref:23aasdfae" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Christmas in April...2013-04-18T20:36:34-05:002013-04-18T20:36:34-05:00Jason Verlytag:mygeekdaddy.net,2013-04-18:/2013/04/18/christmas-in-april/<p>This is not how I imagined April in Minnesota.</p>
<figure><a href="http://share.mygeekdaddy.me/MG_7522.png"><img src="http://share.mygeekdaddy.me/MG_7522.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I'm not sure which is more depressing… how nice of a winter picture I got in April or that the Christmas lights are still up this late.</p>Javascript Date Functions in BIRT2013-04-17T13:33:51-05:002013-04-17T13:33:51-05:00Jason Verlytag:mygeekdaddy.net,2013-04-17:/2013/04/17/javascript-date-functions-in-birt/<p>One of the common tasks a report writer can be asked to do is sort or limit information based on certain dates or date ranges. They could use SQL functions like:</p>
<pre><code>matusetrans.actualdate >= dateadd(day, -7, convert(varchar, getdate(), 101))</code><br></pre>
<pre><code>workorder.reportdate >= getdate() - 7</code><br> </pre>
<pre><code>po.followupdate - getdate() >= 0</code><br></pre>
<pre><code>matusetrans.actualdate …</code></pre><p>One of the common tasks a report writer can be asked to do is sort or limit information based on certain dates or date ranges. They could use SQL functions like:</p>
<pre><code>matusetrans.actualdate >= dateadd(day, -7, convert(varchar, getdate(), 101))</code><br></pre>
<pre><code>workorder.reportdate >= getdate() - 7</code><br> </pre>
<pre><code>po.followupdate - getdate() >= 0</code><br></pre>
<pre><code>matusetrans.actualdate >= dateadd(month,datediff(month,1,getdate()) -1,0) and matusetrans.actualdate < dateadd(month,datediff(month,1,getdate()) +0,0)</code><br></pre>
<p>As part of the report output, the report writer could be asked to display how the date range in the report has been curated. Now the first three are relatively easy to do with built in BIRT date/time functions. But what about the last one? That SQL query is looking at the first and last day of the previous month. How can you dynamically display those kinds of dates in a Maximo BIRT report?</p>
<p>The best way to display a specific date is to use an equivalent Javascript function <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> in BIRT to the SQL date function that was used in the data selection. The common dates report writers are asked to use include:</p>
<ul>
<li>First/Last day of the previous month</li>
<li>First/Last day of the current month</li>
<li>First/Last day of the next month</li>
</ul>
<p>Each of these date functions are shown below with the SQL Server query function <a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> and the equivalent Javascript function that can be used in BIRT. </p>
<p><br></p>
<p><strong>Background:</strong><br/>
One background item that needs to be covered first is how <a href="http://www.w3schools.com/js/js_obj_array.asp">Javascript counts</a> compared to how normal people count. In Javascript the first object in a list starts at zero <code>0</code>, and not at one <code>1</code>. So when calculating/counting months in Javascript, January = 0, February = 1, ..., December = 11.</p>
<p>So when you look at some of the functions below, the following comparison is looking at January.</p>
<pre><code>getMonth() == 0
</code></pre>
<p>Other functions, like addition or subtraction, work as expected.</p>
<p><br></p>
<p><strong>First day of the previous month:</strong><br/>
Functions look for the first day of the previous month, based on what the date is today. </p>
<p><em>SQL Server Function:</em></p>
<pre><code>dateadd(month,datediff(month,1,getdate()) -1,0)
</code></pre>
<p><em>Javascript Function:</em></p>
<pre><code>now = new Date();
if (now.getMonth() == 0) {
current = new Date(now.getFullYear() - 1, 11, 1);
} else {
current = new Date(now.getFullYear(), now.getMonth() - 1, 1);
}
</code></pre>
<figure><a href="http://share.mygeekdaddy.net/first_day_prev_month_js.jpg"><img src="http://share.mygeekdaddy.net/first_day_prev_month_js.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>Last day of the previous month:</strong><br/>
Functions look for the last day of the previous month, based on what the date is today. </p>
<p><em>SQL Server Function:</em></p>
<pre><code>dateadd(day, -1, dateadd(month,datediff(month,1,getdate()) +0,0))
</code></pre>
<p><em>Javascript Function:</em> </p>
<pre><code>now = new Date();
if (now.getMonth() == 0) {
current = new Date(now.getFullYear() - 1, 11, 31);
} else {
current = new Date (new Date(now.getFullYear(), now.getMonth(), 1) - 1);
}
</code></pre>
<figure><a href="http://share.mygeekdaddy.net/last_day_prev_month_js.jpg"><img src="http://share.mygeekdaddy.net/last_day_prev_month_js.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>First day of the current month:</strong><br/>
Functions look for the first day of the current month, based on what the date is today. </p>
<p><em>SQL Server Function:</em> </p>
<pre><code>dateadd(month,datediff(month,1,getdate()) +0,0)
</code></pre>
<p><em>Javascript Function:</em> </p>
<pre><code>now = new Date();
new Date(now.getFullYear(), now.getMonth(), 1);
</code></pre>
<figure><a href="http://share.mygeekdaddy.net/first_day_cur_month_js.jpg"><img src="http://share.mygeekdaddy.net/first_day_cur_month_js.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>Last day of the current month:</strong><br/>
Functions look for the last day of the current month, based on what the date is today. </p>
<p><em>SQL Server Function:</em></p>
<pre><code>dateadd(day, -1, dateadd(month,datediff(month,1,getdate()) +1,0))
</code></pre>
<p><em>Javascript Function:</em> </p>
<pre><code>now = new Date();
new Date (new Date(now.getFullYear(), now.getMonth() +1 , 1) - 1);
</code></pre>
<figure><a href="http://share.mygeekdaddy.net/last_day_cur_month_js.jpg"><img src="http://share.mygeekdaddy.net/last_day_cur_month_js.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>First Day of Next Month:</strong><br/>
Functions look for the first day of the next month, based on what the date is today. </p>
<p><em>SQL Server Function:</em></p>
<pre><code>dateadd(month,datediff(month,1,getdate()) +1,0)
</code></pre>
<p><em>Javascript Function:</em> </p>
<pre><code>now = new Date();
if (now.getMonth() == 11) {
current = new Date(now.getFullYear() + 1, 1, 1);
} else {
current = new Date(now.getFullYear(), now.getMonth() +1 , 1);
}
</code></pre>
<figure><a href="http://share.mygeekdaddy.net/first_day_next_month_js.jpg"><img src="http://share.mygeekdaddy.net/first_day_next_month_js.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>Last Day of Next Month:</strong><br/>
Functions look for the last day of the next month, based on what the date is today. </p>
<p><em>SQL Server Function:</em></p>
<pre><code>dateadd(day, -1, dateadd(month,datediff(month,1,getdate()) +2,0))
</code></pre>
<p><em>Javascript Function:</em> </p>
<pre><code>now = new Date();
if (now.getMonth() == 11) {
current = new Date(now.getFullYear() + 1, 1, 31);
} else {
current = new Date(new Date(now.getFullYear(), now.getMonth() +2 , 1) -1 );
}
</code></pre>
<figure><a href="http://share.mygeekdaddy.net/last_day_next_month_js.jpg"><img src="http://share.mygeekdaddy.net/last_day_next_month_js.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p><strong>Implementing in BIRT Report:</strong><br/>
To get these date fields into BIRT, the best way is to put the Javascript function into a <em>DATA</em> element and not in a <em>Dynamic Text</em> element. Why? A <em>DATA</em> element allows for formatting changes, which means we can modify the date format of the date field. A <em>Dynamic Text</em> element assumes the information will be just text and therefore has no formatting options.</p>
<p>In the BIRT report right click and insert a <em>DATA</em> element.</p>
<figure><a href="http://share.mygeekdaddy.net/insert_data_type_birt.jpg"><img src="http://share.mygeekdaddy.net/insert_data_type_birt.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Once the <em>DATA</em> element is created, insert the applicable Javascript function from above into the <em>Expression</em> field for the element. As stated before, because the Javascript function has been entered as a <em>DATA</em> element, the date field can be formatted any way the report writer needs.</p>Validate KPI's & Metrics in Maximo2013-04-15T22:14:22-05:002013-04-15T22:14:22-05:00Jason Verlytag:mygeekdaddy.net,2013-04-15:/2013/04/15/validate-kpis-metrics-in-maximo/<p>One of the key things a reliability professional is asked to do is look at ways their organization should be measuring their performance against known metrics. One of the best lists I've found is <a href="http://library.smrp.org/ind_metrics">SMRP's Metrics & KPI's</a> list.<sup id="fnref:rfaddsf"><a class="footnote-ref" href="#fn:rfaddsf">1</a></sup> This is a list of recognized metrics and KPI's an organization …</p><p>One of the key things a reliability professional is asked to do is look at ways their organization should be measuring their performance against known metrics. One of the best lists I've found is <a href="http://library.smrp.org/ind_metrics">SMRP's Metrics & KPI's</a> list.<sup id="fnref:rfaddsf"><a class="footnote-ref" href="#fn:rfaddsf">1</a></sup> This is a list of recognized metrics and KPI's an organization can use to monitor the performance of their maintenance group. One of the most common metrics organizations can use is the <a href="http://www.google.com/search?client=safari&rls=en&q=maintenance+PM+to+CM+ratio+metric&ie=UTF-8&oe=UTF-8">PM to CM ratio</a>. The goal for the <em>PM to CM Ratio</em> metric is to monitor how much Preventative(PM) and/or Predictive (PdM) maintenance work is being completed as compared to Corrective maintenance (CM). If the work a maintenance department is getting done is generated from breakdown or ad-hoc work, this ratio will be low (typically less than 1.0). If the work a maintenance department is getting done is generated from PM/PdM work, thus addressing issues before the equipment breaks down, the ratio will be higher (typically between 2.0 and 3.0).<sup id="fnref:rfadd234sf"><a class="footnote-ref" href="#fn:rfadd234sf">2</a></sup> A common task most organizations don't complete is validating the metrics and information that is being collected. A reliability engineer, or maintenance manager, will start measuring a key piece of information based on industry standards, run metric for a while, but then never take any steps to see if the data is being manipulated or is still accurate from the initial assessment. </p>
<p>Take a look at the following chart<sup id="fnref:rfadjfj4sf"><a class="footnote-ref" href="#fn:rfadjfj4sf">3</a></sup> showing the PM to CM work order ratio for a various plant sites: </p>
<figure><a href="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/04/pm2cm_count.png"><img src="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/04/pm2cm_count.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>From this chart, it would appear that Site #5 is doing a pretty good job at moving to a highly proactive PM/PdM environment. So how can we validate their efforts? One way is how many man hours are being put into PM/PdM work. </p>
<figure><a href="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/04/pm2cm_hours.png"><img src="http://theothersideof.mygeekdaddy.net/wp-content/uploads/2013/04/pm2cm_hours.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Huh. </p>
<p>While Site #5 has a 2.23:1 PM to CM work order ratio, it only has a 0.46:1 PM to CM ratio for man hours charged. Digging deeper into the root cause of the discrepancy, it was found Site #5 had started to shift from routed PM work orders to individual PM work orders. The site understood how this metric worked and found a way to alter the results of the metric without making any significant changes to their work processes.<sup id="fnref:fhjfhj987j4sf"><a class="footnote-ref" href="#fn:fhjfhj987j4sf">4</a></sup></p>
<h4>Maintenance Rule #5:</h4>
<blockquote>
<p>Validate your metrics or you don't know what's really happening.</p>
</blockquote>
<h4>SQL Query for Maximo KPI to monitor PM to CM Labor Hours:</h4>
<p>Listed below is the SQL query to use in Maximo's KPI module to generate a PM to CM labor hour ratio. The entire query should be placed in the 'Select' box and the 'Where' box will remain empty. Make sure to leave the number type to 'Decimal'.<sup id="fnref:fhka4baf"><a class="footnote-ref" href="#fn:fhka4baf">5</a></sup></p>
<div class="highlight"><pre><span></span><code><span class="n">select</span><span class="w"> </span><span class="p">(</span><span class="n">select</span><span class="w"> </span><span class="n">sum</span><span class="p">(</span><span class="n">labtrans</span><span class="o">.</span><span class="n">regularhrs</span><span class="p">)</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">labtrans</span><span class="w"> </span><span class="n">join</span><span class="w"> </span><span class="n">workorder</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">refwo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">workorder</span><span class="o">.</span><span class="n">wonum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">workorder</span><span class="o">.</span><span class="n">siteid</span><span class="w"> </span><span class="n">where</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">siteid</span><span class="o">=</span><span class="s1">'BEDFORD'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">startdate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">14</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">startdate</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">workorder</span><span class="o">.</span><span class="n">worktype</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="p">(</span><span class="s1">'PM'</span><span class="p">,</span><span class="w"> </span><span class="s1">'PDM'</span><span class="p">))</span><span class="w"> </span><span class="o">/</span><span class="w"> </span><span class="p">(</span><span class="n">select</span><span class="w"> </span><span class="n">sum</span><span class="p">(</span><span class="n">labtrans</span><span class="o">.</span><span class="n">regularhrs</span><span class="p">)</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">labtrans</span><span class="w"> </span><span class="n">join</span><span class="w"> </span><span class="n">workorder</span><span class="w"> </span><span class="n">on</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">refwo</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">workorder</span><span class="o">.</span><span class="n">wonum</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">workorder</span><span class="o">.</span><span class="n">siteid</span><span class="w"> </span><span class="n">where</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">siteid</span><span class="o">=</span><span class="s1">'BEDFORD'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">startdate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">14</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">labtrans</span><span class="o">.</span><span class="n">startdate</span><span class="w"> </span><span class="o"><</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">workorder</span><span class="o">.</span><span class="n">worktype</span><span class="w"> </span><span class="ow">not</span><span class="w"> </span><span class="ow">in</span><span class="w"> </span><span class="p">(</span><span class="s1">'PM'</span><span class="p">,</span><span class="w"> </span><span class="s1">'PDM'</span><span class="p">))</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">dummy_table</span><span class="w"></span>
</code></pre></div>
<div class="footnote">
<hr>
<ol>
<li id="fn:rfaddsf">
<p>Note: The PDF from SMRP has to be purchased for full details. <a class="footnote-backref" href="#fnref:rfaddsf" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:rfadd234sf">
<p>Look for a future post on the philosophy of Proactive vs Reactive maintenance. <a class="footnote-backref" href="#fnref:rfadd234sf" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
<li id="fn:rfadjfj4sf">
<p>Charts are from a test/development database and in <strong>no way</strong> reflect how I would operate a maintenance department. <a class="footnote-backref" href="#fnref:rfadjfj4sf" title="Jump back to footnote 3 in the text">↩</a></p>
</li>
<li id="fn:fhjfhj987j4sf">
<p>While the charts are fake, one of my plants thought this was a good way to make their numbers look better. <a class="footnote-backref" href="#fnref:fhjfhj987j4sf" title="Jump back to footnote 4 in the text">↩</a></p>
</li>
<li id="fn:fhka4baf">
<p>The SQL statement for the KPI query were written for SQL Server. I'll update the post and give credit to anyone who wants to translate the statement for Oracle or DB2. <a class="footnote-backref" href="#fnref:fhka4baf" title="Jump back to footnote 5 in the text">↩</a></p>
</li>
</ol>
</div>Snot rockets & bow ties2013-04-05T14:15:23-05:002013-04-05T14:15:23-05:00Jason Verlytag:mygeekdaddy.net,2013-04-05:/2013/04/05/snot-rockets-bow-ties/<p>Living in Minnesota makes spring one of my favorite seasons. Not because it's getting warmer, but because I've got bored of the normal winter activities and it's time for something different. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> One of the rites of spring where I live is getting the first ride in on a local …</p><p>Living in Minnesota makes spring one of my favorite seasons. Not because it's getting warmer, but because I've got bored of the normal winter activities and it's time for something different. <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> One of the rites of spring where I live is getting the first ride in on a local bike trail. This trail is used by cyclists, joggers, and walkers, so something usually happens when you get a bunch of people out on the trail for one of the first nice days.</p>
<p>Now as nice as the weather has been, cycling in Minnesota, in April, can cause some <em>unique</em> nasal conditions. And as a result, most cyclists will need to clear their nasal passages in the middle of a ride.<a href="#fn-2" id="fnref-2" title="see footnote" class="footnote">[2]</a> My mistake? Doing it in front of two colleges girls who were casually walking the trail. </p>
<p>As I continued to ride past them I heard one of them say:</p>
<blockquote>
Umm, no. Did you see what he just did? Not cool.
</blockquote>
<p>Now I'm not sure what interest these two had in me before I did the unmentionable act, but apparently snot rockets aren't cool.</p>
<p>Normally when I go for a ride my mind will wander aimlessly for however long I'm out. I've had, and sometimes lost, some of the best ideas I've ever imagined while riding my bike. So now that I've been informed that snot rockets aren't cool, I started to make a mental list about is cool and what isn't. </p>
<p>So from the ride I learned:</p>
<ul>
<li>Bow ties are cool.</li>
<li>Snot rockets aren't cool.</li>
<li>Being a dad is cool.</li>
<li>Going left, when someone says 'On your left' isn't cool.</li>
<li>Being married for 10 years is cool.</li>
<li>Realizing how fast it went isn't cool.</li>
<li>Beating a Yukon Denali to the next intersection is cool.</li>
<li>Acting like a child because a cyclist beat you to the next intersection isn't cool.</li>
</ul>
<p>... and the first ride in spring is <em>always</em> cool.</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
This of course leads to being bored of spring and happy for summer to arrive. Thus the never ending cycle of living in a state of four seasons. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
<li id="fn-2">
Or otherwise known as the snot rocket. <a href="#fnref-2" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>3882 days ago....2013-04-03T00:37:52-05:002013-04-03T00:37:52-05:00Jason Verlytag:mygeekdaddy.net,2013-04-03:/2013/04/03/3882-days-ago/<p>3882 days a go I met someone very special.
<br />
<br /></p>
<p>105 days later I asked her a very special question. She said no.</p>
<p>118 days later I asked her again. She said no again.</p>
<p>138 days later I asked her for a third time. This time she said yes.</p>
<p>229 days …</p><p>3882 days a go I met someone very special.
<br />
<br /></p>
<p>105 days later I asked her a very special question. She said no.</p>
<p>118 days later I asked her again. She said no again.</p>
<p>138 days later I asked her for a third time. This time she said yes.</p>
<p>229 days later we got married.</p>
<p>944 days later we had our first baby.</p>
<p>1899 days later we had our second. </p>
<p>2560 days later we moved to a new home.
<br />
<br /> </p>
<p>And 3882 days later, Holly and I are celebrating our 10th anniversary.</p>
<p>Happy Anniversary sweetie!!!</p>March madness... Geek Dad style2013-03-25T13:38:06-05:002013-03-25T13:38:06-05:00Jason Verlytag:mygeekdaddy.net,2013-03-25:/2013/03/25/march-madness-geek-dad-style/<p>The kids and I have finally found a bracket we get sink our teeth into. Introducing March Madness the way it should be.</p>
<figure><a href="http://share.mygeekdaddy.me/2013/03/20130325-134339.jpg"><img src="http://share.mygeekdaddy.me/2013/03/20130325-134339.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now I wonder what the over/under is on Darth Vader winning it all?</p>Geek Task Management2013-03-19T22:41:37-05:002013-03-19T22:41:37-05:00Jason Verlytag:mygeekdaddy.net,2013-03-19:/2013/03/19/geek-task-management/<figure><a href="http://share.mygeekdaddy.me/20130319-223950.jpg"><img src="http://share.mygeekdaddy.me/20130319-223950.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>Nothing could be further from the truth.<sup id="fnref:awedsfac"><a class="footnote-ref" href="#fn:awedsfac">1</a></sup></p>
<p>Edit: Both Clark Globe and Dr. Drang linked to this post. I'm still looking into what happened to the original post, but the important part was the graph above. [2013-04-14]</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:awedsfac">
<p>I wish I could give original attribute to, but that was trickier …</p></li></ol></div><figure><a href="http://share.mygeekdaddy.me/20130319-223950.jpg"><img src="http://share.mygeekdaddy.me/20130319-223950.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>Nothing could be further from the truth.<sup id="fnref:awedsfac"><a class="footnote-ref" href="#fn:awedsfac">1</a></sup></p>
<p>Edit: Both Clark Globe and Dr. Drang linked to this post. I'm still looking into what happened to the original post, but the important part was the graph above. [2013-04-14]</p>
<div class="footnote">
<hr>
<ol>
<li id="fn:awedsfac">
<p>I wish I could give original attribute to, but that was trickier than I thought - <a href="http://bit.ly/YVypRg">Google Search</a>. <a class="reversefootnote" title="return to article" href="#fnref-1"> <a class="footnote-backref" href="#fnref:awedsfac" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
</ol>
</div>The Minnesota way...2013-03-17T22:33:20-05:002013-03-17T22:33:20-05:00Jason Verlytag:mygeekdaddy.net,2013-03-17:/2013/03/17/the-minnesota-way/<p>I'm sitting down with a bowl of ice cream in the middle of a blizzard. </p>
<p>That's how we do things in Minnesota.</p>Keyboard Maestro - Mac Shutdown Macro2013-03-15T20:33:36-05:002013-03-15T20:33:36-05:00Jason Verlytag:mygeekdaddy.net,2013-03-15:/2013/03/15/keyboard-maestro-mac-shutdown-macro/<p>When I shutdown my Mac I want to make sure it’s in a state that it can be booted up again, anywhere, with out any worries. At minimum this means muting the sound and turning off the wifi. So here’s a quick Keyboard Maestro macro to shut down …</p><p>When I shutdown my Mac I want to make sure it’s in a state that it can be booted up again, anywhere, with out any worries. At minimum this means muting the sound and turning off the wifi. So here’s a quick Keyboard Maestro macro to shut down my Mac with ease.</p>
<figure><a href="http://share.mygeekdaddy.net/km_mbp_shutdown.png"><img src="http://share.mygeekdaddy.net/km_mbp_shutdown.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Sometimes it’s scratching the little itches that feels so good.</p>
<p>You can download the macro here: <a href="http://share.mygeekdaddy.net/Shutdown_MBP.kmmacros.zip">KM Mac Shutdown Macro</a>. Just remove the .zip extension to use.</p>Highlights from Las Vegas...2013-03-11T15:08:13-05:002013-03-11T15:08:13-05:00Jason Verlytag:mygeekdaddy.net,2013-03-11:/2013/03/11/highlights-from-las-vegas/<p>I'm still recovering at work from my recent road trip to my IBM Pulse conference (aka Las Vegas), but spending a relatively quiet weekend at home has helped get my head straight. It was great being able to spend some time with Mom and Dad before the conference and the …</p><p>I'm still recovering at work from my recent road trip to my IBM Pulse conference (aka Las Vegas), but spending a relatively quiet weekend at home has helped get my head straight. It was great being able to spend some time with Mom and Dad before the conference and the professional shuttle service they provide (thanks again for all the driving guys!). There were two major highlights from the trip. First was sitting in on a poker game with Dad and going toe to toe in a 4-8 Hold'em game. For the most part, Dad and I didn't get into too many hands together. There was one hand that I had Dad with a higher two pair until he got his full house on the river. But the big one was going down the wire in a $260 pot and winning with a full house, deuces over eights. That was a very fun hand. </p>
<p>The second one was winning an autographed Carrie Underwood CD via a photo contest. The contest was to get the best "social" picture and share it via social media. I was lucky enough to be selected and announced during the Tuesday keynote. </p>
<p>The winning photo is below.</p>
<figure><a href="http://share.mygeekdaddy.net/ibmpulse1.png"><img src="http://share.mygeekdaddy.net/ibmpulse1.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>Oh, you needed something?2013-03-04T13:05:58-06:002013-03-04T13:05:58-06:00Jason Verlytag:mygeekdaddy.net,2013-03-04:/2013/03/04/oh-you-needed-something/<p>Background for the story:</p>
<p>9:42am - Email from \<redacted></p>
<blockquote>
<p>Can you give me a call, I have a question.</p>
</blockquote>
<p>9:53am - Email from \<redacted> again</p>
<blockquote>
<p>Dropped you a note to give me a call.</p>
</blockquote>
<p>10:02am - Email from \<redacted> again</p>
<blockquote>
<p>Why can’t you give me a call? I have an urgent question …</p></blockquote><p>Background for the story:</p>
<p>9:42am - Email from \<redacted></p>
<blockquote>
<p>Can you give me a call, I have a question.</p>
</blockquote>
<p>9:53am - Email from \<redacted> again</p>
<blockquote>
<p>Dropped you a note to give me a call.</p>
</blockquote>
<p>10:02am - Email from \<redacted> again</p>
<blockquote>
<p>Why can’t you give me a call? I have an urgent question!</p>
</blockquote>
<p>I needed to look up something a team member had previously sent me, so I did a quick check of my inbox. I saw the three messages and gave the person a call. As soon as the person answered they were livid that I hadn’t given them a call back yet, it was now 10:04am. So they had to wait a total of 22 minutes.</p>
<p style="text-align:center;font-weight:bold">22 minutes…</p>
<p>I let the person finish and asked one simple question, ‘Then why didn’t you call me?’</p>
<p>They sat dumbfounded for a second or two and then went on about how busy they are and all the things they are trying to get done today. I again let the person finish and gently <a href="#fn-1" id="fnref-1" title="see footnote" class="footnote">[1]</a> tried to explain I’m trying to get my stuff done too. I said I don’t sit at my desk with my email open, constantly watching and waiting for someone to interrupt the work I’m trying to get done. </p>
<p>I ended my reasoning with one final comment:</p>
<p style="text-align:center;font-weight:bold;font-size:1.3em">Email is not IM</p>
<div class="footnotes">
<hr />
<ol>
<li id="fn-1">
Ok… there may have been a small tinge of snarky in my voice. <a href="#fnref-1" title="return to article" class="reversefootnote"> ↩</a>
</li>
</ol>
</div>True Minnesotan2013-02-19T21:34:41-06:002013-02-19T21:34:41-06:00Jason Verlytag:mygeekdaddy.net,2013-02-19:/2013/02/19/true-minnesotan/<p>It's -8°F outside and I'm having ice cream for a late night snack.</p>
<p>Honestly it could be -40°F and I'd still have ice cream for a late night snack.</p>Karma...2013-01-15T13:51:54-06:002013-01-15T13:51:54-06:00Jason Verlytag:mygeekdaddy.net,2013-01-15:/2013/01/15/karma/<p>One of my favorite lines from the latest Batman movie is when Catwoman disappears quietly while Batman turns away for a second while he's talking to her. He was notorious for doing this to others in the first two movies. So as Batman looks around he mutters to himself,</p>
<blockquote>
<p>Huh …</p></blockquote><p>One of my favorite lines from the latest Batman movie is when Catwoman disappears quietly while Batman turns away for a second while he's talking to her. He was notorious for doing this to others in the first two movies. So as Batman looks around he mutters to himself,</p>
<blockquote>
<p>Huh, so that's what it feels like.</p>
</blockquote>
<p>I've had a running history of people coming to me for assistance, and as I repeat the steps of the problem, what ever glitch I was supposed to help with, happens to go away. Family and friends are especially annoyed when this happens 2 or 3 times in a row (my wife is up to 7 or 8 now). Today, after several calls into IBM support with a recurring problem I was having, I had a remote session call to diagnose the issue. Right on cue… everything worked because the support person was on the phone.</p>
<p>My wife was especially amused when she found out what happened.</p>Common Date-Time SQL Server Statements2013-01-12T13:35:15-06:002013-01-12T13:35:15-06:00Jason Verlytag:mygeekdaddy.net,2013-01-12:/2013/01/12/common-date-time-sql-server-statements/<p>One of the common tasks a Maximo user is asked to do is find information based on a date range. Overtime some of these requests become repetitive enough in nature that it makes sense to create queries that can <em>automatically</em> update upon use. Listed below are some common date/time …</p><p>One of the common tasks a Maximo user is asked to do is find information based on a date range. Overtime some of these requests become repetitive enough in nature that it makes sense to create queries that can <em>automatically</em> update upon use. Listed below are some common date/time SQL query statements that can be used to help make standard search queries automatically roll with date changes. </p>
<p>In all of the SQL statements below<sup id="fnref:2342asdfvs"><a class="footnote-ref" href="#fn:2342asdfvs">1</a></sup>, the results assume that the current date/time would be: <code>2013-01-11 10:30:22.713</code>. </p>
<p>Almost all of the heavy lifting shown below is using a the <em>DATEADD</em><sup id="fnref:2fhjfhfvs"><a class="footnote-ref" href="#fn:2fhjfhfvs">2</a></sup> function and a date/time conversion with: </p>
<div class="highlight"><pre><span></span><code><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">)</span><span class="w"></span>
</code></pre></div>
<p>That conversion changes the current date/time value to just a date value. When this occurs the subsequest adjustments made by <em>DATEADD</em> function make the assumption that the date is no longer just <code>2013-01-11</code> but is <code>2013-01-11 00:00:00.000</code>. </p>
<h4>Searching between dates</h4>
<p>One of the common search items is to find records based on date ranges. To set up the example, using the Advanced Search function in WO Tracking, a user goes in and searches for all work orders reported between today and last Saturday (1/5). The goal is to show all the work orders reported in the last 7d. If the user enters:</p>
<blockquote>
<p>Reported Date From: 1/6/13 <br>
Reported Date To: 1/11/13 </p>
</blockquote>
<p>The resulting query Where Clause would look something like this:</p>
<div class="highlight"><pre><span></span><code><span class="o">((</span><span class="nt">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'WORKORDER'</span><span class="w"> </span><span class="nt">or</span><span class="w"> </span><span class="nt">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'ACTIVITY'</span><span class="o">)</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">reportdate</span><span class="w"> </span><span class="o">&</span><span class="nt">lt</span><span class="o">;=</span><span class="w"> </span><span class="p">{</span><span class="err">ts</span><span class="w"> </span><span class="err">'2013-01-11</span><span class="w"> </span><span class="err">23:59:59.000'</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">historyflag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'BEDFORD'</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">istask</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">reportdate</span><span class="w"> </span><span class="o">&</span><span class="nt">gt</span><span class="o">;=</span><span class="w"> </span><span class="p">{</span><span class="err">ts</span><span class="w"> </span><span class="err">'2013-01-06</span><span class="w"> </span><span class="err">00:00:00.000'</span><span class="w"> </span><span class="p">}</span><span class="o">)</span><span class="w"></span>
</code></pre></div>
<p>Note how the <em>To Date</em> was automatically adjusted to be the end of the day at 23:59:59. While this is the most accurate SQL statement to return the desired results, how likely is it that a work order was reported in the 1 second before midnight? So an alternate search Where Clause could be: </p>
<div class="highlight"><pre><span></span><code><span class="o">((</span><span class="nt">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'WORKORDER'</span><span class="w"> </span><span class="nt">or</span><span class="w"> </span><span class="nt">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'ACTIVITY'</span><span class="o">)</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">reportdate</span><span class="w"> </span><span class="o">&</span><span class="nt">lt</span><span class="o">;</span><span class="w"> </span><span class="p">{</span><span class="err">ts</span><span class="w"> </span><span class="err">'2013-01-12</span><span class="w"> </span><span class="err">00:00:00.000'</span><span class="w"> </span><span class="p">}</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">historyflag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'BEDFORD'</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">istask</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nt">0</span><span class="w"> </span><span class="nt">and</span><span class="w"> </span><span class="nt">reportdate</span><span class="w"> </span><span class="o">&</span><span class="nt">gt</span><span class="o">;=</span><span class="w"> </span><span class="p">{</span><span class="err">ts</span><span class="w"> </span><span class="err">'2013-01-06</span><span class="w"> </span><span class="err">00:00:00.000'</span><span class="w"> </span><span class="p">}</span><span class="o">)</span><span class="w"></span>
</code></pre></div>
<p>Unless your results are absolutely critical to be in specific date range, doing query ranges from midnight to midnight are far more easily managed. Most of the examples below will be based on this philosphy. <em>(Note: one minor difference between the two queries is the latter date range selection uses '<', not the '<=' as returned from the Advanced Search version)</em> </p>
<h4>Getting Date/Time for 00:00:00.000</h4>
<p>As previously stated, a simple way to conduct date range searches is to go from midnight to midnight. But how do you get a date value and change the time to 00:00:00.000. The following statement: </p>
<div class="highlight"><pre><span></span><code><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"></span>
</code></pre></div>
<p>This will return the following value: <code>2013-01-11 00:00:00.000</code></p>
<p>To adjust the date that is returned you modify the <code>+0</code> value. A postive will return 'x' number of future days from today and a negative will return 'x' number of past days from today. The following statement:</p>
<div class="highlight"><pre><span></span><code><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"></span>
</code></pre></div>
<p>Will return the following result: <code>2013-01-04 00:00:00.000</code></p>
<p>So to update the search query previously listed, to show work orders reported in the last 7d, would look like this: </p>
<div class="highlight"><pre><span></span><code><span class="p">((</span><span class="n">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'WORKORDER'</span><span class="w"> </span><span class="ow">or</span><span class="w"> </span><span class="n">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'ACTIVITY'</span><span class="p">)</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">reportdate</span><span class="w"> </span><span class="o">&</span><span class="n">lt</span><span class="p">;</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">historyflag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'BEDFORD'</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">istask</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">reportdate</span><span class="w"> </span><span class="o">&</span><span class="n">gt</span><span class="p">;</span><span class="o">=</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">6</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">)))</span><span class="w"></span>
</code></pre></div>
<h4>First Day of the Month</h4>
<p>Similiar to finding items in a date range, there are requests to find everything in a given month. Using the same analogy of midnight to midnight, users should search from 1st day of the month to the 1st day of the month. The following statement will result in the first day of the current month: </p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p>This statement will return a result of: <code>2013-01-01 00:00:00.000</code></p>
<p>To adjust the date return, for example for 1st day of last month, change the <code>+0</code> to <code>-1</code>, as shown below:</p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="o">-</span><span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p>This will return the value of: <code>2012-12-01 00:00:00.000</code></p>
<p>This is especially useful when dealing with date range queries in Decemeber and January where month and year rollovers can cause problems with other types of monthly summmary queries. The following query would show all the work orders in the previous month [Dec 2012]: </p>
<div class="highlight"><pre><span></span><code><span class="ss">((</span><span class="nv">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'WORKORDER'</span><span class="w"> </span><span class="nv">or</span><span class="w"> </span><span class="nv">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'ACTIVITY'</span><span class="ss">)</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">reportdate</span><span class="w"> </span><span class="o">&</span><span class="nv">lt</span><span class="c1">; dateadd(month,datediff(month,1,getdate())+0,0) and historyflag = 0 and siteid = 'BEDFORD' and istask = 0 and reportdate &gt;= {dateadd(month,datediff(month,1,getdate())-1,0) )</span><span class="w"></span>
</code></pre></div>
<h4>But I have to have 11:59pm</h4>
<p>There are times where a query must be validated or set to ensure it is getting the desired date range, similar to the way the original query from Advanced Search works. The following query will result in a value just before midnight of the current date: </p>
<div class="highlight"><pre><span></span><code><span class="n">select</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">second</span><span class="p">,</span><span class="w"> </span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="p">(</span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="o">+</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))))</span><span class="w"></span>
</code></pre></div>
<p>This will return the following result: <code>2013-01-11 23:59:59.000</code></p>
<p>This query is basically doing two <code>dateadd</code> functions. The first one gets the midnight date for tomorrow and then subtracts 1 second, giving the result of <code>23:59:59.000</code> for today. So to get the last second before midnight, in the previous month, the statement would be:</p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">second</span>,<span class="w"> </span><span class="o">-</span><span class="mi">1</span>,<span class="w"> </span><span class="ss">(</span><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)))</span><span class="w"></span>
</code></pre></div>
<p>Using the 11:59pm date query would result in a Where Clause similar to the original one generated by the Advanced Search: </p>
<div class="highlight"><pre><span></span><code><span class="ss">((</span><span class="nv">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'WORKORDER'</span><span class="w"> </span><span class="nv">or</span><span class="w"> </span><span class="nv">woclass</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'ACTIVITY'</span><span class="ss">)</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">reportdate</span><span class="w"> </span><span class="o">&</span><span class="nv">lt</span><span class="c1">;= dateadd(second, -1, (dateadd(month,datediff(month,1,getdate())+0,0))) and historyflag = 0 and siteid = 'BEDFORD' and istask = 0 and reportdate &gt;= dateadd(month,datediff(month,1,getdate())-1,0) )</span><span class="w"></span>
</code></pre></div>
<p>This would give you all the work orders generated last month that are still open. </p>
<div class="footnote">
<hr>
<ol>
<li id="fn:2342asdfvs">
<p>The examples listed above are for SQL Server. An equivalent set of rules for Oracle and DB2 is in the works. <a class="footnote-backref" href="#fnref:2342asdfvs" title="Jump back to footnote 1 in the text">↩</a></p>
</li>
<li id="fn:2fhjfhfvs">
<p>The DATEADD function is a specific SQL Server function. Reference for the DATEADD function can be found <a href="http://www.w3schools.com/sql/func_dateadd.asp">here</a>. Oracle and DB2 use an equivalent function called <em>TRUNC</em>. Reference information on the <em>TRUNC</em> function can be found <a href="http://www.techonthenet.com/oracle/functions/trunc_date.php">here. <a class="footnote-backref" href="#fnref:2fhjfhfvs" title="Jump back to footnote 2 in the text">↩</a></p>
</li>
</ol>
</div>Why LEGO continues to impress me2012-12-05T08:24:59-06:002012-12-05T08:24:59-06:00Jason Verlytag:mygeekdaddy.net,2012-12-05:/2012/12/05/why-lego-continues-to-impress-me/<p>If you've known me for any length of time, you'll find out that I'm still a die hard LEGO fan. Now this venerable company has taken their reputation as being an amazing group to a whole new level. The premise of the story is:</p>
<blockquote>
<p>... 11-year-old boy saves up his money …</p></blockquote><p>If you've known me for any length of time, you'll find out that I'm still a die hard LEGO fan. Now this venerable company has taken their reputation as being an amazing group to a whole new level. The premise of the story is:</p>
<blockquote>
<p>... 11-year-old boy saves up his money for two years to buy a LEGO train set only to find out it isn’t being made anymore and is now a collectible, completely out of his price range.</p>
</blockquote>
<p>This is where LEGO steps in and makes some magic. </p>
<p>Link to entire article is here: <a href="http://consumerist.com/2012/12/03/lego-finds-spare-discontinued-set-so-boy-who-saved-up-for-2-years-wouldnt-be-disappointed/" target="_blank">LEGO Finds spare set for boy who saved 2 years</a>.</p></p>Optimize BIRT Report Performance2012-12-03T13:36:40-06:002012-12-03T13:36:40-06:00Jason Verlytag:mygeekdaddy.net,2012-12-03:/2012/12/03/optimize-birt-report-performance/<p>One of my favorite Maximo/BIRT sites is <a href="http://maximodev.blogspot.com/" target="_blank">Bruno Portaluri's</a>. He's an IBM IT Architect and has some of the best details related to Maximo customization and development. One his posts that is resonating with me right now is <a href="http://maximodev.blogspot.com/2012/03/report-execution-time.html" target="_blank">how to analyze report performance</a>. A lot of time and effort …</p><p>One of my favorite Maximo/BIRT sites is <a href="http://maximodev.blogspot.com/" target="_blank">Bruno Portaluri's</a>. He's an IBM IT Architect and has some of the best details related to Maximo customization and development. One his posts that is resonating with me right now is <a href="http://maximodev.blogspot.com/2012/03/report-execution-time.html" target="_blank">how to analyze report performance</a>. A lot of time and effort is made by Maximo administrators to get the Maximo environment to run as quickly and crisply as possible. But what experience does an end user get when the application is snappy, but it takes several minutes to run a report? Here are some ways to look at your BIRT performance and speed up your trouble makers. </p></p>
<h4>Getting the data</h4>
<p>In Bruno's post, he took a look at how to get data from Maximo on your BIRT report performance. Maximo has a table called REPORTUSAGELOG and that data <a href="https://www.ibm.com/developerworks/mydeveloperworks/blogs/a9ba1efe-b731-4317-9724-a181d6155e3a/entry/bilog_identifying_active_and_inactive_reports_thru_report_usage4?lang=en" target="_blank">is generated by a cron task</a>. Unless you, or your Maximo administrator, has changed the cron task setting you will have 30 days worth of data on the REPORTUSAGELOG table. The query that Bruno used to collect the BIRT performance is:</p>
<blockquote>
<p>SELECT AVG(enddate-startdate)*24*60, reportname<br>FROM reportusagelog<br>GROUP BY reportname<br>ORDER BY AVG(enddate-startdate) DESC</p>
</blockquote>
<p>If you happen to use SQL Server for your Maximo environment, you'll find this query will end up with the following error: </p>
<div class="highlight"><pre><span></span><code><span class="nv">Msg</span><span class="w"> </span><span class="mi">8117</span>,<span class="w"> </span><span class="nv">Level</span><span class="w"> </span><span class="mi">16</span>,<span class="w"> </span><span class="nv">State</span><span class="w"> </span><span class="mi">1</span>,<span class="w"> </span><span class="nv">Line</span><span class="w"> </span><span class="mi">1</span><span class="o"><</span><span class="nv">br</span><span class="o">></span><span class="w"></span>
<span class="nv">Operand</span><span class="w"> </span><span class="nv">data</span><span class="w"> </span><span class="nv">type</span><span class="w"> </span><span class="nv">datetime</span><span class="w"> </span><span class="nv">is</span><span class="w"> </span><span class="nv">invalid</span><span class="w"> </span><span class="k">for</span><span class="w"> </span><span class="nv">avg</span><span class="w"> </span><span class="nv">operator</span>.<span class="w"></span>
</code></pre></div>
<p>The problem is SQL Server cannot make the datatype transition on the ENDDATE and STARTDATE fields. An updated query to run on SQL Server would be:</p>
<blockquote>
<p>select avg(((convert(float, enddate))-(convert (float, startdate)))<em>24.0</em>60) as avgrun, reportname<br>from reportusagelog <br>group by reportname<br>order by avgrun desc</p>
</blockquote>
<p>Now what was pretty amazing was how well my data matched what Bruno had originally posted. A graph of my data is shown below.</p>
<figure><a href="http://share.mygeekdaddy.net/birt_response_time.png"><img src="http://share.mygeekdaddy.net/birt_response_time.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Take some time to look at what reports are sitting on the left side of that graph. Are those reports ones that users typically run from inside Maximo (PO Print, WO Print, etc) or are they typically scheduled reports delivered via email? Focus on reports users will run themselves and need to wait for completion. </p>
<h4>Tips for Performance</h4>
<p>Once you get an idea on what reports require attention, here are three things that can help make your reports run faster.</p>
<ol>
<li>
<p>Use of IN vs EXISTS in BIRT: One of the quickest, but at times trickiest, ways to speed up BIRT reports is using the EXISTS statement instead of the IN statement in your queries. For example, listed below are two queries to check for Assets that may have Obsolete inventory listed on the Spare Parts list. One uses the EXISTS and one uses the IN SQL statement.</p>
<p><pre><code>(siteid = (select defsite from maxuser where personid = :USER) and status='OPERATING' and exists(select 1 from sparepart where assetnum=asset.assetnum and siteid=asset.siteid and itemnum in (select itemnum from inventory where itemnum=sparepart.itemnum and itemsetid=sparepart.itemsetid and siteid=sparepart.siteid and status='OBSOLETE')))</code></pre></p>
<p><pre><code>(siteid = (select defsite from maxuser where personid = :USER) and status='OPERATING' and exists(select 1 from sparepart where assetnum=asset.assetnum and siteid=asset.siteid and exists (select 1 from inventory where itemnum=sparepart.itemnum and itemsetid=sparepart.itemsetid and siteid=sparepart.siteid and status='OBSOLETE')))</code></pre></p>
<p>While each query will get the same information, the query that uses the EXISTS statement will run faster. Why? Essentially when you run a SQL query and use the EXISTS statement, once the database engine finds a hit to the condition in the EXISTS statement it will stop searching because the items does exist. Using the IN statement requires the query to first search, return the entire sub-query, and then do a comparison. This can cause a tremendous strain on your database if this happens to be against a huge table like Item Master, Work Order, Purchase Order, etc.</p>
</li>
<li>
<p>Reduce the data the report needs to crunch: In BIRT there are several ways to suppress data from showing up on the final report output. But the easiest way is to never have the data show up in the first place. This may seem like an obvious idea, but sometimes the conditional checks needed to suppress the data in the your report's SQL query can be tricky.</p>
<p>The SQL query below is part of a Manpower Utilization check straight from BIRT.</p>
<p><blockquote> sqlText = "SELECT person.locationsite, labor.laborcode, laborcraftrate.craft, " <br>+ " labor.orgid, person.displayname, labor.personid "<br>+ " FROM labor " <br>+ " JOIN person ON person.personid=labor.personid " <br>+ " LEFT OUTER JOIN laborcraftrate ON (labor.laborcode=laborcraftrate.laborcode) AND (labor.orgid=laborcraftrate.orgid) "<br>+ " where labor.worksite = ? and laborcraftrate.defaultcraft=1 " <br>+ " AND laborcraftrate.craft in ('AUTOTECH','ELEC','GROUNDS','MECH') "<br>+ " AND labor.status='ACTIVE' " <br>+ " AND LABOR.LABORCODE NOT IN ('AUTO','GRNDS01','MECH','MECHANIC') "<br>+ " AND EXISTS(SELECT 1 FROM labtrans WHERE (labtrans.startdate >= dateadd(day, -13, convert(varchar, getdate(), 101)) AND labtrans.startdate < dateadd(day, -6, convert(varchar, getdate(), 101)) ) AND labor.laborcode=labtrans.laborcode) and " + where <br>+ " ORDER BY labor.laborcode "</p></blockquote></p>
<p>The original report used some conditional suppression statements inside BIRT to hide Labor records that had NULL values for labor hours within the reporting period. This caused the report to chunk on handling these exceptions.With the updated EXISTS check, the report ran on average 65% faster.</p>
<p>Take the time to work through ways you can reduce what information is pulled in by BIRT.</p>
</li>
<li>
<p>Keep the frills down: One of the traps early report designers (including myself) can get into is using all the bells and whistles available in the Report Designer. Keep the reports down to the barest essentials, but still be useful and informative for the intended audience. If just a list and summary will do, then don't add a graph. Minimize the use of pictures or other external data, this will keep report generation times down and reduce what needs to be added to the generated report.</p>
</li>
</ol>Unexpected surprise…2012-11-11T15:11:49-06:002012-11-11T15:11:49-06:00Jason Verlytag:mygeekdaddy.net,2012-11-11:/2012/11/11/unexpected-surprise/<figure><a href="http://share.mygeekdaddy.net/IMG_2728.jpg"><img src="http://share.mygeekdaddy.net/IMG_2728.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I got this shot from the roof while hanging Christmas lights on the house. Sometimes it's all about being in the right place at the right time.</p>Coming home...2012-10-26T17:26:21-05:002012-10-26T17:26:21-05:00Jason Verlytag:mygeekdaddy.net,2012-10-26:/2012/10/26/coming-home/<p>Dear family,</p>
<p>As I sit here for the past 10 minutes at a complete stand still, I'm reminded why I love NOT living in the Twin Cities. Thanks for the refresher. </p>
<p>Love, Jason</p>
<p></br>
<em>P.S. I moved 4 car lengths in the time to write this.</em></p>Re-usable Date Queries in Maximo2012-09-12T00:00:00-05:002012-09-12T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2012-09-12:/2012/09/12/re-usable-date-queries-in-maximo/<p>One of the things I try to re-enforce with Maximo users is striving to re-use their work, especially queries, as much as possible. A common task in Maximo is to find and sort information related to dates – order date, approval date, status date, etc. A common problem users come back …</p><p>One of the things I try to re-enforce with Maximo users is striving to re-use their work, especially queries, as much as possible. A common task in Maximo is to find and sort information related to dates – order date, approval date, status date, etc. A common problem users come back to me is when they make a really useful query, but find that the query isn’t working as expected because the query was hard coded with a date range. Now when they try to use that query as part of their normal workflow, or in a QBR report, the information comes back less than useful. This post will go over some date related SQL statements that will make your Maximo queries even more powerful.</p>
<p>One of the common tasks users need to do is report, or list, a set of records based on certain date range, say the last 24h. A common frustration I see with users is trying to get the query to be just the past 24h, like this:</p>
<div class="highlight"><pre><span></span><code><span class="mf">2012</span><span class="err">–</span><span class="mf">01</span><span class="err">–</span><span class="mf">01</span><span class="w"> </span><span class="mf">00</span><span class="p">:</span><span class="mf">00</span><span class="p">:</span><span class="mf">00.000</span><span class="w"> </span><span class="kr">to</span><span class="w"> </span><span class="mf">2012</span><span class="err">–</span><span class="mf">01</span><span class="err">–</span><span class="mf">01</span><span class="w"> </span><span class="mf">23</span><span class="p">:</span><span class="mf">59</span><span class="p">:</span><span class="mf">59.999.</span><span class="w"></span>
</code></pre></div>
<p>But you know what is just as good? Adding 0.001 seconds to that query and run the date range from</p>
<div class="highlight"><pre><span></span><code><span class="mf">2012</span><span class="err">–</span><span class="mf">01</span><span class="err">–</span><span class="mf">01</span><span class="w"> </span><span class="mf">00</span><span class="p">:</span><span class="mf">00</span><span class="p">:</span><span class="mf">00.000</span><span class="w"> </span><span class="kr">to</span><span class="w"> </span><span class="mf">2012</span><span class="err">–</span><span class="mf">01</span><span class="err">–</span><span class="mf">02</span><span class="w"> </span><span class="mf">00</span><span class="p">:</span><span class="mf">00</span><span class="p">:</span><span class="mf">00.000</span><span class="w"></span>
</code></pre></div>
<p>Running the query from 12:00am to 12:00am gets you everything you’d want from 12:00am to 11:59pm. In the event you have a transaction that lands exactly on 00:00:00.000, go buy a lottery ticket, you are just that lucky. Maximo allows the use of several SQL functions, including the use of <code>getdate()</code>, <code>dateadd</code>, <code>convert</code>, and <code>datediff</code>. Using these date modifiers allows queries to now have rolling date ranges that will change as the calendar moves on. Here are some examples of rolling date queries you can use in Maximo.</p>
<h4>Current Date to Midnight</h4>
<p>Change current date to midnight of current date:</p>
<div class="highlight"><pre><span></span><code><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"></span>
</code></pre></div>
<p>To change the day the query will be set to midnight to, just change the integer after the ‘day’ field. For example, to return a date of midnight yesterday, the date query would be:</p>
<div class="highlight"><pre><span></span><code><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="err">−</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"></span>
</code></pre></div>
<p>And to get 7 days ago, just do:</p>
<div class="highlight"><pre><span></span><code><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="err">−</span><span class="mi">7</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"></span>
</code></pre></div>
<p>Assuming today is 8/29/12, then the query above would return ‘2012–08–22 00:00:00.000’.</p>
<h4>Current Date/Time to Just Date</h4>
<p>Change the current date/time stamp to just a date format of mm/dd/yy</p>
<div class="highlight"><pre><span></span><code><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">)</span><span class="w"></span>
</code></pre></div>
<h4>Set First Day of Previous Month</h4>
<p>Change the current date/time to yyyy-mm-dd 00:00:00.000 and have the date be the first day of the previous month. So if the current date is 4/21/11, this SQL statement would return 3/1/11.</p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span>–<span class="mi">1</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<h4>Set First Day of Current Month</h4>
<p>Change the current date/time to yyyy-mm-dd 00:00:00.000 and have the date be the first day of the previous month. So if the current date is 4/21/11, this SQL statement would return 4/1/11.</p>
<div class="highlight"><pre><span></span><code><span class="nv">dateadd</span><span class="ss">(</span><span class="nv">month</span>,<span class="nv">datediff</span><span class="ss">(</span><span class="nv">month</span>,<span class="mi">1</span>,<span class="k">getdate</span><span class="ss">())</span><span class="o">+</span><span class="mi">0</span>,<span class="mi">0</span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p>Just like the adjustment in the midnight date query, adjust the integer at the end of the query <code>(….th,1,getdate())+1,0)</code> will shift what first of the month that will be returned, this case it would return 5/1/11 based on the previous criteria.</p>
<h4>Example query</h4>
<p>The following query is used to show all the active purchase orders for a plant site in the last 24h.</p>
<div class="highlight"><pre><span></span><code><span class="p">(</span><span class="n">orderdate</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">historyflag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">(</span><span class="n">select</span><span class="w"> </span><span class="n">defsite</span><span class="w"> </span><span class="n">from</span><span class="w"> </span><span class="n">maxuser</span><span class="w"> </span><span class="n">where</span><span class="w"> </span><span class="n">userid</span><span class="o">=</span><span class="w"> </span><span class="p">:</span><span class="n">user</span><span class="w"> </span><span class="p">)</span><span class="w"> </span><span class="ow">and</span><span class="w"> </span><span class="n">orderdate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="n">dateadd</span><span class="p">(</span><span class="n">day</span><span class="p">,</span><span class="w"> </span><span class="err">–</span><span class="mi">1</span><span class="p">,</span><span class="w"> </span><span class="nb">convert</span><span class="p">(</span><span class="n">varchar</span><span class="p">,</span><span class="w"> </span><span class="n">getdate</span><span class="p">(),</span><span class="w"> </span><span class="mi">101</span><span class="p">))</span><span class="w"> </span><span class="p">)</span><span class="w"></span>
</code></pre></div>
<p>So if this query is run at 8:43am on 6/12/12, the query will look between the following dates:</p>
<div class="highlight"><pre><span></span><code><span class="mf">2012</span><span class="err">–</span><span class="mf">06</span><span class="err">–</span><span class="mf">11</span><span class="w"> </span><span class="mf">00</span><span class="p">:</span><span class="mf">00</span><span class="p">:</span><span class="mf">00.000</span><span class="w"> </span><span class="kr">to</span><span class="w"> </span><span class="mf">2012</span><span class="err">–</span><span class="mf">06</span><span class="err">–</span><span class="mf">13</span><span class="w"> </span><span class="mf">00</span><span class="p">:</span><span class="mf">00</span><span class="p">:</span><span class="mf">00.000</span><span class="w"></span>
</code></pre></div>
<p>Now for some users this will be a little unsettling because it looks like the query is actually searching over 2 days, not just the last 24h. But remember, we’re treating <code>2012–06–13 00:00:00.000</code> = <code>2012–06–12 23:59:59.999</code>. A lot of users will use a shortcut and use the following query for the last 24h by using <code>getdate()</code> and <code>getdate()–1</code>.</p>
<div class="highlight"><pre><span></span><code><span class="ss">(</span><span class="nv">orderdate</span><span class="w"> </span><span class="o"><=</span><span class="w"> </span><span class="k">getdate</span><span class="ss">()</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">historyflag</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">siteid</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="ss">(</span><span class="nv">select</span><span class="w"> </span><span class="nv">defsite</span><span class="w"> </span><span class="nv">from</span><span class="w"> </span><span class="nv">maxuser</span><span class="w"> </span><span class="nv">where</span><span class="w"> </span><span class="nv">userid</span><span class="o">=</span><span class="w"> </span>:<span class="nv">user</span><span class="w"> </span><span class="ss">)</span><span class="w"> </span><span class="nv">and</span><span class="w"> </span><span class="nv">orderdate</span><span class="w"> </span><span class="o">>=</span><span class="w"> </span><span class="k">getdate</span><span class="ss">()</span>–<span class="mi">1</span><span class="w"> </span><span class="ss">)</span><span class="w"></span>
</code></pre></div>
<p>So what happens if you run this report at 3:17pm for a quick report for the plant manager? The second query will definitely be fixed on just the last 24h, but it will also miss any PO created before 3:17pm yesterday. That’s why getting users to look at date filters based on midnight (00:00:00.000) to midnight is such a critical culture change.</p>
<h4>References</h4>
<p>Here are some references for additional details related to some of the funcitons used in the query statements.</p>
<p>MSDN SQL help for <a href="http://msdn.microsoft.com/en-us/library/ms188383">GETDATE</a></p>
<p>MSDN SQL help for <a href="http://msdn.microsoft.com/en-us/library/ms186819.aspx">DATEADD</a></p>
<p>MSDN SQL help for <a href="http://msdn.microsoft.com/en-us/library/ms189794">DATEDIFF</a></p>
<p>MSDN SQL help for <a href="http://msdn.microsoft.com/en-us/library/ms187928.aspx">CAST & CONVERT</a></p>
<p></br></p>
<h4>Bonus SQL Statement</h4>
<p>Use the following query to set the date to be just before midnight today, which will yield a 23:59:59.999 time stamp.</p>
<p>select dateadd(millisecond,–1, (dateadd(day, 1, convert(varchar, getdate(), 101))))</p>Left work just in time...2012-07-26T22:41:09-05:002012-07-26T22:41:09-05:00Jason Verlytag:mygeekdaddy.net,2012-07-26:/2012/07/26/left-work-just-in-time/<figure><a href="http://share.mygeekdaddy.net/IMG_2211.jpg"><img src="http://share.mygeekdaddy.net/IMG_2211.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This is the picture I got just as I left for work that was used by KEYC TV tonight. Two minutes later it was an absolute downpour and 50 mph winds. By the time I got to home, sun and a nice cool breeze. </p>
<p>Got a love Minnesota weather.</p>A view from the backyard...2012-07-20T21:15:50-05:002012-07-20T21:15:50-05:00Jason Verlytag:mygeekdaddy.net,2012-07-20:/2012/07/20/a-view-from-the-backyard/<figure><a href="http://share.mygeekdaddy.net/MG_4529.jpg"><img src="http://share.mygeekdaddy.net/MG_4529.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>No we're not camping tonight, but with a sunset like this…. maybe we should be.</p>I don't care what the weather does now...2012-07-06T13:40:50-05:002012-07-06T13:40:50-05:00Jason Verlytag:mygeekdaddy.net,2012-07-06:/2012/07/06/i-dont-care-what-the-weather-does-now/<p>For several months now we have been without our PS3. Not tragic news for some, but for me and the boys it's been a bit of a disappointment. Well I found out last week that a technical write-up I did was selected as the post of the month (link to …</p><p>For several months now we have been without our PS3. Not tragic news for some, but for me and the boys it's been a bit of a disappointment. Well I found out last week that a technical write-up I did was selected as the post of the month (link to post: <a href="http://mygeekdaddy.net/2012/how-to-embed-js-files-into-birt-report-for-maximo/">How to used embedded .js file with Maximo BIRT reports</a>). The bonus to getting selected was that it also included a $200 Amazon gift card. Sweet! So now thanks to that post, and my dear friends at Amazon, the PS3 is getting replaced.</p>
<p>So between the heat, my toe, and the weekend, I really don't care what the weather does now. :-)</p>Happiness abounds...2012-05-27T19:01:22-05:002012-05-27T19:01:22-05:00Jason Verlytag:mygeekdaddy.net,2012-05-27:/2012/05/27/happiness-abounds/<figure><a href="http://share.mygeekdaddy.net/20120527-185937.jpg"><img src="http://share.mygeekdaddy.net/20120527-185937.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>The picture says it all. I found Sol at a local Mexican restaurant. Hot diggity.</p>How to embed .js files into BIRT2012-05-12T00:00:00-05:002012-05-12T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2012-05-12:/2012/05/12/how-to-embed-js-files-into-birt/<p>One of the most unique features of BIRT is its ability to use other programming languages to do complex tasks within the report file. Take a look at the forums on <a href="http://www.birt-exchange.org/org/home/" target="_blank">BIRT-Exchange.com</a> and you will see examples of people using PHP, java, javascript and more. This post will show …</p><p>One of the most unique features of BIRT is its ability to use other programming languages to do complex tasks within the report file. Take a look at the forums on <a href="http://www.birt-exchange.org/org/home/" target="_blank">BIRT-Exchange.com</a> and you will see examples of people using PHP, java, javascript and more. This post will show how you can embed a javascript file (.js) into a Maximo BIRT report to do complex tasks.</p>
<p>One of the common tasks a report writer will get asked to do is make sure the report looks good. The goal is to have the information laid out cleanly so the end user will clearly see the information. A typical request is to transform a text string’s case, say from upper case to lower. That’s easy to do in BIRT, just apply a string transform on a dynamic text field like this: <code>BirtStr.toLower(row["description"])</code></p>
<p>Now the beauty of BIRT means it can also use the javascript method to apply a lower case string transform too. Like this: <code>row["description"].toLowerCase()</code>.</p>
<p>So another common request is to change a text string from upper or lower case to proper case (UPPER CASE –> Proper Case). Easy, just use a dynamic text field and apply a string transform again - <code>BirtStr.toProper(row["description"])</code></p>
<p>Guess what? BIRT doesn’t have a proper case text transform function. Using the string transform above will cause the report to error out and not show any information in that data row. A new string transform function, in an external javascript file, will need to be created to do the text transformation requested.</p>
<p>You’ll find plenty of examples searching the web on ‘<a href="http://lmgtfy.com/?q=javascript+change+string+to+proper+case" target="_blank">javascript change string to proper case</a>‘ for a javascript example to do a proper case text string transformation. The code that I’ll use was provided by <a href="http://stackoverflow.com/users/360053/tuan" target="_blank">Tuan</a> on <a href="http://stackoverflow.com/questions/196972/convert-string-to-proper-case-with-javascript" target="_blank">stackoverflow.com</a>.</p>
<div class="highlight"><pre><span></span><code><span class="nv">String</span>.<span class="nv">prototype</span>.<span class="nv">toProperCase</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">function</span><span class="w"> </span><span class="ss">()</span><span class="w"> </span>{<span class="w"></span>
<span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="nv">this</span>.<span class="nv">replace</span><span class="ss">(</span><span class="o">/</span>\<span class="nv">w</span>\<span class="nv">S</span><span class="o">*/</span><span class="nv">g</span>,<span class="w"> </span><span class="nv">function</span><span class="ss">(</span><span class="nv">txt</span><span class="ss">)</span>{<span class="k">return</span><span class="w"> </span><span class="nv">txt</span>.<span class="nv">charAt</span><span class="ss">(</span><span class="mi">0</span><span class="ss">)</span>.<span class="nv">toUpperCase</span><span class="ss">()</span><span class="w"> </span>
<span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">txt</span>.<span class="nv">substr</span><span class="ss">(</span><span class="mi">1</span><span class="ss">)</span>.<span class="nv">toLowerCase</span><span class="ss">()</span><span class="c1">;});</span><span class="w"></span>
<span class="w"> </span>}<span class="c1">;</span><span class="w"></span>
</code></pre></div>
<p>Copy/paste the javascript into a text file and save it as <code>toProperCase.js</code> in the Library folder of the BIRT Report Designer application. The path should similar to this: <code>x:\birt_232\reports\birt\libraries</code></p>
<p>Now open the report file that will use the javascript file in BIRT Report Designer. On the Outline tab, click on the report file name. This will bring up the general properties of the report design file.</p>
<figure><a href="http://share.mygeekdaddy.net/2012-05-12_image.png"><img src="http://share.mygeekdaddy.net/2012-05-12_image.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The 6th tab under the 'Property Editor' tab lists 'Resources', click on this to open where the .js file is associated. </p>
<figure><a href="http://share.mygeekdaddy.net/2012-05-12_image1.png"><img src="http://share.mygeekdaddy.net/2012-05-12_image1.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Notice there is an option to add/include a JAR or javascript file. Click the 'Add' button for the javascript file and the 'toProperCase.js' file will be listed as an option. If it's not listed, double check where the .js file was copied to from the steps above. Once attached, save your report file to update the file. </p>
<p>To apply the text string transformation function, just append the text transform to any value in a dynamic text field with <code>.toProperCase()</code>. For example:</p>
<figure><a href="http://share.mygeekdaddy.net/2012-05-12_image2.png"><img src="http://share.mygeekdaddy.net/2012-05-12_image2.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>An example of the text transform is shown below. Text in black has been left unchanged, while the text in blue has been applied the .toProperCase text transform.</p>
<figure><a href="http://share.mygeekdaddy.net/2012-05-12_image3.png"><img src="http://share.mygeekdaddy.net/2012-05-12_image3.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>The next step is to get the .js file to work with the BIRT report inside Maximo. First the .js file has to be compressed into a zip file. This zipped file will be added as part of the import process into Maximo.</p>
<p>Next, log into Maximo and create the report object (skip this step if you’re going to re-import an existing report). Save the new report object and then click on Select Action –> Import Report. When you import the rptdesign file, you will also import the zipped .js flle as a resource file:</p>
<figure><a href="http://share.mygeekdaddy.net/2012-05-12_image4.png"><img src="http://share.mygeekdaddy.net/2012-05-12_image4.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Now click 'Ok' and generate the Request Page. </p>
<p>Run the report in Maximo and the extended javascript text transformation function will work on the report from inside Maximo too.</p>
<figure><a href="http://share.mygeekdaddy.net/2012-05-12_image5.png"><img src="http://share.mygeekdaddy.net/2012-05-12_image5.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Good luck and have fun with this new option for your Maximo BIRT reports.</p>Date Formatting in Maximo BIRT2012-05-03T00:00:00-05:002012-05-03T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2012-05-03:/2012/05/03/date-formatting-in-maximo-birt/<p>Moving from other reporting packages to BIRT, you will always find that one feature you had in your previous reporting tool that you can’t find right away in BIRT. As I’ve continued to adopt more of my company’s internal reports to BIRT, I found date formatting is …</p><p>Moving from other reporting packages to BIRT, you will always find that one feature you had in your previous reporting tool that you can’t find right away in BIRT. As I’ve continued to adopt more of my company’s internal reports to BIRT, I found date formatting is something that can be a little frustrating. Our previous reporting tool could easily convert a Date/Time field to a short date of xx/xx/xx. For example, today’s date would be formatted as:</p>
<div class="highlight"><pre><span></span><code><span class="mf">2012</span><span class="o">-</span><span class="mf">05</span><span class="o">-</span><span class="mf">03</span><span class="w"> </span><span class="mf">15</span><span class="p">:</span><span class="mf">35</span><span class="p">:</span><span class="mf">17.342</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">5</span><span class="o">/</span><span class="mf">3</span><span class="o">/</span><span class="mf">12</span><span class="w"></span>
</code></pre></div>
<p>This is the standard format we use for date fields in our company’s reports. However, BIRT doesn’t recognize years as a 2 digit number, it sees years as a 4 digit number. So when showing date/time fields in BIRT, as a short date, BIRT would default the conversion to:</p>
<div class="highlight"><pre><span></span><code><span class="mf">2012</span><span class="o">-</span><span class="mf">05</span><span class="o">-</span><span class="mf">03</span><span class="w"> </span><span class="mf">15</span><span class="p">:</span><span class="mf">35</span><span class="p">:</span><span class="mf">17.342</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">5</span><span class="o">/</span><span class="mf">3</span><span class="o">/</span><span class="mf">2012</span><span class="w"></span>
</code></pre></div>
<p>So how do you get BIRT to show the short date format we’re used to? By concatenating parts of the date field and converting the year value to a two character string. The following code is entered as a Dynamic Text field in lieu of a Data field:</p>
<div class="highlight"><pre><span></span><code>BirtDateTime.month(row["datetimefield"]) + "/" +
BirtDateTime.day(row["datetimefield"]) + "/" +
BirtStr.right((BirtDateTime.year(row["datetimefield"])).toString(), 2)
</code></pre></div>
<p>So what happens is the following:</p>
<ol>
<li>The <code>BirtDateTime.month(row["datetimefield"])</code> will give the numeric value of month.</li>
<li>Then <code>+ '/'</code> will add the '/' separator to the text string. The '+' ties the two text fields together so they string together.</li>
<li>Then <code>BirtDateTime.day(row["datetimefield"])</code> will give the numeric value of the day.</li>
<li>And <code>+ '/'</code> will be the other date separator.</li>
<li>Finally <code>BirtStr.right((BirtDateTime.year(row["datetimefield"])).toString(), 2)</code> does three steps in one statement:<ul>
<li>The inner function <code>BirtDateTime.year(row["datetimefield"])</code> works like the previous functions and returns a 4 digit year value.</li>
<li>The string modifier <code>.toString()</code> converts the 4 digit Date value to a 4 character string.</li>
<li>The outside Birt function <code>BirtStr.right( ), 2)</code> trims the 4 character year string to just the right 2 characters.</li>
</ul>
</li>
</ol>
<p>So now we can format any Date/Time field to a short date format of 5/3/12.</p>A first in my life…2012-03-31T20:25:00-05:002012-03-31T20:25:00-05:00Jason Verlytag:mygeekdaddy.net,2012-03-31:/2012/03/31/a-first-in-my-life/<p>It’s March.</p>
<p>It’s been warm.</p>
<p>And I mowed my yard…</p>
<p>Now I know that isn’t earth shattering news, but looking back at the past 25+ years of doing yard work, I have never mowed a yard in March. I didn’t even mow the yard in March …</p><p>It’s March.</p>
<p>It’s been warm.</p>
<p>And I mowed my yard…</p>
<p>Now I know that isn’t earth shattering news, but looking back at the past 25+ years of doing yard work, I have never mowed a yard in March. I didn’t even mow the yard in March the couple of years I lived in Cedar Rapids. So now I’m going to do the next best thing to assure a snow storm within the next 2 weeks – take the snow blower off the lawn tractor so I can thatch and fertilize. </p>
<p>At the rate spring is coming, I’ll be watering by mid-April. Nice.</p>First things first for Maximo KPI's & Metrics2012-03-31T00:00:00-05:002012-03-31T00:00:00-05:00Jason Verlytag:mygeekdaddy.net,2012-03-31:/2012/03/31/first-things-first-for-maximo-kpis-metrics/<p>After getting maintenance activities completed in the plant and documented in Maximo, most organizations want to understand what they’ve got done. Going beyond summary reports – number of work orders closed, dollars spent per month, etc., most organizations look to key performance indicators (KPI’s) and metrics to help them …</p><p>After getting maintenance activities completed in the plant and documented in Maximo, most organizations want to understand what they’ve got done. Going beyond summary reports – number of work orders closed, dollars spent per month, etc., most organizations look to key performance indicators (KPI’s) and metrics to help them understand what is happening in their plant or facility. Getting measurements on activities related to Maintenance can be daunting task. Do a Google search on <a href="http://www.mt-online.com/component/content/article/90-march2006/400-tracking-kpis-accross-multiple-plants-and-business-units.html">'maintenance KPI and metrics'</a> and you’re likely to have a melt down on all the information that is available. Like most organizations, you’re likely to want to report on the big name metrics like <a href="http://en.wikipedia.org/wiki/Overall_equipment_effectiveness">OEE</a>, <a href="http://en.wikipedia.org/wiki/Mean_time_to_repair">MTTR</a>, and <a href="http://en.wikipedia.org/wiki/MTBF">MTBF</a>. Before an organization tackles one of these metrics, they should make sure they can report on more fundamental metrics. The idea is similar to the old saying, ‘walk before you run’, so here are some steps on getting started.</p>
<p>First, take a look at some fundamental metrics to see if you have consistent data reporting occurring in Maximo. If you don’t have good data, you won’t have good measurements to rely on. Three common metrics an organization could use are:</p>
<ol>
<li>Monthly work type by hours: This metric looks at all the work orders an organization completed in a month, grouped by work order type, then summarizing the documented time spent on each work order. This metric helps understand what type of work got completed and which type was done most often. To get a complete picture of this metric, an organization would need to see if the following is occurring:<ul>
<li>Do we require all work orders to have a work type?</li>
<li>Do we have work types to properly describe the work being done?</li>
<li>Do we capture all activities on a work order or only some of them?</li>
<li>Do we capture time on all work orders?</li>
</ul>
</li>
<li>Manpower utilization: This metric looks at how much of a manpower’s available time was documented on a work order, over a given period of time. This metric helps an organization understand how well manpower is being scheduled or if there are gaps in documentation. Some questions that could be raised around this metric are:<ul>
<li>Do we have accurate schedules of manpower in Maximo?</li>
<li>Are we capturing all the activities being done in the plant in Maximo?</li>
<li>Do we have inaccurate recording of manpower time (e.g. man hours are documented for a mechanic on a day they weren’t scheduled)</li>
</ul>
</li>
<li>Work orders closed with costs & zero man hours: This metric is used to see if work orders are getting closed with charged parts or materials, but no manpower time was documented with the work. Depending on the volume of work orders closed, some questions that may get raised are:<ul>
<li>At what point in the closure process are we allowing an informational gap to occur that allows a work order to be closed with parts or materials charged, but no man hours.</li>
<li>Are there known exceptions we should exclude from the metric?</li>
<li>Are there steps we could enforce the rule (e.g. conditional security to not allow work order closure when costs exist)?</li>
</ul>
</li>
</ol>
<p>Some good sources on examples of maintenance related KPI’s and metrics to use:</p>
<ul>
<li>USG’s article on 20 KPI’s in their corporate score card: <a href="http://www.mt-online.com/component/content/article/89-february2006/397-part-i-a-corporate-scorecard-tracking-kpis-across-multiple-plants-and-business-units.html">Part I article</a> / <a href="http://www.mt-online.com/component/content/article/90-march2006/400-tracking-kpis-accross-multiple-plants-and-business-units.html">Part II article</a>.</li>
<li>SMRP has a collection of industry recognized KPI and Metric that can be purchased: <a href="http://library.smrp.org/metrics">SMRP Metric Library</a>.</li>
<li>How to Begin Measuring Maintenance Effectiveness: <a href="http://www.mt-online.com/component/content/article/229-2009tf/1252-the-fundamentals-how-to-begin-measuring-maintenance-effectiveness-part-i.html">Part I</a> / <a href="http://www.mt-online.com/component/content/article/229-2009tf/1322-the-fundamentals-how-to-begin-measuring-maintenance-effectiveness-part-ii.html">Part II</a> / <a href="http://www.mt-online.com/component/content/article/229-2009tf/1322-the-fundamentals-how-to-begin-measuring-maintenance-effectiveness-part-ii.html">Part III</a> / <a href="http://www.mt-online.com/component/content/article/287-2010/1701-how-to-begin-measuring-maintenance-effectiveness-part-iv.html">Part IV</a></li>
</ul>
<p>Over the next couple of posts, we’ll take a look developing these into either a dashboard KPI for the Maximo start center or reporting metrics from a BIRT report, so the information can be run understood straight from Maximo.</p>News from Pulse conference last week...2012-03-12T08:27:40-05:002012-03-12T08:27:40-05:00Jason Verlytag:mygeekdaddy.net,2012-03-12:/2012/03/12/news-from-pulse-conference-last-week/<p>Most of you know I went to Las Vegas last week to attend my yearly Maximo conference, called IBM Pulse. This year I was lucky to get selected to present again and this time I co-presented with my counterpart from Ford Motor Co, Howard Springston. Pam Denny, the IBM architect …</p><p>Most of you know I went to Las Vegas last week to attend my yearly Maximo conference, called IBM Pulse. This year I was lucky to get selected to present again and this time I co-presented with my counterpart from Ford Motor Co, Howard Springston. Pam Denny, the IBM architect for Maximo reporting, did a nice write up on Pulse and included us in her post. </p>
<p>IBM Dev Works: <a href="https://www.ibm.com/developerworks/mydeveloperworks/blogs/a9ba1efe-b731-4317-9724-a181d6155e3a/entry/bilog_reporting_faqs_from_pulse_2012_conference46?lang=en" target="_blank">Amazing Clients and Reporting FAQs from Pulse 2012 Conference</a></p>Some stuff needs to be shared...2012-01-29T22:06:36-06:002012-01-29T22:06:36-06:00Jason Verlytag:mygeekdaddy.net,2012-01-29:/2012/01/29/some-stuff-needs-to-be-shared/<iframe width="560" height="315" src="//www.youtube.com/embed/OymMl734Ews?rel=0&showinfo=0" frameborder="0" allowfullscreen></iframe>
<p>Sometimes you just have to share the crazy stuff you find on You Tube.</p>Fall colors from Mankato2011-11-03T20:56:16-05:002011-11-03T20:56:16-05:00Jason Verlytag:mygeekdaddy.net,2011-11-03:/2011/11/03/fall-colors-from-mankato/<figure><a href="http://share.mygeekdaddy.net/MG_1419-01.jpg"><img src="http://share.mygeekdaddy.net/MG_1419-01.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:400px;" /></img></a></figure>
<p>The maple tree in our front yard gave us quite a color show this fall.</p>This is what I think heaven looks like...2011-05-20T19:51:02-05:002011-05-20T19:51:02-05:00Jason Verlytag:mygeekdaddy.net,2011-05-20:/2011/05/20/this-is-what-i-think-heaven-looks-like/<figure><a href="http://share.mygeekdaddy.net/20110520-075028.jpg"><img src="http://share.mygeekdaddy.net/20110520-075028.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Only bigger and deeper.</p>Preparing for the big 4-0…2011-04-13T16:12:00-05:002011-04-13T16:12:00-05:00Jason Verlytag:mygeekdaddy.net,2011-04-13:/2011/04/13/preparing-for-the-big-4-0/<p>It’s coming. The big event that can make men turn tail, run to the local sports car dealership and cry ‘Mommy’. I’m turning 40. Now I can’t say that I’ve had any inclination to do any of those things, but a neighbor was selling his motorcycle …</p><p>It’s coming. The big event that can make men turn tail, run to the local sports car dealership and cry ‘Mommy’. I’m turning 40. Now I can’t say that I’ve had any inclination to do any of those things, but a neighbor was selling his motorcycle and it did sound tempting. As the big date approaches, I’ve started to feel a little more and more uneasy about the date. I think the biggest hurdle I’ve been dealing with is reconciling the expectations of where I thought I’d be in life when I turned 40 against where I really am. </p>
<p>Not what I thought…</p>
<ul>
<li>Office door: Call it the culmination of demonstrating where I got with my professional career. I didn’t need a corner office suite, just something where I could say this is mine. </li>
<li>Music: I really thought I was going to keep my music tastes more current, even as I grew older. This has been one of the harsher realities that prove I’m getting older. </li>
<li>Hair: I had it, I lost it, and sometimes I wish I could get it back. </li>
<li>Weight: Let’s face it, I was a skinny runt for a good portion of my life. And I didn’t think at 40 I would be struggling to shed some extra pounds. Of the any disappointments I have at 40, this is one I’m struggling with most of all. Mostly because it’s the one I have the most control over. </li>
</ul>
<p>More than I could expect…</p>
<ul>
<li>Wife: Holly is what I would expect everyone hopes they find in a spouse. Someone who understands your quirks, enjoys your company on your good days and bad, can make you smile on your worst days and has the same values and beliefs (regardless what their voter registration card says). I love you sweetie! </li>
<li>Boys: Sam and Evan… I can’t add much more than that. Those two can turn my day upside down and I’ll still go to bed thinking how much I love them. I’m in awe every time I take a step back and look at them. </li>
<li>Learning: I’m glad to see that even with the hustle and bustle of home and work, I still want to read and learn. I’m hoping this is a trait I can pass down to Sam and Evan too. </li>
<li>Career: I have to take the fact that I don’t have a door with a grain of salt though. I have a good job that pays me well. I work for a company that continues to grow and is doing well. And when I look back at what I’ve done so far, the office with a door will come someday. </li>
<li>Happy to play: As I look at most friends and co-workers, this is a trait that seems to be slipping away as they get older. I still get as excited to go mountain biking as I did when I was 25. I still know I could spend way too much time playing a video game. I can still say, “I’ll be up in a minute” when playing Legos (with the kids of course). </li>
</ul>
<p>So turning 40… yeah it’s a little weird, but it’s not so bad. </p>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#199" title="2011-04-14 15:08:18">Jen</a>:</strong> HAPPY BIRTHDAY!!!!!!!!!!!</p>Happy St. Patricks’s Day (geek style)…2011-03-17T06:41:42-05:002011-03-17T06:41:42-05:00Jason Verlytag:mygeekdaddy.net,2011-03-17:/2011/03/17/happy-st-patrickss-day-geek-style/<figure><a href="http://share.mygeekdaddy.net/St__Patricks_Day"><img src="http://share.mygeekdaddy.net/St__Patricks_Day" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>Another 5 minutes of fame…2011-03-01T10:25:51-06:002011-03-01T10:25:51-06:00Jason Verlytag:mygeekdaddy.net,2011-03-01:/2011/03/01/another-5-minutes-of-fame/<p>I got interviewed at my conference in Las Vegas again this year.</p>
<p><br /><iframe style="border-right-width: 0px; outline-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" height="295" src="http://cdn.livestream.com/embed/ibmsoftware?layout=4&clip=pla_79543472-33c3-4912-986a-a896cad64b90&color=0x000000&autoPlay=false&mute=false&iconColorOver=0xe7e7e7&iconColor=0xcccccc&allowchat=true" frameborder="0" width="480" scrolling="no"></iframe></p>
<div style="text-align: center; width: 480px; font-size: 11px; padding-top: 10px">Watch <a title="live" href="http://www.livestream.com/?utm_source=lsplayer&utm_medium=embed&utm_campaign=footerlinks" video="video" streaming="streaming">live streaming video</a> from <a title="Watch" href="http://www.livestream.com/ibmsoftware?utm_source=lsplayer&utm_medium=embed&utm_campaign=footerlinks" livestream.com="livestream.com" at="at" ibmsoftware="ibmsoftware">ibmsoftware</a> at livestream.com</div>Fifty years ago and fifty years from now...2011-01-25T21:54:26-06:002011-01-25T21:54:26-06:00Jason Verlytag:mygeekdaddy.net,2011-01-25:/2011/01/25/fifty-years-ago-and-fifty-years-from-now/<p>Like many geeks, I listened to the State of the Union address by President Obama while watching reactions from peers on Twitter. While I normally steer clear of politics online (because you never know how it may come back to you), tonight's speech caught my eye when President Obama started …</p><p>Like many geeks, I listened to the State of the Union address by President Obama while watching reactions from peers on Twitter. While I normally steer clear of politics online (because you never know how it may come back to you), tonight's speech caught my eye when President Obama started to talk about the goals he has for the United States. Goals for better education, more clean energy, and being the leading county worldwide for use of electric vehicles. Reaction to these goals seemed to come down party lines. Democrats praising the President for his vision and leadership. Republicans questioning how can the country afford to make these types of changes. But why are these goal so far fetched?</p>
<p>Fifty years ago another President made similar lofty goals. President Kennedy, in an address to Congress, pledged his support to sending a man to the moon by the end of the decade. This pledge was made just one day after Alan Shepard became the first American in space. It would be nine months later that John Glenn would become the first American to orbit the earth. Can you imagine someone saying we're going to build a plane that will cross the Atlantic just nine months after the Wright Brothers' inaugural flight? Probably not.</p>
<p>But doesn't it make you wonder what can be done if we actually put our heads and hearts into what's possible? What kind of progress could we make if we put the rhetoric aside and look forward to achieving what is actually possible?</p>
<p>Now imagine the world you want for your kids fifty years from now. What are you willing to do to get there?</p>Test post2010-12-31T01:00:00-06:002010-12-31T01:00:00-06:00Jason Verlytag:mygeekdaddy.net,2010-12-31:/2010/12/31/test-post/<p>This should be a buried post on the website. </p>Quick shot from Iowa drive…2010-12-29T23:36:10-06:002010-12-29T23:36:10-06:00Jason Verlytag:mygeekdaddy.net,2010-12-29:/2010/12/29/quick-shot-from-iowa-drive/<figure><a href="http://share.mygeekdaddy.net/Iowa-Drive-Frosted-Tree.jpg"><img src="http://share.mygeekdaddy.net/Iowa-Drive-Frosted-Tree.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>A landscape shot I captured on my way back to Mankato earlier this week from Britt. All the trees were frosted and the drive to and from Iowa that day was absolutely gorgeous.</p>The kindness of a stranger...2010-11-18T22:42:53-06:002010-11-18T22:42:53-06:00Jason Verlytag:mygeekdaddy.net,2010-11-18:/2010/11/18/the-kindness-of-a-stranger/<p>There's a unique feeling of belonging when you participate and embrace an event that only happens in your little corner of the world. For those in Minnesota it's standing outside, waiting in line in the cold and the dark, for a limited edition CD. Weird huh? A local radio station …</p><p>There's a unique feeling of belonging when you participate and embrace an event that only happens in your little corner of the world. For those in Minnesota it's standing outside, waiting in line in the cold and the dark, for a limited edition CD. Weird huh? A local radio station has for the last 21 years put out a compilation CD together, called the <a href="http://www.cities97.com/pages/promotions/Sampler22/">Cities 97 Sampler</a>, of various artists to raise money for local charities. This year it's number 22. Now the goal of the CD is to raise money for charity, but let's be honest, it's got some great music too.</p>
<p>So this year's CD went on sale at 8am at Minnesota Target stores. So after I dropped my son off at school I headed to our local Target to get in line for my copy of the CD. When I got there around 7:30am I was surprised to see the size of the line that had already formed. I got in line and tweeted about waiting, checked some email from work, and made small talk with those in line near me. The guy in front of me was just starting to walk after hip replacement surgery. He joked he wanted to make sure none of the hardware would freeze in the cold weather. As we were talking we asked a Target employee how many copies this store had. <strong>150.</strong> </p>
<p>Seemed like a good number to me.</p>
<p>So at 8am sharp, the doors opened and the entire line started to move in to get their CD. The line moved quickly because the store had opened nearly every register to get people in and out quickly. As I got to the employee who was handing out the CD's I could see the bin was emptying quickly.</p>
<p>Four more people until I could get my copy, still some left.</p>
<p>Three more people, still looks good.</p>
<p>Two more people, uhhh it's looking tight.</p>
<p>One more... the guy in front me got the last two CD's.</p>
<p>What?!?!?</p>
<p>Yep, I was essentially the 151st person in line. The Target employee shouts, 'Sorry folks we are all sold out.' I couldn't believe it. I stood there shocked that I had literally missed out by one. As I stood there wondering how soon the CD would be on eBay, the guy who was just in front of me turns around and offers me one of the CD's he had. I had stood in line with this gentleman for half an hour and chit chatted with him for 10-15 minutes, but he turns around and handed me the CD without blinking an eye.</p>
<p>To the gentleman in line at the Mankato Target, whoever you are, thank you. You demonstrated the true meaning of charity, sharing, and the holiday spirit. May you have a blessed and happy holiday season.</p>Why I carry my camera with me…2010-11-03T10:16:00-05:002010-11-03T10:16:00-05:00Jason Verlytag:mygeekdaddy.net,2010-11-03:/2010/11/03/why-i-carry-my-camera-with-me/<figure><a href="http://share.mygeekdaddy.net/Fall-River-Sunrise1.jpg"><img src="http://share.mygeekdaddy.net/Fall-River-Sunrise1.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This is why I carry my camera with me as much as possible. I got this picture Monday morning while driving into work. The only work I had to do to the picture was copy it from the camera to my laptop and save it in my photo editing software …</p><figure><a href="http://share.mygeekdaddy.net/Fall-River-Sunrise1.jpg"><img src="http://share.mygeekdaddy.net/Fall-River-Sunrise1.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>This is why I carry my camera with me as much as possible. I got this picture Monday morning while driving into work. The only work I had to do to the picture was copy it from the camera to my laptop and save it in my photo editing software. </p>The winning photo…2010-10-12T12:45:00-05:002010-10-12T12:45:00-05:00Jason Verlytag:mygeekdaddy.net,2010-10-12:/2010/10/12/the-winning-photo/<p>Just to put things in perspective, this was the winning photo for the 2011 Mankato Calendar photo contest and the People’s Choice Award.  </p>
<div align="center"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="2011 Photo Contest Winner" border="0" alt="Winning Photo" src="http://verly.me/wp-content/uploads/2010/10/jan_win_pic.jpg" width="304" height="203" /></div>
<p>Hard to beat a guy in a plane taking a picture of another plane flying over Mankato in the dead of winter.  I’ll get’em …</p><p>Just to put things in perspective, this was the winning photo for the 2011 Mankato Calendar photo contest and the People’s Choice Award.  </p>
<div align="center"><img style="background-image: none; border-right-width: 0px; padding-left: 0px; padding-right: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px; padding-top: 0px" title="2011 Photo Contest Winner" border="0" alt="Winning Photo" src="http://verly.me/wp-content/uploads/2010/10/jan_win_pic.jpg" width="304" height="203" /></div>
<p>Hard to beat a guy in a plane taking a picture of another plane flying over Mankato in the dead of winter.  I’ll get’em next year!</p>
<p></br> </p>
<div align="left"> <div style="font-size: 8px">Photo Source: </font><a href="http://city.mankato.mn.us" target="_blank"><font size="1">city.mankato.mn.us</font></a></style></div> </div>Very happy results…2010-10-11T23:15:16-05:002010-10-11T23:15:16-05:00Jason Verlytag:mygeekdaddy.net,2010-10-11:/2010/10/11/very-happy-results/<p>Tonight was the 2011 Mankato Photo Contest presentation by the Mankato City Council. I was honored to have two of my pictures awarded tonight. The first was a night shot of Veteran’s Memorial Bridge to be named the 2nd place photo out of over 375 entries. This picture was …</p><p>Tonight was the 2011 Mankato Photo Contest presentation by the Mankato City Council. I was honored to have two of my pictures awarded tonight. The first was a night shot of Veteran’s Memorial Bridge to be named the 2nd place photo out of over 375 entries. This picture was blown up and already framed at the ceremony tonight. It will now be hung within City government offices and on official literature. </p>
<figure><a href="http://share.mygeekdaddy.net/IMG_5120-4.jpg"><img src="http://share.mygeekdaddy.net/IMG_5120-4.jpg" style="display:block; margin-left: auto; margin-right:auto; width:600px;" /></img></a></figure>
<div style="font-size: 9px; text-align: right;">2nd Place in 2011 Photo Contest</font></div>
<p>The other was being named the 2nd overall photo in the People’s Choice award for my picture of Union Depot in downtown Mankato.  </p> </p>
<figure><a href="http://share.mygeekdaddy.net/Rear-Depot-HDR-1.jpg"><img src="http://share.mygeekdaddy.net/Rear-Depot-HDR-1.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<div style="font-size: 9px; text-align: right;">2nd Place in 2011 People's Choice Award</font></div>
<p>Both of my pictures lost to the same picture, a great aerial photo of Mankato in the winter. Here’s to trying to get up one more spot next year!</p>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#117" title="2010-10-16 21:23:39">Darren Rowley</a>:</strong> Congratulations on the awards...I need to get serious about my photography again...</p>Special thanks...2010-10-01T00:43:47-05:002010-10-01T00:43:47-05:00Jason Verlytag:mygeekdaddy.net,2010-10-01:/2010/10/01/special-thanks/<p>I want to send out a big thank you to family and friends who voted in Mankato's People's Choice Photo award. My picture of Union Depot was selected as one of the 2010 People's Choice. I cannot describe the feelings I had when I found out this evening. </p>
<p>And a …</p><p>I want to send out a big thank you to family and friends who voted in Mankato's People's Choice Photo award. My picture of Union Depot was selected as one of the 2010 People's Choice. I cannot describe the feelings I had when I found out this evening. </p>
<p>And a special thank you to my wife, who put up with hours upon hours of me going out to take pictures. Only to spend just as many going through the the pictures for post processing and filing. Thanks Holly!</p>The insignificant things from your past….2010-09-26T21:05:17-05:002010-09-26T21:05:17-05:00Jason Verlytag:mygeekdaddy.net,2010-09-26:/2010/09/26/the-insignificant-things-from-your-past/<p>Take a look at this picture below and for most people it may not mean much beyond a sidewalk that needs repair. You know what I see this picture? I see old fashioned woodwork, the steepest staircase known to man, brutally cold winters, hot summer days, and my first taste …</p><p>Take a look at this picture below and for most people it may not mean much beyond a sidewalk that needs repair. You know what I see this picture? I see old fashioned woodwork, the steepest staircase known to man, brutally cold winters, hot summer days, and my first taste of independence. </p>
<div align="center"><a href="http://verly.me/wp-content/uploads/2010/09/IMG_738813.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Simple memories" border="0" alt="Simple memories" src="http://verly.me/wp-content/uploads/2010/09/IMG_738813_thumb.jpg" width="304" height="204" /></a> </div>
<p>Some images can capture a moment in time that invokes an emotional response from a lot of people. Or you can take the most innocuous image to most people and it hits a few people on an emotional level others cannot understand.</p>
<p>That’s the beauty of photography.</p>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#103" title="2010-09-28 11:26:36">admin</a>:</strong> I was driving through town from quick trip out to Lake Norden and thought it would be a great day to get a few pictures around Grandma's house. As I was walking along the sidewalk I saw the water valve in the sidewalk and had a flash of about a dozen memories. There was something that always stuck with me about that water valve in the sidewalk. I can't explain it and so maybe it's just something that's stood out to me. But the experience was weird because something so insignificant as a water valve on a sidewalk could bring back so many memories. BTW - I do have a couple pictures of the house and will get them cleaned up and posted to Flickr for everyone to download.</p>
<p><strong><a href="#102" title="2010-09-27 13:03:49">Nancy Peltier</a>:</strong> As I read what you wrote, the first thing to come to my mind was mom's sidewalk; then I thought, why would he take a picture of moms sidewalk? The whole time had I glanced to the left I would have seen the picture of her house. I must have shoveled one too many times to know where you were by the looks & description. I only wish we could get inside!</p>King of the world…2010-08-07T21:53:00-05:002010-08-07T21:53:00-05:00Jason Verlytag:mygeekdaddy.net,2010-08-07:/2010/08/07/king-of-the-world/<p>There is a street corner that I bike past during most of my rides.  The corner has a fire hydrant and a bunch of wildflowers planted around the hydrant.  Each time I ride past this corner, I say to myself that I have to get there before the flowers start …</p><p>There is a street corner that I bike past during most of my rides.  The corner has a fire hydrant and a bunch of wildflowers planted around the hydrant.  Each time I ride past this corner, I say to myself that I have to get there before the flowers start to fade.  Well I finally made it today and this was the prize winner of the bunch I took.  </p>
<div align="center"><a href="http://verly.me/wp-content/uploads/2010/08/IMG_44806.jpg"><img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="IMG_4480-6" border="0" alt="IMG_4480-6" src="http://verly.me/wp-content/uploads/2010/08/IMG_44806_thumb.jpg" width="404" height="271" /></a> </div>
<p> The bug (I don’t know kind, yet), literally came crawling over the backside of the flower and stopped to look up.  I have more pics from the street corner here [<a href="http://www.flickr.com/photos/mygeekdaddy/sets/72157624676544330/" target="_blank">Link</a>].</p>This one’s for Dad…2010-07-12T20:05:18-05:002010-07-12T20:05:18-05:00Jason Verlytag:mygeekdaddy.net,2010-07-12:/2010/07/12/this-ones-for-dad/<figure><a href="http://share.mygeekdaddy.net/IMG_2305.jpg"><img src="http://share.mygeekdaddy.net/IMG_2305.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Thanks again for the loan!</p>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#82" title="2010-07-12 20:48:56">Jen</a>:</strong> Hope you guys are having a good time!</p>Fireworks pictures…2010-07-05T00:51:37-05:002010-07-05T00:51:37-05:00Jason Verlytag:mygeekdaddy.net,2010-07-05:/2010/07/05/fireworks-pictures/<p>I finally got to take the kind of fireworks pictures I’ve wanted to take since I was 10 years olds. I posted the best ones on <a href="http://www.flickr.com/mygeekdaddy">Flickr</a>. My favorite from the night is this one.</p>
<figure><a href="http://share.mygeekdaddy.net/IMG_1978.jpg"><img src="http://share.mygeekdaddy.net/IMG_1978.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>Should have been on the Op-Ed page...2010-06-27T10:27:27-05:002010-06-27T10:27:27-05:00Jason Verlytag:mygeekdaddy.net,2010-06-27:/2010/06/27/should-have-been-on-the-op-ed-page/<figure><a href="http://share.mygeekdaddy.net/92768_strip_zoom.gif"><img src="http://share.mygeekdaddy.net/92768_strip_zoom.gif" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Scott Adams hit it out of the park with this one.</p>New pics on Flickr2010-06-25T23:44:56-05:002010-06-25T23:44:56-05:00Jason Verlytag:mygeekdaddy.net,2010-06-25:/2010/06/25/new-pics-on-flickr/<p>There are some new pictures from the storms we had last night up on Flickr: <a href="http://www.flickr.com/photos/mygeekdaddy/sets/72157624359013658/">Link</a>.  Pretty sure we lost the entire garden due to hail and the fins on our A/C unit look like Evan beat it with Sam's baseball bat.  Otherwise no other damage that I've been …</p><p>There are some new pictures from the storms we had last night up on Flickr: <a href="http://www.flickr.com/photos/mygeekdaddy/sets/72157624359013658/">Link</a>.  Pretty sure we lost the entire garden due to hail and the fins on our A/C unit look like Evan beat it with Sam's baseball bat.  Otherwise no other damage that I've been able to see.  Sample pic from last night’s storm is below:</p>
<div align="center"><a href="http://verly.me/wp-content/uploads/2010/06/IMG_1292.jpg"><img style="border-bottom: 0px;border-left: 0px;border-top: 0px;border-right: 0px" border="0" alt="Lightning 6-25-10" src="http://verly.me/wp-content/uploads/2010/06/IMG_1292_thumb.jpg" width="504" height="208" /></a></div>Getting started…2010-06-17T13:08:58-05:002010-06-17T13:08:58-05:00Jason Verlytag:mygeekdaddy.net,2010-06-17:/2010/06/17/getting-started/<figure><a href="http://share.mygeekdaddy.net/IMG_0419.jpg"><img src="http://share.mygeekdaddy.net/IMG_0419.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>I got a new camera for Father’s Day and have started to try some new techniques that the new camera will allow me to do. This one is of some lilies that we have in our front yard.</p>Get OS X Finder to sort files like Windows Explorer2010-06-12T14:17:00-05:002010-06-12T14:17:00-05:00Jason Verlytag:mygeekdaddy.net,2010-06-12:/2010/06/12/get-os-x-finder-to-sort-files-like-windows-explorer/<blockquote>
<p><em>Note:</em> This post is out of date and does not include all of the original content. Please refer to the most recent version here: <a href="http://mygeekdaddy.net/2014/10/16/change-yosemite-finder-app-sort-order/">Sorting OS X in Yosemite</a>. </p>
</blockquote>
<p>One of the first things I hear when working with a recent Windows to Mac convert is how Finder sorts files …</p><blockquote>
<p><em>Note:</em> This post is out of date and does not include all of the original content. Please refer to the most recent version here: <a href="http://mygeekdaddy.net/2014/10/16/change-yosemite-finder-app-sort-order/">Sorting OS X in Yosemite</a>. </p>
</blockquote>
<p>One of the first things I hear when working with a recent Windows to Mac convert is how Finder sorts files.  In OS X, Finder treats a file and a folder as the same kind of object, so it sorts files and folders in alphabetical order together.  So in Finder you’ll see Adobe Acrobat files before any folder, regardless of what the folder is labeled.  Those from the Windows world normally see folders listed in alphabetical order and then files in alphabetical order.  To get Finder to sort folders and files like this, do the following steps.</p>
<ol>
<li>Locate package for the Finder application to edit the file that applies labels to objects shown in the Finder application. Even though you click a given icon to run an application (like Finder), an OS X application is actually a bunch of files in a special folder called a package.  The Finder app package is located at: <em>/root –> System –> Library –> CoreServices –> Finder</em>.</li>
<li>Right click the Finder app and click ‘Show Package Content’.  This will open the actual files of the package that makes up the Finder app.</li>
<li>Once the Finder app package is opened, you will need to find the file that actually applies the labels for objects listed in Finder.   Go to:  <em>Contents -> Resources -> English.lproj</em>. This applies to English OS X users, use your system’s native language if not English.</li>
<li>After you locate the <em>English.lproj</em> file, locate the <em>InfoPlist.strings</em> file.  This is the file that applies label that shows up in Finder to objects listed in the Finder application – folders and file types.  You will need to set the file to be read/write to edit the file.  Right click the InfoPlist.strings file and click 'Get Info’.  Change the privilege setting for ‘Everyone’ to 'Read & Write’ and close the Info pop-up.</li>
<li>After changing the read/write access rights, right click the <em>InfoPlist.strings</em> file again to edit the file.  You will need to choose a program to edit the file and an easy choice is the default TextEdit program.  When you open the file, look for the line listing ‘Folder’, just near the top.</li>
<li>On the ‘Folder’ line, you want to add a space to the <em>“Folder” = “Folder”</em> listing.  The line should now read <em>“Folder” = “ Folder”</em>.  Notice the space before ‘Folder’ in the word after the equals sign.</li>
<li>After making the changes to the <em>InfoPlist.strings</em>, save the changes and close the file.  Make sure to change the security settings back so that Everyone privileges to the file is read only.</li>
<li>Either log out/log in of your current session or restart the Finder.app by entering ‘sudo killall Finder’ from a Terminal command line.  Once you do, your files will be sorted by folders then files like this.  It’s hard to see, but if you look at the label for ‘Folders’, you will see there is an additional space now.</li>
</ol>
<p>Now Finder will sort folders first in alphabetical order then by file type in alphabetical order.  Other 3rd party programs (like <a href="http://www.cocoatech.com/" target="_blank">Pathfinder</a>) can do the same thing, but this now gives you the control you want inside OS X’s core Finder application.</p>
<hr>
<h4>Comments from original WP Post:</h4>
<p><strong><a href="#57357" title="2014-06-01 05:05:15">straight from the source</a>:</strong> It's a shame you don't have a donate button! I'd most certainly donate to this fantastic blog! I suppose for now i'll settle for bookmarking and adding your RSS feed to my Google account. I look forward to fresh updates and will share this website with my Facebook group. Talk soon! my blog post: <a href="http://abron87.deviantart.com">straight from the source</a></p>Happiness from UPS2010-04-03T10:39:40-05:002010-04-03T10:39:40-05:00Jason Verlytag:mygeekdaddy.net,2010-04-03:/2010/04/03/happiness-from-ups/<p>UPS finally deliveried my little slice of Apple goodness a few minutes ago. It's now resting comfortably upstairs while syncing up for apps, music, photos, etc. </p>
<figure><a href="http://share.mygeekdaddy.net/p_2048_1536_E5F2AFEA-633B-4473-AC72-4E481C374783.jpeg"><img src="http://share.mygeekdaddy.net/p_2048_1536_E5F2AFEA-633B-4473-AC72-4E481C374783.jpeg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>Remembering a great friend…2009-12-23T11:54:49-06:002009-12-23T11:54:49-06:00Jason Verlytag:mygeekdaddy.net,2009-12-23:/2009/12/23/remembering-a-great-friend/<figure><a href="http://share.mygeekdaddy.net/Pepper_image1.jpg"><img src="http://share.mygeekdaddy.net/Pepper_image1.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Some of you may have already heard, but we had to put Pepper to sleep this past weekend. Pepper’s health had declined over the past couple of months and we could see his happiness was not what it used to be. Pepper was the first ‘major’ expense I got …</p><figure><a href="http://share.mygeekdaddy.net/Pepper_image1.jpg"><img src="http://share.mygeekdaddy.net/Pepper_image1.jpg" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>
<p>Some of you may have already heard, but we had to put Pepper to sleep this past weekend. Pepper’s health had declined over the past couple of months and we could see his happiness was not what it used to be. Pepper was the first ‘major’ expense I got as I transitioned from college student to college graduate. It was in the fall of 1993 that I found him at a local pet shelter in Marshall, MN. The person at the shelter said Pepper and his brother were found tied to a stop sign near the shelter. Within two minutes of seeing him in there I knew he was the dog for me. So with nothing more than a leash and collar from the shelter, I signed the papers, paid his registration feed, and took him to Wal-Mart to get a kennel, dog dish, food, etc. so he would be comfortable at my apartment. </p>
<p>Did I mention that I hadn’t even checked to see if my apartment accepted pets? </p>
<p>Pepper was with me for over 16 years, which is almost half of my memorable life. He was the epitome of what defines a great dog. Thank you Pepper for being such a wonderful companion the past 16 years. You were always there when I needed a friendly face to cheer me up or be next to me to get through darker times. There will never be another dog to fill the hole you’ve left in our lives. You will be sorely missed by all us, especially me. Take care and I know I’ll see you again someday. </p>What I’m really thinking sometimes…2009-12-17T11:47:49-06:002009-12-17T11:47:49-06:00Jason Verlytag:mygeekdaddy.net,2009-12-17:/2009/12/17/what-im-really-thinking-sometimes/<figure><a href="http://share.mygeekdaddy.net/lease.png"><img src="http://share.mygeekdaddy.net/lease.png" style="display:block; margin-left: auto; margin-right:auto; margin-bottom:10px; width:600px;" /></img></a></figure>First Post...2007-09-20T22:30:05-05:002007-09-20T22:30:05-05:00Jason Verlytag:mygeekdaddy.net,2007-09-20:/2007/09/20/first-post/<p>First post to test out the new blog.</p>
<p>Stay tuned.</p>