TBS5520SE – Multi-standard TV Tuner USB Box

Die kleine Box in schwarzen Metall verspricht, alles an Fernsehsignalen empfangen zu können, was so hier verfügbar ist.

An der Frontseite 2 LEDs, einmal in blau, um zu zeigen, dass das Gerät arbeitet, und einmal in grün, damit wird angezeigt, dass auf der aktuellen Frequenz ein Sender gefunden wurde. Aber davon sagt die nicht wirklich vorhandene Anleitung nichts. Außerdem sind die LEDs viel zu hell, reine Funktionsindikatoren sollten leicht sichtbar, aber nicht grell sein. Neben einem Monitor aufgestellt stört die Helligkeit massiv. 

Die Box hat einen Antenneneingang sowie einen LNB-Anschluß und ein USB-2.0 Interface.

Das Gehäuse ist aus Metall und hat ein paar Lüftungsschlitze. Die Beschreibung sagt: „Neben der guten Ausstattung und dem modernen Interface wurde auch auf eine geringe Leistungsaufnahme und damit eine niedrige Abwärme, für geräuschlosen Betrieb, geachtet.“. Ein Lüfter ist sicher auch nicht notwendig, aber das Gerät wird schon warm, die Lüftungsschlitze sind gerechtfertigt und gut.

Empfangbar seien DVB-S / S2 / S2X, DVB-C / C2, DVB-T / T2 und ISDB-T. Und das passt auch wunderbar zum zentralen Chip in dem Gerät, dem Si21832B. Dieser dekodiert all diese Standards für uns.

Daneben gibt es noch einen CY7C68013A für die USB-Kommunikation. Außerdem ein paar Verstärker- und Logikchips, aber keine Überraschung.Kommen wir zu den Treibern. Diese können von der Webseite herunter geladen werden, im Lieferumfang ist kein Datenträger – der sowieso nur veraltete Versionen haben würde.

Ich habe zum Ansehen des Video-Streams den kostenlosen TBS-Viewer ausprobiert. Der Sendersuchlauf hatte mich direkt demotiviert. Der Empfangstyp war auf Satellit voreingestellt.

Ein Wechsel auf DVB-T (‚Terrestrisch‘) setzt immer die Transponderliste „DMB-TH Hong Kong“ als Standard.Ein Suchlauf (Korrekt auf Transponderliste: DVB-T2 Deutschland gestellt) lieferte keinen Sender, über die gesamte Frequenzliste hinweg. Spezifisches Scannen einzelner Frequenzen, die hier definitiv empfangbar sind und unverschlüsselte Sender übertrage (514 MHz und 706 MHz), lieferten auch 0 Sender. Den Grund dafür liefert die etwas schwache Anleitung: absolut wichtig ist TBS 5520 SE ChangeMode-Tool v1.0.0.2, mit diesem kann der Empfangsmodus geändert werden. Bei mir war der auf Satellit voreingestellt; nur mit diesem Tool kann auf DVB-T2 umgestellt werden.

Danach funktionierte dann auch der Suchlauf im TBS-Viewer. Allerdings ist die Empfindlichkeit des Empfängers eher mittelmäßig. Eine mickrige Antenne, die auch an einem Fernseher hier eher schwierigen Empfang liefert, die aber an einer Xoro-Box sehr gut funktioniert, liefert auch am TBS-5520 keinen befriedigenden Empfang. Vermutlich braucht man mit dem Gerät meistens eine aktive Antenne.

Zum Test wollte ich auch den kostenpflichtigen DVB-Viewer installieren – TBS Viewer lief noch – und erhielt die Fehlermeldung, dass DVB-Viewer noch liefe. Meine Vermutung ist da klar, dass der TBS-Viewer eine verfiesemantuckte Version des DVB-Viewers ist.

