Показаны сообщения с ярлыком программирование. Показать все сообщения
Показаны сообщения с ярлыком программирование. Показать все сообщения

четверг, 14 января 2010 г.

XAMPP + Python + Django

Без сомнения в сети существует множество инструкций по тому как настроить Python для работы с web сервером Apache и как туда прикрутить Django, но я хочу рассказать о несколько ином варианте настройки.

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

Начнем, пожалуй.

Нам понадобиться сам XAMPP для Windows, новые версии это хорошо, но остановимся на 1.7.1. Конечно же Python, тут уже я буду делать свой выбор исходя из того, что предоставляет мне хостер, а это версия 2.5. Сложим 1 + 1, т.е. Apache, а в данном комплекте это версия 2.2, и Python 2.5 в результате получим, что нам нужен mod_python, который называется mod_python-3.3.1.win32-py2.5-Apache2.2. Ну и конечно же сам Django, на момент написания это была версия 1.1.1.




Постараемся собрать весь комплект устанавливая минимум приложений.
1. Распаковываем сам XAMPP, на пример сразу на флэшку или внешний диск. Результат выглядит так:



2. Распакуем Python не устанавливая его, для этого выполним такую команду:
msiexec /a m:\download\python-2.5.msi /qb TARGETDIR=m:\xampp\python
где m:\download\python-2.5.msi пусть с дистрибутивом, а m:\xampp\python место, куда распаковываем. Результат:



3. Теперь настало время mod_python, но учитывая, что сам питон мы не устанавливали, а просто распаковали, то и этот компонент надо будет ставить так же через распаковку, если закрыть глаза, что это исполняемый файл, то WinRAR его прекрасно открывает как архив.



Тут Нам интересны две вещи, во первых модуль для web сервера Apache, а во вторых модуль для Python.
Ставим модуль для Python. Распаковываем папку mod_python-3.3.1.win32-py2.5-Apache2.2.exe\PLATLIB\mod_python в m:\xampp\python\Lib\site-packages.



Теперь модуль для Apache. Файл mod_python-3.3.1.win32-py2.5-Apache2.2.exe\PLATLIB\mod_python_so.pyd распаковываем в m:\xampp\python и переименовываем его в mod_python.so.



4. Теперь подготовим папку для проекта. В m:\xampp\htdocs создадим django_project.

5. Установим сам Django. Распакуем архив и выполним команду:
m:\xampp\python\python.exe m:\Download\Django-1.1.1\setup.py build
где m:\Download\Django-1.1.1 путь, куда распаковали архив с Django.
По завершению работы скрипта копируем папку m:\Download\Django-1.1.1\build\lib\django в папку с будущим проектом m:\xampp\htdocs\django_project, здесь можно его обновлять, и какая бы версия не стояла у хостера, будем использовать только свою, за одно скопируем все это же в папку m:\xampp\python\Lib\site-packages\django, по идее оно там должно лежать изначально, но понадобиться оно только для всего лишь одной команды создания сайта "Hello world!" с помощью мастера. Скрипт m:\Download\Django-1.1.1\build\scripts-2.5\django-admin.py в папку m:\xampp\python\Scripts, если ее нет, то создайте ее, это и есть тот скрипт, который по быстрому создаст тестовый проект.

6. Настало время настроить web сервер. В файл конфигурации Apache (m:\xampp\apache\conf\httpd.conf) добавляем строчку:
LoadModule python_module "/xampp/python/mod_python.so".
Теперь создадим виртуальный хост для нашего проекта. Предупреждаю сразу, в данной статье не ставится целью рассказать как правильно и красиво надо оформлять виртуальный хост, по этому я просто копирую имеющийся в конфигурационном файле шаблон и слегка его подправляю. Открываем m:\xampp\apache\conf\extra\httpd-vhosts.conf и добавляем:

