From the monthly archives:

October 2009

Four months ago I installed OS X on my HP Pavilion. I’ve always enjoyed trying to turning a sow’s ear into a silk purse. When I was a kid I would build telescopes out of cardboard tubes, airplanes out of surplus Air Force fuel tanks, Heathkit amplifiers, Timex-Sinclair computer kits, and the list goes on.

The HP came with Vista installed, and as you know, it is a genuine turd of an O/S. Installing OS X on a so-so PC to create a faux iMac sounded like a good idea.

The installation took about two weeks of my time. I haunted the www.osx86project.org, www.lifehacker.com, www.hackintosh.org, and www.ihackintosh.com web sites. Everyone of these sites had great tutorials that were guaranteed to work—with one explicit caveat: you had to use the right hardware. If you built your PC from scratch, you would have something that works. Unfortunately, my HP had some incompatibilities. My network card wasn’t on the HCL  (Hardware Compatibility List), nor was my video card (nVidia 8400 GS 512). And that video card turned out to be the Achilles heel for my Hackintosh.

My first attempts to install OS X were frustrating. It took hours of digging around Google to figure out how to set up the BIOS for OS X. Finding some hacked-up nVidia drivers for Intel OS X took a couple of days. I was able to cannibalize a network card from an old server. And then all of a sudden, it worked. Sort of…

Setting up the sound was the next thrill, and when I finally got that working, I discovered that none of the iWork suite worked. I’m dependent on Keynote for my class presentations, so this was a major downer.

But the problem was more severe than Keynote not working—the entire GUI was gooey and moved in slow motion. After some research, I discovered that I needed to turn on  hardware acceleration to Quartz GL to get up to speed. I used osx86tools helped get that working. (osx86tools is no longer under development. :)

Then one day, after two mind-bending weeks, it all worked! Sort of…

These days my main focus is learning Smalltalk. When I cranked up VisualWorks, this is what I saw:

But, most of my applications worked as they should have. A more serious problem eventually became apparent: the desktop would randomly freeze several times a day, usually when I was in the middle of editing a complex document.

Again, I hit Google for any clues, and found out that some nVidia cards just freeze up now and then on OS X, even on real Apple hardware. In other words, I need to buy a video card on the HCL.

Now, I’m declaring this game over. It was fun at first. It worked, sort of. Now I’m reverting the HP to Vista Hell. I can always use it for PHP development.

As for my Mac needs, I ordered a real iMac and I feel good about it. No more sow’s ears for me.

0 comments

I got a free San Francisco Chronicle today. It was a slender tabloid, tossed onto my front sidewalk. It was barely recognizable as a newspaper in the litter that blows into my yard from the high school across the street.

I came to S.F. after I graduated from Cal and I loved reading the Chron. It had great columnists. Herb Caen, Gerald Nachman, Terrence O’Flaherty, and Phil Elwood wrote so well that I looked forward to reading them every day. Herb Caen was the most famous of all. He popularized the word “hippy” that we all take for granted these days. And he was from the Sacramento Valley, like me. I admired his three-dot style and I use ellipses quite often, necessary or not…

 
Today’s Chronicle, thinner than a ham sandwich

I’m proud to say that I was published a few pieces in the Chronicle—a 3-page photo-journalistic piece about the cute girls in the Postal Service (I was a mailman/photographer at the time), and a humorous essay about the demoralizing dating scene I kept encountering in The City. Anyway, I like to think it was humorous.

Now the once mighty Chronicle is going begging for readers. But why read it now? It’s just a few sheets of poorly printed paper, thinner than a ham sandiwich, smaller than my R Crumb Volume 7 Hot ‘n’ Heavy. It won’t be long before the San Francisco Chronicle is just a memory.

Ou sont les neiges d’antan?

0 comments

The Top 100 Functions in Drupal

October 24, 2009

in PHP

This is a list of the 100 most common built-in PHP functions, and the 100 most common Drupal functions in the Drupal source code. Language constructs and reserved words are excluded from the count (foreach, for, while, list, isset, etc).

Total Built-in Functions Used: 239
Total Built-in Function calls in Drupal source code: 1392.

