tag:blogger.com,1999:blog-36988240449819621782024-03-13T08:36:02.206-04:00SelfCommitThoughts, <a href="http://github.com/selfcommit">Code</a>, CreativitySelfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.comBlogger72125tag:blogger.com,1999:blog-3698824044981962178.post-49245735720965926842023-08-14T11:45:00.003-04:002023-08-14T12:02:47.482-04:00The Worlds Best Template for 1 on 1 Meetings<p>Welcome Reader! You're likely here for one of 2 reasons:</p><p>1. My ingenious SEO manipulation helped you arrive here due to this post title.<br />2. We've talked about how I structure my 1:1s and you'd like the template.</p><p>If you simply want the template without explanation, <a href="https://docs.google.com/document/d/e/2PACX-1vSEXl-Pbh9gaOEEznGJWo_ZuyusGamYU9U_DRD0lz1hOSim-2fO9hTxIK_WjiU-h4Eq84FVhoB2SCCx/pub" target="_blank">click here for the Template</a>.<br />Otherwise, see below for how I use the template and why it works.</p><h2 style="text-align: left;">Workflow for a 1:1 Meeting</h2><div>This workflow is intended for people that keep recurring 1:1 meetings.</div><div>The workflow is fine for Manager/IC (individual contributor) or IC/IC meetings.</div><div><br /></div><div><div>Managers derive value from the organized document created though this process.</div><div>The document makes it easy to reference back to current project status, and serves a collection of breadcrumbs during annual review.</div><div><br /></div><div>Other ICs can use these organized breadcrumbs to circle back after a 1:1.</div><div>These documented breadcrumbs are incredibly helpful when either participant is a remote worker.</div></div><div><br /></div><h4 style="text-align: left;">Before the Meeting (Meta)</h4><div><div>Preparation is a curtesy to others, and shows you value their time.</div><div>I typically spend 50 minutes over the course of a week prepping for a 25min 1:1.</div></div><div><br /></div><h2 style="text-align: left;">The Invite</h2><div>If I don't already have a regular 1:1 with an intended participant, I reach out in advance and ask if it's alright to book a recurring 1:1. Sometimes I'll first schedule a very informal 25min meet/greet chat to help determine if we need a regular 1:1. If we do - I let them know:</div><div><ul style="text-align: left;"><li>The cadence (generally weekly if we work together closely, up to as far as monthly).</li><li>The length of the meeting (generally 25min with a few exceptions)</li><li>I'll schedule a recurring invite (I keep it something that they can edit</li></ul><h3 style="text-align: left;"><br /></h3><h2 style="text-align: left;">Before Each Session</h2><div>I book 20-40min of focus time specifically to review the <b>Next </b>section in the 1:1 doc.</div><div><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEimoUtY8lc_GYuL2aSSdPqSEFAmOhXmAIqVg68G19A4aK2LKUNoSBl5cjih7znnt7fLC-YBzdj741JlINUPhCxTU5s6JuQdtO4vKDClWxLf2-vIgauV-pAvfkqYjnRl6bTOEpoK2c9aLjJhxucQEtflRBoJgHFSLQPwtJ28tyjS7GqP9SRIlQopZowKhLE" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="164" data-original-width="494" height="106" src="https://blogger.googleusercontent.com/img/a/AVvXsEimoUtY8lc_GYuL2aSSdPqSEFAmOhXmAIqVg68G19A4aK2LKUNoSBl5cjih7znnt7fLC-YBzdj741JlINUPhCxTU5s6JuQdtO4vKDClWxLf2-vIgauV-pAvfkqYjnRl6bTOEpoK2c9aLjJhxucQEtflRBoJgHFSLQPwtJ28tyjS7GqP9SRIlQopZowKhLE" width="320" /></a></div><br /><br /></div><div><br /></div><div>During that focus time I do the following:</div><div><ul style="text-align: left;"><li>Copy the dated meeting block for todays date.<br /><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEixTIsYStlT5wdotXvOS09BlziGz0cU5xpUM-RoLBggljZmTy2mAjN_eWEll4GD_b6hK_9OG6yOUNuSJEyg-LlxqcJGSd396h8QsZcPTGWglwMFj6QFaHVNyumY5OO8YTg96lSaPUK4EBAkrIaYPI9fbQ0uf7pM-jBLIN6EXgS5Hdddq18fB7B7zsg3faQ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="942" data-original-width="1526" height="248" src="https://blogger.googleusercontent.com/img/a/AVvXsEixTIsYStlT5wdotXvOS09BlziGz0cU5xpUM-RoLBggljZmTy2mAjN_eWEll4GD_b6hK_9OG6yOUNuSJEyg-LlxqcJGSd396h8QsZcPTGWglwMFj6QFaHVNyumY5OO8YTg96lSaPUK4EBAkrIaYPI9fbQ0uf7pM-jBLIN6EXgS5Hdddq18fB7B7zsg3faQ=w400-h248" width="400" /></a></div><br /><br /></li><li>Copy over any bullets from <b>Next</b> into the <b>Results / Discussion<br /><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjo2Y2Rr6G9SMGXdmSy_7alXN9sxLNZ6JXI4msJQJZg3olAkZrtMnledoFcxCbtWUnBFPNg7KHyCNj_OgyHzBCruYWmj0-mWCHZYtvVzxo6b7SrlJ_vh2flWFCXV9X7ZIWSyndosPPSXAc6WEYv1w0j5jKeokcS_vyHJWuzo-5VFIodoKqhHhq-YHtFjHQ" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="270" data-original-width="1086" height="100" src="https://blogger.googleusercontent.com/img/a/AVvXsEjo2Y2Rr6G9SMGXdmSy_7alXN9sxLNZ6JXI4msJQJZg3olAkZrtMnledoFcxCbtWUnBFPNg7KHyCNj_OgyHzBCruYWmj0-mWCHZYtvVzxo6b7SrlJ_vh2flWFCXV9X7ZIWSyndosPPSXAc6WEYv1w0j5jKeokcS_vyHJWuzo-5VFIodoKqhHhq-YHtFjHQ=w400-h100" width="400" /></a></div><br /><br /></b></li><li>Try to add something fun at the end under Items of Interest <br /><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEiDc6fhgWrYSKstQL6RB7E6D20TGdPLYdY9TR45dvEoBj155mX2ajCprvwpof_o0xzXMTrbLF1O41xhXuxtsGnwHkVpFgMZ-GWrOYmEXRFTjAXRpuKZgBY8dZBoG34dDPENjcQbcH6GTOe0spn3w99FfJbUhU7jcv9-dRWkas-IYPX-xbgwW9xrlq9zIqg" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="168" data-original-width="966" height="56" src="https://blogger.googleusercontent.com/img/a/AVvXsEiDc6fhgWrYSKstQL6RB7E6D20TGdPLYdY9TR45dvEoBj155mX2ajCprvwpof_o0xzXMTrbLF1O41xhXuxtsGnwHkVpFgMZ-GWrOYmEXRFTjAXRpuKZgBY8dZBoG34dDPENjcQbcH6GTOe0spn3w99FfJbUhU7jcv9-dRWkas-IYPX-xbgwW9xrlq9zIqg" width="320" /></a><br />This can be work related or not - better if it's more targeted to shared interests over time.</div><br />The end result will look something like this:<br /><div class="separator" style="clear: both; text-align: left;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhTmcnklGp8V7P_7PfvnB8hGDfpwoqqeulhMZp7PKGE4lr31sGsqSfHX_O0ZNDTnWaHIutMm2Q3L--YE8y1jnOHiQdSGwdgHPSPFNoG1Ex9Ae0TYpu-9ainOtFo1gTQ4qzINn5Z-E146X8-BhOT8lifetq4b-337-iDv2k1h_NV8owZTav2vDwxYIthBcI" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="1018" data-original-width="1136" height="358" src="https://blogger.googleusercontent.com/img/a/AVvXsEhTmcnklGp8V7P_7PfvnB8hGDfpwoqqeulhMZp7PKGE4lr31sGsqSfHX_O0ZNDTnWaHIutMm2Q3L--YE8y1jnOHiQdSGwdgHPSPFNoG1Ex9Ae0TYpu-9ainOtFo1gTQ4qzINn5Z-E146X8-BhOT8lifetq4b-337-iDv2k1h_NV8owZTav2vDwxYIthBcI=w400-h358" width="400" /></a></div></li></ul></div></div><h4 style="text-align: left;">During of the Meeting</h4><h2 style="text-align: left;">Start of the session</h2><div>When starting this process with a new participant, I go out of my way to explain:</div><div><br /></div><div><blockquote>"Here's the template I use for 1:1s, during the week you're welcome to add any bullets you want to the <b>Next </b>section. </blockquote><blockquote>About 45min before our 1:1 I'll copy over anything you've written there, along with my notes into the outline for our next meeting"</blockquote></div><div><br /></div><div>For the first few sessions, I typically start of the meeting saying something like:</div><div></div><blockquote><div>"I'm going to share my screen and run through the outline"</div></blockquote><div></div><div><br /></div><div>This almost always comes off as "stiff" or overly structured at first. </div><div>With practice, I think I've improved that experience - but it's OK if this part feels a bit awkward. </div><div>It is awkward, but once both people are comfortable with the ritual of the meeting it tends to become something comfortable and expected.</div><div><br /></div><div><h4 style="text-align: left;">Working the Outline</h4></div><div><br /></div><h2 style="text-align: left;">Results</h2><div>This section is primarily populated by items from the previous session's <b>Action Items.</b></div><div>I also include notable deliverables that weren't tracked in the 1:1.</div><div><br />Like a newscaster, I read the bullets in the doc.</div><div>Each bullet should focus on brevity and clarity.<br />The intention is for the other participant to ask questions if needed.<br /><br /></div><div>Visual indicators are added to help indicate:</div><span id="docs-internal-guid-9b03c427-7fff-11da-ad97-d34df66f9b9c"><ul style="margin-bottom: 0px; margin-top: 0px; padding-inline-start: 48px;"><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">✅ Did the thing! Working as intended.</span></p></li><li aria-level="1" dir="ltr" style="font-family: Arial, sans-serif; font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; list-style-type: disc; vertical-align: baseline; white-space: pre;"><p dir="ltr" role="presentation" style="line-height: 1.38; margin-bottom: 0pt; margin-top: 0pt;"><span style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; text-wrap: wrap; vertical-align: baseline;">⚠️ Something’s wrong</span></p></li></ul></span><div><br /></div><h2 style="text-align: left;">Discussion</h2><div>Items in the discussion section are intended to be prompts for feedback.</div><div>I often include similar visual indicators through emoji to include context:</div><div><ul style="text-align: left;"><li><span id="docs-internal-guid-d037fcdc-7fff-2446-e8a6-b6c5cf90d5d6"><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;">🎉 This is a win, let's discuss</span></span></li><li><span><span face="Arial, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline; white-space-collapse: preserve;"><span id="docs-internal-guid-597b3622-7fff-8ed9-cecb-a89c08258c25"><span face="Roboto, sans-serif" style="font-size: 11pt; font-variant-alternates: normal; font-variant-east-asian: normal; font-variant-numeric: normal; vertical-align: baseline;">🔴 We're blocked on this</span></span></span></span></li></ul><div><span face="Roboto, sans-serif"><span style="font-size: 14.6667px; white-space-collapse: preserve;">Most <b>Action Items</b> result from these conversations.</span></span></div></div><div><span face="Roboto, sans-serif"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><br /></span></span></div><h2>Action Items</h2><div style="text-align: left;"><span face="Roboto, sans-serif"><span style="font-size: 14.6667px; white-space-collapse: preserve;">Action Items are promises made for the next session. Sizing is important.</span></span></div><p style="text-align: left;"><span face="Roboto, sans-serif"><span style="font-size: 14.6667px; white-space-collapse: preserve;"><b>Bad Action Item: </b>Complete quarterly objective<b>
Good Action Item: </b>Generate new JIRA epic to outline quarterly objective work.</span></span></p><p style="text-align: left;"><span face="Roboto, sans-serif"><span style="font-size: 14.6667px; white-space-collapse: preserve;">One of these items is measurable in a binary Done/Not Done way -
</span></span><span face="Roboto, sans-serif" style="font-size: 14.6667px; white-space-collapse: preserve;">The other will be a recurring item that is mostly ignored from session to session.</span></p><div>I also like to utilize Google Tasks.<br />If working in Google Docs, `@task` will allow assignment of a task directly into my Google Tasks list.<br /><br /></div><div>As I update the status in Google Tasks, their state will be reflected in the Meeting doc:</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEhONWrT9CI_I3SmFfvdpWQoHiAcw-vuqP-Ap0fNu1toecflt630jGkRln3yoCbhStMa-4UVVe_q_xR81ENOs31-Q38wT1nZCoUC8NDtiu6wslRei9uWaEsF7zz1825W1v70MJKdNBoKMuKmsHFZ3Mh-hQ0vbFYqkMqIe-bRC1aL3qKr4gY3p0wOd3Yh09E" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="170" data-original-width="1072" height="102" src="https://blogger.googleusercontent.com/img/a/AVvXsEhONWrT9CI_I3SmFfvdpWQoHiAcw-vuqP-Ap0fNu1toecflt630jGkRln3yoCbhStMa-4UVVe_q_xR81ENOs31-Q38wT1nZCoUC8NDtiu6wslRei9uWaEsF7zz1825W1v70MJKdNBoKMuKmsHFZ3Mh-hQ0vbFYqkMqIe-bRC1aL3qKr4gY3p0wOd3Yh09E=w640-h102" width="640" /></a></div></div><h2 style="text-align: left;"><br />Items of Interest</h2><div><div>"Socializing" is built in as part of the <b>Items of Interest</b> section.</div><div>This creates space for conversation past the intention of the meeting.</div></div><div><br /></div><div>That's it - the meeting is over once the outline is complete. </div><div>It's completely OK to end early - No one ever complains about getting time back.</div><div><br /></div><div><br /></div><h4 style="text-align: left;">After the Meeting</h4><h2 style="text-align: left;">Updating the Top Page</h2><div>On the First page of the 1:1 doc, I keep a monthly breakdown of major results.</div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjBYvXCEvZCNU2sDWuknI5bN2nUExwl_ftqbQp9bgkp1XDnsQRpfubDu9xBwT4ko5Vl57vsMJ9QBKr4YELOOJKu5SiCpJ6kxPxZN3wwTA-MWD_NZZlNCcFDRplk25rA3S1BL0L_b9-E9RJaz0QpS7MFHoQpt6Jqq_OYOAw_eRhi5jY1uDENsCgJdP6d-zU" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="1180" data-original-width="1900" height="398" src="https://blogger.googleusercontent.com/img/a/AVvXsEjBYvXCEvZCNU2sDWuknI5bN2nUExwl_ftqbQp9bgkp1XDnsQRpfubDu9xBwT4ko5Vl57vsMJ9QBKr4YELOOJKu5SiCpJ6kxPxZN3wwTA-MWD_NZZlNCcFDRplk25rA3S1BL0L_b9-E9RJaz0QpS7MFHoQpt6Jqq_OYOAw_eRhi5jY1uDENsCgJdP6d-zU=w640-h398" width="640" /></a></div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">This running list is a curated space that represents the "results" of these meetings.</div><div class="separator" style="clear: both; text-align: left;">Most items I list as a "Result" during a 1:1 are also copy/pasted under to their related month.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">12 months seems to be a good break point.</div><div class="separator" style="clear: both; text-align: left;">Each January I clear the top page, linking to a new doc containing the previous contents.</div><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">This is also a great space to include other commonly used links (Like a bookmark for the weekly)<br />I've found this list to be especially helpful during self-review and manager lead review.</div><div class="separator" style="clear: both; text-align: left;"><div class="separator" style="clear: both; text-align: center;"><a href="https://blogger.googleusercontent.com/img/a/AVvXsEjyJ5k9SEDhhCa8KC1uij7X2xpxYyPBUFRwJpPqN3lAPo1RzCvGu0CzMdmFRcenXUxOk_czl_fvHn_DpW1sd-rfpKy7pxyJPK8DYTMHkVu1X0Y9mLOJKy-tiMvVbP8K3vkG8Vz_EhjUjq_J-foTU8ri7edSIpccP8MzQtjj8IU7tptqLOpmkVPmMCFh0Qo" style="margin-left: 1em; margin-right: 1em;"><img alt="" data-original-height="474" data-original-width="1984" height="152" src="https://blogger.googleusercontent.com/img/a/AVvXsEjyJ5k9SEDhhCa8KC1uij7X2xpxYyPBUFRwJpPqN3lAPo1RzCvGu0CzMdmFRcenXUxOk_czl_fvHn_DpW1sd-rfpKy7pxyJPK8DYTMHkVu1X0Y9mLOJKy-tiMvVbP8K3vkG8Vz_EhjUjq_J-foTU8ri7edSIpccP8MzQtjj8IU7tptqLOpmkVPmMCFh0Qo=w640-h152" width="640" /></a></div><br /><br /></div><h4 style="clear: both; text-align: left;"><b>My Last Secret</b></h4><div class="separator" style="clear: both; text-align: left;"><br /></div><div class="separator" style="clear: both; text-align: left;">Most of the practices for this 1:1 workflow also make for great team meetings!</div><div class="separator" style="clear: both; text-align: left;"><br /></div></div>Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-73387639331047737712022-06-20T16:22:00.001-04:002022-06-20T16:22:25.944-04:00Measuring SRE vs SWE Impact<p><span style="font-family: inherit; font-size: medium;">It's time to start a sprint/planning meeting.</span></p><p><span style="font-family: inherit; font-size: medium;">As always, more work exists than engineers. Work must be triaged and prioritized.</span></p><p><span style="font-family: inherit; font-size: medium;">The impact of the work is often a factor in deciding what cards rise to the top.</span></p><p><span style="font-family: inherit; font-size: medium;">How should Site Reliability Engineers (SRE) measure impact compared to Software Engineers (SWE)?</span></p><p><span style="font-family: inherit; font-size: medium;"><br /></span></p><p><span style="font-family: inherit; font-size: medium;">SWE work is feature focused.</span></p><p></p><ul style="text-align: left;"><li><span style="font-family: inherit; font-size: medium;">What have I added to this project?</span></li><li><span style="font-family: inherit; font-size: medium;">What bug have I fixed?</span></li><li><span style="font-family: inherit; font-size: medium;">How many story points am I taking on ?</span></li><li><span style="font-family: inherit; font-size: medium;">What Epic will I advance with this task?</span></li></ul><p></p><p><span style="font-family: inherit; font-size: medium;">SWE is a product driven approach, which is valuable but also often opposed to reliability work.</span></p><p><span style="font-family: inherit; font-size: medium;"><br /></span></p><p><span style="font-family: inherit; font-size: medium;">SRE work often focuses on tasks that answer these questions:</span></p><p></p><ul style="text-align: left;"><li><span style="font-family: inherit; font-size: medium;">What Toil will this reduce?</span></li><li><span style="font-family: inherit; font-size: medium;">Does this work empower other engineers to self-serve a solution?</span></li><li><span style="font-family: inherit; font-size: medium;">Will this work resolve a near miss that we've been fortunate to avoid?</span></li></ul><p></p><p><span style="font-family: inherit; font-size: medium;">Often SRE work looks like the reduction of tech debt.</span></p><p><span style="font-family: inherit; font-size: medium;">That's not to say that SRE is responsible for tech debt, or should be the "infra grease" for an organization. </span></p><p><span style="font-family: inherit; font-size: medium;">SREs tend to be experienced engineers with a background in SWE, System Administration or even product management. SREs often engineer solutions to sociotechnical problems. The most effective use of SRE teams is to position them to rapidly identify and eliminate existing Toil, while driving efforts to increase reliability.</span></p><p><span style="font-family: inherit; font-size: medium;">From a systems perspective, reliability is a spectrum. If the number of things that increase reliability outweigh the choices that reduce resilience, a system is trending towards stability. </span></p><p><span style="font-family: inherit; font-size: medium;">SRE teams should measure the impact of the projects they take on by the amount those projects increase reliability.</span></p>Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-89792710329918800252020-11-03T15:34:00.001-05:002020-11-03T15:36:03.378-05:00TinyPilot: A fun project for both New and Seasoned Sysadmins<p> I recently read about a do it yourself KVM called <a href="https://mtlynch.io/tinypilot/#how-to-build-your-own-tinypilot" target="_blank">TinyPilot</a>, by <a href="https://mtlynch.io/about/" target="_blank">Michael Lynch</a>.</p><p>TinyPilot provides a KVM (Keyboard Video & Mouse) connection to any machine, for the low cost of around $150, or about an hour of your time and whatever Raspberry Pi parts you have sitting around.</p><p>I have an old Dell R800 with an older version of iDRAC. The iDRAC fails every reasonable attempt to manage the server through the browser, and can't be updated any further. I don't keep a VGA monitor around / connected in my garage, it's a major chore anytime I do something that requires a reboot on that system.</p><p>I like this as a weekend project for a few reasons:</p><p></p><ul style="text-align: left;"><li>If you're new to working with home lab hardware, this is a nice stretch project with an immediately useful result.</li><li>If You've a seasoned home lab tinkerer or "professional" - This is much easier and cheaper than a traditional KVM, and likely solves a common annoyance.</li><li>Regardless, it's an inexpensive way to play with a Raspberry Pi and potentially support a useful open source project.</li></ul><div>While following the <a href="https://mtlynch.io/tinypilot/#how-to-build-your-own-tinypilot" target="_blank">tinypilot guide</a>, I ran into a few problems:</div><p>I didn't have a Rasp 4 lying around (Only a 2) - This turned out to be a big issue, you absolutely need a 4.</p><p>I didn't have a 32 gig SD card available (only a 4gig) - This wasn't an issue, worked fine.</p><p>No HDMI port on my old R800 - I tested on another machine, and picked up a hdmi to VGA dongle.</p><p>The actual install of TinyPilot on my Raspberry Pi 2 took about 45min.<br /> This is likely because my Pi 2 is pretty old. No effort was required on my part- outside of kicking off the install script. The installer kicks off an Ansible playbook on the Pi. I'm fine with waiting as it put the Pi 2 to good use, and I actually avoid some of the power concerns with the recommended Pi 4. </p><table style="background-color: #e6e2dd; border-color: transparent; color: #222222; font-family: Roboto, sans-serif; font-size: 16px;"><thead><tr style="background: rgb(242, 241, 240);"><th style="padding: 2px 10px; text-align: left;">Pi</th><th style="padding: 2px 10px; text-align: left;">Recommended PSU current capacity</th><th style="padding: 2px 10px; text-align: left;">Maximum total USB peripheral current draw</th><th style="padding: 2px 10px; text-align: left;">Typical bare-board active current consumption</th></tr></thead><tbody><tr style="background: rgb(242, 241, 240);"><td style="padding: 2px 10px;">Raspberry Pi 2</td><td style="padding: 2px 10px;">1.8A</td><td style="padding: 2px 10px;">1.2A</td><td style="padding: 2px 10px;">350mA</td></tr><tr style="background: rgb(242, 241, 240);"><td style="padding: 2px 10px;">Raspberry <br />Pi 4 </td><td style="padding: 2px 10px;">3.0A</td><td style="padding: 2px 10px;">1.2A</td><td style="padding: 2px 10px;">600mA</td></tr></tbody></table><span style="font-size: x-small;"><a href="https://www.raspberrypi.org/documentation/faqs/" target="_blank">Raspberry Pi FAQ</a></span><div><br />Update:</div><div>As mentioned above - The Raspberry 4 was definitely required. My Pi 2 loaded the web GUI, and even displayed the desktop - but any attempt to interact failed. I suspect either the CPU/RAM on the Pi 2 wasn't enough. I performed a fresh install on my Pi 4, which completed in under 10min. <br /><br /></div><div><br /></div>Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-20573480152760777972020-02-19T10:19:00.003-05:002020-02-19T10:19:37.111-05:00Change OSX Hostname - For Real!This was enough of a headache today that I wanted to keep a record.<br />
<br />
If the hostname of your MacBook doesn't match across various places (Terminal, System Preferences, iCloud) - you can fix it with the steps in <a href="https://apple.stackexchange.com/questions/287760/set-the-hostname-computer-name-for-macos" target="_blank">this Ask Different question.</a><br />
<br />
I've also included the answer here, for my own sanity.<br />
<div class="answercell post-layout--right" style="background-color: white; border: 0px; box-sizing: inherit; color: #242729; font-family: Arial, "Helvetica Neue", Helvetica, sans-serif; font-size: 13px; font-stretch: inherit; font-variant-east-asian: inherit; font-variant-numeric: inherit; grid-column: 2 / auto; line-height: inherit; margin: 0px; min-width: 0px; padding: 0px; vertical-align: baseline; width: auto;">
<div class="post-text" itemprop="text" style="border: 0px; box-sizing: inherit; font-size: 15px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: 1.3; margin: 0px 0px 5px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline; width: 677px;">
<div style="border: 0px; box-sizing: inherit; clear: both; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin-bottom: 1em; padding: 0px; vertical-align: baseline;">
<br /></div>
<div style="border: 0px; box-sizing: inherit; clear: both; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin-bottom: 1em; padding: 0px; vertical-align: baseline;">
<a href="https://knowledge.autodesk.com/support/smoke/learn-explore/caas/sfdcarticles/sfdcarticles/Setting-the-Mac-hostname-or-computer-name-from-the-terminal.html" rel="noreferrer" style="border: 0px; box-sizing: inherit; color: rgba(0, 138, 214, 0.8); cursor: pointer; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">Setting the Mac hostname or computer name from the terminal</a></div>
<blockquote style="background-color: #fbf2d4; border-bottom-color: initial; border-bottom-style: initial; border-image: initial; border-left-color: rgb(255, 235, 142); border-left-style: solid; border-right-color: initial; border-right-style: initial; border-top-color: initial; border-top-style: initial; border-width: 0px 0px 0px 2px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px 0px 10px; padding: 10px; quotes: none; vertical-align: baseline;">
<ol style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; list-style-image: initial; list-style-position: initial; margin: 0px 0px 0px 30px; padding: 0px; vertical-align: baseline;">
<li style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px 0px 0.5em; overflow-wrap: break-word; padding: 0px; vertical-align: baseline;">Open a terminal.</li>
<li style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px 0px 0.5em; overflow-wrap: break-word; padding: 0px; vertical-align: baseline;"><div style="border: 0px; box-sizing: inherit; clear: both; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; padding: 0px; vertical-align: baseline;">
Type the following command to change the <strong style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">primary hostname</strong> of your Mac:<br style="box-sizing: inherit; margin-bottom: 0px;" />This is your fully qualified hostname, for example myMac.domain.com</div>
<pre style="background-color: var(--black-050); border-radius: 3px; border: 0px; box-sizing: inherit; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin-top: 0.5em; max-height: 600px; overflow-wrap: normal; overflow: auto; padding: 12px 8px; vertical-align: baseline; width: auto;"><code style="background-color: var(--black-050); border: 0px; box-sizing: inherit; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">sudo scutil --set HostName <new host name>
</code></pre>
</li>
<li style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px 0px 0.5em; overflow-wrap: break-word; padding: 0px; vertical-align: baseline;"><div style="border: 0px; box-sizing: inherit; clear: both; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; padding: 0px; vertical-align: baseline;">
Type the following command to change the <strong style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">Bonjour hostname</strong> of your Mac:<br style="box-sizing: inherit; margin-bottom: 0px;" />This is the name usable on the local network, for example myMac.local.</div>
<pre style="background-color: var(--black-050); border-radius: 3px; border: 0px; box-sizing: inherit; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin-top: 0.5em; max-height: 600px; overflow-wrap: normal; overflow: auto; padding: 12px 8px; vertical-align: baseline; width: auto;"><code style="background-color: var(--black-050); border: 0px; box-sizing: inherit; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">sudo scutil --set LocalHostName <new host name>
</code></pre>
</li>
<li style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px 0px 0.5em; overflow-wrap: break-word; padding: 0px; vertical-align: baseline;"><div style="border: 0px; box-sizing: inherit; clear: both; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; padding: 0px; vertical-align: baseline;">
If you also want to change the <strong style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline;">computer name</strong>, type the following command:<br style="box-sizing: inherit; margin-bottom: 0px;" />This is the user-friendly computer name you see in Finder, for example myMac.</div>
<pre style="background-color: var(--black-050); border-radius: 3px; border: 0px; box-sizing: inherit; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin-top: 0.5em; max-height: 600px; overflow-wrap: normal; overflow: auto; padding: 12px 8px; vertical-align: baseline; width: auto;"><code style="background-color: var(--black-050); border: 0px; box-sizing: inherit; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">sudo scutil --set ComputerName <new name>
</code></pre>
</li>
<li style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px 0px 0.5em; overflow-wrap: break-word; padding: 0px; vertical-align: baseline;"><div style="border: 0px; box-sizing: inherit; clear: both; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; padding: 0px; vertical-align: baseline;">
Flush the DNS cache by typing:</div>
<pre style="background-color: var(--black-050); border-radius: 3px; border: 0px; box-sizing: inherit; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-size: 13px; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin-top: 0.5em; max-height: 600px; overflow-wrap: normal; overflow: auto; padding: 12px 8px; vertical-align: baseline; width: auto;"><code style="background-color: var(--black-050); border: 0px; box-sizing: inherit; font-family: Consolas, Menlo, Monaco, "Lucida Console", "Liberation Mono", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", "Courier New", monospace, sans-serif; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; padding: 0px; vertical-align: baseline; white-space: inherit;">dscacheutil -flushcache
</code></pre>
</li>
<li style="border: 0px; box-sizing: inherit; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; margin: 0px; overflow-wrap: break-word; padding: 0px; vertical-align: baseline;"><div style="border: 0px; box-sizing: inherit; clear: both; font-family: inherit; font-stretch: inherit; font-style: inherit; font-variant: inherit; font-weight: inherit; line-height: inherit; padding: 0px; vertical-align: baseline;">
Restart your Mac.</div>
</li>
</ol>
</blockquote>
</div>
</div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-38863087748630879802019-12-15T14:54:00.000-05:002019-12-15T14:54:02.212-05:00Expect the Unexpected! Lisa '19<span style="background-color: white; color: #333333; font-family: "Open Sans", Arial, Helvetica, sans-serif; font-size: 16px;">Excited to share the video from my </span><a href="https://www.usenix.org/conference/lisa19/presentation/oboyle" style="font-family: "Open Sans", Arial, Helvetica, sans-serif; font-size: 16px;">Lisa 2019 talk</a><span style="background-color: white; color: #333333; font-family: "Open Sans", Arial, Helvetica, sans-serif; font-size: 16px;"> with </span><a href="https://twitter.com/artschwagerb" style="font-family: "Open Sans", Arial, Helvetica, sans-serif; font-size: 16px;">Brian Artschwager</a><span style="background-color: white; color: #333333; font-family: "Open Sans", Arial, Helvetica, sans-serif; font-size: 16px;">.</span><br />
<span style="background-color: white; color: #333333; font-family: "Open Sans", Arial, Helvetica, sans-serif; font-size: 16px;"><br /></span>
<span style="background-color: white; color: #333333; font-family: "Open Sans", Arial, Helvetica, sans-serif; font-size: 16px;">Ops teams have a higher volume of unplanned work than any other similarly sized team.</span><br />
<span style="background-color: white; color: #333333; font-family: "Open Sans", Arial, Helvetica, sans-serif; font-size: 16px;"><br /></span>
<div style="background-color: white; color: #333333; font-family: "Open Sans", Arial, Helvetica, sans-serif; font-size: 16px; margin-bottom: 0.7em;">
This talk will attempt to explain the details of a practical method of managing unplanned work, though the engaging story of how our team used this method to systematically process our previously unending backlog.</div>
<br />
<iframe allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/AJvxxkPVoZE" width="560"></iframe>Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-45002315299809903532019-11-10T01:17:00.000-05:002019-11-21T13:38:03.484-05:00How The ISE team at Stack Overflow does Python Linting<br />Some time back I wrote this short guide for our internal wiki at Stack.<br />I'm sharing it here for anyone with an interest in Python linting.<br />
<div class="sites-canvas-main" id="sites-canvas-main" style="min-height: 150px; overflow: hidden; padding-bottom: 5px; padding-top: 15px;">
<div id="sites-canvas-main-content">
Our team generally subscribes to a modified version of <a href="https://www.google.com/url?q=https%3A%2F%2Fwww.python.org%2Fdev%2Fpeps%2Fpep-0008%2F&sa=D&sntz=1&usg=AFQjCNFCIViPgqbm0fUL1-Gcv3QdJfa2-A">pep8</a>.<br />Reference: <a href="https://www.google.com/url?q=https%3A%2F%2Fgoogle.github.io%2Fstyleguide%2Fpyguide.html&sa=D&sntz=1&usg=AFQjCNFoObzbmt86swzsfeqTd4DIdOb4QQ">Google Standards for Python</a><br /><br />Specifically:<br /><ul>
<li>We allow long lines up to 120 characters.</li>
<li>Classes should be CamelCase</li>
<li>Globals FULLY_CAPITALIZED</li>
<li>All other variables lower_snake_case</li>
</ul>
The following are recommended steps using Sublime Text linting with Anaconda.</div>
<div>
<ol>
<li>Install sublime text <a href="https://www.google.com/url?q=https%3A%2F%2Fpackagecontrol.io%2F&sa=D&sntz=1&usg=AFQjCNE0XOxtjMK28L85u0lLYCwS6Fldng">Package Control</a></li>
<ul>
<li>From inside sublime text:</li>
<li>CTRL + SHIFT + P to open the package control menu </li>
</ul>
<li>Install anaconda</li>
<ul>
<li>if you already have it you may need to reinstall anaconda when done</li>
</ul>
<li>Install <a href="https://packagecontrol.io/packages/PackageResourceViewer" target="_blank">Sublime Text Package Resource Viewer</a> </li>
<li>Update Anaconda Settings</li>
<ol>
<li>Go to preferences -> Package Settings -> Anaconda</li>
<li>paste <a href="https://gist.github.com/selfcommit/562e454aef269d2e13c3e92ba09c6aee">anaconda settings</a> into the user settings file </li>
</ol>
<li>Using Package resource viewer open your current color scheme </li>
<ol>
<li>CTRL + Shift + P - then type color scheme </li>
<li>Select The Package Resource Viewer option for your color scheme.</li>
<li>Add the <a href="https://gist.github.com/selfcommit/ab62f5ef3813708673e1c5ea7b24fb87">color scheme JSON</a> into the Rules section of your color scheme. </li>
<li>You'll need to do this any time you switch to another color scheme.</li>
</ol>
</ol>
<table cellspacing="0" class="sites-layout-name-one-column sites-layout-hbox" style="margin: 0px; table-layout: fixed; width: 1010px;" xmlns="http://www.w3.org/1999/xhtml"><tbody>
<tr><td class="sites-layout-tile sites-tile-name-content-1" style="padding: 10px; vertical-align: top;"><div dir="ltr">
<div>
<ol><ol style="background-color: white; font-family: verdana, helvetica, arial, sans-serif; font-size: 13.3333px;">
</ol>
</ol>
</div>
If everything worked out, your editor should now look something like this:<br /><div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeQGjd-BjvSRVWj2u4taN5zqSco-7RdAHtNlMRDBh2KIklbnhO7A9BmBMHF9qGoTwIkgTGnPfDM64pVwbntawhhkXxp52M1k0hIANbnW71bdUaR-PEetlHS2bRaKbdoEbSFpajv93HAgc/s1600/Capture.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="535" data-original-width="1121" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeQGjd-BjvSRVWj2u4taN5zqSco-7RdAHtNlMRDBh2KIklbnhO7A9BmBMHF9qGoTwIkgTGnPfDM64pVwbntawhhkXxp52M1k0hIANbnW71bdUaR-PEetlHS2bRaKbdoEbSFpajv93HAgc/s1600/Capture.png" /></a></div>
(Yellow dots indicate warnings, Red errors, blue spacing mistakes.)<br />An explanation of the error will appear in the bottom of the editor</div>
</td></tr>
</tbody></table>
</div>
</div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-77167080742689649132018-05-27T17:52:00.002-04:002018-05-27T18:17:26.788-04:00FizzBuzz in GoI recently started poking around at Go again.<br />
I like to prove I can write FizzBuzz in a new language (without looking up any language-specific syntax).<br />
<br />
This is pretty straightforward - sometimes people go with a case statement, but I wasn't sure what kinds of comparisons were allowed in a <a href="https://gobyexample.com/switch" target="_blank">Go switch</a>. It might be fun to see if I can perform an evaluation (i%5 ==0), or am limited to specific values (1,'a', false).<br />
<br />
<script src="https://gist.github.com/selfcommit/db26558fb7cf5f946a734c9b27788e5c.js"></script>Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-20617182751637606602018-02-06T17:57:00.000-05:002018-02-06T17:57:06.809-05:00LISA17 Talk - Your Secrets in Cloud-Based Key Management<div style="text-align: center;">
<iframe allow="autoplay; encrypted-media" allowfullscreen="" frameborder="0" height="315" src="https://www.youtube.com/embed/stZXutUgLEI" width="560"></iframe></div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-9721398498729301822017-06-01T17:04:00.002-04:002017-06-01T17:04:48.385-04:00Getting Started with AppengineMy brother asked about building web pages on <a href="https://cloud.google.com/appengine/" target="_blank">Google AppEngine</a>. A while back I recorded this getting started tutorial. The expectation is 0 knowledge of how AppEngine works and brings you from empty folder to working website in under 45min. <br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe width="320" height="266" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/xGQW_Iokzxk/0.jpg" src="https://www.youtube.com/embed/xGQW_Iokzxk?feature=player_embedded" frameborder="0" allowfullscreen></iframe></div>
<br />Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-11555770253711140492017-01-09T12:58:00.000-05:002019-11-21T13:36:14.934-05:00Password Mindfullness<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiamA5FkIkhCTpgFnQ8-5ptTicms5HAkGihbyhnUkX21bVRtAobZ7d1zJkZ6OMrn01X9DCbmaIaBgsUlIf9V1i2ukt7T3Le3XVUESwMi7hYvYlE8cubyqsvjYWgMJ7FK091Blx2D0DWn80/s1600/Screen+Shot+2016-10-24+at+11.04.01+AM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiamA5FkIkhCTpgFnQ8-5ptTicms5HAkGihbyhnUkX21bVRtAobZ7d1zJkZ6OMrn01X9DCbmaIaBgsUlIf9V1i2ukt7T3Le3XVUESwMi7hYvYlE8cubyqsvjYWgMJ7FK091Blx2D0DWn80/s1600/Screen+Shot+2016-10-24+at+11.04.01+AM.png" /></a></div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://imgs.xkcd.com/comics/password_strength.png" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://imgs.xkcd.com/comics/password_strength.png" height="259" width="320" /></a></div>
No one likes changing their password. Memorization requires wrote. Most password policies create passwords that are <a href="https://xkcd.com/936/" target="_blank">hard for people to remember, and easy for computers to guess</a>. <br />
<br />
Password change can be fun, and even useful outside of improving security. I'd like to suggest the idea of "Password Mindfulness". Use your password change as an opportunity to focus on something you want to improve.<br />
<br />
<br />
<br />
<br />
<br />
<br />
Create a simple phrase that makes you mindful of a goal.<br />
Some examples:<br />
<br />
Managing Stress:<br />
<br />
<ul>
<li>MyProblemsAreSmall</li>
<li>SipTheCoffee.EnjoyTheTaste</li>
</ul>
Building Relationships:<br />
<ul>
<li>AskOthersAboutTheirDay</li>
<li>TheGreatestJoyIsTakingAnInerestInOthers!</li>
</ul>
Regarding the 2016 Election:<br />
<ul>
<li>ThisTooShallPass!2016</li>
<li>The only thing necessary for the triumph of evil is for good men (and women) to do nothing.</li>
<ul>
<li>(Keep in mind most passwords can include spaces, so the above sentence is long, hard to crack and includes special characters)</li>
</ul>
</ul>
<div>
Mindful Passwords can be strong, and call us to an awareness of something. (An added bonus is that as your priorities change, you can update your password. No need to wait for that 90 day roll over!) </div>
<div>
<br /></div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-6571652214369915012017-01-05T12:56:00.000-05:002017-01-05T13:29:29.032-05:00Hello, PC - Leaving Apple HardwarePart of working at Stack Overflow means refreshing a <a href="http://nickcraver.com/desktop-build/" target="_blank">desktop</a> or laptop build every 2 years. For the better part of the last year, I've been waiting on my refresh, and proclaiming the good word about the upcoming Macbook Pro 2016 refresh. Sadly, MBP 2016 refresh is generally <a href="http://bgr.com/2016/10/28/macbook-pro-2016-specs-creative-professionals-developers/" target="_blank">underwhelming</a>. As a result, I went with a <a href="http://www.razerzone.com/store/razer-blade" target="_blank">Razer Blade 2016</a> with <a href="http://www.razerzone.com/store/razer-core" target="_blank">Razer Core</a> docking station.<br />
<br />
Razer Costs:<br />
<ul>
<li>Blade QHD+ 1Tb - $2700</li>
<li>Razer Core - $500</li>
<li><a href="https://www.amazon.com/ASUS-GeForce-STRIX-Graphic-STRIX-GTX1080-O8G-GAMING/dp/B01GRRRRLO" target="_blank">GTX 1080</a> - $680</li>
<li>ASUS 27" <a href="https://www.amazon.com/PG278QR-G-SYNC-Gaming-Screen-Monitor/dp/B01N4ENDXR/ref=sr_1_3?s=pc&ie=UTF8&qid=1483553616&sr=1-3&keywords=ASUS+monitor+gsync" target="_blank">PQ278QR</a> - $699</li>
</ul>
<div>
Total: ~4600</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR7MG-_EGV0xrJXuMSW8y_b2c2Z4tkrbBwJsv7_OFNkJ6-6vcZaj6FDPGA-p6UtQ66tUqDD4SHtwWpe7LUVyOg7uT01Q55qwsMRAW9BjvZfCsZhgHnYY33ynyXeZMO6_7tkvALMIpXXv8/s1600/Capture.PNG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Apple Cart" border="0" height="362" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiR7MG-_EGV0xrJXuMSW8y_b2c2Z4tkrbBwJsv7_OFNkJ6-6vcZaj6FDPGA-p6UtQ66tUqDD4SHtwWpe7LUVyOg7uT01Q55qwsMRAW9BjvZfCsZhgHnYY33ynyXeZMO6_7tkvALMIpXXv8/s400/Capture.PNG" title="Apple Cart" width="400" /></a></div>
<div style="text-align: center;">
(The 2016 MBP, with considerably less power comes in about $600 higher)</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
Setup:</div>
<div style="text-align: left;">
The Razer Core acts as a docking station connecting the PQ278QR, a second vertical document monitor, and my assorted USB peripherals (USB hub / mouse / keybaord / headset). </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXyu_RlVbimZPSIxmJ6eu3BRMaR5WgiZaPFSj2c1lJxRhDZT84Abtzovjai9lCA7NiCesCJSK7HyB8XVuZlnJ-1P1-Vt3LQQ7fW3LTVmX-bAAqNJZ4lUjDASoXRvKdyY7oIJhWp9XZnNw/s1600/IMG_20170105_114620.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhXyu_RlVbimZPSIxmJ6eu3BRMaR5WgiZaPFSj2c1lJxRhDZT84Abtzovjai9lCA7NiCesCJSK7HyB8XVuZlnJ-1P1-Vt3LQQ7fW3LTVmX-bAAqNJZ4lUjDASoXRvKdyY7oIJhWp9XZnNw/s400/IMG_20170105_114620.jpg" width="400" /></a></div>
<br /></div>
<div style="text-align: left;">
Only 2 leads connect to the laptop - USB C on the Right, and the laptop charger on the left.</div>
<div style="text-align: left;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5UAn-F9xpJkeukooPpd9gUhQF4xf-woI0ENfyhCPuqlcW9Nw_ZAopP0kO_DKxSvwBtdLoc9ASdBGKcFLh_4KDpdaqxC9YWv7zVbPfGcLa8X2bRY7G-fZknlHLQDnx46UjXjI8nxWX384/s1600/IMG_20170105_114633.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="300" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5UAn-F9xpJkeukooPpd9gUhQF4xf-woI0ENfyhCPuqlcW9Nw_ZAopP0kO_DKxSvwBtdLoc9ASdBGKcFLh_4KDpdaqxC9YWv7zVbPfGcLa8X2bRY7G-fZknlHLQDnx46UjXjI8nxWX384/s400/IMG_20170105_114633.jpg" width="400" /></a></div>
<br /></div>
<div style="text-align: left;">
To keep my host OS as agnostic as possible, a majority of my work day is compartmentalized into VM's. Any kind of web development is done in my Ubuntu VM. OSX Development for <a href="https://github.com/google/simian" target="_blank">Simian</a> /<a href="https://github.com/google/cauliflowervest" target="_blank"> Caulflower Vest</a> is done in either my OSX Development VM, or an OSX Testing VM (Simultaneous running of these VM's has been the greatest strain on the 16GB of system ram. Bumping my paging file to 32gig seems to have resolved most issues). I offloaded my domain joined Windows VM to a Vmware View Pool running on a remote ESXI cluster (Although this could have easily run locally as well.)<br />
<br />
All local VM's are backed up daily to my Synology, and the Synology copies that volume to AWS. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
With very little customization to the laptop OS (aside from aesthetics / workflow tools like <a href="http://mizage.com/divvy/" target="_blank">Divvy</a> and <a href="http://puush.me/" target="_blank">Pussh</a>) I can easily remain host agnostic. In researching this build I discovered that the I<a href="https://www.amazon.com/Intel-NUC-Kit-NUC6i7KYK-Mini/dp/B01DJ9XS52/ref=sr_1_fkmr1_1?s=pc&ie=UTF8&qid=1483556040&sr=1-1-fkmr1&keywords=NUC+devils+canyon" target="_blank">ntel NUC</a> is compatible with the Razer Core. The NUC could easily replace my laptop in the event of physical damage or repair.</div>
<div style="text-align: left;">
</div>
<div style="text-align: left;">
Disappointments:</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Windows</div>
<div style="text-align: left;">
Windows 10, while a huge improvement over 7, still has significant use issues. Working with multiple monitors with varying DPI is a nightmare. Moving a window from screen to screen results in a stutter. At high DPI, windows 10 is not pretty. (Where native windows fails, a multi-monitor ubuntu VM works just fine)</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Ram</div>
<div style="text-align: left;">
Going with the Razer meant the same ram limitations as the MBP at 16GB. While this was a major factor in pushing me away from the Macbook Pro, I reasoned that I could get by with less demanding Linux VM's, than running Windows in a VM on OSX. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The Bezel</div>
<div style="text-align: left;">
Razor hardware is nice overall, but the bezel is just hideous. I'm not someone who would have thought I'd care greatly about bezel size. The bezel on the Razer is over 1" in place. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Overall impressions</div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Portable</div>
<div style="text-align: left;">
With the pull of 2 cords, I can take my gaming and development systems anywhere. The Razer has an onboard GTX1060, which is GREAT for most games. Using <a href="http://www.macworld.co.uk/how-to/ipad/how-use-your-ipad-pro-as-second-display-for-your-mac-or-pc-3633246/" target="_blank">Duet</a> I can turn my ipad into a second screen, or use my <a href="https://www.amazon.com/AOC-e1659Fwu-1366x768-Brightness-3-0-Powered/dp/B0105TIGI8?th=1" target="_blank">AOC 16" monitor</a>. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
Powerfull</div>
<div style="text-align: left;">
Part for part, the Razer 2016 has better graphics, Ram and CPU compared to the Macbook. Not much to say on this, other than I'm getting much more machine for less. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
In conclusion - Never again Apple. I was so ingrained in the Apple ecosystem that I nearly forgot what it was like to freely choose the hardware and software I wanted. Some things are done very well by Apple - OSX is a beautiful OS that looks great even in my VMs. It's disappointing that a few marginal hardware improvements (32 gig of Ram, a reasonable battery, working with NVidia to put a substantial card in their system...) could have kept the MBP as my primary device; I am happy to be reminded by this "Brave" move that Apple does not care about Gamers, or developers with strong opinions about hardware.</div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-47541812494906785392016-07-11T12:22:00.000-04:002016-07-11T12:38:46.275-04:00Dear Blizzard: Please fix competitive play.You don't have to look much further than <a href="https://www.reddit.com/r/Overwatch/" target="_blank">/r/overwatch</a> to see that competitive play is broken. Matchmaking is a<a href="http://eu.battle.net/forums/en/overwatch/topic/17611861510" target="_blank"> terrible joke</a>, and Blizzard has <a href="http://www.pcgamer.com/blizzard-has-acknowledged-overwatch-matchmaking-problems-in-australia/" target="_blank">acknowledge the problem</a>. <br />
<br />
After losing around 15 straight matches this weekend, while playing with very competitive friends, I've concluded ranked play is just not functional, much less enjoyable. <br />
<br />
Below are some simple ideas, in patch note form, that would make play less terrible. <br />
<div>
<ul style="background-color: #1f2326; box-sizing: inherit; cursor: default !important; margin-bottom: 0px; margin-left: 1.5rem; padding: 0px;"><ul style="box-sizing: inherit; cursor: default !important; margin-bottom: 0px; margin-left: 1.5rem; margin-top: 0px; padding: 0px;"><br />
<li><span style="color: #00b4ff; font-family: "blizzard" , sans-serif; font-size: 17px; line-height: 25.5px;"><span style="color: white; font-weight: bold; text-decoration: underline;">General</span></span></li>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Player location data, and other exploitable information is treated more securely in the game client. </li>
<ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">We also intend to treat the use of aim-bots and other trainers much more severely. We've hired 1 team member to create new detection methods for Governor on a weekly basis.</li>
</ul>
<li><span style="color: #00b4ff; font-family: "blizzard" , sans-serif; font-size: 17px; line-height: 25.5px;"><span style="color: white; font-weight: bold; text-decoration: underline;">Heros</span></span></li>
<li><span style="color: #00b4ff; font-family: "blizzard" , sans-serif;"><span style="font-size: 17px; line-height: 25.5px;">[Competitive]</span></span></li>
<ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Hero choice will now be a draft pick.</li>
<ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Players will be assigned draft picks randomly (similar to HotS)</li>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Heroes must be unique per teams. </li>
</ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Players with less than 8 hours on a given Hero will not be allowed to select that Hero in draft.</li>
<ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default; font-family: blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">As a result, players must have 8+ hours of play on 7 unique heroes before entering competitive play.</li>
</ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Players can still switch to available heroes during the match.</li>
</ul>
<li><span style="color: #00b4ff; font-family: "blizzard" , sans-serif; font-size: 17px; line-height: 25.5px;"><span style="color: white; font-weight: bold;"><u>Competitive Play</u></span></span></li>
<li><span style="color: #00b4ff; font-family: "blizzard" , sans-serif;"><span style="font-size: 17px; line-height: 25.5px;">[Party System]</span></span></li>
<ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Players can "Search" for filler players based on criteria:</li>
<ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Minimum number of hours as a certain hero</li>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Willingness to play certain class types</li>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Hours since unlocking ranked play.</li>
</ul>
</ul>
<li><span style="color: #00b4ff; font-family: "blizzard" , sans-serif;"><span style="font-size: 17px; line-height: 25.5px;">[Rank Experience]</span></span></li>
<ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Winning a match after a team mate leaves will result in a 2x reward</li>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Leaving a match will result in a 2x rank loss for the leaver</li>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Players that lose with a level 25 on PUG will suffer no penalty*.</li>
</ul>
<li><br /></li>
<li><span style="color: #00b4ff; font-family: "blizzard" , sans-serif; font-size: 17px; line-height: 25.5px;"><span style="color: white; font-weight: bold;"><u>BUG FIXES</u></span></span></li>
<ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">Sudden Death has been removed*.</li>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">'Suffer No Penalty' has been removed from the early leaver text.</li>
<ul>
<li style="box-sizing: inherit; color: #00b4ff; cursor: default !important; font-family: Blizzard, sans-serif; font-size: 17px; line-height: 25.5px; list-style-type: square;">We apparently didn't understand what those words meant*.</li>
</ul>
</ul>
<li><span style="color: #00b4ff; font-family: blizzard, sans-serif;"><span style="font-size: 17px; line-height: 25.5px;"><br /></span></span></li>
</ul>
<li><span style="color: #00b4ff; font-family: blizzard, sans-serif;"><span style="font-size: 17px; line-height: 25.5px;">*Tongue in cheek, but seriously these issues need to be addressed.</span></span></li>
</ul>
<div>
<span style="color: white; font-family: "blizzard" , sans-serif;"><span style="font-size: 17px; line-height: 25.5px;"><b><u><br /></u></b></span></span></div>
<div>
<span style="color: white; font-family: "blizzard" , sans-serif;"><span style="font-size: 17px; line-height: 25.5px;"><b><u><br /></u></b></span></span></div>
<div>
<span style="color: white; font-family: "blizzard" , sans-serif;"><span style="font-size: 17px; line-height: 25.5px;"><b><u><br /></u></b></span></span></div>
<br /></div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-14024936553886759782015-05-23T11:25:00.002-04:002015-06-07T15:36:36.638-04:00Multi-threading and Web Requests<br />
I'm writing a tool that needs to make over 200 API calls using the requests library in python. The function is doing little more than asking for information and then appending that information into a list. The current run time results look like this:<br />
<blockquote class="tr_bq">
[Finished in 209.3s]</blockquote>
I think I can do better. The main delay is caused because each request must be made after the previous request has finished (or in 'consecutive' order). This happens because a single python script runs as a single thread, processing things consecutively. <br />
<br />
Running multiple threads would resolve this problem.A quick search for python multithreading points me to the <a href="https://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers" target="_blank">Pool</a> class in the <a href="https://docs.python.org/2/library/multiprocessing.html" target="_blank">multithreading library</a>. Using a pool of "workers" (threads) I can run each web request concurrently. <br />
<br />
My first attempt at implementing a pool results in the following error:<br />
<blockquote class="tr_bq">
Can't pickle <type instancemethod=""></type></blockquote>
Stack Overflow <a href="http://stackoverflow.com/questions/25156768" target="_blank">had an answer</a> pointing out that in order to pass the work around to multiple threads, the job for each thread needed to be converted into a standard format (serialized or 'pickled'). the particular serializer used by this library dosen't understand how to serialize an instanced method, so we'll help it out:<br />
<script src="https://gist.github.com/selfcommit/66e43bc51820b1c054ed.js"></script>
<div style="text-align: left;">
Placing the above script in my class means that it will add understanding for instanced method pickling. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The next hurtle was the need to pass multiple values into a function called by a Pool instance. While there seem to be many suggested ways of doing this, I found building a helper function to be easiest. </div>
<div style="text-align: left;">
<br /></div>
<script src="https://gist.github.com/selfcommit/acafebf3b23149710fb5.js"></script>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
This helper function takes the a tuple of arguments handed to it, and then calls the "real" function passing the tuple values in. Putting everything together looks something like this:</div>
<div style="text-align: left;">
<br /></div>
<script src="https://gist.github.com/selfcommit/2334c0e32246cb0de1b1.js"></script>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
In the end pool.map is handed the helper function to call, and a payload. The payload consists of a list of tuples. Each tuple contains the arguments needed for 1 call of the function doing the work (sometimes called the 'Critical Section'). The end result:</div>
<blockquote class="tr_bq" style="text-align: left;">
[Finished in 16.3s]</blockquote>
Running with 32 processes, the task took only 16.2 seconds. I'd say that's a solid improvement. Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-12667885814242609462015-05-16T14:19:00.004-04:002015-06-10T19:54:58.082-04:00Student Debt is America's Giving Tree<div style="text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwC4fCRj2m7B1mXkdoq-88Qo5IBTtou0o_zdDg3Xf5le5YAg8tJGuYzcWYFsXhjTOG_ByRjYUwq59DgW54aumvsiHfvtiuCLm4nNEpmGlrH_f87nh3a_VNa-J-hFITV4MsJrBYhAUBvOc/s1600/tree_happy.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="239" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwC4fCRj2m7B1mXkdoq-88Qo5IBTtou0o_zdDg3Xf5le5YAg8tJGuYzcWYFsXhjTOG_ByRjYUwq59DgW54aumvsiHfvtiuCLm4nNEpmGlrH_f87nh3a_VNa-J-hFITV4MsJrBYhAUBvOc/s320/tree_happy.jpg" width="320" /></a></div>
<div style="text-align: center;">
<br /></div>
I'm not an accountant. I'm not a bureaucrat. I am a 31 year old with a mountain of student loan debt. Understanding student debt requires bureaucratic and accounting skills (neither of which were part of my college education.) The real problem of student debt is the problem of 'fake money'. <br />
<br />
To understand fake money, lets say two people decide to purchase an apple tree sapling. Lets call them Bob and Sue. Bob and Sue each pay $1 for 50% ownership of the sapling. Bob and Sue are investors, so they're really in this venture for apples. They agree that every year, they will each take 10 apples and leave the remaining apples on the tree, allowing the tree to reproduce, improve society, and other things that trees with apples do. <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGjM9doGZWMCNsZOKSsVNiwDJe7biGFViikpDlTbsEqfQdSq0Dl4dqDfKDsSGXj_I0GKEpVctI3yOqaoDjyH4c3KAvFL7HPl6mqkJo6KeepQwnN5NCBGLacxy44OoQK8gd0TZTKKHF23s/s1600/all_the_apples.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="206" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGjM9doGZWMCNsZOKSsVNiwDJe7biGFViikpDlTbsEqfQdSq0Dl4dqDfKDsSGXj_I0GKEpVctI3yOqaoDjyH4c3KAvFL7HPl6mqkJo6KeepQwnN5NCBGLacxy44OoQK8gd0TZTKKHF23s/s400/all_the_apples.png" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />
The rub of this problem occurs in year 1 when the sapling has yet to yield any fruit. Bob and Sue arn't sure what to make of this, as now neither of them have yielded their annual apples. They agree that they'll just each take 21 apples next year (with an additional apple for interest). Unfortunately 2 years in the apple sapling is still not yet a fruit bearing tree, and this problem persists until the apples + interest owed Bob and Sue is greater than the tree could ever yield in 1 year. Without apples to spread seed, the tree will never produce, local wild life will not be able to glean fruit from the tree and small ecosystem to which the tree belongs is all the poorer. <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVeOgdufOsibbdXAZDwrWqxFoHx66_STXwzlChtjWdcE1M9cJiNL4kqWUs1GeyttdOOkifNoRlQ4xJFxJE8T61oc1t0iAdcPlD7vdkPl8PJwt0QwOVsFlXwMt87Cg1YULlOtQYrV2e8Ec/s1600/branches.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="215" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjVeOgdufOsibbdXAZDwrWqxFoHx66_STXwzlChtjWdcE1M9cJiNL4kqWUs1GeyttdOOkifNoRlQ4xJFxJE8T61oc1t0iAdcPlD7vdkPl8PJwt0QwOVsFlXwMt87Cg1YULlOtQYrV2e8Ec/s400/branches.png" width="400" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />
Bob and Sue generated this problem by relying on 'Fake Apples'. Just because they agree to a certain yield per year does not mean that yield will occur. Counting missed yields as a debt (and worse, a debt with interest) only compounds the issue. The tree is depraved basic fruit bearing freedom, and Bob and Sue come across as greedy uncaring apple investors. <br />
<br />
Rather than 'Fake Apples' Bob and Sue could have agreed to a percentage of apples each year. This agreement eliminates the problem of fake apples by ensuring that Bob and Sues' yield is always a known number of 'real' apples. If Bob and Sue agree to 25% of all apples yielded annually each, then that would leave 50% for the tree and local ecology. Further, since the tree is able to bear fruit Bob and Sue might also to invest in future saplings and see even more return. The local ecosystem is improved by a greater number of available apples, and Bob and Sue are now investors deeply concerned with the health of their tree and that trees children. <br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuLNMnse2BUnPx09VjYYWKn6GKN2ENesu7XTlhmu3aqXUub3su9SbwT09r8kde6-KBa-LKiQF5c5930kV2NTwEhm7Zi0vSw-wEM-kzCsOtVxZU_95AYWGrZXCxAeLN-dctrlv-xR090sA/s1600/1apple.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhuLNMnse2BUnPx09VjYYWKn6GKN2ENesu7XTlhmu3aqXUub3su9SbwT09r8kde6-KBa-LKiQF5c5930kV2NTwEhm7Zi0vSw-wEM-kzCsOtVxZU_95AYWGrZXCxAeLN-dctrlv-xR090sA/s1600/1apple.jpg" /></a></div>
<div style="text-align: center;">
<br /></div>
<br />
Translating the above problem to student debt is very easy. In our current system investors give freshly minted adults and sometimes even 17 year olds (children!) a choice. That choice is 'Don't go to school', or instead borrow from the limitless well of student loan money. This situation is cyclically worsened as Universities increase cost of attendance due to inflated demand, brought on by highly available 'cheap' money (student loans). <br />
<br />
The reality is that student loans are anything but cheap. While they offer nice incentives like "deferment while in school" and 'low' interest rates of 6%, these loans have hidden and obscured costs. Inability to pay student loans can result in interest rate increase, penalty fees and destruction of credit worthiness. Attempts to find information on loan consolidation and repayment will point the average apple tree (sorry, American consumer) towards predatory companies that charge fees in exchange for assistance applying to free government programs. Worse yet, an apple tree could end up in a consolidation program that combines payments into 1, but increases interest overall. <a href="http://www.nolo.com/legal-encyclopedia/student-loan-debt-bankruptcy.html" target="_blank">Even Bankruptcy is not an option for student debt</a>.<br />
<br />
The problem of student debt repayment is less about people wanting to repay a debt, and more so about being handed a debt they are unable to repay. Much like fake apples, student loans rely on fake money. There is no guarantee that a given individual will earn a given amount, or that a fee repayment schedule will allow them to make payments and still prosper. I propose a new loan structure that would make lenders take on a modicum of risk (of which they presently take none). <br />
<br />
Student loans should a 'real' apples loan policy. This policy would work both for new students and past borrowers looking to convert their debt. An example 'real' apples policy for a student with an estimated $80000 in student loans would look like this:<br />
On average it is safe to say most 22 year olds leaving college will be employed at least 25 years. <br />
'real' apples approach looks at that $80000 and 25 years, while considering that they would like to make their money grow by 20% in that time.(These numbers can and should fluctuate with the students choice of major, school of choice, and estimated future wages) <br />
<br />
<div style="text-align: center;">
$80000 * 1.20 = $96000</div>
<div style="text-align: center;">
$96000 / 25 /12 /2 = $160</div>
<div style="text-align: center;">
current minimum wage ($7.25) * 40 * 2 = $580</div>
<div style="text-align: center;">
$160 is about 27% of a paycheck at minimum wage</div>
<div style="text-align: center;">
<br /></div>
<div style="text-align: left;">
<b>Edit: I just re-read this.. WOW my %'s are off. $160 *2 would actually be $320 a month, or %54 percent of income at minimum wage. That's WELL over the generally accepted 36% debt-to-income ratio lenders use for the purchase of homes, and WAY higher than anyone could afford to exist on while paying. It seems as though more thought is required here. </b><br />
<b><br /></b>
Here is where 'real' apples loans save education and all of society. If the agreed repayment is capped at %20 of pre-tax income (and really, if you're earning minimum wage you should be well below tax) then anyone that is employed should be able to afford bi-monthly payments. Lenders gamble that they will receive their entire return on investment over the course of 25 years at a rate of 20% of taxable income per year; Not to exceed the original $96000. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
The lender is incentivized in this model because they can potentially see their return faster. The borrower is incentivized because as they earn more debt is eliminated faster while remaining a constant, payable, percentage of wages. Society is a better place because debt is repaid faster, with the added bonus of incentivizing lenders to increase educational lending as the minimum wage increases. <i>I'll say that again - increasing the minimum wage would organically increase educational funding at a safe and sustainable rate. </i></div>
<div style="text-align: left;">
<br /></div>
<blockquote class="tr_bq" style="text-align: left;">
How could someone earning minimum wage be asked to give up 20% of their paycheck?</blockquote>
<div style="text-align: left;">
The reality is they are already being asked to pay that much and more. Worse yet, student loan repayment is often at a rate a majority of millennial cannot afford (many of whom are in their 30's and still struggling with the payments).</div>
<div style="text-align: left;">
<br /></div>
<blockquote class="tr_bq" style="text-align: left;">
Twenty percent is a terrible return on a potentially 25 year investment.</blockquote>
<div style="text-align: left;">
Since repayment occurs faster as income increases, lenders would also be incentivized to encourage things like job placement, career advancement, selective of lucrative majors and generally "Caring" about the people whom they're presently financially abusing from a young age. (Much like apple tree)</div>
<div style="text-align: left;">
<br /></div>
<blockquote class="tr_bq" style="text-align: left;">
But if lenders get to pick and choose what to fund - THE ARTS WILL FAIL!</blockquote>
<div style="text-align: left;">
Schools will be incentivized to charge according to the cost of the program, and not a flat cost per credit fee in all courses. Charging fees according to major, based on available money a student can borrow for that major is more respectful to the student than charging $40,000 over 4 years for both an electrical engineering program, and a communications degree. Schools are creative and full of very smart people, they'll figure it out. </div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: center;">
So.. How about them apples?</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGLvLic5tXbDJpv5qJQtiOdcV4CQaQukZuUffD1A7XbxS9r_IznCHTw5fobAMxZyFDFAy55dsCRY_QhgXNAwhWYJrWkMvLAx3mGjwmeDkx5tBwNMUlOldVaFVV6T6AlDTZnTlkDEtsHuY/s1600/giphy.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjGLvLic5tXbDJpv5qJQtiOdcV4CQaQukZuUffD1A7XbxS9r_IznCHTw5fobAMxZyFDFAy55dsCRY_QhgXNAwhWYJrWkMvLAx3mGjwmeDkx5tBwNMUlOldVaFVV6T6AlDTZnTlkDEtsHuY/s1600/giphy.gif" /></a></div>
<div style="text-align: left;">
<br /></div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-2488094943702005682015-05-14T12:54:00.002-04:002015-05-14T12:54:32.347-04:00Beautiful WebscrapingI'll be working out the <a href="http://stackexchange.com/" target="_blank">Stack Exchange</a> London office for the next 2 weeks. Getting there will be a 6 hour flight, and it is likely not to have an internet connection. On long trips, lacking internet, I like to work on problems from <a href="https://projecteuler.net/" target="_blank">Project Euler</a>. I'd rather not manually download every problem to my <a href="https://github.com/selfcommit/Project-Euler" target="_blank">git repo</a>, but with a little bit of Python I can automate it.<br />
<br />
A problem on project Euler is presented on a simple page, sampled below:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirnpgOIHYEp2hcwAmJHFGEpGbYNKmFKP6_kYwcGESgWtHnRpCK-g47TXz8Me14RqQLgSo-8P2JMlAVLoF_aqVHe1e5VdzHHtYo4Yn8vVatcLp2r1sq5LQJWawd2k7gUB4TAzVeZH-P2mY/s1600/Screen+Shot+2015-05-14+at+12.29.42+PM.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="372" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEirnpgOIHYEp2hcwAmJHFGEpGbYNKmFKP6_kYwcGESgWtHnRpCK-g47TXz8Me14RqQLgSo-8P2JMlAVLoF_aqVHe1e5VdzHHtYo4Yn8vVatcLp2r1sq5LQJWawd2k7gUB4TAzVeZH-P2mY/s640/Screen+Shot+2015-05-14+at+12.29.42+PM.png" width="640" /></a></div>
<br />
Looking at the page, we can see that the URL is easily manipulated. Replacing the number at the end of the URL should get the corresponding problem. Using the <a href="http://docs.python-requests.org/en/latest/" target="_blank">requests library</a> and a for loop should quickly hit every problem page. <br />
After hitting each page, I need to grab the relevant content. After looking at the HTML in the page, it's clear that the problem is stored in a div tag with the class "problem_content"<br />
<blockquote class="tr_bq">
<blockquote class="tr_bq">
<script src="https://gist.github.com/selfcommit/c8075cfc0eed05ecb261.js"></script></blockquote>
</blockquote>
<br />
<a href="http://www.crummy.com/software/BeautifulSoup/bs4/doc/" target="_blank">BeautifulSoup</a> can parse HTML returned by the requests and spit out just the problem text. I've included my script below. The relevant variables should be easy enough to change if anyone would like to include it in their own repo.<br />
<br />
<script src="https://gist.github.com/selfcommit/f4b7c429d1e3071ac8da.js"></script>Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-39232412128494171112015-05-13T16:00:00.002-04:002015-07-02T10:54:40.867-04:00Configure GADS for Nested GroupsConfiguring Google Apps Directory Sync (<a href="https://support.google.com/a/answer/106368?hl=en" target="_blank">GADS</a>) to utilize nested AD groups requires that the 'members' field, of the<a href="http://www.google.com/support/enterprise/static/gapps/docs/admin/en/gads/admin/config_group_sync.html" target="_blank"> GADS group search rule</a>, be populated with a valid AD filter. GADS will look at any Unicode attribute in an AD object to fetch that filter. Before we can point GADS to that attribute, we'll need to populate it. <br />
<br />
<br />
That filter can be generated a number of ways, but here's an example in power-shell:<br />
<br />
<script src="https://gist.github.com/selfcommit/f6e1dcee80b8c4aa319c.js"></script><br />
<br />
The member field of the GADS group rule looking at your target ou should be populated with the attribute which is storing filter information (In our above script, we used the attribute info). Also ensure that the "Dynamic (query-based) group" checkbox is checked.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgofEwDp62EgFDHnGWH6VACLD-S3nNqLOtsfpRCG8kteuI6uf_auSv8k-VCH-sBnVETik9QV-nwsgdoXMO5KTIBs4mmvLWlcvfi5asHAEE_5FiPFteRARYD46w_TawSzpZHPGs9s4f6FRI/s1600/2015-05-13.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="444" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgofEwDp62EgFDHnGWH6VACLD-S3nNqLOtsfpRCG8kteuI6uf_auSv8k-VCH-sBnVETik9QV-nwsgdoXMO5KTIBs4mmvLWlcvfi5asHAEE_5FiPFteRARYD46w_TawSzpZHPGs9s4f6FRI/s640/2015-05-13.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
More on <a href="http://www.google.com/support/enterprise/static/gapps/docs/admin/en/gads/admin/prep_ldap.html" target="_blank">LDAP Queries</a> and <a href="http://www.google.com/support/enterprise/static/gapps/docs/admin/en/gads/admin/toc.html" target="_blank">GADS config</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<br />Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.comtag:blogger.com,1999:blog-3698824044981962178.post-80820564692320139112015-04-02T00:30:00.003-04:002015-04-02T00:31:12.902-04:00Vmware View in ChromeOSI've been waiting a long time for a native VMware View Client for ChromeOS. Google recently released <a href="https://developer.chrome.com/apps/getstarted_arc" target="_blank">project ARC Welder</a> which allows android applications to run natively in ChromeOS. Using ARC, I've published a working copy of the <a href="https://chrome.google.com/webstore/detail/vmware-view/ddjjjfcfjkjejafalkgefnhdaicbmaod" target="_blank">VMware View client for ChromeOS</a><br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://chrome.google.com/webstore/detail/vmware-view/ddjjjfcfjkjejafalkgefnhdaicbmaod" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjU7Pam-_xSyxrvwLfcDOlw9RgBdZsNzjSw87Zb1UONYpIRBVGLeVPttWCxvkei92gG3gax7FcsLooimBTri6Pd1XqXczvEeMkwL1teZfDXMtOWzeT4gNLBOBsJLBWACqXfzOe4Y4zjwds/s1600/icon.png" /></a></div>
<br />Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-2264123650649404292015-03-13T19:18:00.003-04:002015-03-13T19:18:34.151-04:00My Two Awesome Dogs.I went to link a picture of my dogs on Reddit, and realized I don't have one readily available online.<br />
<br />
Now I do.<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVoZcLvn09Q9E3gseH_SS92lmDYp8vZcmuFKULCh9w4rvRa8_oV_DQrA7cXteFwTtUQA-2J1WcOLuIrQBPybQmnAgJM4BiPZ3hvRFvMhHl0kr4UZJxFDZw-evIWRVApdHOV0MGaOTqywY/s1600/IMG_20150310_115851.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVoZcLvn09Q9E3gseH_SS92lmDYp8vZcmuFKULCh9w4rvRa8_oV_DQrA7cXteFwTtUQA-2J1WcOLuIrQBPybQmnAgJM4BiPZ3hvRFvMhHl0kr4UZJxFDZw-evIWRVApdHOV0MGaOTqywY/s1600/IMG_20150310_115851.jpg" height="480" width="640" /></a></div>
<br />
<br />Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-29424933762917641412015-02-28T18:06:00.000-05:002015-02-28T18:12:45.624-05:00No More Voice Plans.If you're like me and hate paying for "Voice" and "Data" plans (knowing at the end of the day, it's all "Data", and don't 'talk' on the phone much anyway) - You can finally escape the Voice Plan problem using T-Mobile. With a bit of poking around (and Google Voice) I've setup my tablet to do everything I used to do on my cellphone. I now pay $20 a month for 1 GB of 4G LTE data per month, with "DataStash" (T-Mobile marketing meaning my unused data rolls over each month). <br />
<br />
First, some background on why I did this. I hate carrying both my phone and my tablet with my everywhere. In addition, I really hate the idea of paying an additional fee for an Internet Hotspot to keep in my backpack when I'm on the go. I'm only ever without Wifi 1-2 times per month, and <a href="http://www.verizonwireless.com/wcms/consumer/shop/prepaid.html" target="_blank">Verizon's Hot-Spot plans are ridiculous</a>. <br />
<br />
T-Mobile's DataStash lets me accrue 4G data month to month, which works for me since a majority of the time I'm on Wifi. I needed a "gap" device for those times when I was driving or otherwise disconnected. I also wanted a "Backup" internet connection for times when my home or Hotel internet was out. My Nexus 9 tablet on T-Mobile solved all these problems. <br />
<br />
The first step was to port my existing Cell phone number to <a href="https://www.google.com/voice/" target="_blank">Google Voice</a>. This process is no different than porting your number to any other cell provider. The porting cost me $20. If you already use voice (Like I did) you can also keep your existing Google Voice number forever for an additional $20. I needed to keep both, as most people know and use my existing Google Voice line.<br />
<br />
After porting was complete (Took about 24 hours) I paid the additional $20 and set my original Google Voice number as my primary. At this point Google Voice will route all text messages and voice calls to either number. The end result is that Google Hangouts rings on my Tablet, Macbook, and any other device where Hangouts is installed. <br />
<br />
On my Tablet, I use the <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.hangoutsdialer&hl=en" target="_blank">Hangouts Dialer app</a> to make outgoing calls. The Dialer app can replace hangouts completely.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/UwSal7a7pexeuvm_WWcL09lYzWbFRmAayiDc94CZ0tx0ZwCSy2Gz46ieQQxS-jYbQ-o=h900-rw" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/UwSal7a7pexeuvm_WWcL09lYzWbFRmAayiDc94CZ0tx0ZwCSy2Gz46ieQQxS-jYbQ-o=h900-rw" height="400" width="222" /></a><a href="http://4.bp.blogspot.com/a2LlVIAjXhDtP3kKAmbVmLI8ertu3iqXO4LmUaET8_twse8vQL9Sn2Qnbmxv248xyPT1=h900-rw" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/a2LlVIAjXhDtP3kKAmbVmLI8ertu3iqXO4LmUaET8_twse8vQL9Sn2Qnbmxv248xyPT1=h900-rw" height="400" width="222" /></a></div>
<br />
<br />
All this runs over the internet (No "Voice minutes" required, just data). At this point, all I need is 4G LTE on the tablet.<br />
<br />
I picked up a <a href="http://www.amazon.com/T-Mobile-Complete-SIM-Starter-Kit/dp/B00LPPHHFK/ref=sr_1_1?ie=UTF8&qid=1425163588&sr=8-1&keywords=t+mobile+sim+starter+kit" target="_blank">T-Mobile Sim Starter Kit</a>, (You could also visit <a href="http://www.t-mobile.com/store-locator.html?002=2201628&006=38342708679&007=Search&008=&009=e&012=t%20mobile%20store%20locator&010=FindAStore&cmpid=WTR_PB_0vojGSjF&gclid=CjwKEAiA68WnBRCJxZr5qoaL3iMSJAAXIrr3c-mIAhIbQhEMWFZ5pnfpRmVUxIimNi8wk5j-IZhoBRoCSinw_wcB" target="_blank">your local T-mobile Store</a>). Settings up the tablet was a bit tricky - only because I went with T-Mobiles Sim card kit. While the information seems to point you in the right direction - I ultimately needed to call T-mobile support and request to add my Tablet as a "Post-Paid" and not a "Pre-Paid" option. Either choice would technically work for setup, but the pre-paid plans don't include data rollover. I don't mind paying $20 a month, every month, in exchange for rolling data - but your milage may vary.<br />
<br />
Just to be clear there's 2 plans<br />
<ul>
<li><a href="http://www.t-mobile.com/cell-phone-plans/mobile-internet.html#tab-navigation" target="_blank">PostPaid</a> (I recommend this one, because of Data roll over)</li>
<li><a href="http://prepaid-phones.t-mobile.com/prepaid-internet" target="_blank">Pay as you Go</a></li>
</ul>
<br />
The end result is a tablet that handles all my phone and tablet needs, and has internet everywhere for only $20 a month. Additionally, if I know I'm going to be away -like at Pycon this spring, I can purchase a day / week / month long datapass for additional use. T-mobile has finally got usage right on their monthly mobile data plans - it's too bad they're not marketing it better. I understand that their bread is probably buttered by voice plans - but I think the average technical user will be much happier with a $20 bill over an $85 one.<br />
<br />
1 step closer to my Star Trek future.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif_qloRWtvMlqh-aP6O-AfTXWygRvuEq5-RthrQBJmtwWGaqzfUz8eHUnrUTR3zdIGwh773zNyx35Qj9Ygl3VkUgD7NeMmv1vucv9PyWRzhM_8rStz_x2jYtx4ol8TUdrL1N2EV-AO2Vw/s1600/big-picard_pad_5696.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEif_qloRWtvMlqh-aP6O-AfTXWygRvuEq5-RthrQBJmtwWGaqzfUz8eHUnrUTR3zdIGwh773zNyx35Qj9Ygl3VkUgD7NeMmv1vucv9PyWRzhM_8rStz_x2jYtx4ol8TUdrL1N2EV-AO2Vw/s1600/big-picard_pad_5696.jpg" height="241" width="320" /></a></div>
<br />Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-6664518043411198742015-02-14T15:50:00.005-05:002015-02-14T15:55:20.445-05:00UML Diagrams in DjangoRecently I've been working on a database project for Grad class. I needed to generate a UML diagram as a milestone for the project. I've always felt like doing a "Rough Draft" of anything was like doing double work - so I thought it would be cool if I could programmatically generate a UML from my python models.<br />
<br />
It turns out other people have had this idea and done a nice job of implementing it with <a href="https://pypi.python.org/pypi/pyreverse/0.5.1" target="_blank">Pyreverse</a>. <br />
<br />
Getting started you'll need:<br />
<br />
On Ubuntu:<br />
<blockquote class="tr_bq">
sudo apt-get install graphvix libgraphviz-dev python-dev</blockquote>
<blockquote class="tr_bq">
pip install pylint pygraphviz</blockquote>
On OSX: (I found it easiest to use <a href="http://brew.sh/" target="_blank">Homebrew</a>)<br />
<blockquote class="tr_bq">
brew install graphviz </blockquote>
<blockquote class="tr_bq">
pip install pylint pygraphviz </blockquote>
I also added <a href="http://django-extensions.readthedocs.org/en/latest/installation_instructions.html" target="_blank">django-extentions</a> to my project to clean up some of the meta data from django.<br />
<br />
The result: (where HospiPal is the name of the app I'd like modeled)<br />
<blockquote class="tr_bq">
python manage.py graph_models -g -e -l dot -o django.png HospiPal</blockquote>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSF9rjTBFTUNcPgBH535a1s5kW4ycnQm8sX7UEBZc4-72eUFIAEBrzYoqjR6nnPRtTUXvefQGUCMjcZlaKU6XcEaiUnLyYtcmlvF4kns1CToej9pTYrpQTWIJXb60WG6A3DscpMnTrSWo/s1600/django.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhSF9rjTBFTUNcPgBH535a1s5kW4ycnQm8sX7UEBZc4-72eUFIAEBrzYoqjR6nnPRtTUXvefQGUCMjcZlaKU6XcEaiUnLyYtcmlvF4kns1CToej9pTYrpQTWIJXb60WG6A3DscpMnTrSWo/s1600/django.png" height="348" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Personally, I find this graph beautiful. Saves me quite a bit of time building UML models as well.<br /><br />References:<br /><a href="http://twigstechtips.blogspot.com/2014/09/python-visualise-your-class-hierarchy.html?utm_source=reddit&utm_medium=django" target="_blank">Visualize Your Classes Post</a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-72541424344949180512014-10-18T16:17:00.001-04:002014-10-18T16:17:48.574-04:00How Does Google Work?Great Slideshow that I wanted to share. I look at the way they talk about how Google is run, and it reminds me of the way my Dad, and the other leaders ran our scout troop. If you asked any leader "who was in charge" they would say the kids were. <br />
<br />
The real "organizing" was in their ability to create invisible fences for us. We could fail. If someone forgot to buy the groceries for the trip that weekend... that was on us. We wanted to build a catapult large enough to hurl pumpkins? They were there to help (And watch as it broke on the first pre-camp trial)<br />
<br />
<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="356" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/40175706?rel=0" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="427"> </iframe> </div>
<div style="margin-bottom: 5px;">
</div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-56585358909281915062014-09-17T01:21:00.000-04:002014-10-02T11:44:50.378-04:00I can Powershell and so can you!<br />
Often automating a task is <a href="http://xkcd.com/1205/" target="_blank">not worth the time</a> and rarely takes <a href="http://xkcd.com/1319/" target="_blank">the time planned</a>. At <a href="http://www.stackexchange.com/" target="_blank">StackExchange</a> we have lots of people on our team and in our community <a href="http://stackoverflow.com/tags/powershell/hot" target="_blank">who are amazing at Powershell</a>. <b>I am not one of those people</b>.<br />
<br />
<div>
<h4>
<i style="font-weight: normal;">Is it possible to save time using Powershell, even if you're not a guru? </i><i>Sure!</i></h4>
<div>
<i><br /></i></div>
<h3>
<span style="font-size: large;">Framing the Problem</span></h3>
</div>
<div>
At Stack we use <a href="http://www.google.com/enterprise/apps/business/" target="_blank">Google Apps for Work</a>. Google Apps for Work includes a great tool for linking your existing Active Directory structure to your Google Accounts. That tool, <a href="https://support.google.com/a/answer/106368?hl=en" target="_blank">Google Apps Directory Sync</a> (GADS) allows a company to sync Active Directory Users and Groups with Google email accounts and mailing lists. We already sync our users with email addresses, but my task is to also link our security groups with email distribution lists. </div>
<div>
<br /></div>
<br />
<table class="tg">
<tbody>
<tr>
<th class="tg-031e"><a href="http://i.imgur.com/s8lWuF5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="http://i.imgur.com/s8lWuF5.png" height="260" width="400" /></a></th><th class="tg-031e"><br />
<div style="text-align: left;">
<span style="font-weight: normal;">In a fresh environment, this would be incredibly easy. However, we have a number of mailing lists that exist on the "Google side" that don't have matching security groups in AD. This issue is compounded because when group sync is enabled in GADS, any group that does not match an AD group will be deleted on the Google side. As a friend put it:</span></div>
<br />
<br />
<b>We need to attach a trailer to a moving vehicle.</b></th></tr>
</tbody></table>
<div>
<br />
<br /></div>
<div>
<h3>
<span style="font-size: large;">Steps to resolve the problem:</span></h3>
</div>
<div>
<ol>
<li>Match existing AD Security Groups to Google mailing lists.</li>
<li>Generate AD Security Groups that don't exist for matching Google mailing lists.</li>
<li>Populate the AD Security Groups with the correct users</li>
</ol>
<div>
If you're familiar with GADS, you'll know #1 is pretty easy. Using an AD filter we can <a href="https://www.google.com/support/enterprise/static/gapps/docs/admin/en/gads/admin/config_group_sync.html" target="_blank">match groups in our AD structure</a> to existing Google Groups. The only concern here is to make sure that the AD groups actually have the same users as the existing Google group, since no sync has occurred previously. </div>
</div>
<div>
<br /></div>
<div>
<a href="http://i.imgur.com/6l48aYe.jpg" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img alt="Too Many Clicks..." border="0" src="http://i.imgur.com/6l48aYe.jpg" height="221" title="" width="320" /></a>The second issue, Generating AD Security Groups that don't exist as mailing lists, poses a problem.<br />
Running a simulated Sync on GADS shows <b>80 Google Groups </b>without a matching AD security group. (<b>That's quite a few clicks...)</b><br />
<br /></div>
<div>
<br /></div>
<div>
This is our first opportunity to use Powershell to solve our problems. </div>
<div>
<br /></div>
<div>
<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div style="text-align: left;">
I start by grabbing a list of groups that arn't in AD. GADS simulated Sync logs those groups in a way that is easily copy/pasted into a nice Tab separated format.</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1S8u6EB6o3fIOj-HAjFkK-YAiPxxrsX_ef_-RgCTRUu16UZuSbv8NtSVoxd2xVu7JmfuKrqMtwXiya3UcwOHVlxAHIfUjGvbBPa6lPkCanlLkY2Xoq9VxJ2i7Fvy_sPoRRjRK1fCCJuU/s1600/copy-csv.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg1S8u6EB6o3fIOj-HAjFkK-YAiPxxrsX_ef_-RgCTRUu16UZuSbv8NtSVoxd2xVu7JmfuKrqMtwXiya3UcwOHVlxAHIfUjGvbBPa6lPkCanlLkY2Xoq9VxJ2i7Fvy_sPoRRjRK1fCCJuU/s1600/copy-csv.gif" height="308" width="640" /></a></div>
<br />
<h3>
Now that we have the groups we can get them into AD:</h3>
</div>
<div>
<ul>
<li>Read the CSV into powershell</li>
<li>For each group, generate a security group with matching name.</li>
</ul>
<div>
<i>"BUT I DONT KNOW HOW TO DO THAT IN POWERSHELL"</i></div>
</div>
<div>
That's ok. Lets use our minimal knowledge, and Google to figure out how.</div>
<div>
<br />
<br /></div>
<div>
A quick Google search shows a Technet article on <a href="http://technet.microsoft.com/en-us/library/ee176874.aspx" target="_blank">Import-CSV</a>. Reading Microsoft Technet articles is an art all its own. These articles provide lots of in depth information on Import-CSV. While more information is GREAT, we're trying to Get Things Done. Let's CTRL + F to find relevant examples:</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div>
<br /></div>
<div class="separator" style="clear: both;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0jAqFGaM0_5oYZVJ7C76KUQ8i_h4i-whDYPuTO7H6i-Qen49nx7iYGl1FryoK-NsqCnGPGBJ-EBvo62xLLaYqnZ8NH_Jc1pvcQBxd7C55fb5YzV-KyUFGwjnZTZ-ioBb8OQJ0wmzxl5k/s1600/Import_csv.gif" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj0jAqFGaM0_5oYZVJ7C76KUQ8i_h4i-whDYPuTO7H6i-Qen49nx7iYGl1FryoK-NsqCnGPGBJ-EBvo62xLLaYqnZ8NH_Jc1pvcQBxd7C55fb5YzV-KyUFGwjnZTZ-ioBb8OQJ0wmzxl5k/s1600/Import_csv.gif" height="569" width="640" /></a></div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
We quickly isolate the example CSV import. By dumping that import into a variable ($csv) we now have an object Powershell can manipulate. Following a similar search and CTRL + F for <a href="http://technet.microsoft.com/en-us/library/ee617258.aspx" target="_blank">New-ADGoup</a> we end up a short script:</div>
<script src="https://gist.github.com/selfcommit/1781985ae311dda7b02e.js"></script>
<br />
<div class="separator" style="clear: both;">
<br /></div>
<div>
<h4>
So Close.. But wait there's more!</h4>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz68OoNKM6aVDFqSjfZqOO8AE5hVb9cdAAFGzhYG-fxhVyGu1sObw9InZIeRL4-FCybUy1boq11bqtO1OQO91T2GpAGHSDduSyEichPxYZo98-QO47gxP7ePmkHdFeLr1kIcs3Mhd4Thc/s1600/AD_Members.gif" imageanchor="1" style="clear: right; float: right; margin-bottom: 1em; margin-left: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhz68OoNKM6aVDFqSjfZqOO8AE5hVb9cdAAFGzhYG-fxhVyGu1sObw9InZIeRL4-FCybUy1boq11bqtO1OQO91T2GpAGHSDduSyEichPxYZo98-QO47gxP7ePmkHdFeLr1kIcs3Mhd4Thc/s1600/AD_Members.gif" height="320" width="291" /></a>Problem 1 and 2 are resolved, but we still need to populate those AD groups. Many of the groups only have a few users, and are easily updated using the build in Active Directory Interface. Some groups are larger. So large that the existing AD interface would require <b>hundreds</b>, or even t<b>housands of clicks</b>. If you think that's too many clicks, you'd be right.</div>
<div>
<br /></div>
<div>
<br />
<br />
<br />
<span style="font-size: large;">Powershell can help!</span></div>
<div>
<br /></div>
<div>
Just as before, GADS simulated sync will return a list of users effected by a planned sync. We can again pull that list of users into a TSV.<br />
<br />
<h4>
Lets modify our existing Powershell script to populate AD groups:</h4>
</div>
<div>
We match on email address, not AD username, so we need to find the AD user with a matching email address, and add them to the correct group. <a href="http://technet.microsoft.com/en-us/library/ee617241.aspx" target="_blank">Get-ADUser</a> has a filter option, which accepts a string. If we set the email address provided by GADS as the filtered string, we should always get the user we want.</div>
<script src="https://gist.github.com/selfcommit/696d2a45593313044dde.js"></script>
<div>
<br />
My own workflow involves grabbing a single set of usernames and dumping them into a TSV<br />
I name that TSV after the security Group I intend to populate.<br />
Defining my path with the string below lets me change only 1 variable with each pass of the script.</div>
<div>
<br /></div>
<div>
</div>
<br />
<div style="-webkit-text-stroke-width: 0px; color: black; font-family: Times; font-size: medium; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: normal; orphans: auto; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; widows: auto; word-spacing: 0px;">
<div style="margin: 0px;">
<br /></div>
</div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-33229558453999776582014-06-01T15:07:00.002-04:002015-02-28T18:14:34.733-05:00Play the greatest chess player.. EVERIt happens to be a computer program.<a class="FlattrButton" href="http://www.ha-kn.com/" style="display: none;"></a><br />
<div>
<br /></div>
<div>
<a href="http://en.lichess.org/blog/U4mtoEQAAEEAgZRL/strongest-chess-player-ever">http://en.lichess.org/blog/U4mtoEQAAEEAgZRL/strongest-chess-player-ever</a></div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-42623064571750299512014-05-29T10:19:00.000-04:002014-05-29T10:19:30.429-04:00Most Linked Wikipedia Pages on StackOverflowPretty cool article on the most linked to Wikipedia pages on StackOverflow. <a class="FlattrButton" href="http://www.ha-kn.com/" style="display: none;"></a><br />
<div>
<br /></div>
<div>
<ol style="background-color: white; color: #666666; font-family: 'Adobe Caslon Pro', Cambria, 'Adobe Garamond Pro', Garamond, Georgia, 'Times New Roman', Times, serif; font-size: 10px; margin: 1em 0px; padding: 0px 3em;">
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/SQL_Injection" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" target="_blank" title="en.wikipedia.org/wiki/SQL_Injection">en.wikipedia.org/wiki/SQL_Injection</a> (1001 links)</li>
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/Same_origin_policy" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" title="en.wikipedia.org/wiki/Same_origin_policy">en.wikipedia.org/wiki/Same_origin_policy</a> (909)</li>
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/JSONP" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" target="_blank" title="en.wikipedia.org/wiki/JSONP">en.wikipedia.org/wiki/JSONP</a> (501)</li>
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/Cross-origin_resource_sharing" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" target="_blank" title="en.wikipedia.org/wiki/Cross-origin_resource_sharing">en.wikipedia.org/wiki/Cross-origin_resource_sharing</a> (492)</li>
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/Singleton_pattern" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" target="_blank" title="en.wikipedia.org/wiki/Singleton_pattern">en.wikipedia.org/wiki/Singleton_pattern</a> (468)</li>
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/Undefined_behavior" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" target="_blank" title="en.wikipedia.org/wiki/Undefined_behavior">en.wikipedia.org/wiki/Undefined_behavior</a> (420)</li>
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" target="_blank" title="en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller">en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller</a>(406)</li>
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/Single_responsibility_principle" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" target="_blank" title="en.wikipedia.org/wiki/Single_responsibility_principle">en.wikipedia.org/wiki/Single_responsibility_principle</a> (402)</li>
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" target="_blank" title="en.wikipedia.org/wiki/Don%27t_repeat_yourself">en.wikipedia.org/wiki/Don%27t_repeat_yourself</a> (398)</li>
<li style="font-size: 1.6em; line-height: 1.33; list-style: decimal; margin: 0.33em 0px; padding: 0px;"><a href="http://en.wikipedia.org/wiki/Database_normalization" style="border-bottom-color: rgb(102, 102, 102); border-bottom-style: dotted; border-bottom-width: 1px; color: #666666; outline: none; text-decoration: none;" target="_blank" title="en.wikipedia.org/wiki/Database_normalization">en.wikipedia.org/wiki/Database_normalization</a> (358)</li>
</ol>
</div>
<div>
<br /></div>
<div>
<a href="http://dfkoz.tumblr.com/post/83927509717/the-most-linked-to-wikipedia-articles-on-stack-overflow">Original Link</a></div>
Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0tag:blogger.com,1999:blog-3698824044981962178.post-15408834255305443512014-05-10T20:28:00.003-04:002014-05-10T20:32:50.794-04:00What does it take to be an Awesome Sysadmin?What does it take to be an Awesome Sysadmin?<br />
<br />
This Post on Reddit does a nice job of fleshing that out.<br />
<br />
http://www.reddit.com/r/sysadmin/comments/255zpb/what_are_qualities_of_a_good_sysadmin/<br />
<br />
Knowing what problems are worth automating is a great start.Selfcommithttp://www.blogger.com/profile/17441342505907844442noreply@blogger.com0