<virtualhost test.django.localhost:80>
ServerAdmin admin@localhost
DocumentRoot /xampp/htdocs/django_project
ServerName test.django.localhost
ErrorLog logs/test.django.localhost-error_log
CustomLog logs/test.django.localhost-access_log common
</virtualhost>


Теперь нужно убедить наш web браузер, что адрес http://test.django.localhost/ находится на локальной машине, выполняем команду:
notepad %windir%\system32\drivers\etc\hosts
и добавляем строчку:
127.0.0.1 test.django.localhost

7. Создадим тестовый проект на Django. Тут все просто, выполняем команду:
cd m:\xampp\htdocs\django_project\
m:\xampp\python\python.exe m:\xampp\python\Scripts\django-admin.py startproject hello

В папке m:\xampp\htdocs\django_project\ появится папка hello с тестовым проектом.



8. Т.к. большинство настроек в виртуальном хостинге делается с помощью файла .htaccess, все остальное мы в нем и пропишем.

SetHandler python-program
AddHandler mod_python .py
PythonPath "['/xampp/htdocs/django_project'] + sys.path"
PythonHandler django.core.handlers.modpython
SetEnv DJANGO_SETTINGS_MODULE hello.settings
PythonDebug On

где '/xampp/htdocs/django_project' путь к проекту, где лежит django + hello,
а в hello.settings, hello это имя сайта.
Сохраняем файл в папку m:\xampp\htdocs\django_project.

9. Что бы Apache знал о том, что где то лежит Python нужно задать переменную PYTHONHOME.
Для этого создадим командный файл xampp.bat с таким содержимым:
set PYTHONHOME=%CD%\python
xampp-control.exe

Переменная %CD% содержит путь рабочей директории, значит запускать этот файл надо из самой папки xampp, при этом запускается панель управления, где можно управлять компонентами XAMPP, но тут есть один не красивый момент, а именно то, что окошко консоли постоянно показывается. Сделаем ему небольшой тюнинг.
Качаем утилиту bat2exe, которая умеет делать исполняемые файлы из командных. Запускаем ее, указываем путь к командному файлу, выбираем пункт "Invisible application", "Current directory", в последней вкладке можно выбрать файл иконки, жмем Compile, получаем из файла xampp.bat файл xampp.exe, который выставляет нужную переменную окружения для питона и запускает панель управления, при этом самого приложения не видно, оно будет запущено до тех пор, пока запущен xampp-control.exe.

10. Запускаем Apache, запускаем браузер, переходим по адресу test.django.localhost, видим:


Данный метод запуска опробован на хостинге SpaceWeb.
Надеюсь это кому то помогло. Возможно "продолжение следует"...

Читать дальше...

четверг, 27 августа 2009 г.

C# - Захват содержимого экрана (.net 2.0)


Бывает много ситуаций, когда необходимо сделать снимок экрана, на пример при поддержке установленного программного обеспечения снимок экрана может очень сильно помочь в описании проблемы.

В этой статье мы рассмотрим как сделать снимок экрана, отобразить его, а так же сохранить на диск.



В далекие времена .NET Framework 1.0, что бы сделать снимок экрана приходилось прибегать к вызову Windows API. В .NET Framework 2.0 в пространстве имен System.Drawing и System.Drawing.Imaging появляются новые классы, которые, благодаря GDI+, позволяют работать с графикой, используя только .NET.

Для демонстрации создадим простую Windows Forms программу, которая будет получать снимок экрана, отображать его на форме, а так же при необходимости сохранять его в виде графического файла.

Разместим на форме 4-е кнопки с именами btnCapture, btnSaveJpg, btnSavePng, btnClose, один PictureBox с именем img, а так же SaveFileDialog с именем dlg.


Перейдем к коду, нам потребуется подключить пространства имен System.Drawing и System.Drawing.Imaging.

using System.Drawing;
using System.Drawing.Imaging;

Теперь нам понадобится объект Bitmap (растровое изображение), который будет использоваться для хранения снимка экрана, но т.к. он будет нужен как при самом получении изображения, так и при сохранении изображения, то лучше его сделать частью класса frmMain.

