Ein mehrspaltiges Ergebnis aus einer Spalte generieren (MySQL)

Das Problem:

Eine Datenbank, in der die Daten alle 5 Minuten mit Datum/Zeit gespeichert werden. Die Daten sollen in einem SQL-Ergebnis so dargestellt werden, dass von allen bis jetzt vorhandenen Jahren eine Spalte erzeugt wird um (aufsummierte) Monatswerte vergleichen zu können.

Die Lösung:

SELECT * FROM
(
  SELECT
    Extract(month from `date`) as monat,
    max(`E-Total`) - min(`E-Total`) as diff2009
  FROM
    archiv
  WHERE
    Extract(year from `date`) = 2009
  GROUP BY monat
  ORDER BY monat
) as t2009
NATURAL LEFT JOIN
(
  SELECT
    Extract(month from `date`) as monat,
    max(`E-Total`) - min(`E-Total`) as diff2010
  FROM
    archiv
  WHERE
    Extract(year from `date`) = 2010
  GROUP BY monat
  ORDER BY monat
) as t2010
NATURAL LEFT JOIN
(
  SELECT
    Extract(month from `date`) as monat,
    max(`E-Total`) - min(`E-Total`) as diff2011
  FROM
    archiv
  WHERE
    Extract(year from `date`) = 2011
  GROUP BY monat
  ORDER BY monat
) as t2011

Das Ergebnis:

+-------+----------+----------+----------+
| monat | diff2009 | diff2010 | diff2011 |
+-------+----------+----------+----------+
|     1 |   180.00 |    23.66 |     2.27 |
|     2 |   136.00 |   146.99 |     NULL |
|     3 |   279.00 |   355.02 |     NULL |
|     4 |   475.00 |   476.27 |     NULL |
|     5 |   477.00 |   309.44 |     NULL |
|     6 |   389.48 |   522.26 |     NULL |
|     7 |   478.42 |   519.05 |     NULL |
|     8 |   510.60 |   365.10 |     NULL |
|     9 |   342.67 |   340.95 |     NULL |
|    10 |   203.37 |   313.64 |     NULL |
|    11 |   130.66 |    73.19 |     NULL |
|    12 |    94.42 |     6.50 |     NULL |
+-------+----------+----------+----------+

Instiki mit Gems benutzen anstatt mit den Vendor-Plugins

Ich wollte gerne alle Gems, die ich habe, zentral mit Rubygems verwalten. Deswegen hier eine kleine Anleitung wie man Instiki dazu bekommt, diese Gems zu benutzen.

cd /path/to/instiki/vendor/
rm -r rails
cd plugins/

Es können nur die Plugins gelöscht werden, die es auch als Gems gibt.

rm -r abstract_1.0.0/ diff/ maruku/ rails_xss/ syntax/ xhtmldiff/
cd ../../

Jetzt noch die Gemfile mit folgenden Zeilen ergänzen. (Gilt für Instiki 0.19.1)

gem "rails", "2.3.10"
gem "abstract", "1.0.0"
gem "diff-lcs", "1.1.2"
gem "maruku", "0.6.0"
gem "rails_xss", "0.1.3"
gem "syntax", "1.0.0"
gem "xhtmldiff", "1.0.0"

Speichern und ein

bundle

Fertig.

DV-Cam per Firewire und ffmpeg / ffserver als FLV mit h.264 (x264) streamen

Hier ist eine Anleitung wie man eine DV-Kamera per Firewire, dvgrab, ffmpeg, ffserver und dem JWPlayer ins Netz streamen kann.

Kompiliere dir auf deinem lokalen Rechner die neueste Version von ffmpeg mit x264. Hier bekommst du ffmpeg. Wie du libx264 Support bekommst, steht (unter Anderem) hier.

Als nächstes solltest du einen Webserver zur Verfügung haben, der genug Kapazitäten (Rechenleistung/RAM/Bandbreite) hat, um dort deinen Streamingserver aufzusetzen. Dafür muss auch dort ffmpeg kompiliert werden. Bei mir gab es irgendeinen Bug, deswegen musste ich eine bestimmte Revision nutzen. Am besten du versuchst es als erstes mal mit der aktuellen Version und wenn es dort komische Fehler gibt, dann nutze die Revision 25337. Auf dem Server (bei mir Debian 5.0) also folgendes ausführen:

svn checkout -r 25337 svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
cd ffmpeg
./configure --prefix=/usr --enable-avfilter --enable-bzlib --enable-libgsm --enable-libspeex --enable-pthreads --enable-zlib --disable-stripping --enable-runtime-cpudetect --enable-postproc --enable-swscale --enable-libdc1394 --disable-shared --enable-static --enable-nonfree --enable-libfaac --enable-libx264

Als nächstes musst du eine Konfigurationsdatei für ffserver anlegen. Diese gibt an, wie der Server erreicht werden kann und welche Streams mit welchen Eigenschaften angeboten werden.

