Blog: Latest Entries (15):


ORMs und Performance

Und das ist dann der Punkt an dem ich wieder anfange daran zu zweifeln, dass ORMs wirklich für mehr als load-by-id, update, insert oder delete brauchbar sind.

Gefühlt liefern ORMs bei Performance-Fällen immer nur Lösungen, die man mit nativen Queries schon von sich aus hätte und das ORM nur zusätzlichen Overhead ohne Vorteil verursacht.

bbcode-image


https://de.slideshare.net/AndreyYatsenco/doctrine-internals-unitofwork

Unerwartete Histogramm-Probleme

Histogramm: Man nimmt sich einen Wertebereich und teilt diesen in gleich große Bereich. Nun werde alle Werte in die passenden Bereich einsortiert. Am Ende erhält man normalisierte Daten die aus Bereichen und der Anzahl der in dem Bereich liegen Werte bestehen.

Dies hat bei Bar-Charts bei der Darstellung viele Vorteile. Für Slider braucht man so etwas nicht, da man dort nur den Min- und Max-Wert braucht.

Wenn man nun viele dicht bei einander liegende Werte hat, bekommt man ein geringere Datenmenge als es die Einzelwerte wären.

Als Beispiel nehmen wir diese Werte


105
107
115
115
116
121
144


Wenn wir nun Bereiche mit der Weite von 10 definieren erhalten wir


100:2
110:3
120:1
130:0
140:1


Die Berechnung für die Normalisierung ist sehr ein einfach und daher auch schnell.

Wir sparen an der Datenmenge, je mehr Werte pro Bucket einsortiert werden können. Zusätzliche Daten entstehen aber dann wenn man leere Buckets hat. Hätten wir noch zusätzlich die Werte 1 und 1.000.000 hätten wir nicht mehr 5 Buckets sondern 1.000.000 / 10 also 100.000 Buckets für 9 Werte.

Würden wir PHP mit einer Max-Size 64M für ein Script können wir schon schnell Probleme mit dem Speicher bekommen, wenn zur Speicherung der Bucket Objekte oder eine HashMap verwendet wird.

bbcode-image


Wenn man Histogramme verwendet sollte man immer an diese Problematik denken und wenn möglich nur gefüllte Buckets laden, also ein Min-Count von 1 setzen
und die leeren Buckets erst bei Bedarf rekonstruieren.

CMS und Pages mit selben Layout

Gehen wir mal davon aus wir erstellen eine Homepage für eine Restaurant-Kette mit 3 Restaurants. Die Seite soll so gebaut sein, dass Mitarbeiter der Restaurants einfache Datenänderungen vornehmen können, ohne dafür um Hilfe fragen zu müssen. Auch sollen Änderungen im Layout einfach und schnell möglich sein, dass aber nicht durch die Mitarbeiter, da diese wohl kein HTML beherrschen.

Jedes Restaurant hat eine eigene Unterseite, die vom Aufbau aber immer gleich sind.

Das Problem ist, dass wenn es Änderungen im Layout dieser 3 Seiten geben soll, müssen die Änderungen auch in allen 3 Seiten getätigt werden. Ein einfaches Kopieren geht natürlich nicht, da man sonst ja die individuellen Texte und Bilder überschreiben würde. Die speziellen Öffnungszeiten für Feiertage einzutragen ist nicht ganz so kompliziert, wenn man einen WYSIWYG-Editor hat. Aber einfacher wäre es natürlich, wenn diese Angaben atomar eingegeben werden können und so auch nicht die Gefahr besteht, durch Fehler die gesamte Seite durcheinander zu bringen.

Ich habe für mein Framework/CMS diese Lösung entwickelt. In dem Code der Seite sind Platzhalter eingebaut, die heraus geparst werden und mit individuellen Werten gefüllt werden können. Daher kann man einfach eine vorhandene Seite kopieren und muss nur die im Formular ausgewiesenen Platzhalter neu füllen. Das Layout zu Ändern geht auch einfach weil man den Code wirklich mit Copy und Paste in alle Seiten übernehmen kann, ohne Werte zu überschreiben.

bbcode-image


bbcode-image


