tag:blogger.com,1999:blog-82914997011067291432023-11-16T04:00:15.805-07:00Deliberate ThinkingThoughts and comments by John Sumsion about life and software.<br>
<a href="http://lds.org/scriptures/bofm/alma/34.38?lang=eng#37"><u>Alma 34:38</u></a> Live in thanksgiving daily, for the many mercies and blessings which he doth bestow upon you.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.comBlogger105125tag:blogger.com,1999:blog-8291499701106729143.post-71172260481583978462020-03-04T21:26:00.001-07:002020-03-04T21:26:04.858-07:00Procrastination is Your FriendMy friend told me:<div><br></div><div> Procrastination is your friend when it's time for bed.</div><div><br></div><div>I think that is a true statement.</div>John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-23306772046748602462019-09-25T21:59:00.001-06:002019-09-25T21:59:34.326-06:00Stress on a Cracked Foundation<p dir="ltr">Think about a house standing strong. Imagine a crack in the foundation. Maybe the ground under the house has settled unevenly. Maybe things have shifted since the house was built.</p>
<p dir="ltr">If it has gone long enough that the foundation is cracked, there is a failure waiting to happen. Putting enough stress on a cracked foundation will lead to a dramatic failure.</p>
<p dir="ltr">This is like living at the edge of health: physical, social, emotional, or spiritual. If you aren't constantly investing in repairing and strengthening your foundation, you are more susceptible to unexpected failure.</p>
<p dir="ltr">I want to eat healthy food, keep in touch with good friends, keep enough space in my life, and stay strong in my faith. So that when the storms of life come, I can get through the challenging times. When I ask God for help, I can be more confident I will be able to receive His help to bridge me back to a stable and happy future.</p>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-7433972785812179802019-06-10T07:02:00.001-06:002019-09-17T06:32:41.432-06:00Discover, Receive, Commit<p dir="ltr">Yesterday, I was learning with my <u>peers</u> in a priesthood quorum at church.  The topic was answered prayer.</p>
<p dir="ltr">The combined message of three scriptures stood out to me:<br>
- <a href="https://www.churchofjesuschrist.org/study/scriptures/nt/matt/6?id=p8&lang=eng#p8">Matt 6:8</a> discover vs beg<br>
- <a href="https://www.churchofjesuschrist.org/study/scriptures/bofm/jacob/4?id=p10&lang=eng#p10">Jacob 4:10</a> receive vs command<br>
- <a href="http://www.biblegateway.com/passage/?search=James1:5&version=MSG">James 1:5-7</a> commit vs worry</p>
<p dir="ltr">The combination of receiving God's help, discovering what He has in store, and being pre-committed to act on His generous & challenging prompting is a magic combination to me.</p>
<p dir="ltr">It helps me feel a sense of sufficiency when facing my set of challenges today.  I'm grateful for the learning & strengthening environment afforded to me in my priesthood quorum.</p>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-66344693731580194292019-05-29T22:29:00.002-06:002019-05-29T22:34:46.408-06:00Tuning G1 GC for CassandraTuning G1 GC for Cassandra is too complicated, but it can make a big difference in cluster health.<br />
<br />
Symptoms:<br />
<br />
<ul>
<li>High p99 read/write latencies (because of long GC pauses)</li>
<li>High CPU causing lower read throughput (because of low GC throughput)</li>
<li>Dropped mutations (because of full GC collections on write-heavy clusters)</li>
</ul>
<div>
Here are some options that made a difference for me:</div>
<div>
<ul>
<li>JVM: options for getting GC details out for inspection
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>
<div class="p1">
<span class="s1">-XX:+PrintGCDetails</span></div>
<div class="p1">
<span class="s1">-XX:+PrintGCDateStamps</span></div>
<div class="p1">
<span style="font-variant-ligatures: no-common-ligatures;">-Xloggc:/var/log/cassandra/gc.log</span></div>
</li>
<li>JVM: options for having enough buffer for collections
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2; min-height: 19.0px}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>
<div class="p1">
<span class="s1"># Pre-allocate full heap<br /># Pre-size new size for high-throughput young collections<br />-Xms24G</span></div>
<div class="p1">
<span class="s1">-Xmx24G</span></div>
<div class="p1">
<span class="s1">-Xmn8G</span></div>
</li>
<li>JVM: options for avoiding longer pauses (do reference scanning concurrently with app)<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #3200ca; background-color: #d2d2d2}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style><div class="p1">
<span class="s1"># Have the JVM do less remembered set work during STW, instead</span></div>
<div class="p1">
<span class="s1"># preferring concurrent GC.</span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:G1RSetUpdatingPauseTimePercent=5</span></span></div>
<div class="p2">
<span style="color: black;"><span style="font-variant-ligatures: no-common-ligatures;"># Scan references in parallel to avoid long RSet scan times</span></span></div>
<div class="p2">
<span style="color: black;"><span style="font-variant-ligatures: no-common-ligatures;">-XX:+ParallelRefProcEnabled</span></span></div>
</li>
<li>JVM: options for better young collection throughput (avoid copying short-lived objects)<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #3200ca; background-color: #d2d2d2}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style><div class="p1">
<span class="s1"># Save CPU time by avoiding copying objects repeatedly</span></div>
<div class="p1">
<span class="s1"># Improve collection throughput by making heap regions larger</span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:MaxTenuringThreshold=1</span></span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:G1HeapRegionSize=32m</span></span></div>
</li>
<li>JVM: option cocktail to reduce risk of long mixed collections
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #3200ca; background-color: #d2d2d2}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>
<div class="p1">
<span class="s1"># Avoid to-space exhaustion by starting sooner, capping new size, and being more aggressive during mixed collections</span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:InitiatingHeapOccupancyPercent=40</span></span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:+UnlockExperimentalVMOptions</span></span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:G1MaxNewSizePercent=50</span></span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:G1MixedGCLiveThresholdPercent=50</span></span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:G1MixedGCCountTarget=32</span></span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:G1OldCSetRegionThresholdPercent=5</span></span></div>
<div class="p2">
<span style="color: black;"><span style="font-variant-ligatures: no-common-ligatures;"># Reduce pause time target to make mixed collections shorter</span></span></div>
<div class="p2">
<span style="color: black;"><span style="font-variant-ligatures: no-common-ligatures;">-XX:MaxGCPauseMillis=300</span></span></div>
</li>
<li>JVM: option to get extra buffer for use in allocation emergency<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #3200ca; background-color: #d2d2d2}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>
<div class="p1">
<span class="s1"># Reserve extra heap space to reduce risk of to-space overflows</span></div>
<div class="p2">
<span class="s1"><span style="color: black;">-XX:G1ReservePercent=20</span></span></div>
</li>
<li>JVM: options for top collection throughput during pauses<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #3200ca; background-color: #d2d2d2}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style><div class="p2" style="font-size: medium;">
<span class="s1"><span style="color: black;"># Max out the parallel effort during pause<br /># Set to number of cores</span></span></div>
<div class="p1">
<span class="s1">-XX:ParallelGCThreads=16</span></div>
<div class="p2">
<span style="font-variant-ligatures: no-common-ligatures;"><span style="color: black;">-XX:ConcGCThreads=16</span></span></div>
</li>
<li>Cassandra: option to avoid excess spikes of garbage from compaction
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>
<div class="p1">
<span class="s1"># Reduce load of garbage generation & CPU used for compaction<br />compaction_throughput_mb_per_sec: 2</span></div>
</li>
<li>Cassandra: option to aggressively flush to disk on write-heavy clusters
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>
<div class="p1">
<span class="s1"># Reduce amount of memtable heap load to reduce object copying<br />memtable_heap_space_in_mb: 1024 # instead of default 1/3 heap</span></div>
</li>
</ul>
<div>
<span style="font-family: inherit;"><span style="font-variant-ligatures: no-common-ligatures;">The net effect of the above combined settings is as follows:</span></span></div>
</div>
<div>
<ul>
<li><span style="font-family: inherit;"><span style="font-variant-ligatures: no-common-ligatures;">for a read-heavy cluster on i3.4xlarge:</span></span></li>
<ul>
<li><span style="font-family: inherit;"><span style="font-variant-ligatures: no-common-ligatures;">young collection p90 pause times around 50ms</span></span></li>
<li><span style="font-family: inherit;"><span style="font-variant-ligatures: no-common-ligatures;">mixed collection p90 pause times around 90ms</span></span></li>
<li><span style="font-variant-ligatures: no-common-ligatures;">no Full GCs, no dropped mutations</span></li>
</ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">for write-heavy clusters on r5.2xlarge:</span></li>
<ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">young collection p90 pause times around 175ms</span></li>
<li><span style="font-variant-ligatures: no-common-ligatures;">mixed collection p90 pause times around 175ms</span></li>
<li><span style="font-variant-ligatures: no-common-ligatures;">no Full GCs, no dropped mutations</span></li>
</ul>
</ul>
<div>
<span style="font-variant-ligatures: no-common-ligatures;">Tuning process:</span></div>
</div>
<div>
<ol>
<li><span style="font-variant-ligatures: no-common-ligatures;">Turn on GC logging</span></li>
<li><span style="font-variant-ligatures: no-common-ligatures;">Gather pause times for young collections, mixed collections, and any full collections</span></li>
<ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">get logs for at least 2-3 cycles of young => mixed/full transitions</span></li>
</ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">Decide which of the above you want to optimize for, pick a <b>single set</b> of settings</span></li>
<ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">Apply the settings to one node on one rack</span></li>
<li><span style="font-variant-ligatures: no-common-ligatures;">Decide whether it had the desired effect</span></li>
<li><span style="font-variant-ligatures: no-common-ligatures;">Tweak and repeat on single node until you get to a stable point</span></li>
</ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">Apply settings to all nodes on one rack</span></li>
<ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">Wait for a peak traffic period or apply stress</span></li>
<li>Compare results from non-tuned racks with the tuned rack</li>
<li>Tweak and repeat on single rack<span style="font-variant-ligatures: no-common-ligatures;"> until settings are rock solid</span></li>
</ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">Apply settings to full cluster</span></li>
<ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">Wait for a peak traffic period or apply stress</span></li>
<li>Make sure settings are <b>rock solid for full cluster</b></li>
</ul>
<li><span style="font-variant-ligatures: no-common-ligatures;">Start again on <b>step 2</b> until you have nothing left to tune</span></li>
</ol>
</div>
<br />
<style type="text/css">
p.p1 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #000000; background-color: #d2d2d2}
p.p2 {margin: 0.0px 0.0px 0.0px 0.0px; font: 16.0px Menlo; color: #3200ca; background-color: #d2d2d2}
span.s1 {font-variant-ligatures: no-common-ligatures}
</style>John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-80108716455365688182019-05-20T11:28:00.000-06:002019-05-20T11:54:05.208-06:00Another Poem, With You<b>With You</b><br />
<b><br /></b>
Piece of pie<br />
Clear blue sky<br />
Mountain lakes<br />
Leaves, and rakes<br />
<br />
And when I am with you,<br />
Two hearts filled with joy.<br />
Our time passes softly,<br />
Two hearts, one girl, one boy.<br />
<br />
Teach me love<br />
Teach me caring<br />
I'll teach you happiness<br />
I'll teach you daring<br />
<br />
And when I am with you,<br />
Two hearts filled with joy.<br />
Our time passes softly,<br />
Two hearts, one girl, one boy.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-13844358692967721792019-05-20T10:51:00.001-06:002019-05-20T11:28:26.348-06:00Another Poem, Longer With You<div dir="ltr">
<b>Longer With You</b></div>
<div dir="ltr">
<br />
It took a little bit of time<br />
for me to see and make them rhyme,<br />
and when beneath the pen, the words, they stuck,<br />
it took a bit more time to see, and pluck<br />
them out for you, to read,<br />
and us to hear, and laugh,<br />
and spend a day, a year<br />
together, and whether you want to<br />
or need to depart, the mem'ry<br />
of this time together<br />
might smart,<br />
but mem'ry is short<br />
and time will start to pull<br />
and stretch and fill our heart<br />
with new times together<br />
when never we part.</div>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-37118960444992416492019-05-20T10:46:00.001-06:002019-09-17T06:36:43.201-06:00Another Poem, Knowing Where<div dir="ltr">
<b>Knowing Where</b></div>
<div dir="ltr">
<br></div>
<div dir="ltr">
Came home this evening<br>
at quarter to six.<br>
Met with the Bishop<br>
who told us to fix<br>
sev'ral mistakes<br>
on forms one, five, and six.</div>
<div dir="ltr">
<br></div>
<div dir="ltr">
We're going on a mission to<br>
serve our dear Lord.</div>
<div dir="ltr">
<br></div>
<div dir="ltr">
Where will He send us?<br>
Where will we go?<br>
Over the oceans,<br>
or closer to home?<br>
Who will we serve with?<br>
How long to be gone?</div>
<div dir="ltr">
<br></div>
<div dir="ltr">
We're going on a mission to<br>
Serve our dear Lord.</div>
<div dir="ltr">
<br></div>
<div dir="ltr">
Fam'ly will miss us;<br>
we'll miss them too.<br>
Places we've lived in will<br>
see someone new.<br>
Trust in our Savior, and<br>
live in His care.</div>
<div dir="ltr">
<br></div>
<div dir="ltr">
We're going on a mission, and<br>
He'll meet us there.</div>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com1tag:blogger.com,1999:blog-8291499701106729143.post-47154708560390163032019-05-19T21:15:00.000-06:002019-05-20T11:29:10.289-06:00Another Poem, Riff Off 1 Cor 13<b>Perfect?</b><br />
<br />
Completeness:<br />
What I sought<br />
when I was small.<br />
<br />
Clarity:<br />
What I thought<br />
that I could call.<br />
<br />
Calm:<br />
What was not<br />
were I to fall.<br />
<br />
But if it fails,<br />
or vanishes away,<br />
or if I'm blind,<br />
or mostly so today.<br />
<br />
There is a promised tomorrow,<br />
when that completeness will come<br />
when I will see face to face<br />
and know as I am known.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-41981005740356903692019-05-18T12:29:00.001-06:002019-05-20T11:29:23.603-06:00Another Poem, Finding EncouragementHere is another poem, born out of a desire to help my daughter get through the last few weeks of high school.<br />
<br />
<br />
<b>Born Again</b><br />
<br />
Say your piece.<br />
Toot your horn!<br />
Do your thing.<br />
Sing your song!<br />
<br />
Then look and see<br />
If it was what<br />
You meant to say or do<br />
Then cut.<br />
<br />
And if you meant to do it different,<br />
Or if you notice something new,<br />
Then aren't you glad you started out,<br />
With confidence to see the world,<br />
To learn and do?<br />
<br />
<br />
Sometimes it takes a lot of confidence to overcome the resistance you feel to take the next step in life.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-57111718570852750382019-05-18T12:25:00.001-06:002019-05-18T12:36:08.234-06:00Another Poem, Hymn TextHere is a poem that came out when I couldn't sleep and was thinking about an earlier attempt at writing a hymn for the Church of Jesus Christ of Latter-day Saints, of which I am a member.<br />
<br />
<br />
<b>Learning and Growing</b><br />
<br />
Learning and growing are part of life's purpose,<br />
Even when happiness seems far away.<br />
Peace in this life comes from completely accepting<br />
The plan of our Savior, beginning His way.<br />
<br />
Jesus desires to teach us and guide us,<br />
He will protect us as we find our way.<br />
<br />
When evil conquers it cannot remain long,<br />
If faced with commitment and faith in the Lord.<br />
Confidence, trust in our saving Companion,<br />
Is what will enable our learning His Word.<br />
<br />
Jesus desires to teach us and guide us,<br />
He will protect us as we find our way.<br />
<br />
<br />
We are making another hymnbook, and I think I'll submit it. See <a href="https://www.lds.org/church/news/church-announces-plans-for-new-hymnbook-and-childrens-songbook?lang=eng">https://www.lds.org/church/news/church-announces-plans-for-new-hymnbook-and-childrens-songbook?lang=eng</a>.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-67045709905492994452019-05-18T11:58:00.000-06:002019-05-20T01:39:09.897-06:00Finally Stable Caps to Ctrl MappingOver the years, I have tried so many ways on Linux to map Caps Lock to Ctrl:<br />
<div>
<ul>
<li>Xorg config (that didn't work on a tty console)</li>
<li>Inputrc (really weird rules that depended on initial state)</li>
<li>Gnome keyboard config</li>
</ul>
<div>
Finally there is a stable way to remap Caps Lock to Ctrl. It is relatively simple and it is at the lowest level in Linux.</div>
</div>
<div>
<br /></div>
<div>
Thanks to this page for all the details: <a href="https://wiki.archlinux.org/index.php/Map_scancodes_to_keycodes">https://wiki.archlinux.org/index.php/Map_scancodes_to_keycodes</a> but it took a lot of effort to parse out what actually needed to be done.</div>
<div>
<br /></div>
<div>
Here is a distilled version:</div>
<div>
<br /></div>
<div>
0) Make sure Caps Lock is OFF</div>
<div>
<br /></div>
<div>
1) Create the following file:</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;"><br /></span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">/etc/udev/hwdb.d/10-caps-modifier.hwdb</span></div>
<div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">---</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;">evdev:atkbd:dmi:* # built-in keyboard: match all AT keyboards for now</span></div>
<div>
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"> KEYBOARD_KEY_3a=leftctrl # bind capslock to leftctrl</span></div>
<div>
<span style="font-family: inherit;"><br /></span></div>
<div>
<span style="font-family: inherit;">2) Run the following command:</span><br />
<span style="font-family: inherit;"><br /></span></div>
</div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">$ systemd-hwdb update</span></div>
<div>
<br /></div>
<div>
3) Run the following command to make the remapping take immediate effect:<br />
<br /></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace; font-size: x-small;">$ udevadm trigger</span></div>
<div>
<br /></div>
<div>
This was tested on Ubuntu 18.04.2 LTS running Xfce. The remapping works great in tty consoles, and the X input system.</div>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-5276586760862281882019-05-15T11:27:00.000-06:002019-05-20T11:29:35.346-06:00Poem for GrandmaI wrote a poem for my Grandma for Mother's Day.<br />
<br />
<b>Years</b><br />
<br />
For when along<br />
the road you've come,<br />
you pause,<br />
to see the race,<br />
how it was run.<br />
<br />
The mornings when imaginations sang<br />
The afternoons when, interrupting<br />
work and sun, the lightning cracked.<br />
Then came the rain.<br />
The evenings when all work was done.<br />
<br />
Some goals were met.<br />
Some riches won.<br />
Some people left.<br />
And not just one.<br />
<br />
And then you stood.<br />
Alone.<br />
Dismayed.<br />
<br />
But through<br />
this turn and<br />
that meander,<br />
we kept,<br />
we stayed,<br />
we held each other.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-60555285613768408152019-01-17T08:23:00.000-07:002019-01-17T16:34:21.729-07:00Command The ComputerAfter hearing hype around machine learning eating up tech jobs, I've wondered if I just have my head in the ground about what kind of work I'm doing. So far, I haven't seen a straightforward way to apply machine learning to my work goals.<br />
<br />
However, today I realized I can start a mind shift toward my work that will be both more healthy for me personally, and will allow me to see opportunities for machine learning that I've been missing.<br />
<br />
There are 4 main levels of work I can see:<br />
<ol>
<li>Initiative</li>
<li>Project</li>
<li>Task</li>
<li>Micro-task</li>
</ol>
<div>
As an individual contributor or team lead, the aspects of the work are scoped down to levels 2-4. Most of the opportunities I've seen for applying machine learning have been at the Initiative level, where statistical methods can be applied to solve novel problems or automate whole classes of new/existing work.</div>
<div>
<br /></div>
<div>
Now, imagine you already work at levels 2-4. Imagine you have a computer with infinite intelligence. Imagine that if you describe a piece of work that needs to be done down to the 80% level of precision, that this intelligent computer could get it done and take care of the details. This is what I've found impossible to imagine in advance.</div>
<div>
<br /></div>
<div>
The best way I've found to imagine this is as follows:</div>
<div>
<ul>
<li>do a Task the way I've always done it (level 3)</li>
<li>break the task up into atomic pieces by creating self-standing git commits as I go (one commit per level 4 Micro-task)</li>
<li>when I write each git commit, imagine that I had asked a computer to do what I just did</li>
<li>write the git commit in imperative form, as if I had commanded the computer to accomplish the work at the 80% level of precision</li>
<li>imagine that I had spent the last 30-60min doing something other than solving the problem, and ask myself, "What else would I have been able to do while the computer was spending 15-30min on this?"</li>
</ul>
<div>
This helps me wire up the neurons in my own brain to start thinking about the computer as an intelligent agent that can assist me. And it helps me to imagine how I can use my attention and energy more effectively, rather than just solving micro-tasks all day.</div>
<div>
<br /></div>
<div>
It appears to me that applying machine learning effectively requires stepping back at least to the Project or Initiative level and delegating more work to an "intelligent" computer. And if such an agent doesn't exist, perhaps it can be built.</div>
</div>
<div>
<br /></div>
<div>
In a weird sort of way, I'm starting to use the <a href="http://media.pragprog.com/articles/jan_03_enbug.pdf" target="_blank">Tell</a>, <a href="http://www.bradapp.net/docs/demeter-intro.html" target="_blank">Don't</a> <a href="https://martinfowler.com/bliki/TellDontAsk.html" target="_blank">Ask</a> principle in my own thinking to enhance my ability to imagine solutions coming together more quickly. I know that's taking the Law of Demeter way outside of its traditional scope. But I'm trying to break out of the box here. ;)</div>
<div>
<br /></div>
<div>
If 2018 was a year I didn't write any blog posts, it was certainly a year of great personal growth. I look forward to writing here more during 2019.</div>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-70558883531746368492017-06-02T14:15:00.001-06:002017-06-02T14:16:03.991-06:00Print selection only in ChromeMaybe you already know about "Print selection only" in Chrome. But it changed my life today.<br />
<div>
<br /></div>
<div>
I wanted to print only a part of a web page. Usually, I tweak the pages but then it spans pages and it's confusing to get just the pages I want. Or if I got desperate, I would copy/paste into a text editor and print that instead (after reformatting all the copy/paste noise away). Instead of all that nonsense, I found a better way.</div>
<div>
<br /></div>
<div>
Here's how to do it:</div>
<div>
<ol>
<li>Select the text you want to print (in Chrome)</li>
<li>Click Print (or press Ctrl-P or Cmd-P on Mac)</li>
<li>Click "More Settings" in the Chrome print dialog</li>
<li>Select the "Selection only" box</li>
<li>Adjust "Scale" to get it on the right number of pages (1 page usually)</li>
</ol>
<div>
Then print and you can move on with your life. I love how simple it is. Hopefully you benefit from this.</div>
</div>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-64277239552141178562017-05-30T16:56:00.002-06:002017-05-30T16:57:17.740-06:00Intractable ProblemsGetting into the state of mental flow leads to enjoyment for me. Whether it's playing a lively game of Monopoly with my kids, or playing/coaching an engaging soccer match, or developing the next feature for FamilySearch -- all of the above activities are more enjoyable when I spend a lot of time in the state of mental flow.<br />
<br />
There's a book about this, and I still would like to read it at some point. But today's post is not primarily about flow.<br />
<br />
There are times when I know that a state of mental flow is possible, and desirable, but I can't seem to enter that state. Maybe I'm meaning to write in my journal but the thing I want to write about is an unresolved problem of some importance to me, and I go into immediate problem solving instead of writing about it. Maybe I'm trying to get going on a project outside but I'm exhausted from not getting enough sleep the night before. Maybe I'm attempting to learn something new at work and there is too much new all at once.<br />
<br />
Today I realized that when I have problems entering the state of mental flow, it's because I'm stuck trying to solve intractable problems. See <a href="https://en.wikipedia.org/wiki/Computational_complexity_theory">https://en.wikipedia.org/wiki/Computational_complexity_theory</a><br />
<br />
Here are a few "intractable" problems I've faced recently:<br />
<br />
<ul>
<li>Which task would be most helpful for me to work on first this morning?</li>
<li>What is important to deal with after a trip, and what can be dropped?</li>
<li>Who can I get to help set up flags on Memorial Day?</li>
<li>How can I get uninterrupted time to spend with my wife?</li>
<li>What can I do to increase the likelihood of my son wanting to work with me outside?</li>
</ul>
<div>
The truth is the above problems are only "intractable" when attempted in a certain mental state that treats these decision problems as personal tasks.</div>
<div>
<br /></div>
<div>
Hint: It takes social skill & action to answer all of the above questions effectively. And while the social skill can be learned, if you approach the above problems by thinking that they are personal tasks to be completed, they will by definition be intractable.</div>
<div>
<br /></div>
<div>
A useful word is "stall". Some definitions, glosses, examples:</div>
<div>
- <a href="https://www.google.com/search?q=define%3Astall">https://www.google.com/search?q=define%3Astall</a></div>
<div>
- <a href="http://wordnetweb.princeton.edu/perl/webwn?s=stall">http://wordnetweb.princeton.edu/perl/webwn?s=stall</a></div>
<div>
- <a href="https://en.wikipedia.org/wiki/Stall_(fluid_mechanics)">https://en.wikipedia.org/wiki/Stall_(fluid_mechanics)</a></div>
<div>
<br /></div>
<div>
So when you feel yourself get into a stall, think what intractable problem you are trying to solve. And if it's a problem that needs social skills to solve, reach out for help. Figure out what skills you need to develop and improve your abilities.</div>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-91256079132847932362017-05-03T11:00:00.002-06:002017-05-03T16:22:40.960-06:00HELP: Happy, Evolving, Learning, Productive - Journaling templateSometimes I go to write in my journal after lots has happened, and I find myself at a loss. Too much has happened, I don't know what's important to record, it's all a jumble. So I end up staring out the window and attempting a half-baked job of mentally processing things.<br />
<br />
Here is a set of headings in an attempt to provide a skeleton for my journaling:<br />
<ul>
<li>H: Happenings</li>
<li>E: Evolutions / Progress</li>
<li>L: Learnings</li>
<li>P: Plans</li>
</ul>
<div>
Or described more fully:</div>
<div>
<ul>
<li>H: just neutral reporting on what random stuff has been going on</li>
<li>E: progress reports on things that have moved forward in some significant way in the last while</li>
<li>L: what you've recently learned that sticks out to you</li>
<li>P: what's coming up that has your attention</li>
</ul>
</div>
<div>
In an attempt at finding a mnemonic for HELP, I came up with the following:<br />
<ul>
<li>H: Happy</li>
<li>E: Evolving</li>
<li>L: Learning</li>
<li>P: Productive</li>
</ul>
<div>
And here are some more detailed descriptions of the emotional states in the mnemonic:</div>
<div>
<ul>
<li>H: just starting to write can keep you happier than not, see <a href="https://www.thersa.org/discover/publications-and-articles/rsa-blogs/2016/02/the-cathartic-benefit-of-writing" target="_blank">this post</a></li>
<li>E: highlighting progress, however small, turns into a sense of gratitude for me</li>
<li>L: seeing that I'm still learning is encouraging to me</li>
<li>P: putting rough plans on paper has a reassuring effect, and helps me move forward</li>
</ul>
</div>
<div>
Those adjectives have enough affinity to the headings that it might help me to remember them, and enough positive energy to help them to stick in my mind.</div>
</div>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-8247715978038949422017-05-02T15:41:00.000-06:002017-05-03T11:02:02.944-06:00HPLP: Happy, Progressive, Learning, Productive - Journaling IdeasPost rewritten here:<br />
- <a href="http://deliberate-thinking.blogspot.com/2017/05/help-happy-evolving-learning-productive.html">http://deliberate-thinking.blogspot.com/2017/05/help-happy-evolving-learning-productive.html</a><br />
<br />
With a better acronym.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-5543183384444862402017-01-29T15:21:00.000-07:002017-01-29T15:21:00.203-07:00Worry is a Signal, Not an Activity"You look down today, what's going on?" my wife says when I get home from work. I answer, "I don't know, I was just worrying about this project at work." What's wrong with this picture?<br />
<br />
The mental error is that I was treating worry like an activity instead of treating it like a signal. It's all about the self talk. When there is some outstanding issue that needs attention, it is easy to jump straight to thinking about the issue, even though you can't really do anything about it at the moment. The reality is that if I'm going to resolve the outstanding issue, I need my computer open, I need to talk with a team member to figure things out. I need to write some code or run a query to see where things stand.<br />
<br />
But if I attempt to sort things out mentally while I don't have everything I need to make progress on an issue, it's easy to spin my wheels and fall helplessly into a non-productive mental loop.<br />
<br />
On the other hand, if the "outstanding issue" thought comes into my mind, and I call it worry (which it is), and instead of holding onto that thought, if I treat it like a signal, like an alarm bell, like a red light, then that frees me up to act on the signal. Instead of treating the "outstanding issue" thought as an activity waiting to be engaged in, if I treat it as an self-alert, then I can move to deal with it at a later, more appropriate time.<br />
<br />
The question becomes: "What action can I take right now to make sure that the outstanding issue is dealt with at the appropriate time and place?" Maybe make a reminder on an index card and put it in my work pants pocket. Maybe make a reminder on my phone. Maybe send myself a memory jogger in email. Maybe write a card and stick it in the Trello / Getting Things Done inbox. It just needs to be something that I am confident will get my attention and lead me down the right mental path at the time when I know I will have resources to deal with the issue.<br />
<br />
Any time spent on worry as an activity (beyond dealing with the reminder for the future time/place) I now believe to be worse than a total waste. Not just worthless time spent, but also a drag on the rest of my life. Any unnecessary, anxiety-provoking activity drags me down, makes me less capable of living my life in a worthwhile, enjoyable way.<br />
<br />
Why did I not see this earlier in my life? What could I have done to have learned this earlier in my adolescent / adult experience?John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-76992578578095533022017-01-28T12:54:00.000-07:002017-01-28T12:54:00.227-07:00Where I've beenIt took a long while, but I believe I'm back after a knee surgery in 2015, after releasing / launching a new tree database for FamilySearch in the last half of 2016, and after coming through a difficult transition into a more positive life.<br />
<br />
Thanks to my family who supported me (especially my wife), my friends and co-workers who were patient with me, and those who have waited for me to be a bit more positive and responsive in life.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.comtag:blogger.com,1999:blog-8291499701106729143.post-83595691599482156882016-07-11T08:06:00.000-06:002016-07-11T08:06:34.826-06:00PTSD After Large ReleaseI don't like releasing large chunks of software at once, but there are situations where it's easier to swap out a large piece of interdependent pieces than it is to replace them piecemeal.<br />
<br />
Except you have to make it through the release.<br />
<br />
I worked on replacing the Family Tree database on familysearch.org with a new one. Old was Oracle, new was Cassandra.<br />
<br />
It started at 12:30am and extended, with various emergencies that were handled more or less gracefully by amazing people, until 6:21am. And then it was done, and we had to start keeping it up.<br />
<br />
After a few surprises that none of our simulations exposed, I have enough rest again and can function more or less normally.<br />
<br />
However, the anxiety I felt during the release and the uncertainty I felt in the days just afterwards all added up to a feeling I don't remember feeling before.<br />
<br />
Then I realized that the flashbacks and the irrational worry about keeping things working - probably some mild form of post-traumatic stress.<br />
<br />
Certainly only a taste of what others go through who were in danger of losing their life and barely survived. Not trying to imply that my experience is anywhere near that sort of thing.<br />
<br />
I'm just trying to process my emotions and am hopeful this helps someone know they're not alone.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-6116437689542487872015-08-26T10:32:00.000-06:002015-08-26T10:32:13.619-06:00Git worktree - clone but not quiteHave you ever wanted another workarea for the current repository you're working in? Maybe you're running some tests and need the normal workarea to stay unchanged, so you can't rebase or tweak another branch in the meantime.<br />
<br />
Options up to now:<br />
<br />
<ul>
<li><span style="font-family: Courier New, Courier, monospace;">$ git clone [current-repo] [temp-repo]; cd temp-repo # too heavy-weight, have to push changes back</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">$ sleep 120; check email # interrupts flow</span></li>
</ul>
<br />
<br />
In Git 2.5.0, you can do this easily:<br />
<br />
<ul>
<li><span style="font-family: Courier New, Courier, monospace;">$ git worktree add ../temp master</span></li>
</ul>
<br />
<br />
This creates a new workarea in ../temp with all the current branches. It's the same repository! Any git command you do in the new workarea is applied to (and uses the database of) the original repository: commit, rebase, push, etc.<br />
<br />
NOTE: If you leave off the branch name, '<span style="font-family: Courier New, Courier, monospace;">git worktree add</span>' creates a branch named after the new worktree directory.<br />
<br />
NOTE: If you want to operate on the same branch as the original repository, it is disallowed by default. In order to operate on the same branch, you have to say <span style="font-family: Courier New, Courier, monospace;">$ git worktree add ../temp master -f</span>'. Also if you ever move off of the branch and want to switch back when another worktree has the same branch checked out, you have to use an annoyingly-long option: <span style="font-family: Courier New, Courier, monospace;">$ git checkout master --ignore-other-worktrees</span>. You could put that in an alias like so: <span style="font-family: Courier New, Courier, monospace;">$ git config --global alias.co "checkout --ignore-other-worktrees"</span>.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-57478695383566383492014-08-27T12:34:00.000-06:002014-08-27T12:34:53.162-06:00Rubber Ducking with GitYou've heard of the phenomenon where when you try to explain a hard problem to someone else, you suddenly know the answer, and the other person did nothing but listen to you ramble.<br />
<br />
On the C2 wiki, it's called:<br />
<br />
<ul>
<li><a href="http://c2.com/cgi/wiki?RubberDucking">http://c2.com/cgi/wiki?RubberDucking</a></li>
<li><a href="http://c2.com/cgi/wiki?CardboardAnalyst">http://c2.com/cgi/wiki?CardboardAnalyst</a></li>
</ul>
<br />
<br />
The theory I have about the phenomenon is that in a problem solving situation, the human mind develops a lot of parallel ideas & possible solutions, even ones that you are not aware of. But when you try to describe the problem and your ideas to someone else, just the act of trying to explain the situation helps you see it more clearly and links the ideas together better in a way that you become aware of more possibilities than you were able to see before.<br />
<br />
But I've always had a problem talking to inanimate objects. Call me less imaginative, I guess. Or timid, maybe.<br />
<br />
Well, I've had the feeling for a while now that using Git with small commits made me more productive. And I just realized, I'm using my future self as a rubber ducky, and that the act of writing explanatory commit messages to explain things to my future self is a source of ideas for me.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-90406292276114258642014-04-09T11:26:00.000-06:002014-04-09T11:26:00.405-06:00Heartbleed Reaction Part 2A particularly relavent statement from <a href="http://heartbleed.org/">http://heartbleed.org</a> (server side):<br />
<blockquote class="tr_bq">
"Fortunately many large consumer sites are saved by their conservative choice of SSL/TLS termination equipment and software. Ironically smaller and more progressive services or those who have upgraded to latest and best encryption will be affected most."</blockquote>
<br />
There doesn't appear to be any up-to-the-minute current registry that I could find of sites that are affected on the server. The scan posted on github is fairly out of date at this point, and from what I can tell only takes the homepage into consideration, not sites that only forward to https for things like login / checkout.<br />
<br />
Here is the best one-off checker I could find (server side):<br />
- <a href="https://www.ssllabs.com/ssltest/">https://www.ssllabs.com/ssltest/</a><br />
<br />
Also, it may not be necessary to update Chrome/Firefox, based on the following language on the security stackexchange site:<br />
- <a href="http://security.stackexchange.com/questions/55119/does-the-heartbleed-vulnerability-affect-clients-as-severely">http://security.stackexchange.com/questions/55119/does-the-heartbleed-vulnerability-affect-clients-as-severely</a><br />
<blockquote class="tr_bq">
"Chrome (all platforms except Android): Probably unaffected (uses NSS)"<br />"Chrome on Android: 4.1.1 may be affected (uses OpenSSL). Source. 4.1.2 should be unaffected, as it is compiled with heartbeats disabled."<br />"Mozilla products (e.g. Firefox, Thunderbird, SeaMonkey, Fennec): Probably unaffected, all use NSS"</blockquote>
<br />
The potential vulnerability of clients is discussed here:<br />
- <a href="http://security.stackexchange.com/questions/55119/does-the-heartbleed-vulnerability-affect-clients-as-severely">http://security.stackexchange.com/questions/55119/does-the-heartbleed-vulnerability-affect-clients-as-severely</a><br />
- <a href="https://www.openssl.org/news/secadv_20140407.txt">https://www.openssl.org/news/secadv_20140407.txt</a> (language: "client or server")<br />
- <a href="http://heartbleed.com/">http://heartbleed.com</a><br />
<blockquote class="tr_bq">
"Furthermore you might have client side software on your computer that could expose the data from your computer if you connect to compromised services."</blockquote>
<br />
My guess is that curl going to an https site would be affected, or other programs that use OpenSSL. Maybe a chat client or if programs are downloading their own "auto-updates" over SSL. Those are the only kinds of things that come to mind right now.John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-50549702133799665912014-04-09T03:36:00.000-06:002014-04-09T13:17:09.144-06:00Reacting to HeartbleedIt's 2:37am and I can't sleep. It feels like the internet fell down around my ears.<br />
<br />
What I am doing:<br />
<br />
<ol>
<li>Got educated at <a href="http://heartbleed.com/" target="_blank">http://heartbleed.com</a></li>
<li>Updated Chrome to the 34.x version manually (<a href="http://googlechromereleases.blogspot.com/2014/04/stable-channel-update.html" target="_blank">promoted to stable yesterday</a>)</li>
<ul>
<li>look at <a href="https://support.google.com/chrome/answer/95414" target="_blank">https://support.google.com/chrome/answer/95414</a> and search for "Check for update manually"</li>
</ul>
<li>Checked for vulnerability in sites I use</li>
<ul>
<li>dnsimple.com (<a href="http://blog.dnsimple.com/2014/04/heartbleed-vulnerability-update/" target="_blank">patched as of 8 Apr 14:22 GMT</a>)</li>
<li>github.com (<a href="https://github.com/blog/1818-security-heartbleed-vulnerability" target="_blank">patched and sessions invalidated somewhere between 8 Apr 18:34 GMT and 9 Apr 01:08 GMT</a>, based on atom feed post timestamps)</li>
<li>familysearch.org (<a href="https://github.com/musalbas/heartbleed-masstest/blob/d0ecceabd2f8a3f3c56df6ae666c2b72993f1467/top10000.txt#L5079" target="_blank">not vulnerable as of 8 Apr around 16:00 GMT</a>)</li>
<li>amazon.com (<a href="https://github.com/musalbas/heartbleed-masstest/blob/d0ecceabd2f8a3f3c56df6ae666c2b72993f1467/top10000.txt#L648" target="_blank">not vulnerable as of 8 Apr around 16:00 GMT</a>)</li>
</ul>
<li>Completely clearing cookies and cache on ALL my computers, family & work, including phones</li>
<li>Installing LastPass and resetting ALL my passwords as I become confident that each site is patched</li>
<ul>
<li>I am assuming that all my user/passwords are either already known at this point, or can be discovered by anyone who recorded SSL traffic in the past 2 years</li>
</ul>
<li>Wondering what will happen because of this</li>
</ol>
<div>
UPDATE: Chrome update seems to be not strictly necessary <a href="http://security.stackexchange.com/questions/55119/does-the-heartbleed-vulnerability-affect-clients-as-severely" target="_blank">as stated here</a>. But I'm upgrading anyway, because the Chrome stable release on 8 Apr. 2014 has a lot of other security fixes in it.</div>
<div>
<br /></div>
<div>
UPDATE: More details that I've learned are <a href="http://deliberate-thinking.blogspot.com/2014/04/heartbleed-reaction-part-2.html" target="_blank">here</a> in a follow-up post.</div>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0tag:blogger.com,1999:blog-8291499701106729143.post-74879713235783044192014-04-03T14:24:00.000-06:002014-05-30T07:41:30.087-06:00Paying Down Learning RiskI've heard: "Solve the hardest problem first." As a rule of thumb, that works great to reduce risk early on a software project. But I found myself saying something different to a co-worker recently:<br />
<blockquote class="tr_bq">
Sometimes I start with the hardest problem, but sometimes I like to start with a really easy problem. Why do I do that?</blockquote>
Why <i>would</i> it be a good idea to start with the easiest problem? What kind of risk are you trying to pay down in a given situation?<br />
<br />
Here are some reasons that would justify breaking the "hardest problem first" rule:<br />
<ul>
<li>If you need to gain experience in a new domain, starting with something easy can help you get experience before tackling the harder problems.</li>
<li>If the world has changed out from underneath an existing system in an unpredictable way, starting with changing something easy or predictable can help you observe the source of the chaos.</li>
<li>If you are sharing work, handing the easy work items out to others based on their learning goals can help them learn better.</li>
<li>If tackling a hard problem will take a <i>very</i> long time, and others are waiting for you, then picking an easier part of the problem can help ease integration while still letting you engage on the hard problem.</li>
</ul>
<div>
<br />
The kind of risk you want to pay down first is important. Here are the kinds of risk that would be payed down by the above behaviors:</div>
<div>
<ul>
<li>risk of getting lost while learning</li>
<li>risk of being unable to bring order to a chaotic system</li>
<li>risk of assigning impossible tasks to someone who just wants to ramp up</li>
<li>risk of high integration costs because of trying to change too much at once</li>
</ul>
<div>
<br />
Most of the time, the risk caused by the uncertainty inherent in solving a hard problem is the most important risk to pay down first. But sometimes, there are other factors at play, and other subtle variables that need to be managed to achieve a successful group outcome.</div>
<div>
<br /></div>
<div>
Thank you to Michael Nelson for his instructive collaboration on this topic.</div>
</div>
John Sumsionhttp://www.blogger.com/profile/10335878463276157187noreply@blogger.com0