<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-9079782576020306744</id><updated>2011-12-08T18:18:36.889-05:00</updated><category term='reVision'/><category term='gospel'/><category term='scratch'/><category term='django'/><category term='news'/><category term='programming'/><title type='text'>Victim of Expensive Grace (Ken's blog)</title><subtitle type='html'>Just ask.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>16</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-7152621873769774929</id><published>2009-05-31T23:03:00.000-05:00</published><updated>2009-05-31T23:03:42.561-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Verizon Family and Friends: By the Numbers</title><content type='html'>You could guess what your 10 most called are, or you could measure. Guess what I prefer. Find the "Download SpreadSheet" (sic) option on the Verizon site, and pipe it through some Python like this;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;import csv, operator&lt;br /&gt;calls = list(csv.DictReader(open('/home/kcarnold/Desktop/VoiceDetails.action'),&lt;br /&gt;delimiter='\t'))&lt;br /&gt;not_in = [c for c in calls if 'M2MAllow' not in c['Usage Type']]&lt;br /&gt;minutes = {}&lt;br /&gt;for call in not_in:&lt;br /&gt;   number, mins = call['Number'], int(call['Minutes'])&lt;br /&gt;   minutes.setdefault(number, 0)&lt;br /&gt;   minutes[number] += mins&lt;br /&gt;sorted(minutes.items(), key=operator.itemgetter(1))&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-7152621873769774929?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/7152621873769774929/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=7152621873769774929' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/7152621873769774929'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/7152621873769774929'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2009/05/verizon-family-and-friends-by-numbers.html' title='Verizon Family and Friends: By the Numbers'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-4357124291402674589</id><published>2008-12-10T00:14:00.002-05:00</published><updated>2008-12-10T00:22:34.399-05:00</updated><title type='text'>Jesus is Precious</title><content type='html'>&lt;blockquote&gt;The apostle Peter says, "To you who believe . . . [he] is &lt;i&gt;precious&lt;/i&gt;" (1 Peter 2:7). The grace of God makes Christ precious to us, so that our possessions, our money, our time [and our abilities -ken] have all become eternally and utterly expendable. They used to be crucial to our happiness. They are not so now.&lt;/blockquote&gt;&amp;nbsp;Tim Keller, &lt;a href="http://www.amazon.com/Ministries-Mercy-Call-Jericho-Road/dp/0875522173/"&gt;Ministries of Mercy&lt;/a&gt;, page 63 (The Motivation for Mercy: Grace and Generosity)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-4357124291402674589?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/4357124291402674589/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=4357124291402674589' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/4357124291402674589'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/4357124291402674589'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2008/12/blog-post.html' title='Jesus is Precious'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-456260490037820050</id><published>2008-11-01T23:10:00.002-05:00</published><updated>2008-11-01T23:26:59.739-05:00</updated><title type='text'>Sword Project Bible Reader in Python updated</title><content type='html'>I've updated and finished the core functionality for a &lt;a href="http://github.com/kcarnold/pysword/tree/master"&gt;pure Python reader for SWORD Bible modules&lt;/a&gt; (hosted on github). I had previously posted an &lt;a href="http://kcarnold.blogspot.com/2008/08/sword-project-bible-reader-in-python.html"&gt;initial proof-of-concept&lt;/a&gt;, and now figured out how to map references to keys.&lt;br /&gt;&lt;br /&gt;Still to do: OSIS rendering, abbreviation processing, and the sort of convenience stuff that a frontend would want (Next/Previous, etc.).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-456260490037820050?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/456260490037820050/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=456260490037820050' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/456260490037820050'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/456260490037820050'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2008/11/sword-project-bible-reader-in-python.html' title='Sword Project Bible Reader in Python updated'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-8936528831682405647</id><published>2008-08-08T22:12:00.001-05:00</published><updated>2008-08-08T22:15:47.674-05:00</updated><title type='text'>Supremacy of Christ</title><content type='html'>I want today to commend to each one of us the supremacy of Jesus Christ and his Gospel. It is both the supreme glory of God and the solid rock for our lives. These words don't do it justice. It's hard to find any words that do, but these by Piper do a lot better than mine:&lt;br /&gt;&lt;br /&gt;&lt;a class="moz-txt-link-freetext" href="http://www.youtube.com/watch?v=oYGLl0gO1dk&amp;amp;feature=related"&gt;http://www.youtube.com/watch?v=oYGLl0gO1dk&amp;amp;feature=related&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;We were made to know Christ, not do little trivial things.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I was also recently led to read a familiar passage a little differently. When I did, the emphasis lay on these words:&lt;br /&gt;&lt;br /&gt;    &lt;b&gt;truth, righteousness, gospel&lt;/b&gt; of peace&lt;b&gt;, faith, salvation, Word&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;They are of course the &lt;i&gt;real things&lt;/i&gt; that comprise the "armor of God". I encourage you to likewise read &lt;a href="http://www.gnpcb.org/esv/search/?q=Eph+6%3A10-20"&gt;Ephesians 6&lt;/a&gt; with the supremacy of the Gospel in view.&lt;br /&gt;&lt;br /&gt;One observation I took from that is that one way that the Cross breaks the enemy's power is by removing the allure of the things that he offers. When the enemy offered Jesus bread, he didn't want it because he had something better. If you're concerned about your health, the enemy can control you with something that promises health (like a meditation technique, in my parents' case). But if the Holy Spirit has given you a new heart that regards the love of God as better than life, the temptation of worldly health will have no power over you. In that way, the Gospel (truth, faith, salvation, God's word, etc.) is your armor.&lt;br /&gt;&lt;br /&gt;Other observations about the Gospel? Comment away...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-8936528831682405647?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/8936528831682405647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=8936528831682405647' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/8936528831682405647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/8936528831682405647'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2008/08/supremacy-of-christ.html' title='Supremacy of Christ'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-2316865503471657917</id><published>2008-08-06T21:04:00.003-05:00</published><updated>2008-11-01T23:28:19.346-05:00</updated><title type='text'>Sword Project Bible Reader in Python</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt; I've &lt;a href="http://kcarnold.blogspot.com/2008/11/sword-project-bible-reader-in-python.html"&gt;updated this&lt;/a&gt; and &lt;a href="http://github.com/kcarnold/pysword/tree/master"&gt;put in on GitHub&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The SWORD API is complex. I did at one point try the SWIG wrapper, but that was still quite difficult to get right.&lt;br /&gt;&lt;br /&gt;Fortunately, as complicated as the code is, what it actually does turns out to be very simple. With the help of zverse.cpp, libtool gdb examples/cmdline/lookup, and the Holy Spirit, I came up with this simple Python file to read a verse given an index:&lt;br /&gt;&lt;blockquote&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;# * ztext format documentation&lt;br /&gt;# I'll use Python's struct module's format strings.&lt;br /&gt;# See http://docs.python.org/lib/module-struct.html&lt;br /&gt;# Take the Old Testament (OT) for example. Three files:&lt;br /&gt;#&lt;br /&gt;#  - ot.bzv: Maps verses to character ranges in compressed buffers.&lt;br /&gt;#    10 bytes ('&amp;lt;IIH') for each verse in the Bible:&lt;br /&gt;#    - buffer_num (I): which compressed buffer the verse is located in&lt;br /&gt;#    - verse_start (I): the location in the uncompressed buffer where the verse begins&lt;br /&gt;#    - verse_len (H): length of the verse, in uncompressed characters&lt;br /&gt;#    These 10-byte records are densely packed, indexed by VerseKey 'Indicies' (docs later).&lt;br /&gt;#    So the record for the verse with index x starts at byte 10*x.&lt;br /&gt;#&lt;br /&gt;#  - ot.bzs: Tells where the compressed buffers start and end.&lt;br /&gt;#    12 bytes ('&amp;lt;III') for each compressed buffer:&lt;br /&gt;#    - offset (I): where the compressed buffer starts in the file&lt;br /&gt;#    - size (I): the length of the compressed data, in bytes&lt;br /&gt;#    - uc_size (I): the length of the uncompressed data, in bytes (unused)&lt;br /&gt;#    These 12-byte records are densely packed, indexed by buffer_num (see previous).&lt;br /&gt;#    So the record for compressed buffer buffer_num starts at byte 12*buffer_num.&lt;br /&gt;#&lt;br /&gt;#  - ot.bzz: Contains the compressed text. Read 'size' bytes starting at 'offset'.&lt;br /&gt;#&lt;br /&gt;#  NT is analogous.&lt;br /&gt;&lt;br /&gt;# Configuration (set this to your own modules path):&lt;br /&gt;&lt;br /&gt;modules_path = '/home/kcarnold/.sword/modules/texts/ztext'&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;import struct, zlib&lt;br /&gt;from os.path import join as path_join&lt;br /&gt;&lt;br /&gt;class ZModule(object):&lt;br /&gt;   def __init__(self, module):&lt;br /&gt;       self.module = module&lt;br /&gt;       self.files = {&lt;br /&gt;           'ot': self.get_files('ot'),&lt;br /&gt;           'nt': self.get_files('nt')&lt;br /&gt;           }&lt;br /&gt; &lt;br /&gt;   def get_files(self, testament):&lt;br /&gt;       '''Given a testament ('ot' or 'nt'), returns a tuple of files&lt;br /&gt;       (verse_to_buf, buf_to_loc, text)&lt;br /&gt;       '''&lt;br /&gt;       base = path_join(modules_path, self.module)&lt;br /&gt;       v2b_name, b2l_name, text_name = [path_join(base, '%s.bz%s' % (testament, code))&lt;br /&gt;                                        for code in ('v', 's', 'z')]&lt;br /&gt;       return [open(name, 'rb') for name in (v2b_name, b2l_name, text_name)]&lt;br /&gt;&lt;br /&gt;   def text(self, testament, index):&lt;br /&gt;       '''Get the text for a given index.'''&lt;br /&gt;       verse_to_buf, buf_to_loc, text = self.files[testament]&lt;br /&gt;&lt;br /&gt;       # Read the verse record.&lt;br /&gt;       verse_to_buf.seek(10*index)&lt;br /&gt;       buf_num, verse_start, verse_len = struct.unpack('&amp;lt;IIH', verse_to_buf.read(10))&lt;br /&gt;     &lt;br /&gt;       uncompressed_text = self.uncompressed_text(testament, buf_num)&lt;br /&gt;       return uncompressed_text[verse_start:verse_start+verse_len]&lt;br /&gt;&lt;br /&gt;   def uncompressed_text(self, testament, buf_num):&lt;br /&gt;       verse_to_buf, buf_to_loc, text = self.files[testament]&lt;br /&gt;&lt;br /&gt;       # Determine where the compressed data starts and ends.&lt;br /&gt;       buf_to_loc.seek(buf_num*12)&lt;br /&gt;       offset, size, uc_size = struct.unpack('&amp;lt;III', buf_to_loc.read(12))&lt;br /&gt;&lt;br /&gt;       # Get the compressed data.&lt;br /&gt;       text.seek(offset)&lt;br /&gt;       compressed_data = text.read(size)&lt;br /&gt;       return zlib.decompress(compressed_data)&lt;br /&gt;&lt;br /&gt;if __name__=='__main__':&lt;br /&gt;   import sys&lt;br /&gt;   mod_name = sys.argv[1]&lt;br /&gt;   testament = sys.argv[2]&lt;br /&gt;   index = int(sys.argv[3])&lt;br /&gt; &lt;br /&gt;   module = ZModule(mod_name)&lt;br /&gt;   print module.text(testament, index)&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;br /&gt;This was a one-evening project, mostly taken up by the reverse-engineering. As you can see, Python provides a lot of the foundation work so that the code we actually have to write is very small.&lt;br /&gt;&lt;br /&gt;I still need to figure out how human-readable verse identifiers get mapped to those numerical indices. It's hidden somewhere in VerseKey...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-2316865503471657917?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/2316865503471657917/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=2316865503471657917' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/2316865503471657917'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/2316865503471657917'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2008/08/sword-project-bible-reader-in-python.html' title='Sword Project Bible Reader in Python'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-8943101793967538043</id><published>2008-07-23T10:36:00.002-05:00</published><updated>2008-07-23T10:46:42.301-05:00</updated><title type='text'>For everyone who has been worrying about me...</title><content type='html'>No need to worry. The worst was really only about a day and a half, and it's been gradually and surely getting better since then. The rash is still there, but it's gone down a lot and now only hurts just enough to remind me that it's there.&lt;br /&gt;&lt;br /&gt;So I add a third point to my &lt;a href="http://kcarnold.blogspot.com/2008/07/gospel-notes-from-having-shingles.html"&gt;previous post&lt;/a&gt;: 3. How quickly we forget. With the pain basically gone, so is my passion about those two points. It was very real then, but now it's a distant memory. I'm reminded of the stones of remembrance that the Israelites took from the Jordan as they were crossing over; even then, how quickly they forgot! (See &lt;a href="http://www.gnpcb.org/esv/search/?q=Joshua+4%3A3-7"&gt;Joshua 4:3-7&lt;/a&gt;)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-8943101793967538043?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/8943101793967538043/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=8943101793967538043' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/8943101793967538043'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/8943101793967538043'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2008/07/for-everyone-who-has-been-worrying.html' title='For everyone who has been worrying about me...'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-8263688232072888708</id><published>2008-07-20T13:56:00.008-05:00</published><updated>2008-07-20T14:23:11.298-05:00</updated><title type='text'>Gospel notes from having shingles</title><content type='html'>After my mysterious rash turned excruciatingly painful last night, I got it checked out this morning. Turns out it's a classic presentation of &lt;a href="http://en.wikipedia.org/wiki/Herpes_zoster"&gt;shingles&lt;/a&gt;. But I'd had it for more than a week before starting medication today, so it's quite painful. In fact, I think it's the first thing that I've experienced that makes me want to say, "it hurts like hell!" And thus I realized:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Praise GOD&lt;/span&gt; that although I &lt;span style="font-weight: bold;"&gt;deserve to endure this for eternity&lt;/span&gt;, thanks to &lt;span style="font-weight: bold;"&gt;Jesus's work&lt;/span&gt; &lt;span style="font-style: italic;"&gt;I don't have to&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;And if your eye causes you to sin, tear it out. It is better for you to enter the kingdom of God with one eye than with two eyes to be thrown into hell, ‘where their worm does not die and the fire is not quenched.’ (Mark 9:47-48)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Then the king said to the attendants, ‘Bind him hand and foot and cast him into the outer darkness. In that place there will be weeping and gnashing of teeth.’ For many are called, but few are chosen.” (Matthew 22:13)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;  4 Surely he has borne our griefs&lt;br /&gt;and carried our sorrows;&lt;br /&gt;yet we esteemed him stricken,&lt;br /&gt;smitten by God, and afflicted.&lt;br /&gt;&lt;br /&gt;  5 But he was wounded for our transgressions;&lt;br /&gt;he was crushed for our iniquities;&lt;br /&gt;upon him was the chastisement that brought us peace,&lt;br /&gt;and with his stripes we are healed.&lt;br /&gt;&lt;br /&gt;  6 All we like sheep have gone astray;&lt;br /&gt;we have turned every one to his own way;&lt;br /&gt;and the LORD has laid on him&lt;br /&gt;the iniquity of us all. (Isaiah 53:3-6)&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;I want my attitude toward my &lt;span style="font-weight: bold;"&gt;sin&lt;span style="font-weight: bold;"&gt;s&lt;/span&gt;&lt;/span&gt; be more like my attitude toward this virus.&lt;br /&gt;&lt;br /&gt;This virus is a tiny, otherwise insignificant pest. But &lt;span style="font-weight: bold;"&gt;I want to kill it!&lt;/span&gt; I want it &lt;span style="font-weight: bold;"&gt;out&lt;/span&gt;, &lt;span style="font-style: italic;"&gt;never&lt;/span&gt; to return.&lt;br /&gt;&lt;br /&gt;Oh, that I would view my sins the same way! I'm usually content to let them hide in me; they're small and insignificant and I have more important things to be concerned about. &lt;span style="font-style: italic;"&gt;But if I could just see them for what they really are&lt;/span&gt; -- painful ruptures in my soul that steal my joy away from God and maul God's dwelling place -- then I'd see how &lt;span style="font-weight: bold;"&gt;good&lt;/span&gt; it is to &lt;span style="font-weight: bold;"&gt;rip them out&lt;/span&gt;!&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;For if you live according to the flesh you will die, but if by the Spirit you put to death the deeds of the body, you will live. (Romans 8:13)&lt;/blockquote&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;God may be gracious and bring even more observations to my attention; he's actually shown me a lot in this and I praise him for it (though sometimes with gritted teeth!). Jesus, let me not waste my suffering.&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;More than that, we rejoice in our sufferings, knowing that suffering produces endurance, and endurance produces character, and character produces hope, and hope does not put us to shame, because God's love has been poured into our hearts through the Holy Spirit who has been given to us. (Romans 5:3-5)&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-8263688232072888708?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/8263688232072888708/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=8263688232072888708' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/8263688232072888708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/8263688232072888708'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2008/07/gospel-notes-from-having-shingles.html' title='Gospel notes from having shingles'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-5492867461566308320</id><published>2008-07-05T22:44:00.002-05:00</published><updated>2008-07-05T22:52:30.590-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='gospel'/><title type='text'></title><content type='html'>From &lt;a href="http://iht.com/articles/2008/07/05/africa/06stone.php?page=1"&gt;Tablet ignites debate on messiah and resurrection&lt;/a&gt;:&lt;br /&gt;&lt;blockquote&gt;"His mission is that he has to be put to death by the Romans to suffer so his blood will be the sign for redemption to come," Knohl said. "This is the sign of the son of Joseph. This is the conscious view of Jesus himself. This gives the Last Supper an absolutely different meaning. To shed blood is not for the sins of people but to bring redemption to Israel."&lt;/blockquote&gt;Very interesting article. The true Gospel is that Jesus's death accomplished &lt;span style="font-style: italic;"&gt;both&lt;/span&gt; atonement for the sins of the people &lt;span style="font-style: italic;"&gt;and&lt;/span&gt; by that, redemption for Israel. (i.e., those who are, like Isaac, children of the promise, and from every race, nation, tribe, and tongue.)&lt;br /&gt;&lt;br /&gt;In short, the "new" discovery just confirms what we've known all along: "that Christ died for our sins according to the Scriptures" (&lt;a href="http://www.biblegateway.com/passage/?book_id=53&amp;amp;chapter=15&amp;amp;version=31"&gt;1 Corinthians 15:3&lt;/a&gt;).&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-5492867461566308320?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/5492867461566308320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=5492867461566308320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5492867461566308320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5492867461566308320'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2008/07/from-tablet-ignites-debate-on-messiah.html' title=''/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-5841013075129215219</id><published>2008-06-20T14:30:00.004-05:00</published><updated>2008-06-24T10:20:59.877-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='django'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Django mini-series</title><content type='html'>I'm running a Django mini-series on Will Larson's blog, called &lt;a href="http://lethain.com/entry/2008/jun/11/wielding-django-part-1-minimalism/"&gt;Wielding Django&lt;/a&gt;. So far I have written:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;a href="http://lethain.com/entry/2008/jun/11/wielding-django-part-1-minimalism/"&gt;Minimalism&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://lethain.com/entry/2008/jun/15/wielding-django-up-to-speed/"&gt;Up to Speed&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href="http://lethain.com/entry/2008/jun/22/json-object-oriented-views-and-starting-a-real-app/"&gt;JSON, Object-Oriented Views, and Starting a Real App&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;I'm mainly posting this to provide a place for discussion in the comments.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-5841013075129215219?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/5841013075129215219/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=5841013075129215219' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5841013075129215219'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5841013075129215219'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2008/06/django-mini-series.html' title='Django mini-series'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-2225932591801703041</id><published>2008-06-07T14:28:00.000-05:00</published><updated>2008-06-20T14:29:12.644-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='scratch'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>mp3rename</title><content type='html'>I had a sizable collection of sermons that were named very badly (e.g., just the name). I was unsatisfied with all the mp3 renaming tools I found; they wouldn't get the output I wanted, or wouldn't read id3v2 tags, or etc. So, using python-eyeD3, I wrote my own.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/env python&lt;br /&gt;&lt;br /&gt;import eyeD3, os, sys&lt;br /&gt;&lt;br /&gt;default_subs = {&lt;br /&gt;    ':': ' -',&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;bad_chars = ['?','/',':']    &lt;br /&gt;&lt;br /&gt;def clean(x, subs=default_subs, bad_chars=bad_chars):&lt;br /&gt;    for a,b in subs.iteritems():&lt;br /&gt;        x = x.replace(a,b)&lt;br /&gt;    for c in bad_chars:&lt;br /&gt;        x = x.replace(c,'')&lt;br /&gt;    return x&lt;br /&gt;&lt;br /&gt;def do_rename_file(fname):&lt;br /&gt;    tag = eyeD3.Tag()&lt;br /&gt;    tag.link(fname)&lt;br /&gt;&lt;br /&gt;    name = []&lt;br /&gt;&lt;br /&gt;    num = tag.getTrackNum()[0]&lt;br /&gt;    if num:&lt;br /&gt;        name.append('%02d' % num)&lt;br /&gt;        name.append('-')&lt;br /&gt;    &lt;br /&gt;    artist = tag.getArtist()&lt;br /&gt;    if artist:&lt;br /&gt;        name.append(clean(artist))&lt;br /&gt;        name.append('-')&lt;br /&gt;&lt;br /&gt;    title = tag.getTitle()&lt;br /&gt;    if title:&lt;br /&gt;        name.append(clean(title))&lt;br /&gt;&lt;br /&gt;    name = ''.join(name)&lt;br /&gt;&lt;br /&gt;    if not title:&lt;br /&gt;        print 'Not renaming %s - not enough tag data' % fname&lt;br /&gt;        return&lt;br /&gt;&lt;br /&gt;    name = name+'.mp3'&lt;br /&gt;    &lt;br /&gt;    print 'Renaming "%s" to "%s": (OK,q,sub_name)' % (fname, name)&lt;br /&gt;    x=raw_input()&lt;br /&gt;    if len(x) &gt; 2:&lt;br /&gt;        name = x&lt;br /&gt;    elif len(x) &gt; 0:&lt;br /&gt;        print 'OK, skipping.'&lt;br /&gt;        return&lt;br /&gt;&lt;br /&gt;    os.rename(fname, name)&lt;br /&gt;&lt;br /&gt;if __name__=='__main__':&lt;br /&gt;    for f in sys.argv[1:]:&lt;br /&gt;        do_rename_file(f)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;You can modify the output format by... changing the code. But python is pretty readable.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-2225932591801703041?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/2225932591801703041/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=2225932591801703041' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/2225932591801703041'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/2225932591801703041'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2008/06/mp3rename.html' title='mp3rename'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-5568995230654581908</id><published>2007-01-18T22:13:00.000-05:00</published><updated>2008-06-20T14:25:24.332-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reVision'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Sound Bytes</title><content type='html'>Here are some "Sound Bytes" that I have used to describe my vision. Many are elaborated elsewhere in this blog, but it helps to have everything together in one place:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;I want to be a teacher, not a programmer. I don't just mean that I would prefer academia to industry, though that statement is mostly true. I mean that I want to be able to teach a computer, not program it to follow a set of instructions. Currently computers are not very teachable. Many researchers are focusing on the back-end AI and machine learning algorithms necessary for a computer to learn, but learning from a teacher requires two-way interaction. I want to develop this interaction. That is, I want to approach teaching a computer—what is today called programming—as a task in human-computer interaction.&lt;br /&gt;&lt;br /&gt;Today, the user types in cryptic code and the computer responds with error messages. My new view of programming is as a process by which a computer helps a human clarify, communicate, and refine ideas. Teaching how to program should be teaching how to teach. The implications of this new view range from end-user development, to modularization, to correctness, to optimization, to educational technology.&lt;br /&gt;&lt;br /&gt;This new view requires changes to how we make computers programmable. Instead of just developing new programming languages, we must develop programming environments that allow ideas and relationships to be manipulated in natural, familiar ways. Instead of using syntax to forbid ambiguity, we should allow the user to represent an idea or concept that has not yet been fully developed and help him/her develop it. Ask the user questions about corner cases and reason about them. Likewise, let the user ask questions (e.g., the CMU Natural Programming group’s Whyline). Wherever possible, show behavior “live” (e.g., MIT's Flogo II). The programming environment should guide the user's reasoning toward a consistent and correct concept of the task, clearly communicated to the computer at sufficient detail for unambiguous execution. Programmers should develop concepts, not code.&lt;br /&gt;&lt;br /&gt;I envision starting with the development of an end-user programming environment that works with concepts instead of instructions and allows a managed degree of ambiguity. I have done extensive background research on this topic within the context of end-user programming systems. My literature survey paper, done for a technical writing class last semester, is linked on the sidebar.&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-5568995230654581908?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/5568995230654581908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=5568995230654581908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5568995230654581908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5568995230654581908'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2007/01/sound-bytes.html' title='Sound Bytes'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-5993905705296729896</id><published>2006-12-05T14:18:00.000-05:00</published><updated>2008-06-20T14:25:24.334-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reVision'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Concepts and Relationships</title><content type='html'>The Cognitive Dimensions of Notation vocabulary calls what I'll discuss here "closeness of mapping". Translation between programmer thought and program notation is difficult. Less required translation is better. So strive to allow the human to express his/her concepts as close as possible to his/her natural way.&lt;br /&gt;&lt;br /&gt;What is the natural way we represent concepts? To answer intelligently I'd have to be a psycologist. But I'm pretty sure that any &lt;span style="FONT-STYLE: italic"&gt;code&lt;/span&gt; is not natural. It becomes second-nature to skilled programmers, but only after extensive training, such that us programmers can think directly in the concepts and even language of certain types of computer code.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;First observation&lt;/strong&gt;: we &lt;span style="FONT-STYLE: italic"&gt;don't&lt;/span&gt; express all our concepts the same way. Yes, eventually everything gets stored as connections and signals between neurons, but I don't interact with my concepts that way, or at least I don't try to explain them that way. To explain a mathematical concept, I may lead you through a bunch of symbols and equations. But if you didn't know what the word "mother" meant, I'd try to explain it in much different ways. Perhaps I could express it as symbols and equations, but I'm not sure that would help you.&lt;br /&gt;&lt;br /&gt;So on the micro-scale, there is no &lt;span style="FONT-STYLE: italic"&gt;one&lt;/span&gt; optimal language. In other words, tagline 2: "&lt;span style="FONT-WEIGHT: bold"&gt;The solution to the problem of programming is not to develop another programming language&lt;/span&gt;." In fact, for the low-level nuts-and-bolts, the languages we have are quite good. (Low- and medium- level languages are coupled with hardware capabilities, so as long as hardware stays basically the same, so does the language. I may bring up some alternate ways of doing hardware, now that parallel is hot, that make us re-think these low-level concepts like sequential execution.) Instead, we need to develop a programming &lt;span style="FONT-STYLE: italic"&gt;environment&lt;/span&gt; in which normal humans can work with concepts and relationships in natural ways and eventually--eventually!--put together code.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Second observation&lt;/strong&gt;: we care a lot about &lt;em&gt;relationships&lt;/em&gt; between our concepts. In some schools of thought, concepts themselves are meaningless; only the interactions between concepts (and between concepts and the real world) are meaningful. For a current example of the stress on relationships, see object-oriented programming. But does "object" equal "concept", and "public interface" equal "interaction"? Yes, in some cases. Aspect-oriented programming is trying to capture the rest of the cases. But both paradigms dip shallowly into the richness of our concepts and their interactions, imposing strictness of hierarchy and syntax. [Interaction-oriented(?) programming is taking the first conceptual steps in the right direction here.] An object IS_A concept. So is an aspect, feature, interaction, whatever else we have these days. Let's just do what we always do when we see regularlity like this: generalize it. It seems that a relationship between concepts is itself a concept, or perhaps the instance of one. Oh, instantiation is a concept too. This is all a bit worrying from the where-do-you-stop point of view, but philosophy has the same problem.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Third observation&lt;/strong&gt;: Our representations of concepts evolve. We often subconsciously refine how we understand things and communicate them.&lt;br /&gt;&lt;br /&gt;I'm going to go ahead and post this, even though it's not really done.&lt;br /&gt;&lt;br /&gt;Next: Rigidity, Corner Cases, and Syntax&lt;br /&gt;&lt;br /&gt;~Ken&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-5993905705296729896?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/5993905705296729896/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=5993905705296729896' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5993905705296729896'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5993905705296729896'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2006/12/concepts-and-relationships.html' title='Concepts and Relationships'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-1636181510488390928</id><published>2006-12-05T13:31:00.000-05:00</published><updated>2008-06-20T14:25:24.336-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reVision'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Communication and Clarification</title><content type='html'>Currently programming is a process of figuring out how to give the computer exactly what it wants in order to perform a certain task.&lt;br /&gt;&lt;br /&gt;I want to redefine programming as a &lt;span style="font-style: italic;"&gt;process&lt;/span&gt; by which a computer &lt;span style="font-style: italic;"&gt;helps&lt;/span&gt; a human &lt;span style="font-style: italic;"&gt;clarify&lt;/span&gt; and &lt;span style="font-style: italic;"&gt;communicate&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;ideas&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;That bears unpacking:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;process&lt;/span&gt;&lt;br /&gt;Programming is already far more than edit-compile-run, although most traditional languages tie you to at least 2 of those stages. But when I think of "programming", I think of far more than just &lt;span style="font-style: italic;"&gt;coding&lt;/span&gt; to the whole end-to-end process (if it does end) from an ordinary person having an idea to it being expressed clearly enough that a computer &lt;span style="font-style: italic;"&gt;or other person&lt;/span&gt; can act on it. More comments on the &lt;span style="font-style: italic;"&gt;other person&lt;/span&gt; aspect later [FIXME], but it bears saying now that I'd like a computer to be able to help us clarify what we mean when talking with each other.&lt;br /&gt;&lt;br /&gt;The central focus is not the code developed, but rather the &lt;span style="font-style: italic;"&gt;interaction&lt;/span&gt; between programmer and computer. Hence my tagline: &lt;span style="font-weight: bold;"&gt;"Programming Is Interaction&lt;span style="font-weight: bold;"&gt;"&lt;/span&gt;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;Most human-computer interaction (HCI) research focuses on interaction with pre-built applications, such as OS shells, office applications, and websites. Some precious few have applied HCI concepts to programming, with some amazing results. I've written a whole report on it, which I'll post up here sometime [FIXME]. Summary: MIT Media Lab and CMU Natural Programming are the big ones I've seen. [&lt;span style="font-style: italic;"&gt;Please&lt;/span&gt; let me know if you see any other big work in the field in academia.]&lt;br /&gt;&lt;br /&gt;I'll unpack &lt;span style="font-style: italic;"&gt;process&lt;/span&gt; a lot more over subsequent entries.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;help&lt;/span&gt;&lt;br /&gt;Humans aren't born knowing how to program. That is, we don't instinctively know (1) how to think logically and communicate ideas clearly, nor (2) how to express these ideas in a computer system. The computer should do all it possibly can to help. Automatic code completion (and in some cases, generation) is just the begininng; how about helping us with the basic reasoning behind it too?&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;clarify&lt;/span&gt;&lt;br /&gt;Generally we don't start out with a perfect idea of anything. What is a "paragraph", or an "audio track"? I can try to give a definition, but surely in the course of developing the word processor or sound editor I will refine this definition quite a bit. My definition will probably not look much like "a paragraph is a _____." anymore either; it will mostly talk about how a paragraph relates to other concepts, like words and pages. ("Concepts and Relationships" will cover this issue in depth. [FIXME])&lt;br /&gt;&lt;br /&gt;My initial definition is practically worthless for laying down application code, since refinements in my thoughts will almost certainly change the structure of the implementation. (Ideally my thoughts have the same structure as the implementation. [FIXME]) Yet errors in my initial characterization of the problem can go unsolved for the entire lifetime of the system I develop.&lt;br /&gt;&lt;br /&gt;So the programming environment should help me clarify what I mean by a "paragraph", helping me keep my concept consistent (though forgiving me for being temporarily inconsistent -- see "Rigidity, Corner Cases, and Syntax" [FIXME]) while I refine the structure of my thoughts.&lt;br /&gt;&lt;br /&gt;It should ask questions like, "What should happen if the area of the paragraph extends outside the page margin?" -- because I gave it the concept of paragraph area and page margin and it determined that the two could be in conflict. Or "what should happen if the first line indent is negative?".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;communicate&lt;/span&gt;&lt;br /&gt;Everything makes nearly perfect sense, as long as it stays within the confines of my mind. As soon as it tries to leave, it crashes into reality and comes out a mess. In the process of clarification, my goal is to communicate thoughts clearly. Communicating with a computer is far more demanding than another human, because it probably doesn't share my instinctive understanding of the way the world works. But if I've accurately explained my world to the computer, making my concept understandable to it also makes it more understandable to fellow humans. The number of courses we must take in writing shows how little we start off understanding about clear communication. So there's a lot that the computer can do to help. &lt;span style="font-size:85%;"&gt;[FIXME: this section is weak and not clearly differentiated from "clarify". Perhaps they are really the same thing.]&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;ideas&lt;/span&gt;&lt;br /&gt;Not algorithms, structures, or processes. I mostly covered this in "(Big-Picture)".&lt;br /&gt;&lt;br /&gt;Next: Concepts and Relationships&lt;br /&gt;&lt;br /&gt;~Ken&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-1636181510488390928?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/1636181510488390928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=1636181510488390928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/1636181510488390928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/1636181510488390928'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2006/12/communication-and-clarification.html' title='Communication and Clarification'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-5257401001815776721</id><published>2006-12-04T16:47:00.000-05:00</published><updated>2008-06-20T14:25:24.337-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reVision'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Problems with Programming (Big-Picture)</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Teaching &lt;span style="font-style: italic;"&gt;programming&lt;/span&gt; should be teaching &lt;span style="font-style: italic;"&gt;teaching&lt;/span&gt;.&lt;/blockquote&gt;But it's not.&lt;br /&gt;&lt;br /&gt;Programming currently requires much more skill than just communicating information logically. It requires:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;translating ideas from concepts and formulations natural to humans to those natural to the machine. [The machine makes very little attempt to work with ideas the way humans do.]&lt;/li&gt;&lt;li&gt;communicating these unnatural concepts in an unfamiliar and cryptic &lt;span style="font-weight: bold;"&gt;code&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;knowing lots of details about how things are done internally. [Programming has slowly been getting better on this count.]&lt;/li&gt;&lt;/ul&gt;At best, current programming environments provide means to navigate the code and show its operation line-by-line.&lt;br /&gt;&lt;br /&gt;Worse, the idea of programming today limits the realm of logical manipulation to just what can be expressed as &lt;span style="font-style: italic;"&gt;following a sequence of &lt;/span&gt;&lt;span style="font-style: italic;"&gt;instructions&lt;/span&gt;. There is no &lt;span style="font-style: italic;"&gt;concept&lt;/span&gt; of a &lt;span style="font-style: italic;"&gt;concept&lt;/span&gt;, only what to do with it on a low level. What if we could logically manipulate&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;mathematical expressions&lt;/span&gt; - showing each step in a derivation for a textbook, for once!&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;laws&lt;/span&gt; - allowing politicians and normal citizens to explore what the effect of a law is in a certain situation&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;sciences&lt;/span&gt; - finally teaching a computer physics or chemistry, not just how to run the numbers behind it&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;language&lt;/span&gt; - besides the obvious application to translation, a computer being remotely able to manipulate language is a great help to language learners&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;techniques&lt;/span&gt; of engineering or other fields - say that someone has taught the computer the technique of least squares (in general); when I am trying to solve a problem that requires some sort of approximation, it offers the least squares technique to me, complete with how to actually do it and the conditions and assumptions I have to make&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;documents&lt;/span&gt; - beyond grammar checking to &lt;span style="font-style: italic;"&gt;does this even make sense&lt;/span&gt; (and of course much better grammar checking also, with some help from rational annotation, which I'll get into later -- bug me if I don't)&lt;/li&gt;&lt;/ul&gt;That's just the beginning of the list. I'd venture to say that the kind of thing that will approach general instruction/teaching of a computer would not be called "programming", though for me the development starts there. I welcome suggestions for better names.&lt;br /&gt;&lt;br /&gt;Next: Communication and Clarification.&lt;br /&gt;&lt;br /&gt;~Ken&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-5257401001815776721?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/5257401001815776721/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=5257401001815776721' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5257401001815776721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/5257401001815776721'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2006/12/problems-with-programming-big-picture.html' title='Problems with Programming (Big-Picture)'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-3712161798328823086</id><published>2006-12-04T16:34:00.000-05:00</published><updated>2008-06-20T14:25:24.338-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reVision'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Programming as a Basic Skill</title><content type='html'>Too many people lack even basic programming skills:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Politicians &lt;/span&gt;try unsuccessfully to reason about how their actions will affect complex systems&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Lawyers &lt;/span&gt;can't write clearly while being clearly understood&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Doctors &lt;/span&gt;can't communicate their intuitions about medical conditions&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Scientists &lt;/span&gt;make grave errors in their statistics&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Teachers &lt;/span&gt;can't communicate their knowledge to students&lt;/li&gt;&lt;li&gt;and &lt;span style="font-weight: bold;"&gt;everyone &lt;/span&gt;commits logical fallacies regularly&lt;/li&gt;&lt;/ul&gt;People need to learn how to:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;communicate their ideas clearly, and&lt;br /&gt;&lt;/li&gt;&lt;li&gt;interpret and influence interconnected behaviors that they can't manipulate directly&lt;/li&gt;&lt;/ul&gt;These are basic skills, perhaps more basic than arithmetic.&lt;br /&gt;&lt;br /&gt;A computer's logic is impeccable, yet it can access, store, and manipulate vast quantities of information. So instructing a computer (classically called &lt;span style="font-style: italic;"&gt;programming&lt;/span&gt;) is ideal for teaching these concepts.&lt;br /&gt;&lt;br /&gt;But not today.&lt;br /&gt;&lt;br /&gt;Next: Problems with Programming (Big-Picture)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-3712161798328823086?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/3712161798328823086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=3712161798328823086' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/3712161798328823086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/3712161798328823086'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2006/12/programming-as-basic-skill.html' title='Programming as a Basic Skill'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-9079782576020306744.post-3878214011732325832</id><published>2006-12-04T16:15:00.001-05:00</published><updated>2008-06-20T14:24:14.811-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='reVision'/><title type='text'>Intro</title><content type='html'>[I'm merging my two blogs; this was the first post on reVision: The process of re-visioning programming as interaction, teaching, and idea refinement]&lt;br /&gt;&lt;br /&gt;Welcome!&lt;br /&gt;&lt;br /&gt;A friend suggested that I blog about some ideas I've had so I could get comments. So over the next few days I'll be writing about where I see programming and human-computer interaction now and where it should be.&lt;br /&gt;&lt;br /&gt;I'm doing this to get some ideas out in the open and get comments. Please be wise about what you do with them.&lt;br /&gt;&lt;br /&gt;~Ken&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/9079782576020306744-3878214011732325832?l=kcarnold.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kcarnold.blogspot.com/feeds/3878214011732325832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=9079782576020306744&amp;postID=3878214011732325832' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/3878214011732325832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/9079782576020306744/posts/default/3878214011732325832'/><link rel='alternate' type='text/html' href='http://kcarnold.blogspot.com/2006/12/intro.html' title='Intro'/><author><name>Ken Arnold</name><uri>http://www.blogger.com/profile/01575812415199722294</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
