2009-03-02

Как сделать скриншот из flv файла

1. Ставим на сервер ffmpeg
    > svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ./ffmpeg
    > cd ./ffmpeg
    > ./configure
    > make
    > make install

2. Для создания GD картинки можно использовать, например вот такую функцию:

function Video2GD($filename){
  $descriptors = array(
    0 => array("pipe","r"),
    1 => array("pipe","w"),
    2 => array("pipe","w")
  );
  $cmd = 'ffmpeg -i '.$filename.' -vframes 1 -f image2 /dev/stdout';
  $cwd = '/tmp';
  $env = array();
  $process = proc_open($cmd, $descriptors, $pipes );

  if (is_resource($process)) {
    fclose($pipes[0]);
    $data = stream_get_contents($pipes[1]);
    fclose($pipes[1]);
    $error = stream_get_contents($pipes[2]);
    fclose($pipes[2]);
    return imagecreatefromstring($data);
  }
  return false;
}

пример использования функции Video2Gd:

    $im = Video2GD('/yourvideofile.flv');
    header('Content-Type: image/png');
    imagepng($im);
 

Коментариев: 2

 
  2009-02-27

Третья сигнальная

Если естественный язык свойственный представителям homo sapiens называют второй сигнальной системой, то можно ли рассматривать языки программирования как третью сигнальную?

 

Коментариев: 1

 
  2009-02-27

Перегрузка операторов в Python

Оказывается перегрузка операторов есть не только в C++, но и в Питоне тоже...

A class can implement certain operations that are invoked by special syntax (such as arithmetic operations or subscripting and slicing) by defining methods with special names.This is Python's approach to operator overloading, allowing classes to define their own behavior with respect to language operators.

 

 

Оставить комментарий

 
  2009-02-26

Как разрезать а потом склеить

Встала задачка перебросить небольшой объем данных - гигов восесь с одного сервера на другой... Однако, через вебсервер какой объем не передать, пришлось выкручиваться:

сначала пакуем tar

tar -xzf arhive.tgz ./folder_to_copy/

затем разрезаем

split -b1000000000 arhive.tgz part

затем перекачиваем эти гигабайтные куски на другой сервер, где и собираем:

cat part* > arhive.tgz

просто и красиво :)

правда, как потом оказалось что через ftp можно и восемь гигов преспокойно передать, без всякой резки.

 

Коментариев: 2

 
  2009-02-24

HOUSE md

В выходные докачал из торентов пятый сезон доктора Хауса. Оказался на аглицком языке, что в конечном итоге мне так понравилось что я просмотрел запоем все двенадцать серий сезона.

Вот уж не думал что сериалы могут быть такими интересным. Во первых английский там довольно быстрый, американский и воспринимать его на слух занятие совершенно захватывающее, получается, что ты не просто сериал смотришь а еще и язык улучшаешь. Диалоги, кстати совершенно великолепные.

Во вторых сюжеты захватывают так, что не оторвешся.

Во втретих игра актеров в наших сериалах на порядок хуже - все эти Папины почки, Моя прекрасная Маня, и Кремлевские Куранты - это просто утренник в детском саду какойто...

 

Оставить комментарий

 
  2009-02-16

Метатег для автообновления страницы

<meta http-equiv="Refresh" content="30">
 

Оставить комментарий

 
  2009-02-15

Отладка PHP скриптов

Оказывается отлаживать приложения на PHP возможно если вы используете Eclipse c PDT, для этого необходимо скачать Studio Web Debugger - эта штука ставится как расширение PHP и позволяет эклипсу останавливаться на ваших точках остановки, проходить приложение по шагам, смотреть значения переменных и еще много чего. Радует то, что как Eclipse, так и Debugger доступны для различных платформ, и совершенно бесплатны, вот уж где коммунизм наступил...

 

Оставить комментарий

 
  2009-02-05

А вроде солидный банк...

Вчера звонят из Экономбанка которому мы несколько месяцев назад сделали сайт, дают ссылку и спрашивают WHF?

сайт Экономбанка сайт банка Синергия

Не знаю, по моему не сильно похоже... По моему, совершенно разные сайты - сайт Синергии похож на сайт Экномбанка как наша девятка похожа на DeLorean DMC-12 (машина из "Назад в Будущее")...

 

Коментариев: 4

 
  2009-02-04

Редактор для Python

Попробовав несколько разных радакторов пришел к выводу что для меня лучше чем Eclipse с плагином PyDev ничего не придумано.

 

Коментариев: 2

 
  2009-02-04

Простой вебсервер на Питоне

Возникла необходимость сделать простой вебcервер, но чтобы он был максимально легкий и быстрый. После некоторых размышлений решил реализовать его на Питоне, первоначально в качестве кандидатов рассматривались PHP, Java, Perl, но в конечном итоге решил остановиться на Python.

Приведенный пример работает на Python 2.5, хотя первоначально был сделан на Python 3. Питон выбрал потому что во первых хотелось посмотреть что это за зверь такой, что его так любят разработчики Google a во вторых понравилось что можно с легкостью создавать многонитивые приложения.

Синтаксис языка оказался довольно забавный, так как в нем нет операторных скобок так что тем кто любит сравнивать фигурные скобки Си с паскалевским begin/end останутся без темы для споров - операторных скобок нет как класса.

Понравилась философия разработчиков Battaries Included - например разработчику для создания простого вебсервера не нужно вникать в тонкости протоколов - достаточно взять один из готовых классов. Однако по какой то странной причине разработчики Питона не любят реляционные базы данных, например нет в Питоне интерфейса к MySQL а сторонние разработкики делают расширения весьма неохотно, поэтому третью версию питона с MySQL никак не соединить - максимум что позволено версия 2.5 и когда будет поддержка для третьей - неизвестно.

#! /usr/local/bin/python

import BaseHTTPServer
import cgi
import string

class RequestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
    def showPage(self,method,get_data,post_data):
        self.wfile.write("HTTP/1.1 200 OK\n");
        self.wfile.write("Content-Type: text/html\n")
        self.wfile.write("\n");        

        responce = """
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Simple HTTP Server</title>
<meta name="description" content="Simple HTTP Server" />
</head>
<body style="background:white;">				
Method $method<br />
Path: $path<br />
get data $get_data<br />
post data $post_data<br />

<form action="" method="post">
<input type="text" name="value1">
<input type="submit" name="value2">
</form>
</body>
</html>
        """
        s = string.Template(responce)
        responce = s.substitute(dict(
            get_data=get_data,
            post_data=post_data,
            path=self.path,
            method=method
            )) 
        self.wfile.write(responce);
                
    def do_GET(self):
        get_data = cgi.parse_qs(self.path[2:])
        self.showPage('GET',get_data,{})
        

    def do_POST(self):
        get_data = cgi.parse_qs(self.path[2:])
        cl, cl2 = cgi.parse_header(self.headers.get('content-length'))
        qs = self.rfile.read(int(cl))
        post_data = cgi.parse_qs(qs.decode())
        self.showPage('GET',get_data,post_data)


class ChatServer(BaseHTTPServer.HTTPServer):
    def __init__(self,address,handler):
        BaseHTTPServer.HTTPServer.__init__(self,address,handler)
        

def main():
    try:
        server = ChatServer(('localhost', 8080), RequestHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        print('^C received, shutting down server')
        server.socket.close();

if __name__ == '__main__':
    main()

 

 

Коментариев: 14