tag:blogger.com,1999:blog-91319581827489317412024-03-21T13:43:41.532-07:00Thue's blogThuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.comBlogger11125tag:blogger.com,1999:blog-9131958182748931741.post-14073401132699865242024-03-14T18:35:00.000-07:002024-03-19T04:51:25.508-07:00DR og Starship's succes<p>
DR har lige udgivet <a href="https://www.dr.dk/nyheder/seneste/test-af-mega-rumraket-fra-spacex-gaar-galt-tredje-gang">Test af mega-rumraket fra SpaceX går galt for tredje gang</a> af Karen Nielsen. Jeg følger entusiastisk Starship, og det slog mig at artiklen og især overskriften var misledende. Mens testen ikke gik perfekt, så gik den meget bedre end galt.
</p>
<p>
For en normal raket som SLS, så består en opsendelse af følgende:
<ul>
<li>Første stage fyrer løs, og første stage dratter så i havet</li>
<li>Anden stage fyrer løs, frigiver payload i kredsløb om jorden, og anden stage dratter så i havet.</li>
</ul>
</p>
<p>
Det var omtrent det samme som skete under Starship-opsendelsen, bortset fra at der ikke var nogen payload om bord. Så for enhver anden raket, så ville det have været en succesfuld test. Opsendelsen viste at Starship er (næsten) klar til brug som traditionel raket. Og ikke en hvilken som helst raket: Den største og kraftigste raket nogensinde, større end den legendariske Saturn V.
</p>
<p>
Så når dr.dk skriver at "<i>går galt for tredje gang</i>", "<i>Tredje gang var ikke lykkens gang for "Starship"</i>", og "<i>da "Starship" skulle vende tilbage til jorden, klarede raketten ikke mødet med atmosfæren og gik tabt</i>" så er det misvisende. Mens noget gik galt, så gik andet godt. Det der gik galt var at SpaceX ekstreaordinært også har designet raketten til genbrug, og at dele af testen omkring dette delvist fejlede - men det var sandsynligt og acceptabelt. Der er faktisk intet sted i DR's artikel tegn på at journalisten forstår genbrugs-konteksten.
</p>
<p>
DRs artikel får det til at lyde som om SpaceX er ved at gå neden om og hjem - med 3 fejlslagne opsendelser på stribe. Dette ville være en korrekt beskrivelse for de fleste andre raketprogrammer, men er dybt misvisende for Starship. SpaceX kører et utraditionelt testprogram hvor de bevidst tester tidligt og ofte med prototyper, med en villighed til at ændre kurs baseret på resultaterne. SpaceX har planlagt <a href="https://arstechnica.com/space/2024/02/spacex-seeks-to-launch-starship-at-least-nine-times-this-year/">9 affyringer i 2024</a>, som jeg antager hovedsageligt et tests - pointen med disse er ikke at intet skal være "<i>gået galt</i>", men at lære noget til at forbedre designet. Hvilket klart er sket - hver ny test har været markant bedre end den foregående.
</p>
<p>
Som kontrast til dette er NASA's Space Launch System (SLS), som har været under design siden 2011. Med en total omkostning på over $23 milliarder. Efter 11 år opsendte de deres første raket, uden forudgående testopsendelser - hvis denne raket havde fejlet, så havde det været katastrofalt. Til sammenligning så startede SpaceX for alvor på Starship i 2019, og de totale udviklingsomkostninger er sandsynligvis langt mindre, selv om Starship er en langt mere ambitiøs raket.
</p>
<p>
Da SpaceX udviklede genbrug af første stage af Falcon 9, så var der <a href="https://www.youtube.com/watch?v=bvim4rsNHkQ">en lang periode</a> hvor SpaceX prøvede og fejlede i at lande første stage, efter at have placeret satelliter i kredsløb. Dette var ligesom Starship-testen i dag ikke katastrofer, men tests hvor fejl var forventet og acceptable. I denne periode fungerede Falcon 9 stadig fint som en traditionel raket uden genbrug. SpaceX har muligheden for at gøre det samme med Starship. Muligvis er den eneste mangel at Starship fejlede med at lave et deorbit-burn i testen, hvilket nok er påkrævet så Starship ikke falder ned i hovedet på nogen. Den store nyhed med den nylige tredje test er at Starship næsten er på dette punkt, hvor den går i produktion på samme måde som Falcon 9. Og alt tyder på Starship vil revolutionere adgangen til rummet, på grund af kapacitet og pris.
</p>Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com0tag:blogger.com,1999:blog-9131958182748931741.post-35910456508780790002020-08-27T09:52:00.001-07:002020-08-27T09:52:36.401-07:00Hvorfor er dmi.dk's vejrudsigt dårligere end vejrradaren?Når man kigger på DMI's lokalvejrudsigt, så ser det ud som følger:
<div class="separator" style="clear: both;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidAQMrMKwjSENCv11QUpdCdkvxiFq3kjiQDrYk5W8g2Z2w7X1fEkMmbKeiLlzNWUNgW2-IETHlk60nVxz0BzITBGt0jVlHp159VIp8xpPqf_JP3pt3BHVNZMjqgbk0TD6Tv2Dn0XWAfMIV/s1210/Screenshot+from+2020-08-27+15-45-14.png" style="display: block; padding: 1em 0; text-align: center;"><img alt="" border="0" width="400" data-original-height="373" data-original-width="1210" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidAQMrMKwjSENCv11QUpdCdkvxiFq3kjiQDrYk5W8g2Z2w7X1fEkMmbKeiLlzNWUNgW2-IETHlk60nVxz0BzITBGt0jVlHp159VIp8xpPqf_JP3pt3BHVNZMjqgbk0TD6Tv2Dn0XWAfMIV/s400/Screenshot+from+2020-08-27+15-45-14.png"/></a></div>
Bemærk her at DMI har forudsagt regn klokken 16, med andre muligheder for regn. Men hvis man ser på dmi.dk's vejrradar, så forudser den ikke noget regn på min lokation (den røde marker):
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='600' height='498' src='https://www.blogger.com/video.g?token=AD6v5dxrQPx-kXj-CAxCFlilPG8FI4NMyk3PI6zmdQGMeHHyeUHXjWw6NTZkzylPMdG13QHdmtJp0QYESshQiWSgIg' class='b-hbp-video b-uploaded' frameborder='0'></iframe></div>
Bemærk at radaren både har fortid og fremtid, med et "nu" for lige nu på x-aksen.
Det er min konsekvente oplevelse at jeg kan forudsige regn og byger langt bedre med forudsigelsen fra vejrradaren, end med lokaludsigten. Også på den dag hvor jeg tog billede og screenshot fra, hvor der som radaren forudsagde ikke kom noget regn lokalt. Hvordan kan det være at radaren er bedre - kunne dmi.dk ikke bare indsætte data fra forudsigelsen i vejrradaren i lokaludsigten?
I artiklen "<a href="https://www.dmi.dk/nyheder/2019/radar-paa-det-nye-dmidk-en-byge-af-forbedringer/">Radar på det nye dmi.dk: En byge af forbedringer</a>" skriver DMI at <blockquote>Radaren, der viser nedbørens bevægelser over Danmark, er DMI's allermest populære enkelt-produkt.</blockquote> Men måske er grunden at DMI's standardprodukt, vejrudsigten, er dårlig?Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com0tag:blogger.com,1999:blog-9131958182748931741.post-1394192517520482162019-08-29T11:02:00.000-07:002019-08-29T11:09:09.860-07:00Status for Universal Power Adapter for Mobile Devices (2019)I quite like the idea of a common interchangable power supply for laptops, like micro-USB is/was the common interchangable power supply for phones. Hence I have been keeping half an eye on <a href="https://en.wikipedia.org/wiki/Universal_Power_Adapter_for_Mobile_Devices">Universal Power Adapter for Mobile Devices</a>.
<p>
There doesn't seem to be any actual users of that standard, so I sent an email to IEEE inquiring if they knew of any users. This is the excellent reply I got from chair Leonard Tsai:
<p>
<blockquote style="text-align: left">Hi, Thue,
<p>
I am the chair for IEEE 1823 working group and your email inquiry was forwarded to me early. Sorry about the belated reply as I just travelled to Asia. Currently the IT market which 1823 standard was originally intended had been swayed by USB SIG to use type C connector as alternatives. However, EU standard body had made inquiry to see if 1823 should be consider as the preferred connector for next get mobile device. Also, there are new interests from some automotive industry players that are looking at distributing DC bus inside a car (obvious that 1823 with CAN Bus as control method is preferred than USB type C which was not designed for harsh environment).
<p>
As for commercial deployment, unfortunately I don’t have a definite answer for you. Several power supply vendor in Asia had made prototypes about 2 years ago but I did not get any further updates after that.
<p>
I hope this address your question. Please feel free to contact me for further follow ups.
<p>
Thanks,
<p>
Leonard</blockquote>Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com0tag:blogger.com,1999:blog-9131958182748931741.post-51906228265100750802019-05-01T06:25:00.000-07:002019-05-01T06:25:04.719-07:00Making the Trust 1200 Wireless tablet work on Linux<p>
I have gotten access to an old wireless tablet ("wireless" as in the pen is battery powered, tablet is wired USB), and have gotten it work. Since it was not trivial to figure out how to do that, I though I would describe the steps.
</p>
<p>
First the context: in the old days, X11 communicated directly with the hardware. So for a tablet to work, there needed to exist an X11 driver. There seem to be 2 kinds of tablets: Wacom tablets and non-Wacom tablets, with Wacom tablets generally having much better Linux support. So the first thing I found was some X11 Wizardpen drivers which had not been updated since 2011, which supposedly supported various non-Wacom tablets. This was very much a blind alley.
</p>
<p>
After some further investigation, I found that in the newer Wayland architecture, tablet drivers had been moved into the kernel, and the Wayland project libinput had been created as a middle layer. And in fact the <a href="https://digimend.github.io">DIGImend project</a> had already created a driver for my tablet (which turned out to be a rebranded AIPTEK), which was already in my Fedora installation. The output from the <b>usb-devices</b> command showed a device with "Product=USB Tablet Series Version 1.04" and "Driver=aiptek", and from the <b>dmesg</b> output:
</p>
<p>
<pre>[ 52.555422] aiptek 1-1:1.0: Aiptek using 400 ms programming speed
[ 52.555613] input: Aiptek as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/input/input16
[ 52.556200] usbcore: registered new interface driver aiptek</pre>
</p>
<p>
Indeed, doing <b>cat /dev/input/event16</b> showed output when I interacted with the tablet, so the kernel driver appeared to be forwarding output from the tablet. Now, my tablet was still not showing up in <a href="https://digimend.github.io/support/howto/apps/gimp/">GIMP's list of input devices</a>. Fedora uses Wayland, and GIMP is an X11 app, so GIMP is running via XWayland (X server on top of wayland), but as I could read newer X implementations should still use Wayland's libinput for tablet support.
</p>
<p>Rather obscurely, and after much random poking, I noticed that when running the <b>libinput list-devices</b> command, the following was printed to stderr:
</p>
<p>
<pre>event16 - Aiptek: libinput bug: missing tablet capabilities: resolution. Ignoring this device.</pre>
</p>
<p>It would have been much, much more user friendly if this kind of error message was in the gnome control panel list of input devices, or the gimp list of input devices. Instead both places simply had nothing, initially leaving me wondering if my tablet was working at all.</p>
<p>So it turns out that the libinput tablet support needs to know various information, including in this case the resolution (pixels/mm) of the tablet, in order to work. And while I could see from the output of <b>evemu-describe /dev/input/event16</b> that libinput had figured out e.g. the total number of vertical and horizontal pixels (presumably the tablet has some kind of hardware information protocol), the resolution was indeed missing. So now that I knew what to google for, I found and followed the instructions written by Peter Hutterer in freedesktop.org bugs <a href="https://bugs.freedesktop.org/show_bug.cgi?id=100043">100043</a> and <a href="https://bugs.freedesktop.org/show_bug.cgi?id=103476">103476</a> to add a HWDB entry to my system with the resolution of my tablet.</p>
<p>The database of tablet hardware information is at <b>/usr/lib/udev/hwdb.d/60-evdev.hwdb</b>, and the top of that file has some basic instructions for how to add new entries. It recommends to add new entries for the local system to <b>/etc/udev/hwdb.d/61-evdev-local.hwdb</b>. The entry I added there to make my tablet work was the following:
</p>
<pre>#########################################
# Trust (AIPTEK)
#########################################
#TRUST 1200 Wireless Tablet
evdev:input:b0003v08CAp0010*
EVDEV_ABS_00=::20
EVDEV_ABS_01=::20</pre>
<p>The first non-comment line (<b>evdev:input:b0003v08CAp0010*</b>) is to match the device (and only that device). The EVDEV_ABS_00 is configuration for the X axis, and EVDEV_ABS_01 is configuration for the Y axis. The fields in the X/Y configuration have the format <b>EVDEV_ABS_<axis>=<min>:<max>:<res>:<fuzz>:<flat></b>. I only want to set the "res" field, so I leave the first two fields and the last fields unchanged by doing "::20".
</p>
<p>
The resolution of 20 pixels/mm I figured out the output of evemu-describe
<pre>[...]
# Event type 3 (EV_ABS)
# Event code 0 (ABS_X)
# Value 4658
# Min 0
# Max 5999
# Fuzz 0
# Flat 0
# Resolution 20
# Event code 1 (ABS_Y)
# Value 1807
# Min 0
# Max 4499
# Fuzz 0
# Flat 0
# Resolution 20
[...]</pre>
(the "Resolution 20" only appears because I already manually added it before writing this) and from simply measuring the tablet size (the size was also mentioned on the box the tablet came in). So e.g. for the X axis, there are 6000 pixels and the tablet is 12 inch*(25.4mm/inch) wide, so the resolution is 6000/(25.4*12)=19.7pixels/mm. According to the comments by Hutterer in the freedesktop.org bug reports, the resolution should be an integer, so 19.7 should be rounded to the nearest integer. Similarly, the vertical resolution turns out to be 4500/(25.4*9)=20pixels/mm.
</p>
<p>In the match string (<b>evdev:input:b0003v08CAp0010*</b>), the "b" stands for "bus", the "v" stands for "vendor", and the "p" stands for "product". The USB bus is 0003, and the b and v can be figured out from the output of the <b>usb-devices</b> command:
<pre>T: Bus=01 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 6 Spd=1.5 MxCh= 0
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
P: <b>Vendor=08ca</b> <b>ProdID=0010</b> Rev=01.03
S: Manufacturer=AIPTEK International Inc.
S: Product=USB Tablet Series Version 1.04
C: #Ifs= 1 Cfg#= 1 Atr=80 MxPwr=26mA
I: If#=0x0 Alt= 0 #EPs= 1 Cls=03(HID ) Sub=01 Prot=02 Driver=aiptek
</pre>
</p>
<p>
So having finally added that entry, I could run
<pre>
systemd-hwdb update
udevadm trigger /dev/input/event*
</pre>
to tell the system about the new entry, and my tablet was available in the GIMP input devices configuration.
</p>
<p>
Of course I then created a <a href="https://github.com/systemd/systemd/pull/12453">pull request to the systemd github repository</a>, which manages the HWDB, so the tablet could also work for other people. Having done that, it turned out that the automated test run on my pull request found a duplicate match line in the hardware database, and that somebody else had already added information for my tablet in the newest version of systemd. Argh - that is some coincidence, because there are only about 94 entries in that file, and my tablet is ancient. But I hope that this blog entry can still be helpful as a description for other people.
</p>Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com0tag:blogger.com,1999:blog-9131958182748931741.post-22329257069478208692015-03-11T07:05:00.000-07:002019-08-29T10:56:50.770-07:00Status for Universal Power Adapter for Mobile DevicesI was curious about whether IEEE's <a href="https://en.wikipedia.org/w/index.php?title=Universal_Power_Adapter_for_Mobile_Devices">Universal Power Adapter for Mobile Devices</a> standard had been abandoned. Jonathan Goldberg of IEEE was kind enough to answer my email:
<blockquote style="text-align: left">Thue,<br />
<br />
Good afternoon. In fact, P1823 recently completed a recirculation ballot and has been submitted to the IEEE Standards Review Committee (RevCom) for December 2014 review and possible approval by the IEEE Standards Association Standards Board. <br />
<br />
Please let me know if you have any further questions on this project.<br />
<br />
Regards,<br />
<br />
Jonathan Goldberg<br />
Client Services Manager<br />
IEEE Standards Association<br />
<br />
p: +1 732 562 6088<br />
c: +1 732 570 0116<br />
f: +1 732 562 1571<br />
e: goldberg.j@ieee.org<br />
<br />
IEEE - Fostering technological innovation and excellence for the benefit of humanity.<br />
<br />
On Wed, Sep 24, 2014 at 12:04 PM, IEEE Standards webmail <spa-admin@ieee.org> wrote:<br />
(Message sent via IEEE Standards webmail)<br />
-----------------------------------------<br />
<br />
referer = http://standards.ieee.org/develop/project/1823.html<br />
first_name = Thue<br />
last_name = Kristensen<br />
email = thuejk@gmail.com<br />
email_confirm = thuejk@gmail.com<br />
message = While updating https://en.wikipedia.org/wiki/Universal_Power_Adapter_for_Mobile_Devices , I noted that there have been no meeting minutes published since 2012, so I assume there have been no meetings.<br />
<br />
Does this mean that the P1823 standard is dead, perhaps superseeded by IEC 62700, or is it only sleeping?<br />
preferred_contact_method = Email<br />
daytime_phone1 = (not supplied)<br />
daytime_phone2 = (not supplied)<br />
daytime_phone3 = (not supplied)<br />
country_code = (not supplied)<br />
extension = (not supplied)<br />
referral_type = select one<br />
contact_submit = Submit<br />
<br />
<br />
-----------------------------------------<br />
(End of IEEE Standards webmail message)<br />
</blockquote>
Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com0tag:blogger.com,1999:blog-9131958182748931741.post-49961392168248740392013-06-03T08:49:00.000-07:002013-06-03T08:49:11.360-07:00Dashed line error in Apple PDF viewer<p>
I had the Apple PDF viewer choke on a PDF document which worked wine in other PDF viewers. I tracked it down to a funny dashed line. As can be seen on page 155 of <a href="http://partners.adobe.com/public/developer/en/pdf/PDFReference.pdf">the PDF specification for the third edition</a>, dashed lines are specified as fx "[1 2] 0", which means 1 unit on, 2 units off. To stop dashing, you should write a dash specification of "[] 0".
</p>
<p>
I had a pdf which tried to stop dashing by writing "[ 1 0 ] 0" ("[ 1 0 ] 0 d" actually, I haven't looked into what the "d" means). This worked fine in most PDF viewers, but in Apple's viewer the document stopped rendering at that point. I assume that it is the 0-gap (the first "0") which confuses it. Fixing the PDF generator to use the "[] 0 d" from the specification made it work in Apple's PDF viewer.
</p>
<p>
So now you know, if you come across the same problem :). I would report it to Apple, but they don't seem to let you report bugs if you do not have an Apple ID.
</p>Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com0tag:blogger.com,1999:blog-9131958182748931741.post-61917198843873773772011-12-28T15:33:00.000-08:002014-03-04T04:04:25.906-08:00The Sharing KnifeI liked the fantasy novels <a href="http://en.wikipedia.org/wiki/The_Sharing_Knife">The Sharing Knife</a>, so I asked Lois McMaster Bujold (the author) by email if more books in that series we planned. Her answer:<br /><br /><blockquote>Hi Thue --<br /><br /> No, only the 4 so far. Nothing else is planned at this time.<br /><br /> There is, of course, a new Vorkosigan SF book coming out in November, _CryoBurn_.<br /><br /> bests, Lois.</blockquote><br /><br />Too bad :(Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com1tag:blogger.com,1999:blog-9131958182748931741.post-45911285267537790692011-09-25T08:17:00.000-07:002011-09-25T08:54:54.260-07:00Kom uden om DR's flash-afspillerJeg ser nogen gange Bonderøven på DR1. Men selv om programmerne er tilgængelige via flash-afspilleren, så er DR er langsomme til at lægge programmerne ud til download. Flash-afspilleren er ret irriterende, da man for eksempel ikke kan putte den i fuldscreen, og så samtidigt klikke rundt på sin sekundære skærm.<br /><br />Så siden flash-afspilleren må hente videoen et sted fra, så må jeg da også kunne hente den derfra, og så afspille den fra den downloadede fil.<br /><br />Første trin er at bruge Chromium's developer tools til at "inspecte" flashplayeren på <a href="http://www.dr.dk/dr1/bonderoeven">http://www.dr.dk/dr1/bonderoeven</a> . Den har kildekoden<br /><br /><blockquote><object id="nettvPlayer" height="349px" width="620px" type="application/x-shockwave-flash" data="/nu/assets/swf/NetTVPlayer_10.swf"><br /><param name="quality" value="high"><br /><param name="allowScriptAccess" value="always"><br /><param name="wMode" value="transparent"><br /><param name="swLiveConnect" value="true"><br /><param name="bgcolor" value="#000000"><br /><param name="AllowScriptAccess" value="sameDomain"><br /><param name="AllowFullScreen" value="true"><br /><param name="flashVars" value="data=%7B%22swf%22%3A%22%2Fnu%2Fassets%2Fswf%2FNetTVPlayer_10.swf%22%2C%22height%22%3A%22349px%22%2C%22width%22%3A%22620px%22%2C%22version%22%3A%229.1.0%22%2C%22smoothing%22%3Afalse%2C%22loopPlaylist%22%3Afalse%2C%22autoplay%22%3Atrue%2C%22wmode%22%3A%22transparent%22%2C%22bgcolor%22%3A%22%23000000%22%2C%22geoLocationServiceUrl%22%3A%22http%3A%2F%2Fwww.dr.dk%2Ftjenester%2Fgeolocation%2FGeoLocation.asmx%2FGet%22%2C%22popup%22%3Afalse%2C%22color%22%3A%22%22%2C%22content%22%3A%22od%2Fbonderoeven%2F%22%2C%22live%22%3Afalse%2C%22showChannels%22%3Atrue%2C%22urls%22%3A%7B%22popupUrl%22%3A%22%2Fnu%2Fpopup%2F%22%2C%22seriesImageUrl%22%3A%22%2Fnu%2Fapi%2Fprogramseries%2F%7Bslug%7D%2Fimages%2F%7Bwidth%7Dx%7Bheight%7D.jpg%22%2C%22episodeImageUrl%22%3A%22%2Fnu%2Fapi%2Fvideos%2F%7Bid%7D%2Fimages%2F%7Bwidth%7Dx%7Bheight%7D.jpg%22%2C%22episodesUrl%22%3A%22%2Fnu%2Fapi%2Fprogramseries%2F%7Bslug%7D%2Fvideos%22%2C%22videoUrl%22%3A%22%2Fnu%2Fapi%2Fvideos%2F%7BvideoId%7D%22%2C%22registerView%22%3A%22%2Fnu%2Fapi%2FVideoView%2F%7BvideoId%7D%2F%7BuserId%7D%2F%7BrtmpVideoHost%7D%22%2C%22registerFedoraView%22%3A%22http%3A%2F%2F77.66.32.234%2Fcammpdrnu%2Fmobilwebapp%3Fxslt%3DcopyXml%26service%3DshowClipInfo%26externalId%3D%7BvideoId%7D%26loginName%3D%7BuserId%7D%22%2C%22registerChapterView%22%3A%22%22%2C%22seriesUrl%22%3A%22%2Fnu%2Fapi%2Fprogramseries%22%2C%22flashStatisticUrl%22%3A%22%22%2C%22reportErrorUrl%22%3A%22%2Fnu%2Ffeedback%2F%22%2C%22geoFilterUrl%22%3A%22%2Fnu%2Fgeofilter%2F%22%2C%22liveDeeplink%22%3A%22http%3A%2F%2Fwww.dr.dk%2Fnu%2Flive%2Fse%22%2C%22onDemandDeeplink%22%3A%22http%3A%2F%2Fwww.dr.dk%2Fnu%2Fse%22%2C%22chapterImageUrl%22%3A%22%2Fnu%2Fapi%2Fchapters%2F%7BchapterId%7D%2Fimages%2F%7Bwidth%7Dx%7Bheight%7D.jpg%22%7D%2C%22modules%22%3A%5B%7B%22className%22%3A%22Gemius%22%2C%22parameters%22%3A%7B%22encoding%22%3A%22utf-8%22%2C%22identifier%22%3A%22p9AwR.N.S86s_NjaJKdww7b.fdp8ky90ZnrKpgLHOUn.s7%22%2C%22hitCollector%22%3A%22http%3A%2F%2Fsdk.hit.gemius.pl%22%2C%22playerId%22%3A%22UPlayer%22%7D%7D%2C%7B%22className%22%3A%22JavaScript%22%2C%22parameters%22%3A%7B%7D%7D%5D%2C%22liveStreams%22%3A%5B%7B%22channelName%22%3A%22DR1%22%2C%22gemius_customPackage%22%3A%5B%7B%22name%22%3A%22CHANNEL%22%2C%22value%22%3A%22LIVE%22%7D%2C%7B%22name%22%3A%22PROGRAMME%22%2C%22value%22%3A%22DR1%22%7D%2C%7B%22name%22%3A%22AUTOSTART%22%2C%22value%22%3A%22YES%22%7D%5D%2C%22gemius_materialId%22%3A%22019_LIVE-DR1%26DR1%22%2C%22gemius_live%22%3Atrue%2C%22mediaFiles%22%3A%5B%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr01astream3%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr01bstream3%22%2C%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Ffv2011stream3%22%2C%22rtmp%3A%2F%2Ffl0.c41003.cdn.qbrick.com%2F41003%2Ffv2011stream3%22%5D%2C%22kbps%22%3A1000%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr01astream2%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr01bstream2%22%2C%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Ffv2011stream2%22%2C%22rtmp%3A%2F%2Ffl0.c41003.cdn.qbrick.com%2F41003%2Ffv2011stream2%22%5D%2C%22kbps%22%3A500%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr01astream1%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr01bstream1%22%2C%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Ffv2011stream1%22%2C%22rtmp%3A%2F%2Ffl0.c41003.cdn.qbrick.com%2F41003%2Ffv2011stream1%22%5D%2C%22kbps%22%3A250%7D%5D%7D%2C%7B%22channelName%22%3A%22DR2%22%2C%22gemius_customPackage%22%3A%5B%7B%22name%22%3A%22CHANNEL%22%2C%22value%22%3A%22LIVE%22%7D%2C%7B%22name%22%3A%22PROGRAMME%22%2C%22value%22%3A%22DR2%22%7D%2C%7B%22name%22%3A%22AUTOSTART%22%2C%22value%22%3A%22YES%22%7D%5D%2C%22gemius_materialId%22%3A%22019_LIVE-DR2%26DR2%22%2C%22gemius_live%22%3Atrue%2C%22mediaFiles%22%3A%5B%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr02astream3%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr02bstream3%22%5D%2C%22kbps%22%3A1000%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr02astream2%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr02bstream2%22%5D%2C%22kbps%22%3A500%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr02astream1%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr02bstream1%22%5D%2C%22kbps%22%3A250%7D%5D%7D%2C%7B%22channelName%22%3A%22DR%20K%22%2C%22gemius_customPackage%22%3A%5B%7B%22name%22%3A%22CHANNEL%22%2C%22value%22%3A%22LIVE%22%7D%2C%7B%22name%22%3A%22PROGRAMME%22%2C%22value%22%3A%22DR%20K%22%7D%2C%7B%22name%22%3A%22AUTOSTART%22%2C%22value%22%3A%22YES%22%7D%5D%2C%22gemius_materialId%22%3A%22019_LIVE-DR%20K%26DR%20K%22%2C%22gemius_live%22%3Atrue%2C%22mediaFiles%22%3A%5B%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr04astream3%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr04bstream3%22%5D%2C%22kbps%22%3A1000%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr04astream2%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr04bstream2%22%5D%2C%22kbps%22%3A500%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr04astream1%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr04bstream1%22%5D%2C%22kbps%22%3A250%7D%5D%7D%2C%7B%22channelName%22%3A%22DR%20Ramasjang%22%2C%22gemius_customPackage%22%3A%5B%7B%22name%22%3A%22CHANNEL%22%2C%22value%22%3A%22LIVE%22%7D%2C%7B%22name%22%3A%22PROGRAMME%22%2C%22value%22%3A%22DR%20Ramasjang%22%7D%2C%7B%22name%22%3A%22AUTOSTART%22%2C%22value%22%3A%22YES%22%7D%5D%2C%22gemius_materialId%22%3A%22019_LIVE-DR%20Ramasjang%26DR%20Ramasjang%22%2C%22gemius_live%22%3Atrue%2C%22mediaFiles%22%3A%5B%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr05astream3%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr05bstream3%22%5D%2C%22kbps%22%3A1000%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr05astream2%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr05bstream2%22%5D%2C%22kbps%22%3A500%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr05astream1%22%2C%22rtmp%3A%2F%2Frtmplive.dr.dk%2Flive%2Flivedr05bstream1%22%5D%2C%22kbps%22%3A250%7D%5D%7D%2C%7B%22channelName%22%3A%22DR%20Update%22%2C%22gemius_customPackage%22%3A%5B%7B%22name%22%3A%22CHANNEL%22%2C%22value%22%3A%22LIVE%22%7D%2C%7B%22name%22%3A%22PROGRAMME%22%2C%22value%22%3A%22DR%20Update%22%7D%2C%7B%22name%22%3A%22AUTOSTART%22%2C%22value%22%3A%22YES%22%7D%5D%2C%22gemius_materialId%22%3A%22019_LIVE-DR%20Update%26DR%20Update%22%2C%22gemius_live%22%3Atrue%2C%22mediaFiles%22%3A%5B%7B%22mediaFile%22%3A%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Flivedr03astream3%22%2C%22kbps%22%3A1000%7D%2C%7B%22mediaFile%22%3A%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Flivedr03astream2%22%2C%22kbps%22%3A500%7D%2C%7B%22mediaFile%22%3A%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Flivedr03astream1%22%2C%22kbps%22%3A250%7D%5D%7D%2C%7B%22channelName%22%3A%22DR%20HD%22%2C%22gemius_customPackage%22%3A%5B%7B%22name%22%3A%22CHANNEL%22%2C%22value%22%3A%22LIVE%22%7D%2C%7B%22name%22%3A%22PROGRAMME%22%2C%22value%22%3A%22DR%20HD%22%7D%2C%7B%22name%22%3A%22AUTOSTART%22%2C%22value%22%3A%22YES%22%7D%5D%2C%22gemius_materialId%22%3A%22019_LIVE-DR%20HD%26DR%20HD%22%2C%22gemius_live%22%3Atrue%2C%22mediaFiles%22%3A%5B%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Flivedr06astream3%22%2C%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Flivedr06bstream3%22%5D%2C%22kbps%22%3A1700%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Flivedr06astream2%22%2C%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Flivedr06bstream2%22%5D%2C%22kbps%22%3A1000%7D%2C%7B%22mediaFile%22%3A%5B%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Flivedr06astream1%22%2C%22rtmp%3A%2F%2Flivetv.gss.dr.dk%2Flive%2Flivedr06bstream1%22%5D%2C%22kbps%22%3A500%7D%5D%7D%5D%7D&onLoad=Swiff.CallBacks.Swiff_1316964073832.onLoad&onData=Swiff.CallBacks.Swiff_1316964073832.onData&onSkip=Swiff.CallBacks.Swiff_1316964073832.onSkip&onStateChange=Swiff.CallBacks.Swiff_1316964073832.onStateChange&onShare=Swiff.CallBacks.Swiff_1316964073832.onShare&onPopup=Swiff.CallBacks.Swiff_1316964073832.onPopup&onRequestNowNext=Swiff.CallBacks.Swiff_1316964073832.onRequestNowNext&onContentPathChange=Swiff.CallBacks.Swiff_1316964073832.onContentPathChange"></object></blockquote><br /><br />Her set det ud til at indholdet af "flashVars" er det interessante. Et gæt er, at det er urlencoded, så efter det er kørt igennem http://meyerweb.com/eric/tools/dencoder/ bliver det til<br /><br /><blockquote>data={"swf":"/nu/assets/swf/NetTVPlayer_10.swf","height":"349px","width":"620px","version":"9.1.0","smoothing":false,"loopPlaylist":false,"autoplay":true,"wmode":"transparent","bgcolor":"#000000","geoLocationServiceUrl":"http://www.dr.dk/tjenester/geolocation/GeoLocation.asmx/Get","popup":false,"color":"","content":"od/bonderoeven/","live":false,"showChannels":true,"urls":{"popupUrl":"/nu/popup/","seriesImageUrl":"/nu/api/programseries/{slug}/images/{width}x{height}.jpg","episodeImageUrl":"/nu/api/videos/{id}/images/{width}x{height}.jpg","episodesUrl":"/nu/api/programseries/{slug}/videos","videoUrl":"/nu/api/videos/{videoId}","registerView":"/nu/api/VideoView/{videoId}/{userId}/{rtmpVideoHost}","registerFedoraView":"http://77.66.32.234/cammpdrnu/mobilwebapp?xslt=copyXml&service=showClipInfo&externalId={videoId}&loginName={userId}","registerChapterView":"","seriesUrl":"/nu/api/programseries","flashStatisticUrl":"","reportErrorUrl":"/nu/feedback/","geoFilterUrl":"/nu/geofilter/","liveDeeplink":"http://www.dr.dk/nu/live/se","onDemandDeeplink":"http://www.dr.dk/nu/se","chapterImageUrl":"/nu/api/chapters/{chapterId}/images/{width}x{height}.jpg"},"modules":[{"className":"Gemius","parameters":{"encoding":"utf-8","identifier":"p9AwR.N.S86s_NjaJKdww7b.fdp8ky90ZnrKpgLHOUn.s7","hitCollector":"http://sdk.hit.gemius.pl","playerId":"UPlayer"}},{"className":"JavaScript","parameters":{}}],"liveStreams":[{"channelName":"DR1","gemius_customPackage":[{"name":"CHANNEL","value":"LIVE"},{"name":"PROGRAMME","value":"DR1"},{"name":"AUTOSTART","value":"YES"}],"gemius_materialId":"019_LIVE-DR1&DR1","gemius_live":true,"mediaFiles":[{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr01astream3","rtmp://rtmplive.dr.dk/live/livedr01bstream3","rtmp://livetv.gss.dr.dk/live/fv2011stream3","rtmp://fl0.c41003.cdn.qbrick.com/41003/fv2011stream3"],"kbps":1000},{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr01astream2","rtmp://rtmplive.dr.dk/live/livedr01bstream2","rtmp://livetv.gss.dr.dk/live/fv2011stream2","rtmp://fl0.c41003.cdn.qbrick.com/41003/fv2011stream2"],"kbps":500},{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr01astream1","rtmp://rtmplive.dr.dk/live/livedr01bstream1","rtmp://livetv.gss.dr.dk/live/fv2011stream1","rtmp://fl0.c41003.cdn.qbrick.com/41003/fv2011stream1"],"kbps":250}]},{"channelName":"DR2","gemius_customPackage":[{"name":"CHANNEL","value":"LIVE"},{"name":"PROGRAMME","value":"DR2"},{"name":"AUTOSTART","value":"YES"}],"gemius_materialId":"019_LIVE-DR2&DR2","gemius_live":true,"mediaFiles":[{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr02astream3","rtmp://rtmplive.dr.dk/live/livedr02bstream3"],"kbps":1000},{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr02astream2","rtmp://rtmplive.dr.dk/live/livedr02bstream2"],"kbps":500},{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr02astream1","rtmp://rtmplive.dr.dk/live/livedr02bstream1"],"kbps":250}]},{"channelName":"DR K","gemius_customPackage":[{"name":"CHANNEL","value":"LIVE"},{"name":"PROGRAMME","value":"DR K"},{"name":"AUTOSTART","value":"YES"}],"gemius_materialId":"019_LIVE-DR K&DR K","gemius_live":true,"mediaFiles":[{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr04astream3","rtmp://rtmplive.dr.dk/live/livedr04bstream3"],"kbps":1000},{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr04astream2","rtmp://rtmplive.dr.dk/live/livedr04bstream2"],"kbps":500},{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr04astream1","rtmp://rtmplive.dr.dk/live/livedr04bstream1"],"kbps":250}]},{"channelName":"DR Ramasjang","gemius_customPackage":[{"name":"CHANNEL","value":"LIVE"},{"name":"PROGRAMME","value":"DR Ramasjang"},{"name":"AUTOSTART","value":"YES"}],"gemius_materialId":"019_LIVE-DR Ramasjang&DR Ramasjang","gemius_live":true,"mediaFiles":[{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr05astream3","rtmp://rtmplive.dr.dk/live/livedr05bstream3"],"kbps":1000},{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr05astream2","rtmp://rtmplive.dr.dk/live/livedr05bstream2"],"kbps":500},{"mediaFile":["rtmp://rtmplive.dr.dk/live/livedr05astream1","rtmp://rtmplive.dr.dk/live/livedr05bstream1"],"kbps":250}]},{"channelName":"DR Update","gemius_customPackage":[{"name":"CHANNEL","value":"LIVE"},{"name":"PROGRAMME","value":"DR Update"},{"name":"AUTOSTART","value":"YES"}],"gemius_materialId":"019_LIVE-DR Update&DR Update","gemius_live":true,"mediaFiles":[{"mediaFile":"rtmp://livetv.gss.dr.dk/live/livedr03astream3","kbps":1000},{"mediaFile":"rtmp://livetv.gss.dr.dk/live/livedr03astream2","kbps":500},{"mediaFile":"rtmp://livetv.gss.dr.dk/live/livedr03astream1","kbps":250}]},{"channelName":"DR HD","gemius_customPackage":[{"name":"CHANNEL","value":"LIVE"},{"name":"PROGRAMME","value":"DR HD"},{"name":"AUTOSTART","value":"YES"}],"gemius_materialId":"019_LIVE-DR HD&DR HD","gemius_live":true,"mediaFiles":[{"mediaFile":["rtmp://livetv.gss.dr.dk/live/livedr06astream3","rtmp://livetv.gss.dr.dk/live/livedr06bstream3"],"kbps":1700},{"mediaFile":["rtmp://livetv.gss.dr.dk/live/livedr06astream2","rtmp://livetv.gss.dr.dk/live/livedr06bstream2"],"kbps":1000},{"mediaFile":["rtmp://livetv.gss.dr.dk/live/livedr06astream1","rtmp://livetv.gss.dr.dk/live/livedr06bstream1"],"kbps":500}]}]}&onLoad=Swiff.CallBacks.Swiff_1316964073832.onLoad&onData=Swiff.CallBacks.Swiff_1316964073832.onData&onSkip=Swiff.CallBacks.Swiff_1316964073832.onSkip&onStateChange=Swiff.CallBacks.Swiff_1316964073832.onStateChange&onShare=Swiff.CallBacks.Swiff_1316964073832.onShare&onPopup=Swiff.CallBacks.Swiff_1316964073832.onPopup&onRequestNowNext=Swiff.CallBacks.Swiff_1316964073832.onRequestNowNext&onContentPathChange=Swiff.CallBacks.Swiff_1316964073832.onContentPathChange</blockquote><br /><br />Det meste er det er referencer til DR's kanaler (DR1, DR2, etc), som er irrelevante. Efetr at have formatteret og smidt de åbenlyst irrelevante ting ud er der følgende tilbage:<br /><br /><blockquote>data = { <br /> "content":"od/bonderoeven/", <br /> "urls":{ <br /> "seriesImageUrl":"/nu/api/programseries/{slug}/images/{width}x{height}.jpg", <br /> "episodeImageUrl":"/nu/api/videos/{id}/images/{width}x{height}.jpg", <br /> "episodesUrl":"/nu/api/programseries/{slug}/videos", <br /> "videoUrl":"/nu/api/videos/{videoId}", <br /> "seriesUrl":"/nu/api/programseries", <br /> }, <br /> "modules": <br /> [ <br /> { <br /> "className":"Gemius", <br /> "parameters":{ <br /> "encoding":"utf-8", <br /> "identifier":"p9AwR.N.S86s_NjaJKdww7b.fdp8ky90ZnrKpgLHOUn.s7", <br /> "hitCollector":"http://sdk.hit.gemius.pl", <br /> "playerId":"UPlayer"<br /> }<br /> }<br /> ]<br />}</blockquote><br /><br />I sektionen "urls" gætter jeg mig frem til at {slug} er et ID for serien (Bonderøven), og {videoId} er et ID for det enkelte afsnit.<br /><br />Det viser sig at <a href="http://www.dr.dk/nu/api/programseries">http://www.dr.dk/nu/api/programseries</a> giver en liste over alle DR's programserier. Bonderøvens indgang i den liste er<br /><blockquote> {<br /> "slug": "bonderoeven",<br /> "title": "Bonderøven",<br /> "description": "Frank er lidt spændt, for føllet Manfred er til hingstekåring, hvor han skal bedømmes af tyske dommere, sammen med andre Schleswiger-føl. Og så er det dagen, hvor Frank skal høste med selvbinder, men først laver han et nyt selvbindersejl af en rulle lærred han købte, da han var 18 år. Mirabellerne er modne, så hele familien drager ud med spand for at plukke.",<br /> "shortName": null,<br /> "newestVideoId": 18431,<br /> "newestVideoPublishTime": "\/Date(1316543400000+0200)\/",<br /> "videoCount": 32,<br /> "labels": [<br /> "livsstil"<br /> ]<br /> },</blockquote><br />Så vi gætter på at 18431 er et eksempel på et videoId. Og http://www.dr.dk/nu/api/videos/18431/images/1000x1000.jpg giver da også et pænt billede for det afsnit. Ved at bruge <a href="http://www.dr.dk/nu/api/videos/18431">http://www.dr.dk/nu/api/videos/18431</a> får vi information om afsnittet:<br /><blockquote>{<br /> "id": 18431,<br /> "description": "Frank er lidt spændt, for føllet Manfred er til hingstekåring, hvor han skal bedømmes af tyske dommere, sammen med andre Schleswiger-føl. Og så er det dagen, hvor Frank skal høste med selvbinder, men først laver han et nyt selvbindersejl af en rulle lærred han købte, da han var 18 år. Mirabellerne er modne, så hele familien drager ud med spand for at plukke.",<br /> "programSerieSlug": "bonderoeven",<br /> "title": "Bonderøven (5:10)",<br /> "duration": "00:27:14",<br /> "broadcastTime": "\/Date(1317148200000+0200)\/",<br /> "expireTime": "\/Date(32503676400000+0100)\/",<br /> "publishTime": "\/Date(-62135596800000+0100)\/",<br /> "expired": false,<br /> "broadcastChannel": "DR1",<br /> "videoManifestUrl": "http://www.dr.dk/Forms/Published/PlaylistGen.aspx?qid=2350582&OnlyWritePath=True",<br /> "videoResourceUrl": "http://www.dr.dk/handlers/GetResource.ashx?id=983628",<br /> "premiere": true,<br /> "rtmpVideoHost": null,<br /> "formattedExpireTime": "1. jan. 3000",<br /> "formattedBroadcastTime": "27. sep. 2011",<br /> "formattedBroadcastTimeForTVSchedule": "tir. d. 27. sep",<br /> "formattedBroadcastHourForTVSchedule": "Kl. 20:30",<br /> "chapters": []<br />}</blockquote><br />Her er videoResourceUrl nok hvor selve videoen er. <a href="http://www.dr.dk/handlers/GetResource.ashx?id=983628">http://www.dr.dk/handlers/GetResource.ashx?id=983628</a> giver (efter lidt formattering)<br /><blockquote>{<br /> "resourceId":983628,<br /> "name":"Bonderøven (5:10) 7. sæson, efterår 2011 ",<br /> "mediaType":"Video",<br /> "restrictedToDenmark":false,<br /> "downloadable":false,<br /> "geofilterId":0,<br /> "publish":"2011-09-19T14:46:32",<br /> "expire":"3000-01-01T00:00:00",<br /> "links":<br /> [<br /> {<br /> "qualityId":2350582,<br /> "uri":"rtmp://vod.dr.dk/cms/mp4:CMS/Resources/dr.dk/NETTV/DR1/2011/09/18a5c2f8-8802-4de6-9a9d-6b337b95e1ad/Bonderoeven--5-10---7--saeson-_32f7289ed4f9472c805711dfd91fbf90.mp4?ID=983628",<br /> "linkType":"Streaming",<br /> "fileType":"mp4",<br /> "bitrateKbps":1126,<br /> "width":640,<br /> "height":360<br /> },<br /> {<br /> "qualityId":2350583,<br /> "uri":"rtmp://vod.dr.dk/cms/mp4:CMS/Resources/dr.dk/NETTV/DR1/2011/09/18a5c2f8-8802-4de6-9a9d-6b337b95e1ad/Bonderoeven--5-10---7--saeson-_32f7289ed4f9472c805711dfd91fbf90_1.mp4?ID=983628",<br /> "linkType":"Streaming",<br /> "fileType":"mp4",<br /> "bitrateKbps":626,<br /> "width":640,<br /> "height":360<br /> },<br /> {<br /> "qualityId":2350584,<br /> "uri":"rtmp://vod.dr.dk/cms/mp4:CMS/Resources/dr.dk/NETTV/DR1/2011/09/18a5c2f8-8802-4de6-9a9d-6b337b95e1ad/Bonderoeven--5-10---7--saeson-_32f7289ed4f9472c805711dfd91fbf90_2.mp4?ID=983628",<br /> "linkType":"Streaming",<br /> "fileType":"mp4",<br /> "bitrateKbps":376,<br /> "width":320,<br /> "height":180<br /> }<br /> ],<br /> "chapters":[],<br /> "productionNumber":"00951134130"<br />}</blockquote><br />Hvor der tydeligvis er en indgang for hver kvalitet. DVS at URLen for den højeste kvalitet er rtmp://vod.dr.dk/cms/mp4:CMS/Resources/dr.dk/NETTV/DR1/2011/09/18a5c2f8-8802-4de6-9a9d-6b337b95e1ad/Bonderoeven--5-10---7--saeson-_32f7289ed4f9472c805711dfd91fbf90.mp4?ID=983628<br />hvor delen efter ":" er en playpath. Den kan downloades med Linux-programmet rtmpdump med kommandoen<br /><pre>rtmpdump --playpath="mp4:CMS/Resources/dr.dk/NETTV/DR1/2011/09/18a5c2f8-8802-4de6-9a9d-6b337b95e1ad/Bonderoeven--5-10---7--saeson-_32f7289ed4f9472c805711dfd91fbf90.mp4?ID=983628" -r 'rtmp://vod.dr.dk/cms/mp4:CMS/Resources/dr.dk/NETTV/DR1/2011/09/18a5c2f8-8802-4de6-9a9d-6b337b95e1ad/Bonderoeven--5-10---7--saeson-_32f7289ed4f9472c805711dfd91fbf90.mp4?ID=983628' -o br.flv</pre><br />Tak til marlar i tråden <a href="http://www.linuxin.dk/node/17903">http://www.linuxin.dk/node/17903</a> for at finde ud af playpath-delen!<br /><br />Vi mangler stadig at finde links til de gamle afsnit, og til det skal vi gætte {slug} i URLerne. For at finde {slug} for Bonderøven kigger jeg på programseriernes links nederst på siden <a href="http://www.dr.dk/nu">http://www.dr.dk/nu</a> , og kan se at de er af formen http://www.dr.dk/nu/player/#/bonderoeven/18431 eller http://www.dr.dk/nu/player/#/bonderoeven-retro/13380 . Så siden 18431 var et videoId, gætter jeg på at "bonderoeven" er {slug}. Og ganske rigtigt, så giver <a href="http://www.dr.dk/nu/api/programseries/bonderoeven/images/1000x1000.jpg">http://www.dr.dk/nu/api/programseries/bonderoeven/images/1000x1000.jpg</a> og <a href="http://www.dr.dk/nu/api/programseries/bonderoeven/videos">http://www.dr.dk/nu/api/programseries/bonderoeven/videos</a> et logo samt en liste over episoder med tilhørende downloadlinks.Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com0tag:blogger.com,1999:blog-9131958182748931741.post-41466405797390510832010-01-11T13:21:00.000-08:002010-02-16T07:21:28.953-08:00PHP's implementation of fgetcsv() and fputcsv() does not follow RFC 4180 or Wikipedia's description, and does not work in all cases with Excel or OO Calc, as described in bug <a href="http://bugs.php.net/bug.php?id=50686">http://bugs.php.net/bug.php?id=50686</a> .<br /><br />Here is an RFC 4180-complient implementation in PHP. This can parse more than 1MiB of CSV text per second, so should be fast enough for most uses. It is fairly strict, in that it does not allow whitespace before the start of a quoted item, such as 1, "2" ,3 , in according to the standard, but it would be simple to make it laxer. It supports both \r\n and \n linebreaks, where the standard only supports \r\n. whitespace is just another data character, so '1, 2,3 ' becomes Array(1, " 2", "3 "). backslashes are also just another character, as backslashes have no special meaning in RFC 4180.<br /><br />The code below may be used and redistributed without restrictions. You may consider buying me a beer if you find it useful.<br /><pre><br /><?php<br /><br />class csv {<br /><br /> private static function error($error, $str, $m, $offset, $moving_offset, $csv_line) {<br /> if ($error === "unexpected quote in unquoted field") {<br /> $raw = _("Found an unexpected quote character in field %d of csv line %d (text line %d).".<br /> " The first 50 chars from the start of the field are '%s'.");<br /> } else if ($error === "unexpected quote in quoted field") {<br /> $raw = _("Found an unescaped quote in quoted field %d of csv line %d (text line %d).".<br /> " The first 50 chars from the start of the field are '%s'.");<br /> } else if ($error === "unexpected text after end quote in quoted field") {<br /> $raw = _("Unexpected test after end quote in quoted field %d of csv line %d (text line %d).".<br /> " The first 50 chars from the start of the field are '%s'.");<br /> } else {<br /> die("impossible");<br /> }<br /><br /> $t = sprintf($raw,<br /> sizeof($m[$csv_line])+1,<br /> $csv_line,<br /> sizeof(explode("\n", substr($str, 0, $offset))),<br /> addcslashes(substr($str, $offset, 50), "\t\r\n'\\")<br /> );<br /> throw new Exception($t);<br /> }<br /><br /> /* returns<br /> * array(start_line1 => Array(field1, field2,...),<br /> * start_line2 =><br /> * ...);<br /> *<br /> * Faily speed-important, therefore:<br /> * -With few function calls.<br /> * -Never copy the entire (potentially MB-long) string<br /> * -Never operate on the whole string (so therefore we use no pregs)<br /> *<br /> * This implementation parses a 1MB csv file in under a second,<br /> * which is obviously slow, but should be fast enough. My first try<br /> * was using regexp_max with regexp's offset parameter, which failed<br /> * horribly speed-wise.<br /> *<br /> * The basic idea is to eat one char at a time, and append fields<br /> * and lines to the matrix as we encounter separators and newlines.<br /> *<br /> * Not using PHP's fgetcsvdue to http://bugs.php.net/bug.php?id=50686<br /> */<br /> public static function parse($str, $sep=',') {<br /> if ($str === "") {<br /> return Array();<br /> }<br /><br /> $str .= "\r\n";<br /> $offset = 0;<br /> $item = "";<br /> $len = strlen($str);<br /> $csv_line = 1;<br /> $m = Array($csv_line => Array());<br /> $force_empty_field = false;<br /><br /> $moving_offset = 0;<br /> while ($moving_offset < $len) {<br /> $c = $str[$moving_offset];<br /> if ($c === $sep) {<br /> //separator<br /> $m[$csv_line][] = $item;<br /> $item = "";<br /> $force_empty_field = true;<br /> $offset = ++$moving_offset;<br /> } else if ($c === "\n") {<br /> //newline<br /> if ($str[$moving_offset -1] === "\r") {<br /> //The \r belonged to the newline<br /> $item = substr($item, 0, -1);<br /> }<br /> if ($item !== "" || $force_empty_field) {<br /> $m[$csv_line][] = $item;<br /> $item = "";<br /> }<br /> $offset = ++$moving_offset;<br /><br /> //end of string<br /> if ($offset === $len) {<br /> return $m;<br /> }<br /><br /> $m[++$csv_line] = Array();<br /> $force_empty_field = false;<br /> } else if ($c === '"') {<br /> //quoted item<br /><br /> if ($item !== "") {<br /> //throws exception<br /> self::error("unexpected quote in unquoted field",<br /> $str, $m, $offset, $moving_offset, $csv_line);<br /> }<br /><br /> //eat quote<br /> $moving_offset++;<br /><br /> //read until end quote<br /> while (true) {<br /> $c = $str[$moving_offset];<br /><br /> if ($moving_offset >= $len) {<br /> //throws exception<br /> self::error("unexpected quote in quoted field",<br /> $str, $m, $offset, $moving_offset, $csv_line);<br /> }<br /> if ($c === '"') {<br /> if ($str[$moving_offset+1] === '"') {<br /> //escaped quote<br /> $item .= '"';<br /> $moving_offset += 2; //eat doubled quotes<br /> } else {<br /> //end of item<br /> $moving_offset++; //eat end quote<br /> break;<br /> }<br /> } else {<br /> $item .= $c;<br /> $moving_offset++;<br /> }<br /> }<br /><br /> //eat separator<br /> if ($str[$moving_offset] === $sep) {<br /> $force_empty_field = true;<br /> $moving_offset++;<br /> } else if ( ($str[$moving_offset] === "\r" && $str[$moving_offset+1] === "\n")<br /> || $str[$moving_offset] === "\n") {<br /> $force_empty_field = false;<br /> } else {<br /> self::error("unexpected text after end quote in quoted field",<br /> $str, $m, $offset, $moving_offset, $csv_line);<br /> }<br /><br /> //add field and reset for next field<br /> $m[$csv_line][] = $item;<br /> $item = "";<br /> $offset = $moving_offset;<br /> } else {<br /> $moving_offset++;<br /> $item .= $c;<br /> }<br /> }<br /><br /> die("impossible, since the last char is a \n, and the newline handling should catch that");<br /> }<br /><br /> public static function matrix_to_csv(Array $matrix, $sep=',') {<br /> $str = "";<br /> foreach ($matrix as $row) {<br /> if ($str !== "") {<br /> $str .= "\r\n"; //not just \n, according to RFC 4180<br /> }<br /><br /> $row = array_map(Array(__CLASS__, "escape"), $row);<br /> $row_str = implode($sep, $row);<br /> $str .= $row_str;<br /> }<br /><br /> return $str;<br /> }<br />}<br /><br />?><br /><br /></pre>Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com5tag:blogger.com,1999:blog-9131958182748931741.post-90633319200901746972009-11-16T06:14:00.000-08:002009-11-16T06:57:03.044-08:00Sid Meier's Alpha Centauri on LinuxI own Sid Meier's Alpha Centauri Planetary Pack in the Linux edition from Loki. However, it unfortunately does not seem to run on a modern Linux distribution.<br /><br />So I decided to make a virtual machine image of an old Linux distribution to make it work. That way I will never have to reinstall it, as long as I save the virtualized image.<br /><br />So the procedure is:<br />1) Download Red Hat 8 (in 2 disks): <a href="ftp://ftp.gmd.de/archive.download.redhat.com/redhat/linux/8.0/en/iso/i386/psyche-i386-disc1.iso">ftp://ftp.gmd.de/archive.download.redhat.com/redhat/linux/8.0/en/iso/i386/psyche-i386-disc1.iso</a> and <a href="ftp://ftp.gmd.de/archive.download.redhat.com/redhat/linux/8.0/en/iso/i386/psyche-i386-disc2.iso">ftp://ftp.gmd.de/archive.download.redhat.com/redhat/linux/8.0/en/iso/i386/psyche-i386-disc2.iso</a>.<br /><br />2) Create a virtual disk image:<br />emu-img create -f qcow2 smac_redhat8.img 5G<br /><br />3) Optionally install kqemu kernel module to accelerate qemu (Red Hat 8 didn't work with kvm,presumably because my CPU is not known by Red Hat 8).<br /><br />3) Install Red Hat 8 in virtual image:<br />qemu -cpu pentium2 -hda smac_redhat8.img -m 1024 -soundhw ac97 -cdrom psyche-i386-disc1.iso<br />(You change cdrom in qemu by CTRL-ALT-2 and then "change ide1-cdrom psyche-i386-disc2.iso")<br />Inside the redhat install just selected a generic monitor, which happened to have a default resolution of 1024x768, which happened to be the max resolution of SMAC.<br />Inside the finished installation you need to add "options i810_audio clocking=48000" to /etc/modules.conf , otherwise the sound will play too slowly, and in a very low pitch.<br /><br />4) I think you need to tell qemu to use ALSA instead of OSS:<br /> export QEMU_AUDIO_DRV=alsa<br /> export QEMU_AUDIO_DAC_FIXED_FREQ=48000<br /> export QEMU_AUDIO_ADC_FIXED_FREQ=48000<br /><br /><br />5) Install SMAC inside the virtual machine by putting my SMAC cd in the cd drive, and booting qemu with "-cdrom /dev/cdrom". I just installed SMAC as root inside the virtual machine, as the default install settings expected that. SMAC will be in the main menu under extras->games->smac.<br /><br />6) Update SMAC. Since none of the mirrors the loki update tool knew worked (and I did not want to set up virtual networking), I manually fetched <a href="http://lokifiles.tuxgames.com/updates/smac/smac-6.0a-x86.run">http://lokifiles.tuxgames.com/updates/smac/smac-6.0a-x86.run</a> , made it into an iso image ("genisoimage -o smac_patch.iso dir_with_smac-6.0a-x86.run"), and mounted smac_patch.iso as a cdrom in qemu. You can then run smac-6.0a-x86.run (as root) to patch the SMAC installation.<br /><br />7) You can the virtual machine in full screen mode by hitting CTRL-ALT-fThuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com0tag:blogger.com,1999:blog-9131958182748931741.post-50623350231427782512009-05-10T09:01:00.000-07:002009-05-10T09:07:19.323-07:00Hardcover Books and Market SegmentationNew books are usually only available in hardcover for about a year.<br /><br />Wikipedia <a href="http://en.wikipedia.org/wiki/Hardcover_book">writes that </a><blockquote>Hardcover books tend to cost more than paperback versions of the book. This is due to <a href="http://en.wikipedia.org/wiki/Price_discrimination" title="Price discrimination">price discrimination</a> by booksellers who observe that consumers are willing to pay a premium for hardcover editions over paperbacks beyond the extra costs in materials and production.</blockquote>This bugs me. I think that for most for-fun reading where you aren't taking notes, paperbacks are ergonomically better. So not only do I have to pay more, I am paying more for an inferior product. If they do insist on charging more for new books (fair enough), at least make it an expensive paperback.Thuehttp://www.blogger.com/profile/17820752472572931642noreply@blogger.com0