Housekeeping on Wednesday, 28th of January, Anno Domini MMIX, at the hour of the...
[git/dscho.git] / blog.rss
blob2b21e93dfdd11272edbf0953bcee6816f0b7a632
1 <?xml version="1.0" encoding="utf-8"?>
2 <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
3 <channel>
4 <title>Dscho's blog</title>
5 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html</link>
6 <atom:link href="http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=blog.rss" rel="self" type="application/rss+xml"/>
7 <description>A few stories told by Dscho</description>
8 <lastBuildDate>Wed, 28 Jan 2009 01:18:39 +0100</lastBuildDate>
9 <language>en-us</language>
10 <item>
11 <title>Progress with the interactive rebase preserving merges</title>
12 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1233101919</link>
13 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1233101919</guid>
14 <pubDate>Wed, 28 Jan 2009 01:18:39 +0100</pubDate>
15 <description><![CDATA[Progress with the interactive rebase preserving merges
16 </p><p>
17 I thought about the "dropped" commits a bit more, after all, and it is
18 probably a good thing to substitute them by their parent, as Stephen did it.
19 </p><p>
20 Imagine that you have merged a branch with two commits. One is in upstream,
21 and you want to rebase (preserving merges) onto upstream. Then you still
22 want to merge the single commit.
23 </p><p>
24 Even better, if there is no commit left, the <i>$REWRITTEN</i> mechanism will
25 substitute the commit onto which we are rebasing, so a merge will just
26 result in a fast-forward!
27 </p><p>
28 Oh, another thing: merge commits can never be dropped (as that would mean
29 that the patch id of that commit is identical to a patch id of a commit in
30 the upstream branch; but merge commits do not have a single patch, let alone
31 a patch id). So we can be certain that a dropped commit always has at most
32 one parent.
33 </p><p>
34 So what about a root commit? If that was dropped, we will just substitute
35 it with the commit onto which we rebase.
36 </p><p>
37 The thing that upset me a bit when I found out about it, is what t3410 is
38 all about. It speaks about dropping local merges together with their
39 <u>whole</u> branches when an upstream has the same "merge resolution".
40 </p><p>
41 To my surprise, Stephen had no objections to remove that stuff, so I think
42 I'll be able to submit something usable tomorrow.
43 </p><p>
44 Or maybe I will start to use it first...
45 </p><p>
46 Another thought that occurred to me is that I could include the output of
47 <i>git log --graph</i>. This cannot be done in the rebase script directly,
48 as there are "goto" and "merge" statements disrupting the graph, and
49 besides, it would look ugly if you reordered commits without adjusting the
50 graph, so I may include the graph (for <i>-p</i> only) in the comment section.]]></description>
51 </item>
52 <item>
53 <title>Another midnight riddle?</title>
54 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1233099894</link>
55 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1233099894</guid>
56 <pubDate>Wed, 28 Jan 2009 00:44:54 +0100</pubDate>
57 <description><![CDATA[Another midnight riddle?
58 </p><p>
59 Okay, here's another riddle: what is the next line?
60 </p><p>
61 <pre>
63 1 1
64 2 1
65 1 1 1 2
66 3 1 1 2
67 2 1 1 2 1 3
68 ...
69 </pre>
70 </p><p>
71 And when does the line get wider than 10 digits?]]></description>
72 </item>
73 <item>
74 <title>Fun with calculus after midnight</title>
75 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1233022809</link>
76 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1233022809</guid>
77 <pubDate>Tue, 27 Jan 2009 03:20:09 +0100</pubDate>
78 <description><![CDATA[Fun with calculus after midnight
79 </p><p>
80 Problem: what is the shortest way of defining a variable consisting of <i>N</i>
81 spaces? I.e. for <i>N=80</i> the result will look something like
82 </p><p>
83 <table
84 border=1 bgcolor=white>
85 <tr><td bgcolor=lightblue colspan=3>
86 <pre> </pre>
87 </td></tr>
88 <tr><td>
89 <table cellspacing=5 border=0
90 style="color:black;">
91 <tr><td>
92 <pre>
93 s=' '
94 s="$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s$s"
95 </pre>
96 </td></tr>
97 </table>
98 </td></tr>
99 </table>
100 </p><p>
101 Let's see. Let the minimal number of characters needed be <i>A(N)</i>. For
102 simplicity, let's say that we only use one variable. Then, certainly, <i>A(N)</i>
103 cannot be larger than <i>5+N</i>, as we could define a variable using 1 character
104 for the name, 1 for the equal sign, 2 for the quotes, and one for the semicolon
105 or newline character (whichever).
106 </p><p>
107 Now, let's assume <i>N</i> is a product <i>K*L</i>. Then certainly, <i>A(N)</i> cannot
108 be larger than <i>A(K)+5+2*L</i>, as we could first define a variable that has
109 exactly <i>K</i> spaces and then use that to define the end result (in the example
110 above, <i>K=5</i> and <i>L=20</i>).
111 </p><p>
112 So, for which <i>N=K*L</i> is it better to use two definitions instead of one?
113 </p><p>
114 Simple calculus says that <i>5+K*L>5+K+5+2*L</i> must hold true, or (after some
115 scribbling): <i>L>1+7/(K-2)</i>. Which means that it makes no sense to define
116 a variable with 1 or 2 spaces first, which is kinda obvious (writing '$s'
117 alone would use two characters, so we could write the spaces right away).
118 </p><p>
119 But what for the other values? For <i>K=3</i>, <i>L</i> must be at least 9 to make
120 sense (in other words, <i>N</i> must be at least 27). For <i>K=4</i>, <i>L</i> needs
121 to be greater or equal to 5 (<i>N>=20</i>), the next pairs are <i>(5,4)</i>,
122 <i>(6,3)</i>, <i>(7,3)</i>, <i>(8,3)</i>, <i>(9,3)</i> and starting with <i>K=10</i>, any
123 <i>L>1</i> makes sense.
124 </p><p>
125 The second definition can also contain spaces at the end, however, so for any
126 <i>N=K*L+M</i>, <i>A(N)</i> cannot be larger than <i>A(K)+5+2*L+M</i>.
127 </p><p>
128 Not surprisingly, this leads to exactly the same <i>L>1+7/(K-2)</i> (as we can
129 append the <i>M</i> spaces in the last definition, no matter if we use 1 or
130 2 definitions).
131 </p><p>
132 However, that means that as soon as <i>N>=18</i>, we should use two definitions,
133 prior to that, it makes no sense.
134 </p><p>
135 So for <i>N<18</i>, <i>A(N)=5+N</i>.
136 </p><p>
137 But what <i>K</i> should one choose, i.e. how many spaces in the first definition?
138 In other words, what is <i>A(N)</i> given that we use two definitions?
139 </p><p>
140 That will have to wait for another midnight. Just a teaser: <i>A(80)=36</i>. Oh,
141 and with 80 characters, you can define a string of 9900 spaces...]]></description>
142 </item>
143 <item>
144 <title>Valgrind takes a loooong time</title>
145 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232997290</link>
146 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232997290</guid>
147 <pubDate>Mon, 26 Jan 2009 20:14:50 +0100</pubDate>
148 <description><![CDATA[Valgrind takes a loooong time
149 </p><p>
150 Yesterday, I started a run on a fast machine, and it took roughly 5.5
151 hours by the machine's clock.
152 </p><p>
153 And of course, I redirected stdout only... *sigh*
154 </p><p>
155 Which triggered a Google search how to force redirection of all the output
156 in the test scripts to a file and the terminal at the same time.
157 </p><p>
158 It seems as if that is not easily done. I tried
159 <center><table
160 border=1 bgcolor=white>
161 <tr><td bgcolor=lightblue colspan=3>
162 <pre> </pre>
163 </td></tr>
164 <tr><td>
165 <table cellspacing=5 border=0
166 style="color:black;">
167 <tr><td>
168 <pre>
169 exec >(tee out) 2>&1
170 </pre>
171 </td></tr>
172 </table>
173 </td></tr>
174 </table></center>
175 </p><p>
176 but that did not work: it mumbled something about invalid file handles or some
177 such.
178 </p><p>
179 The only solution I found was:
180 <center><table
181 border=1 bgcolor=white>
182 <tr><td bgcolor=lightblue colspan=3>
183 <pre> </pre>
184 </td></tr>
185 <tr><td>
186 <table cellspacing=5 border=0
187 style="color:black;">
188 <tr><td>
189 <pre>
190 mkpipe pipe
191 tee out < pipe &
192 exec > pipe 2>&1
193 </pre>
194 </td></tr>
195 </table>
196 </td></tr>
197 </table></center>
198 </p><p>
199 That is a problem for parallel execution, though, so I am still looking for a
200 better way to do it.
201 </p><p>
202 Once I have the output, it is relatively easy to analyze it, as I already
203 made a script which disects the output into valgrind output and the test
204 case it came from, then groups by common valgrind output and shows the
205 result to the user.]]></description>
206 </item>
207 <item>
208 <title>A day full of rebase... and a little valgrind</title>
209 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232927812</link>
210 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232927812</guid>
211 <pubDate>Mon, 26 Jan 2009 00:56:52 +0100</pubDate>
212 <description><![CDATA[A day full of rebase... and a little valgrind
213 </p><p>
214 I think that I am progressing nicely with my rebase -p work, so much so
215 that I will soon be able to use it myself to work on topic branches <u>and</u>
216 rebase all the time without much hassle.
217 </p><p>
218 In other words, I would like to be able to rebase all my topic branches
219 to Junio's <i>next</i> branch whenever that has new commits. With a single
220 rebase.
221 </p><p>
222 And finally, I got the idea of the thing Stephen implemented for dropped
223 commits; however, I am quite sure I do not like it.
224 </p><p>
225 So what are "dropped" commits?
226 </p><p>
227 When you rebase, chances are that the upstream already has applied at
228 least some of your patches. So we filter those out with <i>--cherry-pick</i>.
229 Stephen calls those "dropped" commits.
230 </p><p>
231 Then he goes on to reinvent the "$REWRITTEN" system: a directory containing
232 the mappings of old commit names to new commit names. That is easily fixed.
233 </p><p>
234 But worse, he substitutes the dropped commits with their <u>parents</u>, instead
235 of substituting them with the corresponding commits in upstream.
236 </p><p>
237 I guess this will be a medium-sized fight on the mailing list, depending
238 how much energy Stephen wants to put in to defend his strategy.
239 </p><p>
240 Anyway, I finally got to a point where only three of the tests are failing,
241 t3404, t3410 and t3412. Somewhat disappointing is t3404, as its name pretends
242 not to exercize -p at all. Oh well, I guess I'll see what is broken tomorrow.
243 </p><p>
244 Another part of the day was dedicated to the Valgrind patch series, which
245 should give us yet another level of code quality.
246 </p><p>
247 After having confused myself with several diverging/obsolete branches, I did
248 indeed finally manage to send that patch series off. Woohoo.]]></description>
249 </item>
250 <item>
251 <title>Regular diff with word coloring (as opposed to word diff)</title>
252 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232888842</link>
253 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232888842</guid>
254 <pubDate>Sun, 25 Jan 2009 14:07:22 +0100</pubDate>
255 <description><![CDATA[Regular diff with word coloring (as opposed to word diff)
256 </p><p>
257 You know, if I were a bit faster with everything I do, I could do so much more!
258 </p><p>
259 For example, Junio's idea that you could keep showing a regular diff, only
260 coloring the words that have been removed/deleted.
261 </p><p>
262 Just imagine looking at the diff of a long line in LaTeX source code. It
263 should be much nicer to the eye to see the complete removed/added sentences
264 instead of one sentence with colored words in between, disrupting your read
265 flow.
266 </p><p>
267 Compare these two versions:
268 </p><p>
269 Regular diff with colored words:
270 <blockquote><tt>
271 -This sentence has a <font color=red>tyop</font> in it.<br>
272 +This sentence has a <font color=green>typo</font> in it.<br>
273 </tt></blockquote>
274 </p><p>
275 Word diff:
276 <blockquote><tt>
277 This sentence has a <font color=red>tyop</font><font color=green>typo</font> in it.<br>
278 </tt></blockquote>
279 </p><p>
280 And it should not be hard to do at all!
281 </p><p>
282 In <i>diff_words_show()</i>, we basically get the minus lines as
283 <i>diff_words->minus</i> and the plus lines as <i>diff_words->plus</i>. The
284 function then prepares the word lists and calls the xdiff engine to do all the
285 hard work, analyzing the result from xdiff and printing the lines in
286 <i>fn_out_diff_words_aux()</i>.
287 </p><p>
288 So all that would have to be changed would be to <u>record</u> the positions
289 of the removed/added words instead of outputting them, and at the end printing
290 the minus/plus buffers using the recorded information to color the words.
291 </p><p>
292 This would involve
293 </p><p>
294 <ul>
295 <li>adding two new members holding the offsets in the <i>diff_words</i>
296 struct,
297 <li>having a special handling for that mode in
298 <i>fn_out_diff_words_aux()</i> that appends the offsets and
299 returns,
300 <li>adding a function <i>show_lines_with_colored_words()</i> that
301 outputs a buffer with a given prefix ('-' or '+') and coloring the words at
302 given offsets with a given color,
303 <li>modify <i>diff_words_show()</i> to call that function for the "special
304 case: only removal" and at the end of the function, and
305 <li> disabling the <i>fwrite()</i> at the end of <i>diff_words_show()</i> for that
306 mode.
307 </ul>
308 </p><p>
309 Of course, the hardest part is to find a nice user interface for that. Maybe
310 <i>--colored-words</i>? &#x263a;]]></description>
311 </item>
312 <item>
313 <title>Ideas for a major revamp of the --preserve-merges handling in git rebase</title>
314 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232828715</link>
315 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232828715</guid>
316 <pubDate>Sat, 24 Jan 2009 21:25:15 +0100</pubDate>
317 <description><![CDATA[Ideas for a major revamp of the <i>--preserve-merges</i> handling in <i>git rebase</i>
318 </p><p>
319 As probably everybody agrees, the code to preserve merges is a big mess
320 right now.
321 </p><p>
322 Worse, the whole concept of "pick <merge-sha1>" just does not fly well.
323 </p><p>
324 So I started a <u>major</u> cleanup, which happens to reduce the code very
325 nicely so far.
326 </p><p>
327 It will take a few days to flesh out, I guess, but these are the major
328 ideas of my work:
329 </p><p>
330 <b>pick $sha1</b><br>
331 <blockquote>will only work on non-merges in the future.</blockquote>
332 <b>merge $sha1 [$sha1...] was $sha1 Merge ...</b><br>
333 <blockquote>will merge the given list of commits into the current HEAD, for
334 the user's reference and to keep up-to-date what was rewritten,
335 the original merge is shown after the keyword "was" (which is not
336 a valid SHA-1, luckily).</blockquote>
337 <b>goto $sha1</b><br>
338 <blockquote>will reset the HEAD to the given commit.</blockquote>
339 <b>$sha1'</b><br>
340 <blockquote>for merge and goto, if a $sha1 ends in a single quote, the
341 rewritten commit is substituted (if there is one).</blockquote>
342 </p><p>
343 Example:
344 </p><p>
345 <pre>
346 A - B - - - E
348 C - D
349 </pre>
350 </p><p>
351 could yield this TODO script:
352 </p><p>
353 <pre>
354 pick A
355 pick C
356 pick D
357 goto A'
358 pick B
359 merge D' was E
360 </pre>
361 </p><p>
362 This should lead to a much more intuitive user experience.
363 </p><p>
364 I am very sorry if somebody actually scripted <i>rebase -i -p</i> (by setting
365 GIT_EDITOR with a script), but I am very certain that this cleanup is
366 absolutely necessary to make <i>rebase -i -p</i> useful.]]></description>
367 </item>
368 <item>
369 <title>Thoughts about interactive rebase</title>
370 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232778113</link>
371 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232778113</guid>
372 <pubDate>Sat, 24 Jan 2009 07:21:53 +0100</pubDate>
373 <description><![CDATA[Thoughts about <i>interactive rebase</i>
374 </p><p>
375 Somebody mentioned that my <i>my-next</i> branch is a mess, as it mixes all
376 kinds of topics.
377 </p><p>
378 That is undeniably true, however, there is a good reason that I do not
379 have a lot of topic branches: I work on more than just one computer.
380 </p><p>
381 To make sure that I do not lose a commit by mistake, I always <i>rebase -i</i>
382 the <i>my-next</i> branch of the computer I happen to work on on top of the
383 <i>my-next</i> branch I fetch from <a href=http://repo.or.cz>repo.or.cz</a>.
384 </p><p>
385 To rebase a lot of topic branches at the same time seems a bit complicated.
386 But that is actually what the <i>-p</i> option (preserve merges) is all about.
387 </p><p>
388 The only problem is that the code for <i>rebase -i -p</i> has been messed up
389 recently, quite successfully, I might add.
390 </p><p>
391 Worse, some people are pushing for a completely and total unintuitive syntax.
392 </p><p>
393 So maybe I will start to work on <i>-p</i> again, for my own use (I should learn
394 to heed the principle more: work on things I can use myself).
395 </p><p>
396 My current idea is to implement a "goto" statement that will jump to another
397 commit. To make it easily usable, I will add the semantics that "goto" will
398 always try to go to the <u>rewritten</u> version of the given commit; if the user
399 wanted to have the original commit, she has to paste the unabbreviated commit
400 name.
401 </p><p>
402 The more I think about it, the more I actually like this idea &#x263a;
403 </p><p>
404 Of course, working on this little project means that I will have to cope with
405 that ugly code again. *urgh*]]></description>
406 </item>
407 <item>
408 <title>Git Logos</title>
409 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232745071</link>
410 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232745071</guid>
411 <pubDate>Fri, 23 Jan 2009 22:11:11 +0100</pubDate>
412 <description><![CDATA[Git Logos
413 </p><p>
414 The other day, when I did not exactly have too much time on my hands, but
415 definitely too much motivation, I played around creating several logos.
416 </p><p>
417 An ambigram (if you turn it 180 degrees around the appropriate axis, it looks
418 exactly the same as unrotated):
419 </p><p>
420 <center>
421 <table border=0>
422 <tr>
423 <td align=center>
424 <embed type="image/svg+xml"
425 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-ambigram.svg" width=317 />
426 </td>
427 </tr>
428 <tr>
429 <td align=center>
430 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-ambigram.svg>git-ambigram.svg</a>
431 </td>
432 </tr>
433 </table>
434 </center>
435 </p><p>
436 A play on gitk:
437 </p><p>
438 <center>
439 <table border=0>
440 <tr>
441 <td align=center>
442 <embed type="image/svg+xml"
443 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-gitk-logo.svg" width=325 />
444 </td>
445 </tr>
446 <tr>
447 <td align=center>
448 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-gitk-logo.svg>git-gitk-logo.svg</a>
449 </td>
450 </tr>
451 </table>
452 </center>
453 </p><p>
454 A play on the test you have to go through before getting new glasses:
455 </p><p>
456 <center>
457 <table border=0>
458 <tr>
459 <td align=center>
460 <embed type="image/svg+xml"
461 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-visual-test.svg" width=325 />
462 </td>
463 </tr>
464 <tr>
465 <td align=center>
466 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=git-visual-test.svg>git-visual-test.svg</a>
467 </td>
468 </tr>
469 </table>
470 </center>
471 </p><p>
472 This is Henrik Nyh's logo (converted to .svg by yours truly):
473 </p><p>
474 <center>
475 <table border=0>
476 <tr>
477 <td align=center>
478 <embed type="image/svg+xml"
479 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=gitlogo.svg" width=165 />
480 </td>
481 </tr>
482 <tr>
483 <td align=center>
484 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=gitlogo.svg>gitlogo.svg</a>
485 </td>
486 </tr>
487 </table>
488 </center>
489 </p><p>
490 And of course, the original logo...
491 </p><p>
492 <center>
493 <table border=0>
494 <tr>
495 <td align=center>
496 <embed type="image/svg+xml"
497 src="dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=original-git-logo.svg" width=165 />
498 </td>
499 </tr>
500 <tr>
501 <td align=center>
502 <a href=dscho.git?a=blob_plain;hb=aaa9edafbe6ca5349ad7b36848fb294e5f4fc529;f=original-git-logo.svg>original-git-logo.svg</a>
503 </td>
504 </tr>
505 </table>
506 </center>
507 </p><p>
508 Maybe some of you have fun with them...]]></description>
509 </item>
510 <item>
511 <title>How to deal with files that are not source code when merging</title>
512 <link>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232742582</link>
513 <guid>http://repo.or.cz/w/git/dscho.git?a=blob_plain;hb=blog;f=index.html#1232742582</guid>
514 <pubDate>Fri, 23 Jan 2009 21:29:42 +0100</pubDate>
515 <description><![CDATA[How to deal with files that are not source code when merging
516 </p><p>
517 Last week, one of the mentors of last year's <a href=http://code.google.com/soc>
518 Summer of Code</a> mentioned the idea that merge strategies are in dear need
519 for file types other than source code.
520 </p><p>
521 I think this idea is awesome, even if I cannot bring myself to believe that
522 any of the file types would make a good Summer of Code project: either they
523 are too complicated (think raster images such as .png or even .jpg), or they
524 are too straight-forward (think LaTeX, where all that is needed is a good
525 graphical user interface to inspect the three versions: <i>ours</i>, <i>baseline</i>
526 and <i>theirs</i>).
527 </p><p>
528 The LaTeX idea would be a good project for me to mentor, though: I have a
529 pretty clear idea how it should be done; I just lack the time (and motivation)
530 to do it myself.
531 </p><p>
532 As for OpenOffice text documents, vector graphics (such as .svg), or more
533 specific data such as spreadsheets, I think that all of these are really
534 difficult: the problem is not so much the implementation (i.e. the programming
535 part of it), but the design.
536 </p><p>
537 This design should involve much more than a Summer of Code project is about:
538 you would need to survey users' expectations, and at least the mentor -- if
539 not the student -- would need to be an expert in usability questions, which
540 is rather unlikely in the realm of Open Source.
541 </p><p>
542 Maybe this is the missing part in Open Source: we have many brilliant
543 programmers, but next to nobody with a good idea how to design intuitive
544 user interfaces.
545 </p><p>
546 That might be related to the fact that brilliant software engineers, as they
547 can be found in Open Source, are not exactly known for their social skills,
548 a human trait that seems to be a very important prerequisite for designing
549 intuitive user interfaces.
550 </p><p>
551 Well, I have <a href=http://git.or.cz/gitwiki/SoC2009Ideas#head-6188833471f79f277e162ef9fbe1592aa10b5f6c>
552 added</a> the proposal to Git's Summer of Code idea page on the Git Wiki; We will
553 see what comes out of it.]]></description>
554 </item>
555 </channel>
556 </rss>