Also: es funktioniert alles, aber die Dokumentation stinkt schon anrüchig, und die Lösung des Empfangsumschaltens mittels des Change-Mode-Tools ist suboptimal. Technisch Interessierte werden keine Schwierigkeiten damit haben, aber es ist nicht gut.

Ein für mich wichtiger Kaufgrund war die Zusage „Treiber für sämtliche 32- und 64-bit Betriebssysteme befinden sich im Lieferumfang: Win XP, Vista, Win 7/8/10 und Linux.“ „Sämtliche 32- und 64-bit Betriebssysteme“ … MacOS ist schon einmal nicht dabei, somit ist sämtliche eine leere Versprechung. Linux ist ein verlockendes Versprechen für mich; ich will immer noch den Empfang von Fernsehen auf einem Raspberry Pi machen, und das Dekodieren dann auf anderen Clients. Leider unterstützt der Raspberry Pi h.265 nicht. Linux und sämtliche klingt wunderbar. ARM-Linux scheint da aber nicht wirklich drunter zu fallen.

Mehr zum Linux-Treiber später….

Salesforce API documentation could be better with API versions

Once again I found a nice, no, necessary feature. When searching for RecordType-IDs in Apex, you could either query for them with SOQL (burning away the precious number of statements) OR you could just ask the schema.

With List<RecordTypeInfo> contactRTs = Schema.SObjectType.Contact.getRecordTypeInfos() you can get all available RecordTypes for this Object. With contactRTs[0].getName() you can get the label of the record type.

The label. This may be dependent on the language of the user, so it’s utterly useless in code. But there is also contactRTs[0].getDeveloperName() – yay! However, the documentation never states which is the minimum API needed for a function call, and this is absolute crap. Why not just add a line with the API-version? Otherwise you may get errors, which contradict the documentation.

