Die Digitalo Masche

Wer kennt digitalo.de ?

Ich hatte mir dort eine TV Karte bestellt und ein SATA Kabel.
Vor ca. 1 Monat.

1. Panne
Die Lieferung wurde falsch adressiert.
Ich bin Einzelunternehmer, als solcher darf ich meinen Firmennamen nicht ohne meinen vollständigen Namen bei Briefwechsel verwenden. Ich hatte dort also ein Konto als Firma eröffnet.
Die Sendung kam nicht an weil mein Name nicht dranstand und ich keinen Firmennamen am Briefkasten habe, denn das ist überflüssig, da ich ja ohnehin immer meinen Namen angeben muss.
Ich hatte noch versucht die Sendung abzufangen, hatte mit der Post telefoniert.
Und es gab einen Emailwechsel mit dem Support von digitalo.

Ich hatte per Paypal gezahlt das ich z.Zt. keine Überweisungen tätigen kann.

Die zweite Sendung kam dann an, alles ok, Ware in Ordnung.

2. Panne
Vor einigen Tagen bekomme ich eine Mahnung per Email. Ich schaue nach und sehe tatsächlich wurde am 25. Juni 2013 das Geld zurückgeschickt auf mein Paypal Konto.
Ich antwortete auf die Email und meinte das ich z.Zt. keine Möglichkeit habe außer mit Paypal die Transaktion zu machen.
Es gab keine Antwort.
Also frage ich nochmal nach.
Die Antwort war, ich soll das per Banküberweisung machen.
Also schrieb ich wieder das ich keine Möglichkeit außer Paypal habe im Moment und erklärt warum.
Ich hatte meinen Reisepass verloren und das vor einigen Tagen beim Ordnungsamt gemeldet.
Der Mann oder die Frau meinte das ich mich mit dem Schein vom Ordnungsamt ausweisen könne.
Und das es ja noch die Möglichkeit der Bareinzahlung gibt.
Tja ich sehe aber nicht ein das mir durch ihren Fehler Extrakosten entstehen.
Ich habe diese Lage nicht verschuldet, sondern sie indem Sie mir das Geld zurückschickten.
Der Mann oder die Frau drohte damit das Mahnverfahren weiterlaufen zu lassen.
Gut, wenn das so ist, ich kann auch anders. Also drohte ich jetzt damit einen Betrugsversuch zur Anzeige zu bringen.
Denn das ist es, ein Betrugsversuch.
Es gibt kein Entgegenkommen bei der von denen verschuldeten Sache.
Ich werde behandelt wie ein Schuldner obwohl ich meinen Teil erfüllt hatte.
Ist das mein Problem wenn sie mir das Geld das ich überwiesen hatte zurückschicken, ist das meine Schuld?
So wie ich das sehe versuchen sie Mahngebühren abzukassieren und das sehe ich als Betrugsversuch und sollten von ihrer Seite Mahngebühren erhoben werden werde ich das zur Anzeige bringen.
Ich bin bereit ihnen den Betrag zukommen zu lassen, wenn sie aber die z.Zt. einzige Möglichkeit nicht akzeptieren ist das wiederholt nicht meine Schuld und sie werden sich gedulden müssen bis ich beim Konsulat war, was ich morgen vor habe zu erledigen.
Und dann bekomme ich evtl. einen Schein mit dem ich mich ausweisen kann.
Helden der Arbeit.

Aber was ich noch machen werde, ich werde überall wo man diesen Shop bewerten kann eine Negative Bewerung abgeben. Denn so lasse ich mit mir nicht umgehen.

Und um noch etwas hinzuzufügen. Ich hatte mein Leben lang noch NIE bei irgendwem Schulden. Es ist für mich eine Charaktersache und einfach logisch das man seine Schulden begleicht. Ich war immer derjenige der anderen Leuten Geld leiht und auf das begleichen seiner offenen Rechnungen pochen musste. Und da war ich immer entgegenkommend.
Was die hier abziehen ist unter aller Sau.

KabelBW und Google

Ich bin KabelBW Kunde. Ich habe ein erzwungenes ds-lite. Ich habe auch einen DNS Server vom Anbieter vorgegeben eingestellt.

