too busy sharpening the saw
DESCRIPTION
Slides from my presentation at Roots 2011. Watch the recording here: http://vimeo.com/24735626TRANSCRIPT
![Page 1: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/1.jpg)
![Page 2: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/2.jpg)
![Page 3: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/3.jpg)
![Page 4: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/4.jpg)
![Page 5: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/5.jpg)
![Page 6: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/6.jpg)
TooBusySharpening
theSaw
![Page 7: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/7.jpg)
![Page 8: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/8.jpg)
![Page 9: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/9.jpg)
![Page 10: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/10.jpg)
![Page 11: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/11.jpg)
![Page 12: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/12.jpg)
I
![Page 13: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/13.jpg)
AM
![Page 14: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/14.jpg)
A
![Page 15: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/15.jpg)
LIAR
![Page 16: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/16.jpg)
!
![Page 17: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/17.jpg)
![Page 18: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/18.jpg)
![Page 19: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/19.jpg)
Move upwards tothe unimportant
![Page 20: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/20.jpg)
![Page 21: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/21.jpg)
Try faking it
![Page 22: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/22.jpg)
![Page 23: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/23.jpg)
The most important thing is
the thing most easily forgotten
![Page 24: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/24.jpg)
![Page 25: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/25.jpg)
Be extravagant
![Page 26: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/26.jpg)
![Page 27: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/27.jpg)
Bridges - build - burn
![Page 28: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/28.jpg)
![Page 29: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/29.jpg)
Consider different fading systems
![Page 30: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/30.jpg)
![Page 31: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/31.jpg)
Courage!
![Page 32: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/32.jpg)
![Page 33: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/33.jpg)
![Page 34: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/34.jpg)
![Page 35: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/35.jpg)
![Page 36: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/36.jpg)
![Page 37: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/37.jpg)
![Page 38: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/38.jpg)
Kanban?
![Page 39: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/39.jpg)
def count_lines(code): current_line_is_code = False line_count = 0 current_state = init for c in code + '\n': input = translate_input(c) current_state, contains_code = state_table[current_state][input] if contains_code: current_line_is_code = True if input == input_n and current_line_is_code: line_count += 1 current_line_is_code = False return line_count
### debug output ###
state_str = ['init', 'code', '/','/*', '//', '*', '"', '\\']
def input_str(input): if input in ' \t': return '<space>' elif input in '\n\r': return '<NL>' else: return '<' + input + '>'
def count_lines_with_debug_output(code): current_line_is_code = False i = 0 line_count = 0 current_state = init for c in code + '\n': print "\n=================" print code[:i+1] + '$\n' print state_str[current_state], '\t', input_str(c), '\t', '=>', current_state, contains_code = state_table[current_state][translate_input(c)] if contains_code: current_line_is_code = True if translate_input(c) == input_n and current_line_is_code: line_count += 1 current_line_is_code = False print state_str[current_state], ('(%s)' % line_count) i+=1 return line_count
import sysif __name__ == '__main__': code = sys.stdin.read() print count_lines_with_debug_output(code)
# statesinit = 0code = 1slash = 2slash_star = 3slash_slash = 4star = 5string = 6bs_string = 7
# inputsinput_w = 0input_n = 1input_l = 2input_slash = 3input_star = 4input_quote = 5input_bs = 6
def translate_input(input): if input == '*': return input_star elif input == '/': return input_slash elif input == '"': return input_quote elif input == '\'': return input_bs elif input in ' \t': return input_w elif input in '\n\r': return input_n else: return input_l
T = Truef = False
# state_table[current_state][input] == (next_state, contains_code?)state_table = [ \ [(init, f), (init, f), (code, T), (slash, f), (code, T), (string, T), (code, T)], \ [(code, T), (init, f), (code, T), (slash, f), (code, T), (string, T), (code, T)], \ [(code, T), (init, T), (code, T), (slash_slash,f), (slash_star, f), (string, T), (code, T)], \ [(slash_star, f), (slash_star, f), (slash_star, f), (slash_star, f), (star, f), (slash_star, f), (slash_star, f)], \ [(slash_slash, f), (init, f), (slash_slash,f), (slash_slash,f), (slash_slash,f), (slash_slash, f), (slash_slash, f)], \ [(slash_star, f), (slash_star, f), (slash_star, f), (init, f), (star, f), (string, T), (slash_star, f)], \ [(string, T), (string, T), (string, T), (string, T), (string, T), (init, T), (bs_string, T)], \ [(string, T), (string, T), (string, T), (string, T), (string, T), (string, T), (string, T)] \]
![Page 40: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/40.jpg)
def count_lines(code): current_line_is_code = False line_count = 0 current_state = init for c in code + '\n': input = translate_input(c) current_state, contains_code = state_table[current_state][input] if contains_code: current_line_is_code = True if input == input_n and current_line_is_code: line_count += 1 current_line_is_code = False return line_count
### debug output ###
state_str = ['init', 'code', '/','/*', '//', '*', '"', '\\']
def input_str(input): if input in ' \t': return '<space>' elif input in '\n\r': return '<NL>' else: return '<' + input + '>'
def count_lines_with_debug_output(code): current_line_is_code = False i = 0 line_count = 0 current_state = init for c in code + '\n': print "\n=================" print code[:i+1] + '$\n' print state_str[current_state], '\t', input_str(c), '\t', '=>', current_state, contains_code = state_table[current_state][translate_input(c)] if contains_code: current_line_is_code = True if translate_input(c) == input_n and current_line_is_code: line_count += 1 current_line_is_code = False print state_str[current_state], ('(%s)' % line_count) i+=1 return line_count
import sysif __name__ == '__main__': code = sys.stdin.read() print count_lines_with_debug_output(code)
# statesinit = 0code = 1slash = 2slash_star = 3slash_slash = 4star = 5string = 6bs_string = 7
# inputsinput_w = 0input_n = 1input_l = 2input_slash = 3input_star = 4input_quote = 5input_bs = 6
def translate_input(input): if input == '*': return input_star elif input == '/': return input_slash elif input == '"': return input_quote elif input == '\'': return input_bs elif input in ' \t': return input_w elif input in '\n\r': return input_n else: return input_l
T = Truef = False
# state_table[current_state][input] == (next_state, contains_code?)state_table = [ \ [(init, f), (init, f), (code, T), (slash, f), (code, T), (string, T), (code, T)], \ [(code, T), (init, f), (code, T), (slash, f), (code, T), (string, T), (code, T)], \ [(code, T), (init, T), (code, T), (slash_slash,f), (slash_star, f), (string, T), (code, T)], \ [(slash_star, f), (slash_star, f), (slash_star, f), (slash_star, f), (star, f), (slash_star, f), (slash_star, f)], \ [(slash_slash, f), (init, f), (slash_slash,f), (slash_slash,f), (slash_slash,f), (slash_slash, f), (slash_slash, f)], \ [(slash_star, f), (slash_star, f), (slash_star, f), (init, f), (star, f), (string, T), (slash_star, f)], \ [(string, T), (string, T), (string, T), (string, T), (string, T), (init, T), (bs_string, T)], \ [(string, T), (string, T), (string, T), (string, T), (string, T), (string, T), (string, T)] \]
puts gets. gsub(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(\/\/.*)/,''). gsub(/^\s*$/,'').gsub(/\n+/,"\n").split(/\n/).length-1
![Page 41: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/41.jpg)
def count_lines(code): current_line_is_code = False line_count = 0 current_state = init for c in code + '\n': input = translate_input(c) current_state, contains_code = state_table[current_state][input] if contains_code: current_line_is_code = True if input == input_n and current_line_is_code: line_count += 1 current_line_is_code = False return line_count
### debug output ###
state_str = ['init', 'code', '/','/*', '//', '*', '"', '\\']
def input_str(input): if input in ' \t': return '<space>' elif input in '\n\r': return '<NL>' else: return '<' + input + '>'
def count_lines_with_debug_output(code): current_line_is_code = False i = 0 line_count = 0 current_state = init for c in code + '\n': print "\n=================" print code[:i+1] + '$\n' print state_str[current_state], '\t', input_str(c), '\t', '=>', current_state, contains_code = state_table[current_state][translate_input(c)] if contains_code: current_line_is_code = True if translate_input(c) == input_n and current_line_is_code: line_count += 1 current_line_is_code = False print state_str[current_state], ('(%s)' % line_count) i+=1 return line_count
import sysif __name__ == '__main__': code = sys.stdin.read() print count_lines_with_debug_output(code)
# statesinit = 0code = 1slash = 2slash_star = 3slash_slash = 4star = 5string = 6bs_string = 7
# inputsinput_w = 0input_n = 1input_l = 2input_slash = 3input_star = 4input_quote = 5input_bs = 6
def translate_input(input): if input == '*': return input_star elif input == '/': return input_slash elif input == '"': return input_quote elif input == '\'': return input_bs elif input in ' \t': return input_w elif input in '\n\r': return input_n else: return input_l
T = Truef = False
# state_table[current_state][input] == (next_state, contains_code?)state_table = [ \ [(init, f), (init, f), (code, T), (slash, f), (code, T), (string, T), (code, T)], \ [(code, T), (init, f), (code, T), (slash, f), (code, T), (string, T), (code, T)], \ [(code, T), (init, T), (code, T), (slash_slash,f), (slash_star, f), (string, T), (code, T)], \ [(slash_star, f), (slash_star, f), (slash_star, f), (slash_star, f), (star, f), (slash_star, f), (slash_star, f)], \ [(slash_slash, f), (init, f), (slash_slash,f), (slash_slash,f), (slash_slash,f), (slash_slash, f), (slash_slash, f)], \ [(slash_star, f), (slash_star, f), (slash_star, f), (init, f), (star, f), (string, T), (slash_star, f)], \ [(string, T), (string, T), (string, T), (string, T), (string, T), (init, T), (bs_string, T)], \ [(string, T), (string, T), (string, T), (string, T), (string, T), (string, T), (string, T)] \]
What’s Happening?
10 Tweet
puts gets. gsub(/(\/\*([^*]|[\r\n]|(\*+([^*\/]|[\r\n])))*\*+\/)|(\/\/.*)/,''). gsub(/^\s*$/,'').gsub(/\n+/,"\n").split(/\n/).length-1
![Page 42: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/42.jpg)
![Page 43: Too busy sharpening the saw](https://reader030.vdocuments.mx/reader030/viewer/2022020206/5479e19f5906b520358b45ee/html5/thumbnails/43.jpg)
andersnoråsi t ’s o n l y c o d e , m o m