Archiv

Archiv für die Kategorie ‘Technik’

nGinx und H.264 / MP4 Streaming

24. Juli 2010 Manuel Keine Kommentare

Ich bin durch Zufall darauf gestoßen, das man ab Flash 10 nun H.264 Videos durch Flash streamen lassen kann. Klar man kann nun auf die HTML5 Tags umschwenken , aber ich möchte das gerade wenig versierte PC Anwender auch meine Videos (da es sich um Hilfe-Videos handelt) sehen können. Kurz gegoogled und ein passendes Addon für nGinx (geht auch mit Apache, lighttpd, etc.) gefunden: Code-Shop

Das ganze dann wie im Wiki beschrieben gemacht und zack – Fehler! Läuft nicht mit der derzeit als Stable gekennzeichneten Version nGinx 0.7.67.

In einer Mailingliste habe ich dann die Lösung gefunden:

cd /usr/src
wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
tar -zxvf nginx_mod_h264_streaming-2.2.7.tar.gz
wget http://h264.code-shop.com/download/nginx_mod_h264_streaming-2.2.7.tar.gz
tar -zxvf nginx_mod_h264_streaming-2.2.7.tar.gz
cd nginx_mod_h264_streaming-2.2.7
curl -o hpatch.patch "http://www.freebsd.org/cgi/cvsweb.cgi/ports/www/nginx-devel/files/extra-patch-ngx_http_streaming_module.c?rev=1.1;content-type=text/plain"
patch -p0 < hpatch.patch
cd ../nginx-0.7.67
./configure --add-module=/usr/src/nginx_mod_h264_streaming-2.2.7
make
sudo make install

Und dann wie im Wiki einfach weiter machen und in der nginx.conf um die Zeile 40 folgendes einfügen:

location ~ \.mp4$ {
  mp4;
}

Dann nur noch starten und es kann los gehen.

Falls das Patchfile irgendwann nicht mehr verfügbar ist, hier ist der Inhalt der Datei hpatch.patch

--- ../nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c.orig	2010-05-24 18:04:43.000000000 +0400
+++ ../nginx_mod_h264_streaming-2.2.7/src/ngx_http_streaming_module.c	2010-05-24 18:05:02.000000000 +0400
@@ -155,10 +155,6 @@
   }

   /* TODO: Win32 */
-  if (r->zero_in_uri)
-  {
-    return NGX_DECLINED;
-  }

   rc = ngx_http_discard_request_body(r);

[Django] Session Variabel im Template nutzen

8. Juli 2010 Manuel Keine Kommentare

Um die Session Variabel auch im Template direkt benutzen zu können gibt es zwei Varianten.

Variante 1:
Man fügt in der settings.py unter TEMPLATE_CONTEXT_PROCESSORS den Eintrag django.core.context_processors.request hinzu:

TEMPLATE_CONTEXT_PROCESSORS = (
"django.core.context_processors.auth",
"django.core.context_processors.debug",
"django.core.context_processors.i18n",
"django.core.context_processors.media",
'django.core.context_processors.request',
)

Dann kann man z. B. Session Daten aus dem request im Template mit

    {{ request.session }}

benutzen.

Variante 2:

Alternativ kann man eine “schlankere” Variante benutzen falls man nicht alles bzw. nur ein Teil der request Daten benötigt – wie bei mir – nur die Session Variabel. Dazu erstellen wir im Projektverzeichnis die Datei context.py.

context.py:

def add_session(request):
    return {'session': request.session}

settings.py:

TEMPLATE_CONTEXT_PROCESSORS = (
   "django.contrib.auth.context_processors.auth",
   "django.core.context_processors.debug",
   "django.core.context_processors.i18n",
   "django.core.context_processors.media",
   "django.contrib.messages.context_processors.messages"
   "context.add_session",
)

Und schon kann man im Template auf die Session Daten zugreifen.

   {{ session.variablenname }}

Optimal ist diese Variante um ggf. eigene Daten per Default im Template verfügbar zu machen.

[Test] JiffyBox von DomainFactory

7. Juli 2010 Manuel Keine Kommentare

Für einen Kunden habe ich ein Django Projekt erstellt welches er selber hosten möchte. Nach langem Suchen nach einem geeigneten und preiswerten Provider bin ich auf den Cloud-On-Demand Server von DomainFactory mit dem namen JiffyBox gestoßen.

Mehr…

[C#] KeyDown / KeyUp auch im Form abfangen

28. Juni 2010 Manuel Keine Kommentare

Folgendes Scenario:

Man hat ein Form mit mehreren Steuerelementen (z. B. TextBox, MasketTextbox, etc.). Nun möchte man aber gewisse Tastenkombinationen “global” im Form verarbeiten. Problem dabei ist, das Form bekommt per Default davon nichts mit. Im Form muss die Eigenschaft KeyPreview auf True gesetzt werden, um auch im Form die Tastenanschläge mit zu bekommen.

this.KeyPreview = true;
KategorienC# Tags: , , , , ,

[Test] Panoramasoftware Autopano

26. Juni 2010 Manuel Keine Kommentare

Als ich das letzte mal den Jacobsberg (mit ehm. Fernsehturm) bei Porta-Westfalica bestiegen habe, habe ich mehrere Bilder in einem ca. 180° Schwenk aufgenommen. Nun wollte ich diese “zusammensetzen”, allerdings nicht per Photoshop (ja ich weiss, das geht auch toll).

Ich habe mich durch diverse Software geklickt und musste feststellen, dass Autopano eigentlich wirklich gute Arbeit leistet.

ss

Vorteile:
- Gute “Zusammenführung”
- Passt die Farben sehr gut an
- Automatik – Modus
- Manueller Modus mit sehr vielen Einstellmöglichkeiten
- Kann mehrere “Gruppen” im Batch-Modus nacheinander rendern
- Liest NEF-RAW von Nikon direkt ein
- Einfache GUI

ss2

Nachteil:
- Teuer (Giga Variante 199€ und Pro Variante 99€)
- Kann bei 300 DPI und 13 Megapixel schonmal etwas länger brauchen

Ergebnis:

group-1-dsc_0014_dsc_0019-6-images

[C#] Für die Datenquelle wurde keine Datenquelleninstanz angegeben.

26. Juni 2010 Manuel Keine Kommentare

Ich beschäftige mich gerade mit dem ReportDesigner von Visual Studio 2010. Nachdem ich einen Report mit dem Assistenten erstellt habe und dort (um überhaupt Felder angezeigt zu bekommen) eine Datenquelle angelegt habe – erhielt ich die Meldung “Für die Datenquelle wurde keine Datenquellinstanz angegeben”.

In meinem C# Code war aber als Datenquelle die aktuelle Datenbankverbindung angeben. Was ich nicht wusste, ist das man diese genauso benennen muss wie man sie im Report Designer benannt hat (Da dies ja automatisch passiert (DataSource1, DataSource2,…)).

Also wenn der Assistent den Bericht erstellt sollte man darauf achten, das man sich den DS Namen merkt und diesen dann passend im C# übergibt.

reportViewer1.LocalReport.DataSources.Add(
	new ReportDataSource("DataSet1", LoadSalesData())
);

reportViewer1.LocalReport.DataSources.Add(
	new ReportDataSource("DataSet2", LoadSalesData2())
);

Quelle: Tutorials.de – Forum