Mit FritzOS 05.50 kann ich den aber einstellen, ändert aber nichts daran das ich dem DNS von KabelBW nicht mehr trauen kann. Wenn jemand schon die Funktionen der Fritz Box beschneidet ist das auch kein Wunder. Und so wie die Vertreter sich damals aufgeführt hatten von wegen aggressiv und “wir haben das Kabel Monopol in Baden Württemberg” kann man eigentlich schon darauf schließen das sie nicht das Beste des Kunden im Sinn haben. Dazu kommt die Augenwischerei mit der “WLAN Option”. Man nimmt ja an die Fritz Box ist ein Erwerb, wie es bei DSL Anbietern so üblich ist, man zahlt etwas mehr und bekommt ein besseres Modell, nicht so bei KabelBW, man zahlt dafür das eine Konfigurationsdatei die übermittelt wird so aussieht das sie nicht die Funktion “WLAN” abstellt.

Also, tacheles:

Fragen wir mal den von KabelBW voreingestellten DNS Server nach der v4 IP von google.com

dig google.com @2a02:8070::201:82:212:62:62

; <<>> DiG 9.9.2-P2 <<>> google.com @2a02:8070::201:82:212:62:62
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63032 ;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 1452 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 189 IN A 109.193.193.20 google.com. 189 IN A 109.193.193.30 google.com. 189 IN A 109.193.193.25 google.com. 189 IN A 109.193.193.59 google.com. 189 IN A 109.193.193.44 google.com. 189 IN A 109.193.193.54 google.com. 189 IN A 109.193.193.39 google.com. 189 IN A 109.193.193.29 google.com. 189 IN A 109.193.193.49 google.com. 189 IN A 109.193.193.55 google.com. 189 IN A 109.193.193.34 google.com. 189 IN A 109.193.193.24 google.com. 189 IN A 109.193.193.45 google.com. 189 IN A 109.193.193.40 google.com. 189 IN A 109.193.193.50 google.com. 189 IN A 109.193.193.35 ;; Query time: 9 msec ;; SERVER: 2a02:8070:0:201:82:212:62:62#53(2a02:8070:0:201:82:212:62:62) ;; WHEN: Fri Jun 14 21:13:33 2013 ;; MSG SIZE rcvd: 295

Und jetzt fragen wir mal Google selbst nach ihrer v4 IP von google.com

dig google.com @8.8.8.8

; <<>> DiG 9.9.2-P2 <<>> google.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 38439 ;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 300 IN A 173.194.70.138 google.com. 300 IN A 173.194.70.139 google.com. 300 IN A 173.194.70.102 google.com. 300 IN A 173.194.70.101 google.com. 300 IN A 173.194.70.100 google.com. 300 IN A 173.194.70.113 ;; Query time: 41 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Fri Jun 14 21:02:56 2013 ;; MSG SIZE rcvd: 135

Was ist das?

Fragen wir mal wem die IP 109.193.193.35 gehört.

dig -x 109.193.193.35

; <<>> DiG 9.9.2-P2 <<>> -x 109.193.193.35
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 50403 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;35.193.193.109.in-addr.arpa. IN PTR ;; ANSWER SECTION: 35.193.193.109.in-addr.arpa. 73932 IN PTR HSI-KBW-109-193-193-035.hsi7.kabel-badenwuerttemberg.de. ;; AUTHORITY SECTION: . 56376 IN NS l.root-servers.net. . 56376 IN NS i.root-servers.net. . 56376 IN NS d.root-servers.net. . 56376 IN NS a.root-servers.net. . 56376 IN NS m.root-servers.net. . 56376 IN NS j.root-servers.net. . 56376 IN NS k.root-servers.net. . 56376 IN NS f.root-servers.net. . 56376 IN NS c.root-servers.net. . 56376 IN NS g.root-servers.net. . 56376 IN NS b.root-servers.net. . 56376 IN NS e.root-servers.net. . 56376 IN NS h.root-servers.net. ;; Query time: 13 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Fri Jun 14 21:16:04 2013 ;; MSG SIZE rcvd: 336

HSI-KBW-109-193-193-035.hsi7.kabel-badenwuerttemberg.de

Ja hier oben steht 127.0.0.1, ich forwarde die DNS abfragen an die Fritz Box und die Forwarded an die Voreingestellten DNS Server.