public partial class frmMain : Form
{
private Bitmap captured;

public frmMain()
{
InitializeComponent();
}
...

Далее создадим процедуру получения снимка экрана по нажатию на кнопку btnCapture. Во первых необходимо определить размер создаваемого изображения, а так же глубину цвета. Эти данные можно получить из свойств объекта Screen. В примере будет использоваться основной экран, что для варианта с одним монитором вполне годится, а в случае с несколькими мониторами необходимо использовать массив Screen.AllScreens[].

Размер изображения:

Rectangle bounds = Screen.PrimaryScreen.Bounds;

Глубина цвета - это количество бит, выделяемых на каждую точку на экране, что в свою очередь определяет количество цветов, которое может принимать эта точка. Для минимизировать использование памяти будем использовать полученное значение для создания растрового изображения:

int colourDepth = Screen.PrimaryScreen.BitsPerPixel;

Что бы использовать полученное значение глубины цвета, необходимо создать объект RixelFormat, который представляет из себя перечисление и присвоить ему соответствующее значение. Существует некоторое ограничение для значения в 8-мь бит, по этому для таких снимков экрана будет создаваться 16-и битное изображение.

PixelFormat format;
switch (colourDepth)
{
case 8:
case 16:
format = PixelFormat.Format16bppRgb565;
break;

case 24:
format = PixelFormat.Format24bppRgb;
break;

case 32:
format = PixelFormat.Format32bppArgb;
break;

default:
format = PixelFormat.Format32bppArgb;
break;

}
Теперь, зная значение глубины цвета и размера изображения, можно инициализировать объект bitmap, которому ранее было присвоено имя captured:

captured = new Bitmap(bounds.Width, bounds.Height, format);
Переходим к использованию GDI+, создадим поверхность для рисования, которая будет связана с нашим растровым изображением.

Graphics gdi = Graphics.FromImage(captured);
Ну и наконец сделаем снимок экрана, в этом нам поможет метод CopyFromScreen, в него передаются 5-ть параметров, первые два это координаты левого верхнего пикселя копируемого изображения, следующие два это координаты места вставки изображения в "холст" GDI+, последний параметр это размер копируемой области.
gdi.CopyFromScreen(bounds.Left, bounds.Top, 0, 0, bounds.Size);
Ну а теперь можно вывести полученное изображение в PictureBox на нашей форме:
img.BackgroundImageLayout = ImageLayout.Zoom;
img.BackgroundImage = captured;
Вся процедура обработки нажатия на кнопку btnCapture:
private void btnCapture_Click(object sender, EventArgs e)
{
Rectangle bounds = Screen.PrimaryScreen.Bounds;
int colourDepth = Screen.PrimaryScreen.BitsPerPixel;
PixelFormat format;
switch (colourDepth)
{
case 8:
case 16:
format = PixelFormat.Format16bppRgb565;
break;

case 24:
format = PixelFormat.Format24bppRgb;
break;

case 32:
format = PixelFormat.Format32bppArgb;
break;

default:
format = PixelFormat.Format32bppArgb;
break;
}
captured = new Bitmap(bounds.Width, bounds.Height, format);
Graphics gdi = Graphics.FromImage(captured);
gdi.CopyFromScreen(bounds.Left, bounds.Top, 0, 0, bounds.Size);
img.BackgroundImageLayout = ImageLayout.Zoom;
img.BackgroundImage = captured;
}
Теперь создадим процедуры сохранения полученного изображения в файл.
Сохранение в формате jpeg при нажатии на кнопке btnSaveJpg.
Проверяем инициализирован ли объект bitmap, если да, то открываем диалоговое окно сохранения файла в котором настроен фильтр на отображение только изображений в формате jpeg, если файл выбран, то сохраняем, используя метод Save объекта Bitmap.
private void btnSaveJpg_Click(object sender, EventArgs e)
{
if (captured != null)
{
dlg.Filter = "Jpeg image|*.jpg|All files|*.*";
dlg.Title = "Save captured screen as jpeg";
if (dlg.ShowDialog() == DialogResult.OK)
{
captured.Save(dlg.FileName, ImageFormat.Jpeg);
}
}
}
Сохранение в формате png при нажатии на кнопке btnSavePng.

private void btnSavePng_Click(object sender, EventArgs e)
{
if (captured != null)
{
dlg.Filter = "PNG image|*.png|All files|*.*";
dlg.Title = "Save captured screen as png";
if (dlg.ShowDialog() == DialogResult.OK)
{
captured.Save(dlg.FileName, ImageFormat.Png);
}
}
}

Вот и все.

Скачать исходный код примера.

Читать дальше...

пятница, 3 июля 2009 г.

MS SQL Function Split

Вариант реализации функции Split, которая разрезает строку на мини-таблицу, по умолчанию в качестве разделителя используется пробел.
CREATE FUNCTION [dbo].[fn_Split](
@text nvarchar(max),
@delimiter char(1) = ' '
)

RETURNS @Strings TABLE
(
position int IDENTITY PRIMARY KEY,
value nvarchar(max)
)
AS
BEGIN
DECLARE @INDEX int
SET @INDEX = -1
WHILE (LEN(@text) > 0)
BEGIN
SET @INDEX = CHARINDEX(@delimiter , @text)
IF (@INDEX = 0) AND (LEN(@text) > 0)
BEGIN
INSERT INTO @Strings VALUES (@text)
BREAK
END
IF (@INDEX > 1)
BEGIN
INSERT INTO @Strings VALUES (LEFT(@text, @INDEX - 1))
SET @text = RIGHT(@text, (LEN(@text) - @INDEX))
END
ELSE
SET @text = RIGHT(@text, (LEN(@text) - @INDEX))
END
RETURN
END
Пример:
SELECT * FROM [dbo].[fn_Split] (
'hello;world;split'
,';'
)
Результат:

positionVALUE
11hello
22world
33split


Читать дальше...

пятница, 5 июня 2009 г.

Шрифт - Andale Mono


Шрифт, который приятно видеть при написании кода.
Скачать: для Windows, для Macintosh
Читать дальше...

среда, 3 июня 2009 г.

Как сбросить Identity в MS Sql

Если у Вас в таблице есть поле с автоинкрементном (Identity), то при удалении строк из таблицы нумерация все равно продолжается с последнего числа.

Есть несколько вариантов решения этой проблемы.

1. DBCC CHECKIDENT
Это самый простой вариант, просто устанавливаете желаемое значение. Будьте осторожны, не установите значение меньше, чем последнее.

DBCC CHECKIDENT (<table name>,RESEED,<new value>)

2. Удалить и добавить поле
Это более безопасный вариант т.к. новые значения присваиваются автоматически, но требует большего количества действий и меняет порядок столбцов.

ALTER TABLE <table name> DROP CONSTRAINT <constraint name>

ALTER TABLE <table name> DROP COLUMN <column name>

ALTER TABLE <table name> ADD <column name> bigint identity (1,1) NOT NULL

ALTER TABLE <table name> ADD CONSTRAINT <constraint name> PRIMARY KEY CLUSTERED(<column name> ASC)WITH (PAD_INDEX = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

3. Удалить и создать таблицу
Этот вариант устанавливает новое безопасное значение и сохраняет порядок колонок.

Создайте новую временную таблицу с такой же структурой, скопируйте все данные во временную таблицу, удалите старую таблицу и переименуйте временную.

Выбор подходящего варианта остается за вами.
Читать дальше...

вторник, 2 июня 2009 г.

Hello World

Как и полагается ...

public class ExampleClass
{
public static void Main()
{
System.Console.WriteLine("Hello, world!");
}
}

так тоже красиво

public class HelloWorld
{
public static void main(String[] args)
{
System.out.println("Hello, world!");
}
}

Читать дальше...