Yes, I know that the Summer`18 release is not far now, so in this case it means that it was a bit more than a week before I can use this needed feature. But it cost me quite some time – checking if I had a typo, if I misread … and then finally a search for the release notes with this function. With the API version in the docs, this would have been a matter of minutes…

Simple script for setting allowed IP address in tinyproxy

I’m using a dynamic IP address, but for Salesforce development I need a fixed one. As a proxy with a fixed IP address is enough, I use tinyproxy for that. Of course I cannot afford to have an unrestricted open proxy. Now this small script helps me achieve this in a half-automated way. I ssh in to my proxy-server, call this script, and it takes care of producing an appropriate line in the configuration:


#! /bin/bash
#
# Find the ip address of the calling ssh
callerId=`echo $SSH_CONNECTION | awk '{print $1}'`
#
# Find the allow line and set it to the ip address
sudo sed -i "/# set from script/!b;n;cAllow ${callerId}" /etc/tinyproxy.conf
sudo systemctl restart tinyproxy

In order for this to work, you need a marker in your tinyproxy.conf. This script looks for „# set from script“, and replaces the following line with an Allow-entry.

Was soll das Gerede in Warteschleifen?

Jetzt bin ich wieder in so einer Hotline-Warteschleife (ich möchte doch mal wissen, was Medion zu den widersprüchlichen Angaben zu dem Rechner zu sagen hat), und werde mit Musik genervt.

Aber die Unsitte, dass alle paar Sekunden eine Bandansage mich darüber informiert, dass immer noch niemand zur Verfügung steht, ist extrem störend. Wenn einfach nur Musik läuft, dann schalte ich halt den Lautsprecher an, lasse das Telefon neben mir liegen, und kann weiter arbeiten. Eine menschliche Stimme allerdings reisst mich dann raus – es gibt mir Hoffnung, dass jemand mit mir reden, ja vielleicht sogar mein Problem lösen könnte.

Wirklich: lasst diese sinnlosen Ansagen. Es glaubt doch sowieso niemand, was da geredet wird. „Nur noch ein paar Augenblicke..“, „Der nächste freie Mitarbeiter…“ Blah blah blah. Es nervt!

Aldi liefert nicht übermäßig schnell – Medion Erazer X67015

Am Montag, 4.12. direkt morgens im Aldi bezahlt, aber bis heute noch nicht einmal verschickt.

Den Medion Erazer X67015 hätte ich gerne. Ich hatte schon angefangen, mir Preise für die Komponenten raus zu suchen, und bin dann zu einem ähnlichen Gesamtpreis gelangt. Allerdings hätte ich dann in 3 Shops bestellen müssen, und das Ding noch zusammen bauen. So entspricht der Rechner in etwa der Leistungskategorie, die ich wollte, aber vor allem ist alles zusammen. Mit Garantie.

Allerdings fand ich das Konzept schon etwas gewöhnungsbedürftig. Ich muss also vor Ort im Laden mein Geld abgeben, erhalte dafür einen flimsigen Zettel mit einem Code, und muss dann das ganze Prozedere einer Online-Bestellung noch zusätzlich machen. Und dann halt darauf warten, dass das Gerät auch zu mir kommt.

Dienstag morgen, 0:30h erhalte ich eine Email von Aldi:
„die folgende Bestellung werden wir heute versenden:
[…]
Versanddatum: 04.12.2017“

Also erstmal: die Email ging am 5.12. raus. Sie war im Futur geschrieben und behauptet, am 4.12. würde die Bestellung versendet werden.

Aber ich freute mich dennoch, das schien ja schnell zu funktionieren. Schwierigkeiten mit den Zeitformen der deutschen Sprache kann ich gut ignorieren. Aber jetzt haben wir den 6.12., 2 Tage nachdem die Bestellung versandt werden sollte. Der Status bei DHL ist immer noch, dass die Daten elektronisch übermittelt wurden, aber auch DHL noch auf das Paket wartet:

Sendungsverfolgung DHL: am 5.12. wurden die Daten elektronisch übermitteltIch bin gespannt, ob und wann da noch etwas passiert. Ich bin vor allem sauer, weil die Email eine ganz andere Zusage enthielt. Und das ist einfach nicht in Ordnung!

Telefonisch war auch keine andere Information zu erhalten. Die Person im Callcenter sagte nur, er wisse nicht, was die verschiedenen Firmen untereinander ausgemacht haben. Wie üblich bin ich als Kunde wieder Wurst.

mods.curse.com might have leaked data

Some time ago I played World of Warcraft. Hell, was that addictive. I’m kind of happy that I don’t do it anymore. To be effective in raids I needed addons, which I got from mods.curse.com. And as I am wary to give out my main email address, I once again created one exclusively for this purpose.

For a few months now I find spam being sent to that particular address. It’s not an address you would easily guess such as info@ or contact@ or so, it was very particularly tailored so that it would relate both to curse and to my username on WoW. Mails to it are received in my catch-all inbox, where most of the spam lands.

This particular wave of spam is from „Sale4MichaelKors“, „Deals 4 Jordan“, „Pandora Jewelry“ and „UGG Boots“. Stuff which I don’t receive for any other email address.

Now, I have contacted the support, but the last reply was „We can confirm that we are not aware of any mishandling of your user data, nor any incidents that would have exposed it. If you would like more information on Twitch’s Privacy Policy please feel free to read up here.“.

The fact remains that this is the one and only place where I used that email address. Either they have sold my information (I do not believe that) or the data has been stolen. I don’t claim it to be a recent leak. I have a Yahoo address, which was definitely compromised, and I could clearly see that the information obtained had not been abused for quite some time after the data leaked. I assume the same is true in this case. So the leak is not necessarily new.

However, I did not get any specifics what the ’security team‘ had looked into. Maybe they only looked at potential incidents this year, I don’t know.

What I know is: this email address was exclusively used with curse.com, and now I receive spam on it. I draw my conclusions from those facts.

 

Salesforce: $Component-merge fields behaving unexpectedly

So I was writing a slightly complicated form validation in Javascript. Therefore I needed access to the values of all fields of an <apex:form>. But worse, some fields were shown conditionally.

So I assumed that the validation would merely need to check whether the fields existed, as a conditional rendering does not add the fields to the DOM (in contrast to hiding them with display: none). So my Visualforce page looked something like this:

<apex:page controller="ConditionalRerenderController">
    <apex:form>
        Click me
        <apex:inputCheckbox value="{!condition}" id="firstId">
            <apex:actionSupport event="onclick" rerender="conditionalBlock"/>
        </apex:inputCheckbox><br/>
        <apex:pageBlock id="conditionalBlock">
            <apex:pageBlockSection rendered="{!condition}" columns="1">
                <apex:inputText id="secondId" value="{!stringValue}" /><br/>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>

The JS to get the value of the text input field would be rather simple

var inputfield = document.getElementById('secondId');
if(inputField != null)
    alert(inputfield.value);

However, the attribute id in Visualforce does not translate directly to the HTML attribute of the same name. To make sure a produced id is in fact unique, Salesforce adds information on the context, practically making it unusable to hard-code the id in javascript.

But there is the global merge field $Component which allows to resolve the produced HTML id. So I expected this to work:

var inputfield = document.getElementById('{!$Component.secondId}');
if(inputfield != null)
    alert(inputfield.value);

But inputfield would always be null, no matter whether the checkbox had been clicked before, rendering the input field.

This is quite a problem, as it turns out this merge field is not re-evaluated outside of the block that gets re-rendered. Instead, the expression always evaluates to an empty string outside of the conditionally rendered block. So you would need to put all Javascript that needs an id of an element within the conditionally rendered block.

Or – maybe more workable – you could use class names as pseudo-IDs. If you would add

styleClass="pseudoId"

to the input-field you can access it with

var elements = document.getElementsByClassName('pseudoId');
if(elements != null && elements.length > 0) {
    var inputField = elements[0];
    alert(inputField.value);
}

Have a try, and notice how the id of the text input only appears in the conditionally rendered block.
The page:

<apex:page controller="ConditionalRerenderController">
    <apex:form>
        Click me
        <apex:inputCheckbox value="{!condition}" id="firstId">
            <apex:actionSupport event="onclick" rerender="conditionalBlock"/>
        </apex:inputCheckbox><br/>
        firstId: <apex:outputText value="{!$Component.firstId}" /><br/>
        secondId: <apex:outputText value="{!$Component.secondId}" /><br/>

        <apex:pageBlock id="conditionalBlock">
            <apex:pageBlockSection rendered="{!condition}" columns="1">
                <apex:inputText id="secondId" value="{!stringValue}" /><br/>
                secondId: <apex:outputText value="{!$Component.secondId}" /><br/>
            </apex:pageBlockSection>
        </apex:pageBlock>
    </apex:form>
</apex:page>

The controller:

public class ConditionalRerenderController {
 public boolean condition {get;set;}
 public String stringValue {get;set;}
 
 public ConditionalRerenderController() {
 this.condition = false;
 this.stringValue = 'empty';
 }
}

Packungen mit frischen Chilis – Verdorbene Ware

In jedem Geschäft, in das ich gehe, halte ich Ausschau nach Chilis. Möglichst frische, möglichst welche, die ich noch nicht gegessen habe. Dabei fällt mir viel zu oft auf, dass  in kleinen Packungen verdorbene Ware angeboten wird.

Gerade vor einer Woche im Kaufhof. Ich war sehr glücklich, dass es dort einen Chili-Mix gab, der auch Scotch Bonnett enthielt (und leider auch Jalapeño als Beifang). Oberflächlich sah alles gut aus, die Früchte schienen fest zu sein. Beim Aufschneiden der Scotch Bonnett zeigte sich aber, dass die innen schon schimmelten. Bei ganz genauem Hinsehen hätte man das vielleicht am Stiel erahnen können.

Vor über einem Monat erzählte ich, dass ich Carolina Reaper gefunden habe. Auch bei denen war ein Viertel schon etwas angefault. Feststellbar von außen dadurch, dass die Früchte etwas weich schienen. Von innen, weil sie braun waren und ungesund rochen. Seit dieser Zeit liegen in der Metro die selben Packungen rum und werden nicht besser. Also inzwischen schon so, dass jeder, der sich ein wenig mit Essen auskennt, erkennen müsste, dass der Inhalt faul ist.

Im Handelshof hatte ich Bhut Jolokia gefunden, die Packung, die ich mitgenommen habe, war auch völlig in Ordnung. Aber auch da liegen die restlichen Packungen seit nun fast einem Monat rum – der Inhalt fault.

Das Gleiche gilt aber auch für Rewe und vermutlich jeden anderen Supermarkt, in dem Packungen mit Chilis verkauft werden. Zum einen liegt es daran, dass auf diesen Packungen keinerlei Datum drauf steht. Es wäre doch einfachst, den Zeitpunkt des Verpackens abzudrucken. Dann wüsste auch ein Kunde, der den Chilis ihren Zustand nicht ansehen kann, wie alt – oder auch wie frisch – das Essen ist.

Natürlich wird das auch bei anderen frischen Lebensmitteln nicht gemacht, allerdings unterstelle ich mal, dass sowohl das Personal als auch der Durchschnittskunde bei Äpfeln oder Bananen halbwegs erkennen kann, ob man das noch essen bzw. kaufen sollte. Bei Chilis, insbesondere den knubbeligen Vertretern wie Carolina Reaper und Bhut Jolokia sieht das offenbar anders aus. Auch ich kann bei eingepackter Ware nicht erkennen, ob die noch in Ordnung ist.

Meine neue KFZ-Werkstatt des geringsten Misstrauens

Für Autowerkstätten bin ich ein Albtraum. Ich glaube immer, dass ich durchaus verstehe, was da so gemacht wird. Ich glaube auch, dass nicht alle KFZ-Werkstätten immer korrekt abrechnen. Daher braucht es eigentlich auch viel Überzeugungsarbeit seitens der Beschäftigten, damit ich eine Werkstatt mehr als einmal betrete.

Es fängt schon bei dem Allgemeinen Kriterium an, dass ich sicher sein möchte, dass sich jemand der Grenzen seines Wissens bewusst ist. Das ist bei allen Fachkräften so. Niemand kann selbst in seinem Spezialgebiet alles wissen. Daher ist immer ein wichtiger Faktor, ob jemand bereit ist, die Grenzen seines Wissens zu offenbaren – das ist die wichtigste Vorstufe zum Eingestehen von eigenen Fehlern. und auch da: niemand ist unfehlbar. Aber jeder kann von seinen Fehlern lernen.

Wie dem auch sei, da habe ich endlich jemand gefunden, dem ich mein Auto anvertraue. Nicht nur, dass er bei allen Fragen die „richtigen“ Antworten gegeben hat, sondern vor allem: Fragen wurden nicht genervt als scheinbaren Angriff auf die Autorität angesehen. Außerdem wurden nur Reparaturvorschläge gemacht, die auch meiner Meinung nach Aussicht auf Erfolg hatten.

Er sagt, er braucht keine weitere Werbung, daher kann ich auch mit ihm keine Geschäfte zum Guten meiner Firma machen. Wer braucht schon eine Webseite, die den aktuellen technischen Ansprüchen genügt, wenn man genügend Kunden hat.

Dennoch möchte ich hier öffentlich mein Lob und meinen Dank an Holger Ludwig senden. Seine Werkstatt Fahrzeug & Motor – Technik & Design in Bergisch Gladbach ist derzeit meine Werkstatt des geringsten Misstrauens. Und das, obwohl ich 45 Kilometer bis dahin fahren muss.

Danke!