Noch Fragen?

Darf das KabelBW? Datenschutz? Privatsphäre?

Update:
Das wird ja immer krasser.

dig google.com @8.8.8.8

; <<>> DiG 9.9.2-P2 <<>> google.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27787 ;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 189 IN A 109.193.193.29 google.com. 189 IN A 109.193.193.39 google.com. 189 IN A 109.193.193.59 google.com. 189 IN A 109.193.193.44 google.com. 189 IN A 109.193.193.55 google.com. 189 IN A 109.193.193.49 google.com. 189 IN A 109.193.193.35 google.com. 189 IN A 109.193.193.40 google.com. 189 IN A 109.193.193.30 google.com. 189 IN A 109.193.193.34 google.com. 189 IN A 109.193.193.54 google.com. 189 IN A 109.193.193.20 google.com. 189 IN A 109.193.193.50 google.com. 189 IN A 109.193.193.25 google.com. 189 IN A 109.193.193.45 google.com. 189 IN A 109.193.193.24 ;; Query time: 18 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Sat Jul 6 16:30:44 2013 ;; MSG SIZE rcvd: 295


dig google.com @2001:4860:4860::8888

; <<>> DiG 9.9.2-P2 <<>> google.com @2001:4860:4860::8888
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 47393 ;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 512 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 300 IN A 109.193.193.44 google.com. 300 IN A 109.193.193.55 google.com. 300 IN A 109.193.193.35 google.com. 300 IN A 109.193.193.54 google.com. 300 IN A 109.193.193.40 google.com. 300 IN A 109.193.193.50 google.com. 300 IN A 109.193.193.39 google.com. 300 IN A 109.193.193.34 google.com. 300 IN A 109.193.193.20 google.com. 300 IN A 109.193.193.29 google.com. 300 IN A 109.193.193.45 google.com. 300 IN A 109.193.193.25 google.com. 300 IN A 109.193.193.30 google.com. 300 IN A 109.193.193.59 google.com. 300 IN A 109.193.193.49 google.com. 300 IN A 109.193.193.24 ;; Query time: 18 msec ;; SERVER: 2001:4860:4860::8888#53(2001:4860:4860::8888) ;; WHEN: Sat Jul 6 16:34:32 2013 ;; MSG SIZE rcvd: 295


dig google.com @208.67.222.222

; <<>> DiG 9.9.2-P2 <<>> google.com @208.67.222.222
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40371 ;; flags: qr rd ra; QUERY: 1, ANSWER: 16, AUTHORITY: 0, ADDITIONAL: 1 ;; OPT PSEUDOSECTION: ; EDNS: version: 0, flags:; udp: 4096 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 300 IN A 109.193.193.39 google.com. 300 IN A 109.193.193.50 google.com. 300 IN A 109.193.193.34 google.com. 300 IN A 109.193.193.24 google.com. 300 IN A 109.193.193.29 google.com. 300 IN A 109.193.193.44 google.com. 300 IN A 109.193.193.25 google.com. 300 IN A 109.193.193.40 google.com. 300 IN A 109.193.193.35 google.com. 300 IN A 109.193.193.30 google.com. 300 IN A 109.193.193.55 google.com. 300 IN A 109.193.193.20 google.com. 300 IN A 109.193.193.49 google.com. 300 IN A 109.193.193.54 google.com. 300 IN A 109.193.193.45 google.com. 300 IN A 109.193.193.59 ;; Query time: 15 msec ;; SERVER: 208.67.222.222#53(208.67.222.222) ;; WHEN: Sat Jul 6 16:43:52 2013 ;; MSG SIZE rcvd: 295

208.67.222.222 ist die OpenDNS IP

Was geht eigentlich ab?

Was auch interessant ist, nachdem ich was von wegen DNS in ihrem Forum geschrieben hatte, und der Beitrag wurde geschlossen, hatte die Fritzbox am nächsten Tag FritzOS 5.50 drauf, nicht mehr 05.24.

Das selbe von einem Hetzner Server

# dig google.com

; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> google.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 382 ;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 116 IN A 173.194.113.9 google.com. 116 IN A 173.194.113.4 google.com. 116 IN A 173.194.113.1 google.com. 116 IN A 173.194.113.5 google.com. 116 IN A 173.194.113.3 google.com. 116 IN A 173.194.113.8 google.com. 116 IN A 173.194.113.0 google.com. 116 IN A 173.194.113.14 google.com. 116 IN A 173.194.113.2 google.com. 116 IN A 173.194.113.7 google.com. 116 IN A 173.194.113.6 ;; Query time: 3 msec ;; SERVER: 213.133.98.98#53(213.133.98.98) ;; WHEN: Sat Jul 6 16:37:40 2013 ;; MSG SIZE rcvd: 204 # dig google.com @208.67.222.222 ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> google.com @208.67.222.222
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57984 ;; flags: qr rd ra; QUERY: 1, ANSWER: 11, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;google.com. IN A ;; ANSWER SECTION: google.com. 172 IN A 173.194.113.104 google.com. 172 IN A 173.194.113.102 google.com. 172 IN A 173.194.113.103 google.com. 172 IN A 173.194.113.96 google.com. 172 IN A 173.194.113.99 google.com. 172 IN A 173.194.113.105 google.com. 172 IN A 173.194.113.98 google.com. 172 IN A 173.194.113.110 google.com. 172 IN A 173.194.113.97 google.com. 172 IN A 173.194.113.101 google.com. 172 IN A 173.194.113.100 ;; Query time: 20 msec ;; SERVER: 208.67.222.222#53(208.67.222.222) ;; WHEN: Sat Jul 6 16:46:04 2013 ;; MSG SIZE rcvd: 204

und bevor jetzt jemand sagt "Das liegt an dem 6in4 Tunnel!"
nein tut es nicht, denn leite ich DNS Anfragen an meinen Server weiter bekomme ich andere IPs

Update:
Ok, angeblich ist das wegem Googles Global Content Cache.
Das erklärt aber nicht wirklich wieso Anfragen an öffentliche DNS gefaket werden.

Update 17.03.2013:
Die KabelBW DNS liefern die gewohnten IP Adressen.
Ob diese aber gespooft sind ist fraglich, denn die Anfragen an den DNS liefern keine autoritativen Antworten.
Bei Hetzner werden diese geliefert, beim KabelBW DNS nicht, die IP-Adressen unterscheiden sich außerdem.

redmine uwsgi nginx on freebsd

Took me 3 days to figure this out. Full, mind draining days.
If I were paid to do this this info would cost at least 1200 EUR.

This is for versions:
FreeBSD 9.1
uwsgi 1.9.12
nginx 1.4.1
redmine 2.3.1

You’re pretty much left on your own in FreeBSD. Google results are terrible.

1. Problem: Rubygems fail on rdoc creation.

Solution:
modify /etc/make.conf

NOPORTDOCS=yes

2. Problem: FreeBSD’s uwsgi port only uses the default buildconf and doesn’t build the rack plugin.

I have installed every dependant port and I don’t know how to turn off warnings as errors. Did I mention that I really hate this nontransparent Makefile system? I hate it.
The LUA plugin doesn’t compile at all, can’t find lua.h
The transformation_toupper, xslt, ssi and v8 plugins display warnings so they fail to compile.
After compiling mono and openjdk uwsgi complains that it can’t find the libjvm.so and uwsgi.dll.
So it comes down to stripping everything down to what works.

The buildconf file. I have saved it in /root/default.ini

[uwsgi]
main_plugin = python,gevent,psgi,php,rack,coroae,cgi,webdav
inherit = base

Note:
You have to compile PHP with the embed sapi so it builds the libphp5.so


cd /usr/ports/www/uwsgi
make patch
cp /root/default.ini work/uwsgi-1.9.12/buildconf/default.ini
make install clean

3. Problem: uwsgi configuration

mkdir -p /usr/local/etc/uwsgi
mkdir -p /var/log/uwsgi

/etc/rc.conf

uwsgi_enable="YES"
uwsgi_profiles="redmine"
uwsgi_redmine_flags="--yaml /usr/local/etc/uwsgi/redmine.yaml"

/usr/local/etc/uwsgi/redmine.yaml

