Housekeeping on Monday, 26th of January, Anno Domini MMIX, at the hour of the Dog
[git/dscho.git] / index.html
blob0786457b817337a5914f546b8c9f38d6120d69c9
1 <html>
2 <head>
3 <title>Dscho's blog</title>
4 <meta http-equiv="Content-Type"
5 content="text/html; charset=UTF-8"/>
6 </head>
7 <body style="width:800px;background-image:url(dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=paper.jpg);background-repeat:repeat-y;background-attachment:scroll;padding:0px;">
8 <div style="width:610px;margin-left:120px;margin-top:50px;align:left;vertical-align:top;">
9 <h1>Dscho's blog</h1>
10 <div style="position:absolute;top:50px;left:810px;width=400px">
11 <table width=400px bgcolor=#e0e0e0 border=1>
12 <tr><th>Table of contents:</th></tr>
13 <tr><td>
14 <p><ul>
15 <li><a href=#1232927812>26 Jan 2009 A day full of rebase... and a little valgrind</a>
16 <li><a href=#1232888842>25 Jan 2009 Regular diff with word coloring (as opposed to word diff)</a>
17 <li><a href=#1232828715>24 Jan 2009 Ideas for a major revamp of the <i>--preserve-merges</i> handling in <i>git rebase</i></a>
18 <li><a href=#1232778113>24 Jan 2009 Thoughts about <i>interactive rebase</i></a>
19 <li><a href=#1232745071>23 Jan 2009 Git Logos</a>
20 <li><a href=#1232742582>23 Jan 2009 How to deal with files that are not source code when merging</a>
21 <li><a href=#1232626236>22 Jan 2009 The UGFWIINI contest</a>
22 <li><a href=#1232611542>22 Jan 2009 Top-posting</a>
23 <li><a href=#1232607201>22 Jan 2009 Sverre's hat</a>
24 <li><a href=#1232604722>22 Jan 2009 Let there be images!</a>
25 </ul></p>
26 <a href=dscho.git?a=blob_plain;hb=1bc8fbc1b23647c3ff435d39ab3900a935c1162b;f=index.html>Older posts</a>
27 </td></tr></table>
28 <br>
29 <div style="text-align:right;">
30 <a href="dscho.git?a=blob_plain;hb=blog;f=blog.rss"
31 title="Subscribe to my RSS feed"
32 class="rss" rel="nofollow"
33 style="background-color:orange;text-decoration:none;color:white;font-family:sans-serif;">RSS</a>
34 </div>
35 <br>
36 <table width=400px bgcolor=#e0e0e0 border=1>
37 <tr><th>About this blog:</th></tr>
38 <tr><td>
39 <p>It is an active <a href=http://repo.or.cz/w/git/dscho.git?a=blob;f=source-1232626236.txt;h=1edde0467a>abuse</a> of <a href=http://repo.or.cz/>repo.or.cz</a>,
40 letting gitweb unpack the objects in the current tip of the branch <i>blog</i>,
41 including the images and the RSS feed.
42 </p><p>
43 Publishing means running a script that collects the posts, turns them into
44 HTML, makes sure all the images are checked in, and pushes the result.
45 </p><p>
46 This blog also serves to grace the world with Dscho's random thoughts on and
47 around Git.
48 </p>
49 </td></tr></table>
50 <br>
51 <table width=400px bgcolor=#e0e0e0 border=1>
52 <tr><th>Links:</th></tr>
53 <tr><td>
54 <ul>
55 <li> <a href=http://git-scm.com/>Git's homepage</a>
56 <li> <a href=http://gitster.livejournal.com/>Junio's blog</a>
57 <li> <a href=http://www.spearce.org/>Shawn's blog</a> seems to be sitting
58 idle ever since he started working for Google...
59 <li> <a href=http://torvalds-family.blogspot.com/>Linus' blog</a> does not
60 talk much about Git...
61 <li> Scott Chacon's <a href=http://whygitisbetterthanx.com/>Why Git is better
62 than X</a> site
63 <li> <a href=http://vilain.net/>The blog of mugwump</a>
64 <li> <a href=http://blogs.gnome.org/newren/>Elijah Newren</a> chose the
65 same path as Cogito, offering an alternative porcelain (an approach
66 that is doomed in my opinion)
67 <li> <a href=http://msysgit.googlecode.com/>The msysGit project</a>, a (mostly)
68 failed experiment to lure the many Windows developers out there to
69 contribute to Open Source for a change.
70 </ul>
71 </td></tr></table>
72 <br>
73 <table width=400px bgcolor=#e0e0e0 border=1>
74 <tr><th>Google Ads:</th></tr>
75 <tr><td>
76 <script type="text/javascript"><!--
77 google_ad_client = "pub-5106407705643819";
78 /* 300x250, created 1/22/09 */
79 google_ad_slot = "6468207338";
80 google_ad_width = 300;
81 google_ad_height = 250;
82 //-->
83 </script>
84 <script type="text/javascript"
85 src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
86 </script>
87 </td></tr></table>
88 </div>
89 <h6>Monday, 26th of January, Anno Domini MMIX, at the hour of the Rat</h6>
90 <a name=1232927812>
91 <h2>A day full of rebase... and a little valgrind</h2>
93 <p>
94 </p><p>
95 I think that I am progressing nicely with my rebase -p work, so much so
96 that I will soon be able to use it myself to work on topic branches <u>and</u>
97 rebase all the time without much hassle.
98 </p><p>
99 In other words, I would like to be able to rebase all my topic branches
100 to Junio's <i>next</i> branch whenever that has new commits. With a single
101 rebase.
102 </p><p>
103 And finally, I got the idea of the thing Stephen implemented for dropped
104 commits; however, I am quite sure I do not like it.
105 </p><p>
106 So what are "dropped" commits?
107 </p><p>
108 When you rebase, chances are that the upstream already has applied at
109 least some of your patches. So we filter those out with <i>--cherry-pick</i>.
110 Stephen calls those "dropped" commits.
111 </p><p>
112 Then he goes on to reinvent the "$REWRITTEN" system: a directory containing
113 the mappings of old commit names to new commit names. That is easily fixed.
114 </p><p>
115 But worse, he substitutes the dropped commits with their <u>parents</u>, instead
116 of substituting them with the corresponding commits in upstream.
117 </p><p>
118 I guess this will be a medium-sized fight on the mailing list, depending
119 how much energy Stephen wants to put in to defend his strategy.
120 </p><p>
121 Anyway, I finally got to a point where only three of the tests are failing,
122 t3404, t3410 and t3412. Somewhat disappointing is t3404, as its name pretends
123 not to exercize -p at all. Oh well, I guess I'll see what is broken tomorrow.
124 </p><p>
125 Another part of the day was dedicated to the Valgrind patch series, which
126 should give us yet another level of code quality.
127 </p><p>
128 After having confused myself with several diverging/obsolete branches, I did
129 indeed finally manage to send that patch series off. Woohoo.
130 </p>
131 <h6>Sunday, 25th of January, Anno Domini MMIX, at the hour of the Goat</h6>
132 <a name=1232888842>
133 <h2>Regular diff with word coloring (as opposed to word diff)</h2>
136 </p><p>
137 You know, if I were a bit faster with everything I do, I could do so much more!
138 </p><p>
139 For example, Junio's idea that you could keep showing a regular diff, only
140 coloring the words that have been removed/deleted.
141 </p><p>
142 Just imagine looking at the diff of a long line in LaTeX source code. It
143 should be much nicer to the eye to see the complete removed/added sentences
144 instead of one sentence with colored words in between, disrupting your read
145 flow.
146 </p><p>
147 Compare these two versions:
148 </p><p>
149 Regular diff with colored words:
150 <blockquote><tt>
151 -This sentence has a <font color=red>tyop</font> in it.<br>
152 +This sentence has a <font color=green>typo</font> in it.<br>
153 </tt></blockquote>
154 </p><p>
155 Word diff:
156 <blockquote><tt>
157 This sentence has a <font color=red>tyop</font><font color=green>typo</font> in it.<br>
158 </tt></blockquote>
159 </p><p>
160 And it should not be hard to do at all!
161 </p><p>
162 In <i>diff&#95;words&#95;show()</i>, we basically get the minus lines as
163 <i>diff&#95;words->minus</i> and the plus lines as <i>diff&#95;words->plus</i>. The
164 function then prepares the word lists and calls the xdiff engine to do all the
165 hard work, analyzing the result from xdiff and printing the lines in
166 <i>fn&#95;out&#95;diff&#95;words&#95;aux()</i>.
167 </p><p>
168 So all that would have to be changed would be to <u>record</u> the positions
169 of the removed/added words instead of outputting them, and at the end printing
170 the minus/plus buffers using the recorded information to color the words.
171 </p><p>
172 This would involve
173 </p><p>
174 <ul>
175 <li>adding two new members holding the offsets in the <i>diff&#95;words</i>
176 struct,
177 <li>having a special handling for that mode in
178 <i>fn&#95;out&#95;diff&#95;words&#95;aux()</i> that appends the offsets and
179 returns,
180 <li>adding a function <i>show&#95;lines&#95;with&#95;colored&#95;words()</i> that
181 outputs a buffer with a given prefix ('-' or '+') and coloring the words at
182 given offsets with a given color,
183 <li>modify <i>diff&#95;words&#95;show()</i> to call that function for the "special
184 case: only removal" and at the end of the function, and
185 <li> disabling the <i>fwrite()</i> at the end of <i>diff<u>words</u>show()</i> for that
186 mode.
187 </ul>
188 </p><p>
189 Of course, the hardest part is to find a nice user interface for that. Maybe
190 <i>--colored-words</i>? &#x263a;
191 </p>
192 <h6>Saturday, 24th of January, Anno Domini MMIX, at the hour of the Pig</h6>
193 <a name=1232828715>
194 <h2>Ideas for a major revamp of the <i>--preserve-merges</i> handling in <i>git rebase</i></h2>
197 </p><p>
198 As probably everybody agrees, the code to preserve merges is a big mess
199 right now.
200 </p><p>
201 Worse, the whole concept of "pick <merge-sha1>" just does not fly well.
202 </p><p>
203 So I started a <u>major</u> cleanup, which happens to reduce the code very
204 nicely so far.
205 </p><p>
206 It will take a few days to flesh out, I guess, but these are the major
207 ideas of my work:
208 </p><p>
209 <b>pick $sha1</b><br>
210 <blockquote>will only work on non-merges in the future.</blockquote>
211 <b>merge $sha1 [$sha1...] was $sha1 Merge ...</b><br>
212 <blockquote>will merge the given list of commits into the current HEAD, for
213 the user's reference and to keep up-to-date what was rewritten,
214 the original merge is shown after the keyword "was" (which is not
215 a valid SHA-1, luckily).</blockquote>
216 <b>goto $sha1</b><br>
217 <blockquote>will reset the HEAD to the given commit.</blockquote>
218 <b>$sha1'</b><br>
219 <blockquote>for merge and goto, if a $sha1 ends in a single quote, the
220 rewritten commit is substituted (if there is one).</blockquote>
221 </p><p>
222 Example:
223 </p><p>
224 <pre>
225 A - B - - - E
227 C - D
228 </pre>
229 </p><p>
230 could yield this TODO script:
231 </p><p>
232 <pre>
233 pick A
234 pick C
235 pick D
236 goto A'
237 pick B
238 merge D' was E
239 </pre>
240 </p><p>
241 This should lead to a much more intuitive user experience.
242 </p><p>
243 I am very sorry if somebody actually scripted <i>rebase -i -p</i> (by setting
244 GIT_EDITOR with a script), but I am very certain that this cleanup is
245 absolutely necessary to make <i>rebase -i -p</i> useful.
246 </p>
247 <h6>Saturday, 24th of January, Anno Domini MMIX, at the hour of the Dragon</h6>
248 <a name=1232778113>
249 <h2>Thoughts about <i>interactive rebase</i></h2>
252 </p><p>
253 Somebody mentioned that my <i>my-next</i> branch is a mess, as it mixes all
254 kinds of topics.
255 </p><p>
256 That is undeniably true, however, there is a good reason that I do not
257 have a lot of topic branches: I work on more than just one computer.
258 </p><p>
259 To make sure that I do not lose a commit by mistake, I always <i>rebase -i</i>
260 the <i>my-next</i> branch of the computer I happen to work on on top of the
261 <i>my-next</i> branch I fetch from <a href=http://repo.or.cz>repo.or.cz</a>.
262 </p><p>
263 To rebase a lot of topic branches at the same time seems a bit complicated.
264 But that is actually what the <i>-p</i> option (preserve merges) is all about.
265 </p><p>
266 The only problem is that the code for <i>rebase -i -p</i> has been messed up
267 recently, quite successfully, I might add.
268 </p><p>
269 Worse, some people are pushing for a completely and total unintuitive syntax.
270 </p><p>
271 So maybe I will start to work on <i>-p</i> again, for my own use (I should learn
272 to heed the principle more: work on things I can use myself).
273 </p><p>
274 My current idea is to implement a "goto" statement that will jump to another
275 commit. To make it easily usable, I will add the semantics that "goto" will
276 always try to go to the <u>rewritten</u> version of the given commit; if the user
277 wanted to have the original commit, she has to paste the unabbreviated commit
278 name.
279 </p><p>
280 The more I think about it, the more I actually like this idea &#x263a;
281 </p><p>
282 Of course, working on this little project means that I will have to cope with
283 that ugly code again. *urgh*
284 </p>
285 <h6>Friday, 23rd of January, Anno Domini MMIX, at the hour of the Pig</h6>
286 <a name=1232745071>
287 <h2>Git Logos</h2>
290 </p><p>
291 The other day, when I did not exactly have too much time on my hands, but
292 definitely too much motivation, I played around creating several logos.
293 </p><p>
294 An ambigram (if you turn it 180 degrees around the appropriate axis, it looks
295 exactly the same as unrotated):
296 </p><p>
297 <center>
298 <table border=0>
299 <tr>
300 <td align=center>
301 <embed type="image/svg+xml"
302 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-ambigram.svg" width=317 />
303 </td>
304 </tr>
305 <tr>
306 <td align=center>
307 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-ambigram.svg>git-ambigram.svg</a>
308 </td>
309 </tr>
310 </table>
311 </center>
312 </p><p>
313 A play on gitk:
314 </p><p>
315 <center>
316 <table border=0>
317 <tr>
318 <td align=center>
319 <embed type="image/svg+xml"
320 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-gitk-logo.svg" width=325 />
321 </td>
322 </tr>
323 <tr>
324 <td align=center>
325 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-gitk-logo.svg>git-gitk-logo.svg</a>
326 </td>
327 </tr>
328 </table>
329 </center>
330 </p><p>
331 A play on the test you have to go through before getting new glasses:
332 </p><p>
333 <center>
334 <table border=0>
335 <tr>
336 <td align=center>
337 <embed type="image/svg+xml"
338 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-visual-test.svg" width=325 />
339 </td>
340 </tr>
341 <tr>
342 <td align=center>
343 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-visual-test.svg>git-visual-test.svg</a>
344 </td>
345 </tr>
346 </table>
347 </center>
348 </p><p>
349 This is Henrik Nyh's logo (converted to .svg by yours truly):
350 </p><p>
351 <center>
352 <table border=0>
353 <tr>
354 <td align=center>
355 <embed type="image/svg+xml"
356 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=gitlogo.svg" width=165 />
357 </td>
358 </tr>
359 <tr>
360 <td align=center>
361 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=gitlogo.svg>gitlogo.svg</a>
362 </td>
363 </tr>
364 </table>
365 </center>
366 </p><p>
367 And of course, the original logo...
368 </p><p>
369 <center>
370 <table border=0>
371 <tr>
372 <td align=center>
373 <embed type="image/svg+xml"
374 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=original-git-logo.svg" width=165 />
375 </td>
376 </tr>
377 <tr>
378 <td align=center>
379 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=original-git-logo.svg>original-git-logo.svg</a>
380 </td>
381 </tr>
382 </table>
383 </center>
384 </p><p>
385 Maybe some of you have fun with them...
386 </p>
387 <h6>Friday, 23rd of January, Anno Domini MMIX, at the hour of the Pig</h6>
388 <a name=1232742582>
389 <h2>How to deal with files that are not source code when merging</h2>
392 </p><p>
393 Last week, one of the mentors of last year's <a href=http://code.google.com/soc>
394 Summer of Code</a> mentioned the idea that merge strategies are in dear need
395 for file types other than source code.
396 </p><p>
397 I think this idea is awesome, even if I cannot bring myself to believe that
398 any of the file types would make a good Summer of Code project: either they
399 are too complicated (think raster images such as .png or even .jpg), or they
400 are too straight-forward (think LaTeX, where all that is needed is a good
401 graphical user interface to inspect the three versions: <i>ours</i>, <i>baseline</i>
402 and <i>theirs</i>).
403 </p><p>
404 The LaTeX idea would be a good project for me to mentor, though: I have a
405 pretty clear idea how it should be done; I just lack the time (and motivation)
406 to do it myself.
407 </p><p>
408 As for OpenOffice text documents, vector graphics (such as .svg), or more
409 specific data such as spreadsheets, I think that all of these are really
410 difficult: the problem is not so much the implementation (i.e. the programming
411 part of it), but the design.
412 </p><p>
413 This design should involve much more than a Summer of Code project is about:
414 you would need to survey users' expectations, and at least the mentor -- if
415 not the student -- would need to be an expert in usability questions, which
416 is rather unlikely in the realm of Open Source.
417 </p><p>
418 Maybe this is the missing part in Open Source: we have many brilliant
419 programmers, but next to nobody with a good idea how to design intuitive
420 user interfaces.
421 </p><p>
422 That might be related to the fact that brilliant software engineers, as they
423 can be found in Open Source, are not exactly known for their social skills,
424 a human trait that seems to be a very important prerequisite for designing
425 intuitive user interfaces.
426 </p><p>
427 Well, I have <a href=http://git.or.cz/gitwiki/SoC2009Ideas#head-6188833471f79f277e162ef9fbe1592aa10b5f6c>
428 added</a> the proposal to Git's Summer of Code idea page on the Git Wiki; We will
429 see what comes out of it.
430 </p>
431 <h6>Thursday, 22nd of January, Anno Domini MMIX, at the hour of the Goat</h6>
432 <a name=1232626236>
433 <h2>The UGFWIINI contest</h2>
436 </p><p>
437 Just in case somebody finds this blog, here is a challenge. Inspired by my
438 own little hack (this blog), I announce the "Using Git For What It Is Not
439 Intended" contest.
440 </p><p>
441 And it is especially cool, since the acronym sounds cool! You might miss
442 this fact if you do no know that I pronounce the "F" like an "A" so that
443 it sounds cool.
444 </p><p>
445 This will be a running contest; whenever I have 10 valid applications, I
446 will announce a winner on the Git mailing list.
447 </p><p>
448 So, what accounts for a valid application?
449 </p><p>
450 <ul>
451 <li> You must use a Git program (the term is used loosely here, GitWeb is
452 considered a Git program, for example).
453 <li> The program must be intended for something completely different than
454 what you are using it for. E.g. GitWeb -- which was intended to let
455 you browse through the history using your web browser -- is used
456 to serve a blog to the wide world.
457 <li> You must be able to prove that you actually used the Git program to
458 the purpose you claim, preferably in a live demonstration like this
459 one.
460 <li> Nobody and nothing must be harmed in the process (except your
461 laughing muscle, that's okay).
462 </ul>
463 </p><p>
464 So, how does such an abuse look like?
465 </p><p>
466 <ul>
467 <li> ... like this blog.
468 <li> Managing your mail (in maildir format) in a Git repository.
469 <li> Finding duplicate files by
470 <table
471 border=1 bgcolor=black>
472 <tr><td bgcolor=lightblue colspan=3>
473 &nbsp;
474 </td></tr>
475 <tr><td>
476 <table cellspacing=5 border=0
477 style="color:white;">
478 <tr><td>
479 <pre>
480 $ git init
481 $ git add .
482 $ git ls-files --stage | sort -k2 | uniq -d -s7 -w40
483 </pre>
484 </td></tr>
485 </table>
486 </td></tr>
487 </table>
488 <li> Abusing the Git alias mechanism to call scripts defined directly in
489 the config.
490 </ul>
491 </p><p>
492 I am really looking forward to all of your submissions... *chuckles*
493 </p><p>
494 </p>
495 <h6>Thursday, 22nd of January, Anno Domini MMIX, at the hour of the Snake</h6>
496 <a name=1232611542>
497 <h2>Top-posting</h2>
500 </p><p>
501 Okay, last post for a while. But this is something that is nagging me
502 tremendously. I should probably just let go, but in my deepest inner self,
503 really close to my heart, I refuse to believe that any human beings could
504 be incapable of certain degrees of reason.
505 </p><p>
506 Take the example of top-posting. Everybody who read a top-posted email
507 knows that you have to scroll down, possibly weeding through tons of
508 pages to find out what the heck the author of the last reply was replying
510 </p><p>
511 Never mind that it would take the author of the reply just a couple of
512 seconds to remove all the irrelevant stuff -- as she already knows what
513 is the relevant part, saving minutes, in case of mailing lists hours,
514 easily, to the readers who otherwise would have to discern what is
515 irrelevant and what is relevant first.
516 </p><p>
517 It is a horrible time waste. But of course not for the top-poster.
518 </p><p>
519 The problem is that I frequently run into such people, and when I write
520 them a polite mail, explaining to them that it is impolite to top-post,
521 and why, the answers I get sometimes make me check if the sky is still up
522 and the earth down. Yesterday was an example of such a dubitable
523 pleasure.
524 </p><p>
525 Most funny are the ridiculous attempts by those persons at explaining why
526 top-posting is <i>so</i> much superior to anything else.
527 </p><p>
528 Which is good, because if they were not that funny, they would be pretty sad.
529 </p>
530 <h6>Thursday, 22nd of January, Anno Domini MMIX, at the hour of the Dragon</h6>
531 <a name=1232607201>
532 <h2>Sverre's hat</h2>
535 </p><p>
536 The fun part about a blog is that you can talk about less technical stuff.
537 For example, Sverre's hat.
538 </p><p>
539 Let me start a bit earlier, so that you get the context.
540 </p><p>
541 Last year, at the <a href=http://git.or.cz/gitwiki/GitTogether>GitTogether</a>,
542 we had an <a href=http://en.wikipedia.org/wiki/Unconference>unconference style
543 conference</a>, which basically meant that it was our job to decide what
544 we want to talk about.
545 </p><p>
546 It turned out to be pretty hard, because there was so much we wanted to
547 discuss, and because we wanted to get to know each other, and we wanted to
548 do some hacking.
549 </p><p>
550 So to help us decide what subjects, and in which order we wanted to have
551 scheduled, Shawn opened a series on <a href=http://moderator.appspot.com/>
552 Google Moderator</a>, a nifty, yet simple application which allows a group
553 to agree quickly on an agenda.
554 </p><p>
555 It worked quite well; However, that little saboteur displayed his sense of
556 humor so overtly that some entertaining Gitter put the question "Should Sverre
557 wear a hat?" on the agenda.
558 </p><p>
559 Sure enough, the subject got voted up, and eventually, we got Sverre a hat:
560 </p><p>
561 <center><img src=dscho.git?a=blob_plain;hb=30319f7436828cd15db8a531a0057351d8e361c0;f=sverre-hat.jpg sverre-hat.jpg></center>
562 </p><p>
563 By the way, another thing I like about this blog engine is that there are no
564 comments... Nothing is more annoying than leaving a comment on a blog,
565 forgetting about it for a few months, and then finding somebody answered
566 ages ago.
567 </p><p>
568 Update: Sverre says it was dsymonds idea.
569 </p>
570 <h6>Thursday, 22nd of January, Anno Domini MMIX, at the hour of the Dragon</h6>
571 <a name=1232604722>
572 <h2>Let there be images!</h2>
575 </p><p>
576 One of the most important features of blogs is the ability to insert images.
577 So what would this blog be, if it could not present something that says
578 more than a thousand words?
579 </p><p>
580 So here it goes, my first picture in this blog, taken from my Google Tech
581 Talk in Mountain View:
582 </p><p>
583 <center><img src=dscho.git?a=blob_plain;hb=85b89d1cd73acd65ca4381be901d50287dde8170;f=all-your-rebase.png width=500px></center>
584 </p><p>
585 Now this blog starts to look like a real blog...
586 </p>
587 </div>
588 </body>
589 </html>