Rank Function Occurrences Per Cent
1 define 94 6.75
2 implode 79 5.68
3 array_merge 63 4.53
4 substr 58 4.17
5 trim 38 2.73
6 str_replace 38 2.73
7 count 37 2.66
8 preg_replace 35 2.51
9 array_pop 33 2.37
10 array_shift 31 2.23
11 explode 30 2.16
12 ini_set 29 2.08
13 header 27 1.94
14 urldecode 23 1.65
15 call_user_func_array 22 1.58
16 func_get_args 21 1.51
17 chr 17 1.22
18 array_keys 16 1.15
19 array_unshift 15 1.08
20 preg_match 15 1.08
21 preg_replace_callback 15 1.08
22 in_array 15 1.08
23 is_array 14 1.01
24 strtr 14 1.01
25 array_filter 13 0.93
26 strpos 12 0.86
27 md5 12 0.86
28 parse_url 12 0.86
29 dirname 11 0.79
30 unserialize 11 0.79
31 max 11 0.79
32 gmdate 10 0.72
33 strlen 9 0.65
34 printf 9 0.65
35 time 9 0.65
36 pg_query 9 0.65
37 serialize 8 0.57
38 round 8 0.57
39 array_walk 8 0.57
40 array_flip 8 0.57
41 date 8 0.57
42 array_unique 8 0.57
43 ksort 8 0.57
44 str_repeat 7 0.50
45 mysqli_query 7 0.50
46 array_map 7 0.50
47 asort 7 0.50
48 mysql_query 7 0.50
49 file_get_contents 6 0.43
50 function_exists 6 0.43
51 register_shutdown_function 6 0.43
52 array_reverse 6 0.43
53 ceil 5 0.36
54 fclose 5 0.36
55 urlencode 5 0.36
56 xml_parser_create 5 0.36
57 uasort 5 0.36
58 file 5 0.36
59 strstr 5 0.36
60 basename 5 0.36
61 base64_encode 5 0.36
62 bcmod 5 0.36
63 min 5 0.36
64 strtolower 5 0.36
65 floor 4 0.29
66 array_merge_recursive 4 0.29
67 array_slice 4 0.29
68 preg_match_all 4 0.29
69 ob_start 4 0.29
70 mysql_connect 4 0.29
71 abs 4 0.29
72 realpath 4 0.29
73 ltrim 4 0.29
74 mail 4 0.29
75 preg_split 4 0.29
76 base64_decode 4 0.29
77 chmod 4 0.29
78 array_key_exists 4 0.29
79 call_user_func 4 0.29
80 ob_end_clean 4 0.29
81 ord 4 0.29
82 array_values 3 0.22
83 is_numeric 3 0.22
84 xml_parser_free 3 0.22
85 debug_backtrace 3 0.22
86 pg_last_error 3 0.22
87 is_dir 3 0.22
88 intval 3 0.22
89 xml_set_character_data_handler 3 0.22
90 is_string 3 0.22
91 stripslashes 3 0.22
92 sort 3 0.22
93 fopen 3 0.22
94 ini_get 3 0.22
95 xml_set_element_handler 3 0.22
96 trigger_error 3 0.22
97 extract 3 0.22
98 is_object 3 0.22
99 array_diff 3 0.22
100 link 3 0.22

Total Drupal Functions Used: 1647
Total Custom Drupal Function calls in Drupal source code: 6819.