uwsgi:
master: 1
processes: 4
logto: /var/log/uwsgi/redmine.log
rack: /usr/local/www/redmine/config.ru
post-buffering: 4096
env: RAILS_ENV=production

Yes the socket: is missing because the init script takes care of that (grr!)
The socket is autonamed /tmp/uwsgi-redmine.sock

For redmine installation check the official docs. They work.

4. Problem: nginx configuration


cd /usr/local/etc/nginx
mkdir vhosts
touch vhosts/redmine.conf

/usr/local/etc/nginx/nginx.conf

user www;
worker_processes 2;

events {
worker_connections 1024;
}

http {
include mime.types;
default_type application/octet-stream;
sendfile on;
keepalive_timeout 65;
include vhosts/*.conf;
}

/usr/local/etc/nginx/vhosts/redmine.conf

server {
listen 80;
server_name redmine.server; # I have a local tld, add more server aliases if you need public access

location / {
root "/usr/local/www/redmine/public";
include uwsgi_params;
uwsgi_modifier1 7;
if (!-f $request_filename) {
uwsgi_pass unix:/tmp/uwsgi-redmine.sock;
}
}
}

/etc/rc.conf

nginx_enable="YES"


service uwsgi start
service nginx start

Mindfuck galore, HTH
Linux > FreeBSD except for ZFS root which is a major pain in the ass on Linux

Fixe Idee: 100GE Stadtnetze

Ich frage mich wieso wir Bürger nicht einfach selber ein Stadtnetz aufziehen statt alles privaten Unternehmen zu überlassen. Ich frage mich auch was sowas kosten würde in der Anschaffung und Instandhaltung. Und weiter wenn jede Stadt ein Bürgernetz und alle Netze untereinander verbunden sind. So das ich in, in meinem Fall Göppingen, mit jemandem in Hamburg Daten tauschen kann. Und alle Bürgernetze haben dann Knoten zu den Netzen der Nachbarländer oder sind an de-cix angebunden wegen globalem Routing. Oder man legt die Kabel selbst bzw schickt die Satelliten hoch oder baut die Funkmasten usw.

Und wie würde so ein Bürgernetz aussehen? Jede Wohnung in jedem Haus hätte einen 10GE oder 100GE Anschluss (Kostenfaktor). Wegen mir hat jedes Haus einen 100GE Anschluss. Man legt ein Kabel von Haus zu Haus. Oder man sagt jeder Haushalt soll min 1GE haben und an einem 100GE dürfen maximal 100 oder genau 100 Haushalte. Und so verbindet man jeden 100GE Knoten mit dem nächsten bis alle Haushalte untereinander verbunden sind. Das Routet man nach außen vorerst mal über de-cix. Im internen Stadtnetz kann man dann einfach untereinander Daten tauschen. Möchte man z.B. Daten anbieten stellt man eine Kiste hin und schließt die an die Haushaltsleitung an und konfiguriert dann seine Dienste. Jeder Haushalt bekommt ein /64 v6 subnet.
Braucht man 2 Knoten pro 100 Haushalte? Wenn einer Ausfällt.
Ist natürlich erst eine Rohe Idee.

UPDATE:

a wie die Kosten dann letztendlich aussehen würden werde ich mal versuchen in der nächsten Zeit herauszufinden. Man findet kaum Infos darüber was 100GE so kostet. Wo hast du das mit den 10k€ her?
Ein CISCO Repeater 36k$. Denke die Preise werden da noch Purzeln. Reichweite 10km ca. dürfte reichen um Städte miteinander zu verbinden. Dann sehe ich auf der Seite ein 2 Port Switch Modul das 45k$ kostet. Gut einigen wir uns auf 14.000 Haushalte.
100GE = 100 Haushalte pro 1x100GE = 140x100GE. Auf der Seite costcentral gibts Bundles, da steht aber nicht dran ob die 10GE oder 100GE sind, wie auch immer der höchstpreis ist 165k$. Das sind 14000 Haushalte. 16 Ports x 2 = 32 Ports, aber 16 Module. Ein 2 Port Modul übrig um das ganze an die nächste Stadt weiterzuleiten.
Hey wir sind nicht kleinlich also machen wir doch einfach 400k€ draus mit Kabel und den 1GE Ports und installation und sowieso weil gutes Wetter ist. 400k€ für Hardware mit 1 Jahr Garantie.
Macht 400k€ im Jahr auf 14k Haushalte = 28,57€ im Jahr / Haushalt. Das ist gaaarnix.
Ich zahl bei KabelBW mit meinem Tarif 480€ im Jahr.
Gut ich manage das und will dafür 5k€ im Monat, also 60k€ im Jahr.
Hab noch 5 Freelance Servicekräfte die pro Einsatz 100-300€ kosten. Rechnen wir mit 300€ pro Servicekraft. Sind 1500€ im Monat oder 18000€ im Jahr. Das macht 34,14 € im Jahr pro Haushalt. Oder 2,85€ im Monat pro Haushalt aufgerundet.
Selbst wenn es das 5fache kosten würde wären das 14,22 € im Monat pro Haushalt. Durchaus guter Preis für eine Full Duplex 1GE Leitung.
Fazit Bürgernetz ist durchaus möglich und günstiger als von Privatanbietern. Über 100% günstiger im absolut schlechtesten Fall und mit 20facher VDSL Bandbreite im Download und 100facher im Upload. Und keine zusätzlichen Traffickosten.

Hab ich was übersehen?

Die Anwort ist ja, ich hab was übersehen.
Man braucht 8,75 * so viel Hardware.
Da wären wir bei unseren großzügigen 400k * 8,75 = 3,5 millionen euro.
3,5 millionen euro / 14000 Haushalte macht im Jahr 250€.
Oder im Monat 20,88€ was noch immer günstiger ist als von Privaten.
Und das sind die Anschaffungskosten weil wir mit 1 Jahr Garantie rechnen auf die Hardware.
Wir nehmen also an das wir jedes Jahr neue Hardware kaufen. Davon geht diese Kalkulation aus.

Symfony2 File Upload with Related Entities

Here is how I do it, thank me later.

What it does? Upload an image file and an audio file and add an encode job.
The purpose is to join an image and a mp3 into a mkv file x264 encoded with ffmpeg.
But this here is only to upload the files and add the related entities. Yes I am very proud of myself for having accomplished this even if it was extremely more complicated than just doing it in PHP.

Entities:

Encodejob

id;
}

/**
* Set video
*
* @param string $video
* @return Encodejob
*/
public function setVideo($video)
{
$this->video = $video;

return $this;
}

/**
* Get video
*
* @return string
*/
public function getVideo()
{
return $this->video;
}

/**
* Set finished
*
* @param boolean $finished
* @return Encodejob
*/
public function setFinished($finished)
{
$this->finished = $finished;

return $this;
}

/**
* Get finished
*
* @return boolean
*/
public function getFinished()
{
return $this->finished;
}

/**
* Set image
*
* @param \Dalu\MediaBundle\Entity\Image $image
* @return Encodejob
*/
public function setImage(\Dalu\MediaBundle\Entity\Image $image = null)
{
$this->image = $image;

return $this;
}

/**
* Get image
*
* @return \Dalu\MediaBundle\Entity\Image
*/
public function getImage()
{
return $this->image;
}

/**
* Set audio
*
* @param \Dalu\MediaBundle\Entity\Audio $audio
* @return Encodejob
*/
public function setAudio(\Dalu\MediaBundle\Entity\Audio $audio = null)
{
$this->audio = $audio;

return $this;
}

/**
* Get audio
*
* @return \Dalu\MediaBundle\Entity\Audio
*/
public function getAudio()
{
return $this->audio;
}

public function setUploadedAudio(UploadedFile $uploaded_audio = null)
{
$this->uploaded_audio = $uploaded_audio;
return $this;
}

public function getUploadedAudio()
{
return $this->uploaded_audio;
}

public function setUploadedImage(UploadedFile $uploaded_image = null)
{
$this->uploaded_image = $uploaded_image;
return $this;
}

public function getUploadedImage()
{
return $this->uploaded_image;
}
}