Man hätte natürlich auch Entitäten und Controller mit Templates bauen können. Aber für solche Zwecke ist das oft vom Aufwand her nicht gerechtfertigt, weil die verwendete Zeit nicht entsprechend bezahlt werden würde und mit dieser Lösung es wohl auch schneller geht.

bbcode-image


Und für die einfachen Benutzer ist es so auch viel übersichtlicher und sie können dann bestimmt mehr alleine Ändern, weil sie nicht der Content der gesamten Seite erschlägt.

bbcode-image

vi für den absoluten Anfänger

Wer sich einmal aus versehen in den vi verirrt hatte, weiß wie verwirrend dieser Text-Editor für die Befehlszeile sein kann. Die meisten nutzen vi meistens nur für einen Zweck.. das Bearbeiten von Config-Dateien auf einem Server über eine SSH-Session oder schnelle Anpassungen an Dateien, wenn man Dinge auf der lokalen Dev-Workstation nicht nachvollziehen kann. Dazu reichen zumeist Datei öffnen, Datei bearbeiten, Datei speichern und vi wieder verlassen.

Öffnen ist ganz einfach:


vi file.conf


Dann öffnet sich der vi und man kann über die Pfeil-Tasten schon mal die Position wechseln.
wenn man nun schreiben möchte drückt man i für insert-mode.
Nun nimmt man seine Änderungen vor.
Mit ESC wechselt man zurück in den Command-mode. Speichern geht über :w für write.

Danach kann man entweder mit i weiter bearbeiten oder gibt :q für quit ein.

An sich eine sehr logische Bedienung aus dem insert-mode und dem command-mode zwischen denen man hin und her schalten kann.


JavaScript Facet-Filter

Heute mal wieder etwas mehr Theorie und Forschung und nicht nur Einrichtung und Administration von Servern.

Manchmal hat man einen Satz und Daten den filtern möchte und dann hätte man noch zusätzlich gerne Ansichten auf das Ergebnis von verschieden Facetten aus. Anders gesagt, man möchte wissen, welches Ergebnis zu welchen Filter gehört.

Ich hab hier einen Service in JavaScript geschrieben der genau so etwas macht und der auch mit AngularJS oder Node.js verwendet werden kann. Für kleine Datensätze erspart man sich damit Systeme wie ElasticSearch, die natürlich sehr viel besser und ausgereifter sind, als dieses kleine Beispiel, aber es gibt einen guten Einblick in das Thema. Auch sieht man daran, dass man alles gut parallelisieren kann.

Einmal kann man beim allgemeinen Filter-Durchlauf die zu filternde Menge aufteilen und jeden Teil einzeln in einem Worker/Thread filtern lassen und dann die Ergebnisse wieder zusammen führen. Danach kann man auch jedes Facet wiederum durch einen eigenen Worker/Thread bearbeiten lassen. Beides habe ich hier aber noch nicht umgesetzt.

Der Service:


/*
{
filter:[
{
field:"",
values:[]
op:"eq"
}
]
facetFields:[
{
field:"",
value:""
}
]
}
*/

function FacetsFilterService(){
this.filterArray=function(field, values, items, op){
var result = [];
for(var i=0;i<items.length;i++){
var item=items;
if(item[field]){
if((!op || op=="ep") && values.indexOf(item[field]) > -1){
result[result.length] = item;
}
else if(op=="gt"){
var found=false;
for(var v=0;v<values.length && !found;v++){
if(values[v] > item[field]){
found = true;
}
}
if(found){
result[result.length] = item;
}
}
else if(op=="gt"){
var found=false;
for(var v=0;v<values.length && !found;v++){
if(values[v] < item[field]){
found = true;
}
}
if(found){
result[result.length] = item;
}
}
else if(op=="bw"){

}
}
}
return result;
}

this.filter=function(request, items){
var fullResult = items;
//TODO this to a worker and split items
for(var i=0; i< request.filter.length; i++){
var filter = request.filter;
if(filter.values && filter.values.length>0){
fullResult = this.filterArray(filter.field, filter.values, fullResult);
}
}

var result = {
request : request,
full : fullResult,
facets: []
};

//TODO worker per facet-field
for(var j=0; j< request.facetFields.length;j++){
var facetField = request.facetFields[j];
result.facets[result.facets.length] = {
field:facetField.field,
value:facetField.value,
hits: this.filterArray(facetField.field, facetField.value, fullResult)
};
}

return result;
}

this.createFilterList = function(items, ignoreList){
var result=[];
for(var i=0; i< items.length; i++){
var item = items;
var keys = Object.keys(item);
for(var k=0;k<keys.length;k++){
var key=keys[k];
if(!ignoreList || !ignoreList.indexOf(key) == -1){
if(!result[key]){
result[key] = {
name:key,
values:[]
}
}

var value = item[key];
if(result[key].indexOf(value) == -1){
result[key].values.push(value);
}
}
}
}

var tmp=[];
for(var index in result){
tmp[tmp.length] = result[index];
}

return result;
}
}