Rank Function Occurrences Per Cent
1 t 1133 16.62
2 theme 273 4.00
3 db_query 230 3.37
4 drupal_set_message 214 3.14
5 variable_get 148 2.17
6 drupal_render 113 1.66
7 form_set_error 89 1.31
8 check_plain 80 1.17
9 watchdog 78 1.14
10 l 73 1.07
11 st 68 1.00
12 drupal_set_title 66 0.97
13 drupal_get_form 59 0.87
14 variable_set 52 0.76
15 system_settings_form 43 0.63
16 cache_clear_all 43 0.63
17 update_sql 40 0.59
18 drupal_goto 39 0.57
19 drupal_add_js 38 0.56
20 db_result 34 0.50
21 url 34 0.50
22 theme_get_setting 33 0.48
23 confirm_form 32 0.47
24 base_path 27 0.40
25 pager_query 27 0.40
26 drupal_add_css 27 0.40
27 module_invoke 27 0.40
28 format_date 26 0.38
29 check_url 26 0.38
30 drupal_not_found 25 0.37
31 db_fetch_object 25 0.37
32 module_invoke_all 22 0.32
33 drupal_attributes 19 0.28
34 drupal_alter 19 0.28
35 drupal_map_assoc 19 0.28
36 db_query_range 18 0.26
37 language_list 17 0.25
38 get_t 17 0.25
39 drupal_add_tabledrag 17 0.25
40 xmlrpc_error 17 0.25
41 language_default 16 0.23
42 arg 16 0.23
43 template_preprocess 16 0.23
44 _locale_import_message 15 0.22
45 format_plural 15 0.22
46 stdClass 15 0.22
47 _user_mail_text 14 0.21
48 drupal_bootstrap 14 0.21
49 menu_get_item 14 0.21
50 drupal_set_header 13 0.19
51 menu_rebuild 13 0.19
52 cache_set 12 0.18
53 db_add_field 12 0.18
54 _db_query 12 0.18
55 form_error 12 0.18
56 variable_del 12 0.18
57 db_fetch_array 12 0.18
58 module_list 12 0.18
59 drupal_mail 11 0.16
60 drupal_get_destination 11 0.16
61 drupal_load 11 0.16
62 batch_process 11 0.16
63 batch_get 11 0.16
64 drupal_access_denied 11 0.16
65 hook_schema 10 0.15
66 form_set_value 10 0.15
67 _db_query_callback 10 0.15
68 node_load 9 0.13
69 node_get_types 9 0.13
70 module_rebuild_cache 9 0.13
71 menu_link_save 9 0.13
72 file_directory_path 9 0.13
73 form_clean_id 9 0.13
74 conf_path 9 0.13
75 image_get_info 9 0.13
76 update_get_projects 9 0.13
77 db_change_field 9 0.13
78 drupal_json 8 0.12
79 file_scan_directory 8 0.12
80 batch_set 8 0.12
81 _form_set_class 8 0.12
82 cache_get 8 0.12
83 module_load_include 8 0.12
84 tablesort_sql 8 0.12
85 install_task_list 8 0.12
86 _db_create_key_sql 8 0.12
87 _db_error_page 8 0.12
88 drupal_get_normal_path 8 0.12
89 b 8 0.12
90 hook_forms 7 0.10
91 drupal_maintenance_theme 7 0.10
92 drupal_set_content 7 0.10
93 module_load_install 7 0.10
94 file_create_path 7 0.10
95 drupal_query_string_encode 7 0.10
96 menu_link_delete 7 0.10
97 _db_create_field_sql 7 0.10
98 menu_execute_active_handler 7 0.10
99 module_exists 7 0.10
100 _locale_get_predefined_list 7 0.10

0 comments

The Top 100 Functions in Drupal

October 23, 2009

in PHP

This is a list of the 100 most common built-in PHP functions, and the 100 most common Drupal functions in the Drupal source code. Language constructs and reserved words are excluded from the count (foreach, for, while, list, isset, etc).


There were 1350 calls to 235 built-in functions in the source code, and 5483 calls to 1032 DRUPAL functions.
The Top 100 Built-in PHP Functions in Drupal

Rank Function Occurrences Per Cent
1 define 94 6.75
2 implode 79 5.68
3 array_merge 63 4.53
4 substr 58 4.17
5 trim 38 2.73
6 str_replace 38 2.73
7 count 37 2.66
8 preg_replace 35 2.51
9 array_pop 33 2.37
10 array_shift 31 2.23
11 explode 30 2.16
12 ini_set 29 2.08
13 header 27 1.94
14 urldecode 23 1.65
15 call_user_func_array 22 1.58
16 func_get_args 21 1.51
17 chr 17 1.22
18 array_keys 16 1.15
19 array_unshift 15 1.08
20 preg_match 15 1.08
21 preg_replace_callback 15 1.08
22 in_array 15 1.08
23 is_array 14 1.01
24 strtr 14 1.01
25 array_filter 13 0.93
26 strpos 12 0.86
27 md5 12 0.86
28 parse_url 12 0.86
29 dirname 11 0.79
30 unserialize 11 0.79
31 max 11 0.79
32 gmdate 10 0.72
33 strlen 9 0.65
34 printf 9 0.65
35 time 9 0.65
36 pg_query 9 0.65
37 serialize 8 0.57
38 round 8 0.57
39 array_walk 8 0.57
40 array_flip 8 0.57
41 date 8 0.57
42 array_unique 8 0.57
43 ksort 8 0.57
44 str_repeat 7 0.50
45 mysqli_query 7 0.50
46 array_map 7 0.50
47 asort 7 0.50
48 mysql_query 7 0.50
49 file_get_contents 6 0.43
50 function_exists 6 0.43
51 register_shutdown_function 6 0.43
52 array_reverse 6 0.43
53 ceil 5 0.36
54 fclose 5 0.36
55 urlencode 5 0.36
56 xml_parser_create 5 0.36
57 uasort 5 0.36
58 file 5 0.36
59 strstr 5 0.36
60 basename 5 0.36
61 base64_encode 5 0.36
62 bcmod 5 0.36
63 min 5 0.36
64 strtolower 5 0.36
65 floor 4 0.29
66 array_merge_recursive 4 0.29
67 array_slice 4 0.29
68 preg_match_all 4 0.29
69 ob_start 4 0.29
70 mysql_connect 4 0.29
71 abs 4 0.29
72 realpath 4 0.29
73 ltrim 4 0.29
74 mail 4 0.29
75 preg_split 4 0.29
76 base64_decode 4 0.29
77 chmod 4 0.29
78 array_key_exists 4 0.29
79 call_user_func 4 0.29
80 ob_end_clean 4 0.29
81 ord 4 0.29
82 array_values 3 0.22
83 is_numeric 3 0.22
84 xml_parser_free 3 0.22
85 debug_backtrace 3 0.22
86 pg_last_error 3 0.22
87 is_dir 3 0.22
88 intval 3 0.22
89 xml_set_character_data_handler 3 0.22
90 is_string 3 0.22
91 stripslashes 3 0.22
92 sort 3 0.22
93 fopen 3 0.22
94 ini_get 3 0.22
95 xml_set_element_handler 3 0.22
96 trigger_error 3 0.22
97 extract 3 0.22
98 is_object 3 0.22
99 array_diff 3 0.22
100 link 3 0.22

Total Drupal Functions Used: 1647
Total Custom Drupal Function calls in Drupal source code: 6819.

The Top 100 Drupal Native Functions

Rank Function Occurrences Per Cent
1 t 1133 16.62
2 theme 273 4.00
3 db_query 230 3.37
4 drupal_set_message 214 3.14
5 variable_get 148 2.17
6 drupal_render 113 1.66
7 form_set_error 89 1.31
8 check_plain 80 1.17
9 watchdog 78 1.14
10 l 73 1.07
11 st 68 1.00
12 drupal_set_title 66 0.97
13 drupal_get_form 59 0.87
14 variable_set 52 0.76
15 system_settings_form 43 0.63
16 cache_clear_all 43 0.63
17 update_sql 40 0.59
18 drupal_goto 39 0.57
19 drupal_add_js 38 0.56
20 db_result 34 0.50
21 url 34 0.50
22 theme_get_setting 33 0.48
23 confirm_form 32 0.47
24 base_path 27 0.40
25 pager_query 27 0.40
26 drupal_add_css 27 0.40
27 module_invoke 27 0.40
28 format_date 26 0.38
29 check_url 26 0.38
30 drupal_not_found 25 0.37
31 db_fetch_object 25 0.37
32 module_invoke_all 22 0.32
33 drupal_attributes 19 0.28
34 drupal_alter 19 0.28
35 drupal_map_assoc 19 0.28
36 db_query_range 18 0.26
37 language_list 17 0.25
38 get_t 17 0.25
39 drupal_add_tabledrag 17 0.25
40 xmlrpc_error 17 0.25
41 language_default 16 0.23
42 arg 16 0.23
43 template_preprocess 16 0.23
44 _locale_import_message 15 0.22
45 format_plural 15 0.22
46 stdClass 15 0.22
47 _user_mail_text 14 0.21
48 drupal_bootstrap 14 0.21
49 menu_get_item 14 0.21
50 drupal_set_header 13 0.19
51 menu_rebuild 13 0.19
52 cache_set 12 0.18
53 db_add_field 12 0.18
54 _db_query 12 0.18
55 form_error 12 0.18
56 variable_del 12 0.18
57 db_fetch_array 12 0.18
58 module_list 12 0.18
59 drupal_mail 11 0.16
60 drupal_get_destination 11 0.16
61 drupal_load 11 0.16
62 batch_process 11 0.16
63 batch_get 11 0.16
64 drupal_access_denied 11 0.16
65 hook_schema 10 0.15
66 form_set_value 10 0.15
67 _db_query_callback 10 0.15
68 node_load 9 0.13
69 node_get_types 9 0.13
70 module_rebuild_cache 9 0.13
71 menu_link_save 9 0.13
72 file_directory_path 9 0.13
73 form_clean_id 9 0.13
74 conf_path 9 0.13
75 image_get_info 9 0.13
76 update_get_projects 9 0.13
77 db_change_field 9 0.13
78 drupal_json 8 0.12
79 file_scan_directory 8 0.12
80 batch_set 8 0.12
81 _form_set_class 8 0.12
82 cache_get 8 0.12
83 module_load_include 8 0.12
84 tablesort_sql 8 0.12
85 install_task_list 8 0.12
86 _db_create_key_sql 8 0.12
87 _db_error_page 8 0.12
88 drupal_get_normal_path 8 0.12
89 b 8 0.12
90 hook_forms 7 0.10
91 drupal_maintenance_theme 7 0.10
92 drupal_set_content 7 0.10
93 module_load_install 7 0.10
94 file_create_path 7 0.10
95 drupal_query_string_encode 7 0.10
96 menu_link_delete 7 0.10
97 _db_create_field_sql 7 0.10
98 menu_execute_active_handler 7 0.10
99 module_exists 7 0.10
100 _locale_get_predefined_list 7 0.10

0 comments

Jonesing for the New iMac

October 20, 2009

in Editorial

Every cell in my body wants this. Maybe it’s because I have a birthday coming up next year and I think I deserve a little Sweetness and Light for being such a sweetheart.

I want the iMac with the Quad Core and 8GB and 2TB. I’m sure it will make me smarter and happier. I’m sure that VisualWorks will run great on this, and Squeak, too. I’ll learn Smalltalk faster and become a better person sooner.

Thank you, Steve, for making insanely great products. The other manufacturers, they just don’t get it.

Your humble FanBoy,

Doug

Happy hacking…

0 comments

DHH and the Ninja Rock Stars at 37Signals have drunk the Tim Ferriss cool-aid and churned out another motivational book called Rework. They’re taking advance orders for their new copy-and-paste collection of NR (Nouveau Riche) fortune cookie wisdom. I hear (from their Twitter droppings) that they are the most awesome pre-ordered/unpublished business/motivational/self-improvement book on Amazon. When I looked today it was ranked #4739, not quite the top of the heap, but almost #1.

An important person named Seth Godin contributed the hyperbolic blurb on the cover: “Ignore this book at your own peril”. This is quite an ominous statement. It sounds like someone from the publisher is going to knock on your door and punch you in the face if you don’t buy this book. I think this is what the encyclopedia and vacuum cleaner salesmen call the “hard sell.” There a few other appropriate words for it: pompous, bombastic, hyperbolic, gassy, windy, Billy-Maysian etc.

This Zig Ziglerish exhortation reminds me of the pitch I heard when I got sandbagged into attending an Amway meeting: This will change your life forever. If you work the Plan, the Plan works for you. K.I.S.S! You’ll have hundreds of people working under you while you sit on the beach in Florida! You’re gonna be working 4 hours a week and driving a Porsche and flying in a private jet with blondes in bikinis!!!


Smarter than Einstein

I think the title Rework is the authors’ (there are quite a few geniuses involved) subtle way of saying they’ve found some important information that has escaped every other human being who has lived on the planet in the last 10,000 years. We are blessed to live in the same era as DHH and his cohort. Newton couldn’t figure it out. Einstein missed this nugget completely. Turing didn’t come close. Goethe, Keats, Heine, Flaubert—all blind. But now the guys who created Backpack and Campfire (don’t know what they are) are going to blow us away with their profound insights. They will rework the way we think about work.

Layers Galore

When I stop to think about it, the title alone is worth $22.00. You get one layer, a literal word — rework, as in redo a job — and a second layer (re (regarding) work). That’s only $11.00 a layer, and if you pre-order now, they’ll throw in another layer for free. This book is a steal.

Don’t Steal. Buy!

Don’t steal it, though: pre-order it right here from my Amazon Associate account so that I can make a few bucks, too, as I climb out of the ranks of work slaves to live on the sunny mountain tops with the NRs.


37Signals Introduces New Color to the World
I should mention that DHH and gang have pulled out all stops with this book. They’ve expanded the primary color palette by adding in a new, heretofore unknown color that they call “black.” They’ve used this new color on the jacket of their book.

Fanboy Ululations

Fanboys across the nation have declared this new color “the bestest color ever.” Here are a few gushings on the 37Signals blog, with names changed to protect the embarrassed:

Jxxx Sxxxxxxx 21 Aug 09

Wow. Nice.

Jxx Oxxx 21 Aug 09

Cover looks great! Just placed a pre-order for my whole team on Amazon. Looking forward to it.

Dan 21 Aug 09

WOW . What’s “fire the workaholics/emulate drug dealers” about?
Really curious.

Mxxxxx Rxxxx Mxxxxxxxxx 21 Aug 09

The back cover looks really great, and I love the clean, mostly empty covers. Great job guys; I’ll be sure to pick up a copy.

JB 21 Aug 09

Great design, very… Swiss inspired?
Congrats, very good start,
jb

Anonymous Coward 21 Aug 09

Design: reminds me of those cheesy 90’s motivational posters found in corp. offices.
Swiss Inspired

I think the cover is definitely Swiss inspired! I urge you to buy this book—through my link, or course. With the proceeds I collect, I’ll be able to get a deck chair on that beach in Valhalla. God, it’s going to be swell to rub elbows with the Illuminati and Nouveau Riche Rat Pack. If you want to join us, you get reworked.

Rework is so awesome that I feel reworked already, even without reading the book. Sometimes a good title, a good blurb, and a new color is all you need to “sell” an idea. As that carnival dude says, “Ignore this book at your own peril.”

Happy hacking…

0 comments

My new masthead shows a Happy Hacking Keyboard Professional 2 keyboard with blank keys (with this blog’s name on it, of course). Only the nerdiest of geeks buy them. It’s a real man’s keyboard. If you can use one of these, you have earned the right to say “Hunt and peckers dig a hole and bury yourselves in shame.”

My HHKB Professional 2

My personal HHKB Professional 2 keyboard looks a lot like a regular keyboard except all of the useless keys are missing. Actually, even those keys (function keys, etc) are available if you press the function key and hit one of the number keys.

The HHKB Professional 2 keyboard has the best touch I’ve ever experienced—better, in my opinion, than the clicky IBM/DasKeyboard keyboards that everyone raves about. I’ve owned both of those and wouldn’t say anything bad about either, but this is the Ninja Rock Star of the keyboard world.*

What seals the deal with the HHKBP2 is that the control key fall nicely under the left little finger, which is perfect for me because I spend endless hours each day coding with Vi. And the escape key is easily accessible as I shift between the edit and command modes. Try one. You’ll like it.

Be warned: this great keyboard is expensive. The Yin/Dollar exchange rate doesn’t help. But, don’t cheap out and get the HHKB Lite version. You’ll be sorry.

You can only buy the HHKB Professional 2 from Japan. I got mine from GeekStuff4u.com. Hey, you might want to get one of their Yakuza Thumb drives, too. They’re made of real thumbs.

* While I’m rambling on about keyboards, I’ll say the Mac keyboards are cute, but not my thing. The best laptop keyboard is the one on my ThinkPad X61.

1 comment

After two days of using the TypeMatrix 2030 keyboard, I have lost the ability to type on either standard keyboards or the TypeMatrix. All of my typing synapses are in disarray. My motor neurons are flailing as they try to reconnect. I’m back to Stage One, Mrs. Roberts’ Beginning Typing class at Pierce Joint Union High School in Arbuckle California.

Thank you TypeMatrix for luring me into your diabolic Time Machine. My brain is now 13-years old again.

1 comment

The search never stops. I always have the feeling that the perfect keyboard is just around the corner. This is what I’m typing on now, the TypeMatrix 2030. You’re not seeing the typos because I’m correcting them. My typing speed is about 15 wpm, but the promise is that I’ll be up to speed in a few days/weeks.

Of course, I’m right in the middle of some time sensitive projects, so this is the perfect time to waste time. Is “self sabotage” the correct term?

I learned of this keyboard through an interview with Peepcode founder Geoffrey Grosenbach.

1 comment

Robert Scoble interviewed Dan Olsen, the founder of Yourversion in this Building 43 interview. I make a cameo appearance as a PHP hacker.

0 comments