Inhalt meiner sample.conf

# Port on which the server is listening. You must select a different
# port from your standard HTTP web server if it is running on the same
# computer.
Port 8090

# Address on which the server is bound. Only useful if you have
# several network interfaces.
BindAddress 12.34.56.789

MaxHTTPConnections 200

MaxClients 100

MaxBandwidth 10000

# Access log file (uses standard Apache log file format)
# '-' is the standard output.
CustomLog -

# Suppress that if you want to launch ffserver as a daemon.
NoDaemon

<Feed feed1.ffm>

# You must use 'ffmpeg' to send a live feed to ffserver. In this
# example, you can type:
#
# ffmpeg http://localhost:8090/feed1.ffm

File /tmp/feed1.ffm
FileMaxSize 200K
</Feed>

<Stream stream.flv>
Feed feed1.ffm
Format flv
VideoCodec libx264
AVPresetVideo default
AVPresetVideo baseline
VideoSize 512x288
VideoFrameRate 12
VideoGopSize 12
VideoBitRate 200
VideoBufferSize 40
AudioBitRate 32
AudioCodec libfaac
AudioSampleRate 22050
AVOptionVideo flags +global_header
AVOptionAudio flags +global_header
</Stream>

# Server status

<Stream stat.html>
Format status

# Only allow local people to get the status
ACL allow localhost
ACL allow 192.168.0.0 192.168.255.255

</Stream>

<Redirect index.html>
URL http://www.ffmpeg.org/
</Redirect>

Dann kann der Server mit

ffserver -f sample.conf

gestartet werden.

Jetzt solltest du auf deinem lokalen Rechner mit per Firewire angeschlossener DV-Kamera folgendes starten können. Achte darauf, dass du Zugriff auf /dev/raw1394 hast.

dvgrab - | ffmpeg -i - http://12.34.56.789:8090/feed1.ffm

Jetzt sollte dein ffmpeg/ffserver anfangen zu streamen. Du kannst dir den Status des ffservers unter

http://12.34.56.789:8090/stat.html

ansehen.

Jetzt brauchst du einen Player. Ich benutze den JWPlayer von hier. Downloaden, auf den Server ziehen, entpacken und verfügbar machen. Hier eine Beispiel HTML-Seite, die zu den ffserver Einstellungen von oben passt:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de">
  <head>
    <title>My Player</title>
      <script type="text/javascript" src="/jwplayer/jwplayer.js"></script>
  </head>
  <body>
        <video
        src="http://12.34.56.789:8090/stream1.flv"
        height="288"
        poster="stream1.jpg"
        id="container"
        width="512">
        </video>
        <script type="text/javascript">
          jwplayer("container").setup({
            autostart: false,
            height: 288,
            width: 512,
            image: 'http://12.34.56.789/stream1.jpg',
            players: [
	      { type: "html5" },
              { type: "flash", src: "/jwplayer/player.swf" }
            ],
            streamer:'http://12.34.56.789:8090/stream1.flv'
          });
        </script>
  </body>
</html>

Jetzt solltest du diese HTML per Browser aufrufen und nach einem Klick deinen Stream sehen.

Anhang: Hier habe ich versucht ein Live-Bild zu streamen und gleichzeitig auf eine Festplatte aufzunehmen. Keine Garantie für Funktion, ist hier nur vollständigkeitshalber! :)

dvgrab - | ffmpeg -threads 4 -i - -f mpeg -r 25 -b 32000000 -s 1024x576 -acodec mp2 -ab 320000 -ar 44100 pipe: -newvideo -y -f mpeg -r 25 -b 32000000 -s 1024x576 -acodec mp2 -ab 320000 -ar 44100 /media/600c4d7c-f3b6-4a1c-abc2-181a70dfc16f/rec.mpg | ffmpeg -threads 2 -i pipe:0 http://12.34.56.789:8090/feed1.ffm

ActiveRecord::StatementInvalid - Mysql::Error: MySQL server has gone away

Nach einiger Zeit stürzt eine Sinatra-App von mir mit Fehler 500 ab. Die Logdateien verraten “ActiveRecord::StatementInvalid - Mysql::Error: MySQL server has gone away”. Das ist das erste Mal, dass ich ActiveRecord ohne Rails verwende. Habe jetzt mal eine Lösung ((http://www.ruby-forum.com/topic/123472#719835)) versucht bei der ActiveRecord “gepatcht” wird. Mal sehen ob der Server jetzt läuft.

module ActiveRecord
  class Base

    class << self
      alias :old_connection :connection
      def connection
        self.verify_active_connections!
        old_connection
      end
    end

  end
end

Simples Ruby Facebook Beispiel

Ich habe ein kleines Programm geschrieben, welches als Basis genutzt werden kann um eine eigene Facebook-App zu entwickeln. Hier ist der Quellcode: http://github.com/benben/simple-ruby-facebook-example