Beispiel Daten:


var values=[
{
id:1,
type:"80486",
postfix:"SX",
mhz:25,
socket:"Socket 3"
},
{
id:2,
type:"80486",
postfix:"DX",
mhz:66,
socket:"Socket 3"
},
{
id:3,
type:"80486",
postfix:"DX",
mhz:100,
socket:"Socket 3"
},
{
id:4,
type:"P5",
postfix:"",
mhz:60,
socket:"Socket 5"
},
{
id:5,
type:"P54",
postfix:"C",
mhz:90,
socket:"Socket 5"
},
{
id:6,
type:"P54",
postfix:"C",
mhz:100,
socket:"Socket 5"
},
{
id:7,
type:"P54",
postfix:"C",
mhz:133,
socket:"Socket 5"
},
{
id:8,
type:"P55",
postfix:"C",
mhz:166,
socket:"Socket 7"
},
{
id:9,
type:"P55",
postfix:"C",
mhz:200,
socket:"Socket 7"
}
];



Und nun wollen wir alle CPUs mit 66MHz, 100MHz, 133MHz und 166MHz. Zusätzlich wollen wir aber noch wissen, wie sich diese Ergebnisse auf den Socket 3,4 und 5 verteilen:


var request={
filter:[
{
field:"mhz",
values:[66,100,133,166]
}
],
facetFields:[
{
field:"socket",
value:"Socket 3"
},
{
field:"socket",
value:"Socket 4"
},
{
field:"socket",
value:"Socket 5"
}
]
};


Das wenden wir nun auf die DAten an:


var service=new FacetsFilterService();
var result = service.filter(request, values);
console.log(result);


Und unser Ergebnis sieht wie erwartet aus:

* 486 mit 66MHz
* 486 und Pentium mit 100MHz
* Pentium mit 133MHz
* Pentium MMX mit 166MHz

bbcode-image


und der Pentium MMX 166MHz fällt bei den Facets wieder raus weil er zum Sockel 7 gehört, der aber nicht durch die Facets abgedeckt sind:

* Sockel 3: 66Mhz und 100Mhz
* Sockel 4: keine Ergebnisse
* Sockel 5: 100MHz und 133MHz

bbcode-image


Man kann die Facets natürlich auch ohne vorgeschalteten Filter nutzen und so damit Daten für die Anzeige aufbereiten.

Auch kann man dieses ohne Probleme auch auf PHP oder Java portieren und gerade bei Java kann man mit Threads sicher eine sehr performante Lösung damit bauen.

JavaScript WebWorkerPool