Image

path ? null : $this->getUploadRootDir() . '/' . $this->path;
}

public function getWebPath()
{
return null === $this->path ? null : $this->getUploadDir() . '/' . $this->path;
}

protected function getUploadRootDir()
{
// the absolute directory path where uploaded
// documents should be saved
return __DIR__ . '/../../../../web/' . $this->getUploadDir();
}

protected function getUploadDir()
{
// get rid of the __DIR__ so it doesn't screw up
// when displaying uploaded doc/image in the view.
return 'media/image';
}

/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}

/**
* Set filename
*
* @param string $filename
* @return Image
*/
public function setFilename($filename)
{
$this->filename = $filename;

return $this;
}

/**
* Get filename
*
* @return string
*/
public function getFilename()
{
return $this->filename;
}

/**
* Set path
*
* @param string $path
* @return Image
*/
public function setPath($path)
{
$this->path = $path;

return $this;
}

/**
* Get path
*
* @return string
*/
public function getPath()
{
return $this->path;
}
}

Audio

path ? null : $this->getUploadRootDir() . DIRECTORY_SEPARATOR . $this->path;
}

public function getWebPath()
{
return null === $this->path ? null : $this->getUploadDir() . '/' . $this->path;
}

protected function getUploadRootDir()
{
// the absolute directory path where uploaded
// documents should be saved
return __DIR__ . '/../../../../web/' . $this->getUploadDir();
}

protected function getUploadDir()
{
// get rid of the __DIR__ so it doesn't screw up
// when displaying uploaded doc/image in the view.
return 'media/audio';
}

/**
* Get id
*
* @return integer
*/
public function getId()
{
return $this->id;
}

/**
* Set filename
*
* @param string $filename
* @return Image
*/
public function setFilename($filename)
{
$this->filename = $filename;

return $this;
}

/**
* Get filename
*
* @return string
*/
public function getFilename()
{
return $this->filename;
}

/**
* Set path
*
* @param string $path
* @return Image
*/
public function setPath($path)
{
$this->path = $path;

return $this;
}

/**
* Get path
*
* @return string
*/
public function getPath()
{
return $this->path;
}
}

Form

add('video','text',array(
'attr' => array(
'class'=> 'input-xxlarge'
)))
->add('uploaded_image','file',array(
'attr' => array(
'class'=> 'input-xxlarge'
)))
->add('uploaded_audio','file',array(
'attr' => array(
'class'=> 'input-xxlarge'
)))
;
}

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
$resolver->setDefaults(array(
'data_class' => 'Dalu\MediaBundle\Entity\Encodejob'
));
}

public function getName()
{
return 'dalu_mediabundle_encodejobtype';
}
}

Controller

getDoctrine()->getRepository('DaluMediaBundle:Encodejob')->findAll();
return array(
'jobs' => $jobs
);
}

/**
* @Route("/new", name="media_encode_new")
* @Template()
*/
public function newAction()
{
$entity = new Encodejob();
$form = $this->createForm(new EncodejobType(), $entity);

return array(
'entity' => $entity,
'form' => $form->createView()
);
}

/**
* @Route("/create", name="media_encode_create")
* @Method("POST")
* @Template()
*/
public function newpostAction(Request $request)
{
$entity = new Encodejob();
$form = $this->createForm(new EncodejobType(), $entity);

$form->bind($request);

if ($form->isValid())
{
$em = $this->getDoctrine()->getManager();
$image = new Image();
$audio = new Audio();

$uploaded_image = $form->get('uploaded_image')->getData();
$uploaded_audio = $form->get('uploaded_audio')->getData();

$image->setFilename($uploaded_image->getClientOriginalName()); //TODO: Bild umbenennen
$audio->setFilename($uploaded_audio->getClientOriginalName()); //TODO: Audio umbenennen

$date = new \DateTime();
$image->setPath($date->format('Y/m/d'));
$audio->setPath($date->format('Y/m/d'));

$uploaded_image->move($image->getAbsolutePath());
$uploaded_audio->move($audio->getAbsolutePath());

$entity->setImage($image);
$entity->setAudio($audio);

$em->persist($image);
$em->persist($audio);

$em->persist($entity);
$em->flush();

return $this->redirect($this->generateUrl('media_encode_index'));
}

return array(
'entity' => $entity,
'form' => $form
);
}

}

new.html.twig

{% extends 'DaluThemeBundle::bootstrap.html.twig' %}
{% block body %}

{{ form_widget(form) }}

{% endblock %}