If I switch to "watch live tv" with a WinTV v4l card configured first,
current svn gives the pop-up "You should have gotten a channel lock by
now..."  even while the channel is playing fine.  It then
fails to change to a different channel on the same card, giving first a
blank screen, then "Error was encountered while displaying
video,&quot; then a segfault.&nbsp;  <br>
<br>
If I hit &quot;R&quot; to start recording on the WinTV, it starts that recording,
but instead of sending me back to watch the recording, it shows a
channel from the atsc card. <br>
<br>
The HD-3000 is working well, though.<br>
<br>
Here's a bit of backend log -v siparser,channel,record<br>
<br>
2005-09-29 00:15:09.070 MainServer::HandleAnnounce Playback<br>
2005-09-29 00:15:09.070 adding: chinch as a client (events: 0)<br>
2005-09-29 00:15:09.093 Getting next free recorder after : -1<br>
2005-09-29 00:15:09.095 Card 1 is local.<br>
2005-09-29 00:15:09.124 MainServer::HandleAnnounce Playback<br>
2005-09-29 00:15:09.124 adding: chinch as a client (events: 1)<br>
2005-09-29 00:15:09.152 MainServer::HandleAnnounce Playback<br>
2005-09-29 00:15:09.152 adding: chinch as a client (events: 0)<br>
2005-09-29 00:15:09.400 MainServer::HandleAnnounce Playback<br>
2005-09-29 00:15:09.400 adding: chinch as a client (events: 0)<br>
2005-09-29 00:15:09.407 adding: chinch as a remote ringbuffer<br>
2005-09-29 00:15:09.419 TVRec(1): Changing from None to WatchingLiveTV<br>
2005-09-29 00:15:09.419 TVRec(1): ClearFlags(FrontendReady,CancelNextRecording,) -&gt; RunMainLoop,<br>
2005-09-29 00:15:09.419 TVRec(1): SetFlags(AskAllowRecording,) -&gt; RunMainLoop,AskAllowRecording,<br>
2005-09-29 00:15:09.419 TVRec(1): Request: Program(no) channel() input() flags(LiveTV,)<br>
2005-09-29 00:15:09.419 TVRec(1): ClearFlags(WaitingForSIParser,SIParserRunning,) -&gt; RunMainLoop,AskAllowRecording,<br>
2005-09-29 00:15:09.420 TVRec(1): ClearFlags(WaitingForSignal,SignalMonitorRunning,) -&gt; RunMainLoop,AskAllowRecording,<br>
2005-09-29 00:15:09.469 Channel(/dev/video0)::SwitchToInput(in 0)<br>
2005-09-29 00:15:09.505 Channel(/dev/video0)::SwitchToInput() setting video mode to NTSC<br>
2005-09-29 00:15:09.577 Channel(/dev/video0)::SetChannelByString(54)<br>
2005-09-29 00:15:09.578 ChannelBase(/dev/video0)::SetCachedATSCInfo(): RESET<br>
2005-09-29 00:15:09.595 External channel change: /usr/local/bin/myth-change-chan.sh 54<br>
2005-09-29 00:15:09.612 Waiting for External Tuning program to exit<br>
2005-09-29 00:15:10.614 ret_pid(0) child(22539) status(0x0)<br>
2005-09-29 00:15:11.617 ret_pid(22539) child(22539) status(0x0)<br>
2005-09-29 00:15:11.617 External Tuning program no longer running<br>
2005-09-29 00:15:11.617 External Tuning program exited with no error<br>
2005-09-29 00:15:11.618 ChannelBase(/dev/video0)::SetCachedATSCInfo(54): 5_4<br>
2005-09-29 00:15:11.622 TVRec(1): SetFlags(NeedToStartRecorder,) -&gt; RunMainLoop,AskAllowRecording,NeedToStartRecorder,<br>
2005-09-29 00:15:11.622 TVRec(1): Starting Recorder<br>
2005-09-29 00:15:11.640 TVRec(1): Using profile 'Live TV' to record<br>
2005-09-29 00:15:11.650 Unknown video codec<br>
2005-09-29 00:15:11.650 Please go into the TV Settings, Recording Profiles and<br>
2005-09-29 00:15:11.651 setup the four 'Software Encoders' profiles.<br>
2005-09-29 00:15:11.651 Assuming RTjpeg for now.<br>
2005-09-29 00:15:11.651 NVR: Error, unknown audio codec<br>
2005-09-29 00:15:11.656 SetRecording(0x0)<br>
2005-09-29 00:15:11.794 TVRec(1): SetFlags(RecorderRunning,) -&gt;
RunMainLoop,AskAllowRecording,NeedToStartRecorder,RecorderRunning,<br>
2005-09-29 00:15:11.794 TVRec(1): ClearFlags(NeedToStartRecorder,) -&gt; RunMainLoop,AskAllowRecording,RecorderRunning,<br>
2005-09-29 00:15:12.539 TVRec(1): SetFlags(FrontendReady,) -&gt; FrontendReady,RunMainLoop,AskAllowRecording,RecorderRunning,<br>
2005-09-29 00:15:24.326 TVRec(1): ClearFlags(0x40000000) -&gt; FrontendReady,RunMainLoop,AskAllowRecording,RecorderRunning,<br>
2005-09-29 00:15:24.327 TVRec(1): Request: Program(no) channel(55) input() flags(LiveTV,)<br>
2005-09-29 00:15:24.327 TVRec(1):
ClearFlags(WaitingForSIParser,SIParserRunning,) -&gt;
FrontendReady,RunMainLoop,AskAllowRecording,RecorderRunning,<br>
2005-09-29 00:15:24.327 TVRec(1):
ClearFlags(WaitingForSignal,SignalMonitorRunning,) -&gt;
FrontendReady,RunMainLoop,AskAllowRecording,RecorderRunning,<br>
2005-09-29 00:15:24.327 TVRec(1): SetFlags(WaitingForRecPause,) -&gt;
FrontendReady,RunMainLoop,AskAllowRecording,WaitingForRecPause,RecorderRunning,<br>
free(): invalid pointer 0x80ada80!<br>
2005-09-29 00:15:59.346 RingBuffer: Couldn't read data from the capture card in 15 seconds. Stopping.<br>
Segmentation fault<br>
<br>
<br>
<br>
in gdb: <br>
Program received signal SIGSEGV, Segmentation fault.<br>
[Switching to Thread -1393939536 (LWP 23975)]<br>
0xb67d7546 in QObject::activate_signal () from /usr/lib/libqt-mt.so.3<br>
<br>
(gdb) thread apply all bt full<br>
<br clear="all">Thread 18 (Thread -1410716752 (LWP 23977)):<br>
#0&nbsp; 0xb6483440 in pthread_cond_timedwait@@GLIBC_2.3.2 ()<br>
&nbsp;&nbsp; from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#1&nbsp; 0xb6a73190 in QWaitCondition::wait () from /usr/lib/libqt-mt.so.3<br>
No symbol table info available.<br>
#2&nbsp; 0xb7c11ba3 in NuppelVideoRecorder::doVbiThread (this=0xaebca008)<br>
&nbsp;&nbsp;&nbsp; at NuppelVideoRecorder.cpp:3146<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tv = {tv_sec = 4, tv_usec = 967000}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; rdset = {fds_bits = {4194304, 0 &lt;repeats 31 times&gt;}}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vbi = (vbi *) 0x0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cc = (cc *) 0x8355c60<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vbifd = 22<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vbicallbackdata = {nvr = 0xaebca008, teletextpage = {pgno = 0,<br>
&nbsp;&nbsp;&nbsp; subno = 0, lang = 0, flags = 0, errors = 0, lines = 0, data = {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; '\0' &lt;repeats 39 times&gt; &lt;repeats 25 times&gt;}, flof = 0, link = {{<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pgno = 0, subno = 0}, {pgno = 0, subno = 0}, {pgno = 0, subno = 0}, {<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pgno = 0, subno = 0}, {pgno = 0, subno = 0}, {pgno = 0, subno = 0}}},<br>
&nbsp; foundteletextpage = false}<br>
#3&nbsp; 0xb7c0c603 in NuppelVideoRecorder::VbiThread (param=0xaebca008)<br>
&nbsp;&nbsp;&nbsp; at NuppelVideoRecorder.cpp:2082<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nvr = (NuppelVideoRecorder *) 0xaebca008<br>
---Type &lt;return&gt; to continue, or q &lt;return&gt; to quit---<br>
#4&nbsp; 0xb6480b63 in start_thread () from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#5&nbsp; 0xb633718a in clone () from /lib/tls/libc.so.6<br>
No symbol table info available.<br>
<br>
Thread 17 (Thread -1402328144 (LWP 23976)):<br>
#0&nbsp; 0xb6483440 in pthread_cond_timedwait@@GLIBC_2.3.2 ()<br>
&nbsp;&nbsp; from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#1&nbsp; 0xb6a73190 in QWaitCondition::wait () from /usr/lib/libqt-mt.so.3<br>
No symbol table info available.<br>
#2&nbsp; 0xb7c0d6d5 in NuppelVideoRecorder::doAudioThread (this=0xaebca008)<br>
&nbsp;&nbsp;&nbsp; at NuppelVideoRecorder.cpp:2176<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; afmt = 16<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; trigger = 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; afd = 20<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; act = 431<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; lastread = 4096<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frag = 524298<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; blocksize = 4096<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buffer = (<br>
&nbsp;&nbsp;&nbsp; unsigned char *) 0x8354c58
&quot;\uffff\001\002\002'\0020\002S\002d\002}\002\215\002\022\003
\003H\003Y\003g\003}\003i\003~\003T\003d\0033\003?\003\003\003\020\003\uffff---Type
&lt;return&gt; to continue, or q &lt;return&gt; to quit---<br>
\002\uffff\002\217\002\236\002^\002o\002K\002X\002D\002S\002r\002\206\002\215\002\233\002\221\002\uffff\002\204\002\226\002n\002}\002@\002L\002\uffff\001\t\002\uffff\001\uffff\001\211\001\226\001c\001o\001W\001`\001\uffff\001\uffff\001\uffff\001\uffff\001\036\002(\002P\002Z\002u\002\200\002\216\002\232\002\234\002\uffff\002\uffff\002\uffff\002\227\002\uffff\002\201\002\224\002m\002o\002\213\001\220\001\024\001&amp;\001\uffff&quot;
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ispace = {fragments = 0, fragstotal = 8, fragsize = 1024, bytes = 954}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; anow = {tv_sec = 1127967720, tv_usec = 868936}<br>
#3&nbsp; 0xb7c0c5d5 in NuppelVideoRecorder::AudioThread (param=0xaebca008)<br>
&nbsp;&nbsp;&nbsp; at NuppelVideoRecorder.cpp:2073<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nvr = (NuppelVideoRecorder *) 0xaebca008<br>
#4&nbsp; 0xb6480b63 in start_thread () from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#5&nbsp; 0xb633718a in clone () from /lib/tls/libc.so.6<br>
No symbol table info available.<br>
<br>
Thread 16 (Thread -1393939536 (LWP 23975)):<br>
#0&nbsp; 0xb67d7546 in QObject::activate_signal () from /usr/lib/libqt-mt.so.3<br>
No symbol table info available.<br>
#1&nbsp; 0xb67d7354 in QObject::activate_signal () from /usr/lib/libqt-mt.so.3<br>
No symbol table info available.<br>
#2&nbsp; 0xb7d0face in RecorderBase::RecorderPaused (this=0xaebca008)<br>
&nbsp;&nbsp;&nbsp; at moc_recorderbase.cpp:86<br>
No locals.<br>
---Type &lt;return&gt; to continue, or q &lt;return&gt; to quit---<br>
#3&nbsp; 0xb7c11dc2 in NuppelVideoRecorder::doWriteThread (this=0xaebca008)<br>
&nbsp;&nbsp;&nbsp; at NuppelVideoRecorder.cpp:3213<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; action = ACTION_NONE<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; firsttimecode = -1<br>
#4&nbsp; 0xb7c0c5a7 in NuppelVideoRecorder::WriteThread (param=0xaebca008)<br>
&nbsp;&nbsp;&nbsp; at NuppelVideoRecorder.cpp:2064<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nvr = (NuppelVideoRecorder *) 0xaebca008<br>
#5&nbsp; 0xb6480b63 in start_thread () from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#6&nbsp; 0xb633718a in clone () from /lib/tls/libc.so.6<br>
No symbol table info available.<br>
<br>
Thread 15 (Thread -1383240784 (LWP 23974)):<br>
#0&nbsp; 0xb6483440 in pthread_cond_timedwait@@GLIBC_2.3.2 ()<br>
&nbsp;&nbsp; from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#1&nbsp; 0xb6a73190 in QWaitCondition::wait () from /usr/lib/libqt-mt.so.3<br>
No symbol table info available.<br>
#2&nbsp; 0xb7c078c0 in NuppelVideoRecorder::StartRecording (this=0xaebca008)<br>
&nbsp;&nbsp;&nbsp; at NuppelVideoRecorder.cpp:1112<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vc = {name = &quot;BT878 video (Hauppauge (bt878))&quot;, type = 171,<br>
&nbsp; channels = 4, audios = 1, maxwidth = 768, maxheight = 480, minwidth = 48,<br>
&nbsp; minheight = 32}<br>
---Type &lt;return&gt; to continue, or q &lt;return&gt; to quit---<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mm = {frame = 1, height = 480, width = 480, format = 15}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vm = {size = 17039360, frames = 8, offsets = {0, 2129920, 4259840,<br>
&nbsp;&nbsp;&nbsp; 6389760, 8519680, 10649600, 12779520, 14909440, 0 &lt;repeats 24 times&gt;}}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vchan = {channel = 0, name = &quot;Television&quot;, '\0' &lt;repeats 21 times&gt;,<br>
&nbsp; tuners = 1, flags = 3, type = 1, norm = 1}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; va = {audio = 0, volume = 58981, bass = 32768, treble = 32768,<br>
&nbsp; flags = 30, name = &quot;Television\000\000\000\000\000&quot;, mode = 1,<br>
&nbsp; balance = 32768, step = 0}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vt = {tuner = 0, name = '\0' &lt;repeats 31 times&gt;, rangelow = 0,<br>
&nbsp; rangehigh = 0, flags = 0, mode = 0, signal = 0}<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; channelinput = 0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; frame = 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buf = (<br>
&nbsp;&nbsp;&nbsp; unsigned char *) 0xaa663000
&quot;\030\024\021\020\021\026\024\024\020\026\022\025\030\022\020\026\026\033\037\037\020\020\026\021\021\025\020\023\037%15!\020\020\020\020\021
\036\025\026\033\032\031\032\033\037\026\020\024\027\027\021\020\027\035\035\020\020\034\033\030\025\027\032\032\032\030\032\026\022\031\026\027\026\022\031\027\032\037\032\027\020\027\033\030\025\020\022\036),\034\025\036#\035\020\021\020\020\023\021\030\034\033\020\020\024\037
\034\037/&amp;!\032\020\020\020\020\0363/\034\022\020\020\032%'!\020\020\020\020\020\030#\035\034\027\026\025\020\026*!\027\031
\034\022\023\020\021\022\020\020\025\036\035\034\&quot;\033\021\030\032\027\021\020\034\033\036\026\024\021\021\023\031\030\035%$\032\032$\026\027\&quot;\025\020\020\020\025\025\026\023\020&quot;...<br>
---Type &lt;return&gt; to continue, or q &lt;return&gt; to quit---<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; syncerrors = 0<br>
#3&nbsp; 0xb7ba8220 in TVRec::RecorderThread (param=0xaebca008) at tv_rec.cpp:1094<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; recorder = (class RecorderBase *) 0xaebca008<br>
#4&nbsp; 0xb6480b63 in start_thread () from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#5&nbsp; 0xb633718a in clone () from /lib/tls/libc.so.6<br>
No symbol table info available.<br>
<br>
Thread 14 (Thread -1353847888 (LWP 23964)):<br>
#0&nbsp; 0xb6483440 in pthread_cond_timedwait@@GLIBC_2.3.2 ()<br>
&nbsp;&nbsp; from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#1&nbsp; 0xb6a73190 in QWaitCondition::wait () from /usr/lib/libqt-mt.so.3<br>
No symbol table info available.<br>
#2&nbsp; 0xb7942cc6 in ThreadedFileWriter::SyncLoop (this=0x8161908)<br>
&nbsp;&nbsp;&nbsp; at ThreadedFileWriter.cpp:231<br>
No locals.<br>
#3&nbsp; 0xb7941b55 in ThreadedFileWriter::boot_syncer (wotsit=0x8161908)<br>
&nbsp;&nbsp;&nbsp; at ThreadedFileWriter.cpp:65<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fw = (ThreadedFileWriter *) 0x8161908<br>
#4&nbsp; 0xb6480b63 in start_thread () from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#5&nbsp; 0xb633718a in clone () from /lib/tls/libc.so.6<br>
---Type &lt;return&gt; to continue, or q &lt;return&gt; to quit---<br>
No symbol table info available.<br>
<br>
Thread 13 (Thread -1345459280 (LWP 23963)):<br>
#0&nbsp; 0xb6483440 in pthread_cond_timedwait@@GLIBC_2.3.2 ()<br>
&nbsp;&nbsp; from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#1&nbsp; 0xb6a73190 in QWaitCondition::wait () from /usr/lib/libqt-mt.so.3<br>
No symbol table info available.<br>
#2&nbsp; 0xb7942d79 in ThreadedFileWriter::DiskLoop (this=0x8161908)<br>
&nbsp;&nbsp;&nbsp; at ThreadedFileWriter.cpp:252<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; size = 0<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; written = 72<br>
#3&nbsp; 0xb7941b27 in ThreadedFileWriter::boot_writer (wotsit=0x8161908)<br>
&nbsp;&nbsp;&nbsp; at ThreadedFileWriter.cpp:58<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fw = (ThreadedFileWriter *) 0x8161908<br>
#4&nbsp; 0xb6480b63 in start_thread () from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#5&nbsp; 0xb633718a in clone () from /lib/tls/libc.so.6<br>
No symbol table info available.<br>
<br>
Thread 12 (Thread -1334875216 (LWP 23961)):<br>
#0&nbsp; 0xb6485436 in __lll_mutex_lock_wait () from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
---Type &lt;return&gt; to continue, or q &lt;return&gt; to quit---<br>
#1&nbsp; 0xb6487394 in _L_mutex_cond_lock_26 () from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#2&nbsp; 0xb06f639c in ?? ()<br>
No symbol table info available.<br>
#3&nbsp; 0x07f6468f in ?? ()<br>
No symbol table info available.<br>
#4&nbsp; 0xb7f32ba0 in ?? ()<br>
No symbol table info available.<br>
#5&nbsp; 0x00005d99 in ?? ()<br>
No symbol table info available.<br>
#6&nbsp; 0x0810d878 in ?? ()<br>
No symbol table info available.<br>
#7&nbsp; 0x00000000 in ?? ()<br>
No symbol table info available.<br>
#8&nbsp; 0xb06f6328 in ?? ()<br>
No symbol table info available.<br>
#9&nbsp; 0xb64832e8 in pthread_cond_wait@@GLIBC_2.3.2 ()<br>
&nbsp;&nbsp; from /lib/tls/libpthread.so.0<br>
No symbol table info available.<br>
#10 0xb6a731e9 in QWaitCondition::wait () from /usr/lib/libqt-mt.so.3<br>
No symbol table info available.<br>
Previous frame inner to this frame (corrupt stack?)<br>
#0&nbsp; 0xb67d7546 in QObject::activate_signal () from /usr/lib/libqt-mt.so.3<br>
(gdb)<br>
<br>
<br>
Hope this is helpful.&nbsp; System was working very well with svn from a few days ago (so of course, I had to mess with it :)<br>
Let me know if you need other logs / tests.<br>
<br>
--Wendy<br>-- <br>Wendy Seltzer<br><a href="http://wendy.seltzer.org/blog/">http://wendy.seltzer.org/blog/</a>