Ich hab mir mal einen allgemeinen und für alle Zwecke geeigneten WebWorkerPool. Man kann die Anzahl der Worker skalieren, was auch bei den Test sich spürbar auswirkte. Auch eine ähnliche Weise sind nun auch die WebWorker auf [https://www.mp4togif.com]MP4toGIF.com[/url] implementiert, was auch da alles spürbar beschleunigt hat.

Beim eigentlichen WebWorker muss man nur das Antwort-Format einhalten:


{
result:{...},
index:0
}


Index ist der Index des Workloads und wurde in event.data.index übergeben wären der eigentliche Workload in event.data.workload zu finden
ist.


function WebWorkerPool(){
this.workerScript = "";
this.workerData = []; // {msg:{},callback:function}

this.callback = null; //global callback for workerData
this.finishCallback = null;

this.finishCounter=0;

this.worker = null;
this.workers = [];

this.callbackWrapper=function(controller){
return function(event){
controller.finishCounter--;
if(event.data.index && controller.workerData[event.data.index].callback){
controller.workerData[event.data.index].callback(event.data.result);
}
else if(controller.callback){
controller.callback(event.data.result);
}

if(controller.finishCounter == 0){
controller.finishCallback();
try{
controller.worker.close();
for(var iW=0;iW < controller.workers.length; iW++){
controller.workers[iW].close();
}
}
catch(e){

}
}
};
};

this.startSerial = function(){
this.startParallel(1);
};

this.startParallel = function(max){
if(!max){
max = 4;
}

this.finishCounter = this.workerData.length;
this.worker = new Worker(this.workerScript);
for(var iW=0; iW<max; iW++){
var worker = new Worker(this.workerScript);
worker.addEventListener('message', this.callbackWrapper(this), false);
this.workers.push(worker);
}

var factor = this.workerData.length / max;
for(var i=0;i<this.workerData.length;i++){
var workerIndex = Math.floor(i/factor);
this.workers[workerIndex].postMessage(
{
workload: this.workerData.msg,
index:i
});
}
};
}


man kann theoretisch jedem Workload eine eigene Callback-Function mit geben. Wobei eine allgemeine für alle wohl meistens reichen wird.
Wenn alle Workloads abgearbeitet sind wird die finale Callback-Function aufgerufen, um die Ergebnisse weiter zu verarbeiten.


Lumia 950

Nach ungefähr 1,75 Jahren wechsel ist jetzt von meinem Lumia 640 auf ein Lumia 950. Nachdem das Lumia 950 meiner Frau durch ein Moto Z Play ersetzt wurde, weil es nur noch Probleme machte, wurde es eingeschickt. Der Akku lief heiß, es lies sich nicht mehr Ausschalten ausschalten sondern startete immer gleich neu. Laden war ein Glücksspiel und auch das Anschließen an den PC klappt oft nicht.
Dann kam es mit neuen Mainboard wieder und ich habe mich dann entschieden, mein 640 durch das 950 zu ersetzen.
Der Umstieg war relativ einfach, weil die wichtigen Dinge über das MS-Konto synchronisiert wurden und auch Whatsapp fand ein Backup vom Vortag auf der SD-Karte.

bbcode-image


Aber es gibt auch andere Vorteile:

* Schnellere Kamera
* Extra Auslöse-Taste für die Kamera, wo durch man das Smartphone stabiler halten kann
* Bessere Low-Light Bilder
* 4K Video
* 2 SIM-Slots, wo durch ich Privat- und möglicher weise Freelancing-Nummer haben könnte, falls doch noch mal neue Aufträge kommen sollten
* USB 3.0 wo durch alles doch etwas schneller geht beim Bilder kopieren

Insgesamt ist der Vorteil, dass ich jetzt auch wenn ich keine DSLR dabei habe, ganz gute Fotos machen kann. 4K Video werde ich bei Zeiten mal Ausprobieren und mal gucken wie scharf und gut die Qualität wird, wenn man es dann auf FullHD runter rechnet.


Was und wann ist es eine Workstation?

In letzter Zeit scheint der Begriff Workstation wieder mal öfters aufzutreten. Gefühlt war dieser lange Zeit eigentlich Tod und Hersteller die auch auch als Hersteller von Workstations verstehen schienen auch zu verschwinden. Gefühlt ging es einher mit dem Verschwinden der RISC-Workstations und dem Aufkommen der Multi-Core CPUs im x86 und x86-64 Bereich. Viele die erst in den letzten 10 Jahren mit der professionellen IT zu tun hatten, kennen den Begriff Workstation oft nicht mal. Wenn sie hören, dass man Xeon-CPUs und keinen i3/i5/i7 verwendet hört man dann meist nur: "Ach, dass sind ja auch Server-CPUs...", was an sich aber falsch ist da Intel bis auf die E7 (vorher Xeon-7000) an sich nie CPUs gebaut hat, die rein für Server gedacht waren. Auch beim Itanium gab es Workstations und nicht nur HPC-Maschinen.

Aber was unterscheidet eine Workstation von einem normalen Desktop-PC? Wie erklärt man was eine Workstation anders macht als einen PC? Personen die noch mit Herstellern wie Sun, SGI oder DEC aufgewachsen sind, wissen einfach was eine Workstation ist. Es ist zwar eher ein Gefühl als etwas konkretes, aber man weiß dass es eine Workstation ist und dass sie scheiße teuer sein wird.

Früher (also Mitte bis Ende der 80er) gab es die 3M-Regel um eine Workstation zu definieren (passte aber auch nicht immer). Diese Regel besagt, dass alles was 1MB RAM, 1MIPS Rechenleistung und ein Display mit 1 Megapixel hat, als Workstation gelten kann.
Somit galten auch Rechner wie der Amiga 3000 und der Atari TT als Workstations. Für diese gab es jeweils ein entsprechendes Unix-Derivat. Damals gab es aber auch sowie so noch sehr viel mehr Unterscheidungen, denn es gab Homecomputer (C64, Atari ST, Amiga) und PCs (IBM PC-kompatibel und IBM PS/2 gehörten dazu), zusätzlich noch Workstations, Server (umgerüstete PCs, meist nur mit einer großen Festplatte ausgerüstet), Mini-Computer (das was jetzt ein Server ist nur etwas größer), Mainframes, Super-Computer, und noch ein paar Dinge mehr zum Terminal-Arbeitsplätze.

bbcode-image


Schon in den 80er gab es Versuche mit Intel 386er CPUs und Workstations. Ein Beispiel ist die Sun386i, aber wirklich durchsetzen konnte sich das Konzept nicht. Anfang bis Mitte der 90er änderte Sich aber vieles. Die Homecomputer starben aus und mit ihnen auch Firmen wie Atari und Commodore. Apple hatte große Probleme und IBM suchte verzweifelt nach einem System, dass man nicht so einfach kombinieren konnte. Neue Bus-Systeme wie EISA und MCA brachten dann PCs und Workstations immer weiter zusammen. Der PowerPC wurde in IBM-Workstations und Server verwendet, fand aber auch schnell bei Apple breite Verwendung.

bbcode-image


Und langsam begann Technologie aus dem RISC- und Workstation-Bereich in den PC-Bereich rüber zu schwappen. Mit dem Pentium wurde dann der PC auch von der Leistung her Konkurrenzfähig. Einer der ersten Hersteller von x86-Workstations war Intergraph. Deren Grafiklösungen fand man sonst eher in Alpha-Workstations von DEC, aber es gab auch Ausführungen für x86-Systeme und diese Grafiklösungen waren extrem leistungsfähig. Quake wurde von ID auf solchen Systemen entwickelt als OpenGL im Enduser-Bereich noch vollkommen unbekannt war.

Mit dem Pentium Pro (dem ersten P6 Prozessor von Intel) kam dann die Wendung im Workstation Bereich. Man konnte mit CPUs, die nur einen Bruchteil der RISC-Konkurrenz kosteten ein System bauen, dass fast oder auch oft genau so schnell war, wie eines der teuren Workstation-Systeme. Der P6 war auch die erste CPU, die für SMP Systeme mit bis zu 8 CPUS laufen konnte. Als es dann zum Pentium 2 ging (der Nachfolger des Pentium Pro und einigen Technologien aus dem Pentium MMX) kam man dann auch zu der oben eingangs gestellten Frage: "Ab wann ist ein PC eine Workstation?".

bbcode-image


Es gibt Workstation mit CPUs aus dem Desktop-Bereich. z.B. dem i5 oder i7. Ein PC an dem man arbeitet und der mehr als eine CPU (was dann nur Xeons oder Opterons sein können) hat ist also eindeutig eine Workstation und kein PC. An einem Server arbeitet man nicht direkt und der wird wohl in einem Rack eingebaut sein oder wenigstens in einem anderen Raum stehen. Was aber nicht besagt, dass der Server nicht auf normaler PC-Hardware basieren darf. Spezielle Grafiklösungen wie Quadros sprechen auch stark für eine Workstation Bei allem darunter ist es wohl einfach auch eine Definitionssache des Herstellers. Eine HP Z400 ohne Xeon ist an sich von der Hardware ein normaler PC.

bbcode-image


Wenn jemand den Xeon als Server-CPU bezeichnet hat er aber irgendwo auch wieder recht und dass ist der Punkt wie ich eine Workstation definieren würde. Ein PC der auf Hardware und Technologie aus dem Server-Bereich basiert. Wie ein Server soll eine Workstation hohe Performance liefern, über lange Zeit zuverlässig und stabil laufen. Sollte es zu einem Ausfall kommen, kostet jede Minute, die die Maschine nicht läuft bares Geld, weil es nicht einfach einen Ersatz gibt. Die Workstation muss also gut wartbar sein. Was bedeutet, dass Hardwarekonmponenten mit wenigen Handgriffen ausgetauscht werden kann.
Stabil wird das System durch hochwertige Komponenten und Hardware die extra Zertifizierte Treiber liefert und Fehlerkorrekturen wie ECC unterstützt.

Wenn ein PC so etwas alles erfüllt ist es eine Workstation. Wenn man einen Server nimmt und daran wie mit einem PC arbeitet, ist es auch eine Workstation.

bbcode-image


Wenn man also einen Rechner mit Xeon-CPU vor sich hat, muss es nicht unbedingt ein Server sein und wenn man sich einen guten PC zusammen bauen will, sollte man auch mal überlegen ob die Vorteile einer Xeon-CPU nicht auch dort für sich von Vorteil wären.

Projekt SMS2X gestartet

Mein neustes Projekt ist heute Abend gestartet. Es geht um ein Framework, dass SMS empfangen kann und diese dann anhand verschiedener Regeln wie Absender, Empfänger oder Inhalt an ein oder auch mehrere externe Systeme weiterleiten kann.
Diese Weiterleitung an andere System geschieht über Plugins, die auch dann die Daten aus der SMS aufbereiten sollen, so dass sie vom externen System verarbeitet werden können.
Einfache Plugins wie "in eine DB" schreiben, an einen REST-Service oder meine MessageDriven Bean schicken, werden direkt dann mitgeliefert.

Das Empfangen und Senden von einer SMS mit Java habe ich schon letzten Monat erfolgreich getestet, deswegen glaube ich, dass ich relativ schnell zu ersten Ergebnissen kommen werden. In den nächsten 2 Monaten hätte ich gerne den ersten brauchbaren Prototypen.

bbcode-image

Windows x86-Code auf ARM

x86 Code auf ARM

Windows NT war ja nie auf Intel-CPUs beschränkt. Auch wenn viele Plattformen nur in den Anfangen bis WinNT 4.0 unterstützt wurden und nur die Alpha-Plattform hätte fast noch Windows 2000 erhalten.

bbcode-image


Wobei in Deutschland neben den X86 und x86-64 Versionen eigentlich nur die PowerPC-Version (XBox 360) und die Alpha-Version von Bedeutung war, weil wirklich ein PC mit Alpha CPU und WinNT 4.0 im normalen Handel (Vobis) auftauchte.

Gut die ARM-Version für die kleinen Surfaces und Smartphones lief in Deutschland auch ganz gut, aber zum wirklichen Arbeiten musste man auch hier zu einem Surface Pro mit Intel CPU greifen.

Das Problem ist und war, dass es zu viele native Programme gibt, die nur für
eine CPU-Plattform kompiliert wurden und werden. Die Windows Universal App Plattform hat zu wenig Verbreitung und Java für Desktop-Anwendungen... naja.. der Zug ist meiner Meinung nach schon lange abgefahren.
Die Alpha-Plattform hatte hier den Vorteil, dass hier ein Win32 Emulator mitgeliefert wurde, der alle möglichen Windows Programme wie Office und so direkt ausführen konnte und dass wohl auch in einer wirklich guten Geschwindigkeit.

Im Endanwenderbereich gibt es momentan neben x86 und x86-64 nur noch ARM. Alles andere spielt kaum eine Rolle oder wird in eher speziellen Anwendungsgebieten eingesetzt, wo ein Windows nicht wirklich benötigt wird oder auch sinnvoll wäre.

Es gab schon PCs mit ARM CPUs und die waren wohl auch nicht schlecht zu den damaligen Zeiten. Es wird auch immer wieder über moderne Notebooks und PCs mit ARM-CPUs spekuliert, wobei hier nie wirklich was geschehen ist. Es gab eher Bestrebungen Aufgaben, die sonst von PCs erledigt werden, auf ARM Geräte zu verschieben.
ARM-Geräte sind meistens einfachere Tablets und Smartphones. Auf denen mit Anwendungen wie Word oder sogar Bildbearbeitungen und Videoschnitt zuarbeiten ist eigentlich kaum möglich. Eine externe Tastatur hilft, eine Maus bring schon mehr und am Ende ist das Display bei den Smartphones auf jeden Fall zu klein.

Microsoft hat Continuum entwickelt, welches das Smartphone in einen kleinen PC verwandelt, wenn man eben Monitor, Maus, Tastatur, etc an das Smartphone anschließt.
Es gibt eine Art Desktop und die Anwendungen passen sich soweit an, dass man sie besser und vor allem schneller bedienen kann.

Soweit klingt alles ganz toll. Ein Gerät, das man mobil und stationär verwenden kann und dass sich der jeweiligen Umgebung anpasst. Nintendo geht mit der Switch ja in eine ähnliche Richtung.

Aber am Ende fehlt immer irgend eine Windows-Anwendung die es nur für Intel-CPUs gibt und wegen der man dann eben doch bei PC und Smartphone bleibt.
Nun hat Microsoft einen performanten Emulator für immerhin Win32 Anwendungen entwickelt der auch ARM Geräten läuft. Damit könnte man also auf dem Smartphone, dann auch Win32 Anwendungen wie Photoshop oder kleine Spiele laufen lassen.
Das wäre dann auch ein Grund wieder bei den mobilen Geräten zu Windows zu wechseln, weil man damit dann wirklich ein kleines Notebook oder einen kleinen PC einsparen könnte und mit dem Smartphone viele Bereich abdecken könnte, die momentan nur von PCs oder den großen Tablets bedient werden können.

Es ist spannend und würde mal wieder etwas mehr Bewegung in den PC-Markt bringen.

Jetzt fehlen nur noch extrem gut skalierende CPUs und Kühllösungen, die es ermöglichen im mobilen Betrieb stromsparend und kühl zu arbeiten und im stationären oder Dockingstation-Betrieb dann viel Leistung bringen zu können.
Aber auch bei Thema kann man wohl mal auf Nintendos Switch Konsole gespannt sein.

Modules und der Composer-Autoloader

Man kann nicht nur über die composer.json den Autoloader befüllen. Wenn man z.B. Module hat die nicht über den Composer installiert werden sondern aus einem Verzeichnis geladen werden, müsste man die Einträge per Hand vornehmen, was aber nicht wirklich ideal ist.


$autoloader = require_once("../vendor/autoload.php");

foreach(ModuleFactory->getModuleList("modules/") as $module){
if(is_dir($module->getPath() . "/deploy/classes")){
$autoloader->addPsr4($module->getName()."\", $module->getPath() . "/deploy/classes");
}
}


Damit kann schnell und einfach alle Klassen des Modules hinzufügen und muss keinen eigenen ClassLoader schreiben.

Es ist natürlich langsamer als die über "dump-autoload" angelegten Mappings, aber dafür auch sehr viel flexibler.

AVM DVB-C Repeater als DVB-T Ersatz

DVB-T wird abgeschaltet. Das ist nicht schön, weil doch viele es nutzen. Nicht dass es besonders gut funktioniert hätte oder eine gute Bildqualität geliefert hätte. Viele hatten doch eher öfters Empfangsprobleme, wenn die Wände mal stabiler waren. Aber es war doch besser als Kabel für DVB-C oder DVB-S durch die Wohnung zu verlegen. Gerade wenn man zur Miete wohnt, kann man nicht vernünftig in jeden Raum so ein Kabel legen.

DVB-T2 ist an sich keine alternative, weil hier für die privaten Sender eine monatliche Gebühr fällig wird, was
sich wohl im Jahr auf so 70 Euro aufsummieren wird. Meiner Erfahrung nach setzen die wenigstens Haushalte rein auf DVB-T und es sind zu meist nur 2. oder 3. Geräte, die keinen direkten anderen Anschluss finden, die über DVB-T betrieben werden.

Bei mir war es ein DBV-T Stick an dem PC meiner Frau, der in paar Monaten nutzlos sein würde. Ein Kabel für DVB-C oder überhaupt ein weiteres Kabel dahin zu legen ist sehr suboptimal. LAN geht über das Stromkabel und ansonsten wird für alles so weit wie möglich nur WLAN verwendet. Nur im Arbeitszimmer intern gibt es richtiges LAN mit einem Switch und vielen Kabeln.

Ich kam dann auch die Idee das TV-Signal zu streamen. Es gibt mehrere fertige Lösungen dafür, so dass ich keinen Streaming Server selbst zusammen bauen musste. Die scheinbar beste Lösung kam von AVM. Der AVM FRITZ!WLAN Repeater DVB-C kann zwei Streams liefern und integriert sich direkt in das WLAN als Repeater so dass man ihn nur an die Steckdose stecken muss das Kabel für das TV-Signal verbinden muss. Ein T-Adapter ist auch gleich dabei.

bbcode-image

bbcode-image

bbcode-image


Also so einen bestellt. Die Installation ging sehr einfach. Hardware war innerhalb von 2 Minuten installiert.

bbcode-image


Dann mit dem WLAN des Repeater verbunden und http://fritz.repeater aufgerufen.

bbcode-image


Über das Menü kann man das Gerät dann in das vorhandene WLAN integrieren (man könnte auch ein LAN-Kabel verwenden oder ein weiteres WLAN nur damit einrichten).
Dann lief der Sendersuchlauf und kurz darauf waren alle Sender gefunden.

Dann folgte der komplexe Teil. Nämlich den Stream zu den Geräten zu bekommen. In der Senderübersicht des Gerätes kann man sich eine Senderliste als m3u-Datei erzeugen lassen und diese im VLC laden. Der listet dann alle Sender auf und man kann die jeweiligen Streams öffnen. Funktionierte gleich sehr gut und stabil. Die Qualität ist auf jeden Fall besser als DVB-T.

bbcode-image


Im Schlafzimmer steht noch ein TV-Gerät, das zwar über DVB-C angeschlossen war, aber dort immer Aussetzer im Stream hatte während die Streams über den Amazon Fire TV Stick problemlos liefen. Apps für TV-Streams der Pro7/Sat.1 Sender gibt es, aber die ganzen anderen Sender würden fehlen. VLC für den Fire Stick kann zwar auf alle möglichen Netzwerk und NAS Freigaben zugreifen, aber nichts mit der m3u-Datei anfangen.

bbcode-image


AVM bietet die FritzAppTV an, die aber erstmal nur über den Google Play-Store und iTunes zu bekommen ist. Aber zum Glück gibt es die APK direkt von AVM auch direkt als Download auf dieser Seite.

Jetzt muss man diese APK nur noch auf dem Fire TV Stick installieren. Das ist zum Glück auch sehr einfach. Bei den Einstellungen des Sticks die beiden Optionen in den Entwicklereinstellungen aktivieren. Dann habe ich mit Hilfe dieser Anleitung und der dort angebotenen Programme zum Download angebotenen Programme (Bei der Installation auf Addware achten! und es wird dann nur eine FTV.zip Datei "installiert") die APK auf dem Stick installiert. Die App tauchte dort direkt auf und lies sich ohne Probleme starten.

bbcode-image


bbcode-image


Streams laufen gut und auch hier stimmt die Bildqualität.

Damit kann DVB-T jetzt abgeschaltet werden ohne dass es uns noch irgendwie interessieren würde und als Nebeneffekt ist die Bildqualität und die Stabilität der Streams sehr viel besser geworden.

Older posts: