2009-06-05

Как получить список координат из Google Maps

Здесь можно найти исходники и примеры на эту тему.

 

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

 
  2009-03-20

Прелоадер-Генератор

Bomfunk выложил сабж а я его немного отрихтовал - так стало гораздо симпатичнее :)

 

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

 
  2009-03-16

Знак $ в именах переменных JavaScript

вот интересно MSDN пишет:

  • The first character must be an ASCII letter (either uppercase or lowercase), or an underscore (_) character. Note that a number cannot be used as the first character.

  • Subsequent characters must be letters, numbers, or underscores.

  • The variable name must not be a reserved word.

Чем в таком случае является переменная $ активно используемая в Prototype или в JQuery - буквой, цифрой или знаком подчекивания? Здравый смысл подсказывает что это скорее буква...

Бывают ли еще такие "странные" буквы которые можно бы было использовать в именах переменных. Например, @ или # использовать не получается.

 

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

 
  2009-03-05

Демон на Питоне

Встала задача: есть некий сервер написанный на Питоне который слушает некий порт, выполняет запросы, в общем работает - теперь нужно запустить этот сервер как демон. В шеле такая задача решается просто добавлением амперсенда после вызова команды запуска:

server.py > logfile &

Однако хочется чтобы наш сервер запускался автоматически после того как сервер был рестартован, для этого нужно создать скрипт запуска в директории /etc/init.d

Почему то поиск в Интернете дал на удивление мало готовых рецептов, поэтому решил написать свой вариант такого скрипта - благо у меня уже была заготовка от одного старого проекта на java. В случае Питоном скрипт оказался даже проще.

 

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

 
  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

Перегрузка операторов в 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-15

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

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

 

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

 
  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

 
  2009-01-27

Browser Detection

Обнаружил что фрагмент кода из mootools выдает какой то странный результат для версии движка, может я не знаю каких нюансов, но все же хочется чтобы версия хоть как то коррелировала с версией браузера, кроме того писать каждый раз Browser.Engine.presto довольно длинно, хотелось бы чтобы было просто Browser.presto.

Mootools в отличие от jQuery и prototype определяет тип движка браузера по определенным особенностям объектной модели а не по navigator.userAgent, это неплохо, вот только версию движка таким образом можно определить очень приблизительно, поэтому версию будет логично определять по navigator.userAgent а сам движок по функционалу объектной модели.

Немного похозяйничав в коде получилось вот что:

var Browser = {	
	platform: (navigator.platform.match(/mac|win|linux/i) || ['other'])[0].toLowerCase(),
	version: (navigator.userAgent.toLowerCase().match(/.+(?:rv|it|ra|ie|me)[\/: ]([\d.]+)/) || [-1,-1])[1]
};

if (window.opera) Browser.presto = true;
else if (window.ActiveXObject) Browser.trident = true;
else if (!navigator.taintEnabled) Browser.webkit = true;
else if (document.getBoxObjectFor != null) Browser.gecko = true;

Ваш браузер:

Версия  
Платформа  
trident (IE)  
presto (Opera)  
webkit (Safary, Chrome)  
gecko (Firefox, Mozilla)  
 

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