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

6 ноября 2010 г.

musicmans.ru | Как сделать сайт на Django | GWT

Посмотрел я на дерево жанров и оно мне не понравилось. Страшное, неудобное. И решил сразу заняться клиентской стороной. Тем более у нас есть отличнейший повод!

Итак, настроим gwt. Скачиваем eclipse 3.6 для java.
Далле переходим на страницы с загрузками GWT. Ставим gwt плагин для eclipse.

Создаем проект File > New > Web Application Project.

Название: genre
package: ru.musicmans

Запуск - Debug As > Web Application.

Переходим по адресу, устанавливаем плагин. Все работает.

Устанавливаем GWT Designer. Читаем quick start.

Далее можно конвертировать, созданный проект из gwt plugin (gwt plugin мы поставили потому, что в нем все равно находиться сам gwt) в gwt java project, который идет с дизайнером (правой кнопкой на проекте - convert to) или создать новый:



Сразу создадим модуль ru.musicmans.genre.GenreTree:



Итак, проект создан. Открываем genre.java и кликаем на вкладку Design.



Что нам надо для организации передачи данных? Мы не можем использовать rpc call gwt, так как у нас на стороне сервера django. Что делать в данном случае? Я рассматривал данный вопрос около года назад. Итог такой: возможен вывод данных в темплейте и преобразование их в javascript object, но это не очень оптимальный путь, тем более, что приложению обычно нужны данные в процессе работы (в том числе, обновленные). Поэтому лучшим решением мне предоставляется REST (с помощью этого подхода не надо проходить новый путь создания интерфейсов сервисов). Я решил не использовать SmartGWT, слишком он навороченный. В чистом GWT нет поддержки REST, поэтому воспользуемся Restlet Framework, ну а со стороны django - django-piston.

Скачаем Restlet Framework, Edition for Google Web Toolkit. Установим (укажем java build path в свойствах проекта).

Django-Piston

Теперь перейдем к серверной стороне. django-piston я уже как-то упоминал. Так вот, устанавливаем:

>c:\Python26\Scripts\pip.exe install hg+http://bitbucket.org/jespern/django-piston@c4b2d21db51a#egg=piston

Читаем документацию. Создадим приложение api, пропишем (r'^api/', include('api.urls')), в главном urls.py. Создадим в приложении файлы urls.py и handlers.py. Остальные файлы, кроме __init__.py можно удалить.
handlers.py:

from django.core.urlresolvers import reverse

from piston.handler import BaseHandler#@UnresolvedImport

from genre.models import GenreDirStyle#@UnresolvedImport

class GenreHandler(BaseHandler):
allowed_methods = ('GET', )
fields = ('name', 'type', 'url' )
model = GenreDirStyle

@classmethod
def url(self, genre):
return reverse('genre_genre', args=[genre.id])

def read(self, request, genre_id):
genre = GenreDirStyle.objects.get(id=int(genre_id))
return genre

urls.py:

from django.conf.urls.defaults import *

from piston.resource import Resource#@UnresolvedImport

from api.handlers import GenreHandler#@UnresolvedImport

genre_resource = Resource(handler=GenreHandler)

urlpatterns = patterns('',
url(r'^genre/(?P[^/]+)/$', genre_resource, name='api_genre_id'),
)


Переходим по адресу, например http://localhost:8000/api/genre/3/ :

{
"url": "/genre/id/4/",
"type": 3,
"name": "Prog-Rock"
}

Чтобы открывать application/json в firefox, установите дополнение, а еще лучше используйте RESTClient для Firefox.

Вернемся к клиентской части.

Добавим widget дерево в gwt приложение tree:






Запускаем отладку, кстати, сразу рекомендую изменить параметр logLevel в конфигурации отладки.

С помощью firebug видим, что ответа на запрос по адресу http://localhost:8000/api/genre/3 не увенчались успехом, поэтому вспоминаем про проблему SOP.

В процессе поиска решений наткнулся на django-crossdomainxhr-middleware.py, позволяющее использовать кроссдоменные запросы (требуется firefox > 3.5).



Но мы пока его использовать не будем.

Итак, проблему SOP при разработке решим следующим образом. Отключим Jetty сервер, запускаемый в отладке, а также укажем порт 8000.


Сделаем символическую ссылку с директории war проекта на www\media\static\gwt\genre, под windows, например, так:

www\media\static\gwt>mklink /d genre d:\path\to\gwt\war\

Далее, можно отлаживать приложение по адресу примерно такому (предварительно запустив веб-сервер отладки django) http://localhost:8000/media/static/gwt/genre/GenreTree.html?gwt.codesvr=127.0.0.1:9997 адресу. Параметр gwt.codesvr обязателен при отладке gwt приложения.

А еще лучше создать темплейт django, подключив к нему приложение gwt примерно следующим образом. Создаем div с id='genreTreeEntryPointId' в темплейте, а в gwt root panel определяем следующим образом:
RootPanel rootPanel = RootPanel.get("genreTreeEntryPointId");

Теперь мы можем отлаживать gwt приложение прямо в "окружении" django-проекта, например, по адресу такому http://localhost:8000/genre/tree/?gwt.codesvr=127.0.0.1:9997&genre_id=2 .

Серверный и клиентский код выкладывать слишком много, остановимся на нюансах:

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

treeqs = GenreDirStyle.objects.raw("""SELECT t2.*
FROM genre_genredirstyle AS t1
LEFT JOIN genre_genredirstyle AS t2
ON t2.lft BETWEEN t1.lft AND t1.rgt
WHERE t1.lft < %s AND t1.rgt > %s AND t1.tree_id = 1 AND t2.depth-1 = t1.depth AND t2.tree_id = %s
ORDER BY t2.lft;""", (genre.lft, genre.rgt, genre.tree_id))

Построение дерева решил возложить на плечи клиентов.
- При загрузке приложения выводим div с изображением, который заменяется самим приложением, после его загрузки, а также выполнения всех ajax запросов.
- Настройки приложения выводим как JSON объект в javascript, получая значения которого в gwt приложении:

private final Dictionary paramsDict = Dictionary.getDictionary("gwtGenreParameters");
String paramsDict.get("API_GENRES_MAIN_URL");

- Автоматический разбор JSON ответа. Используем данное приложение.
Оно зависит от: google-gin и totoe (погуглите и подключайте в проект).
- Для обозначения состояния элемента дерева используем своей объект класса (сокращенный вид):

private class GenreTreeItemData
{
private int id;
private Boolean alreadyLoaded = false;
private String description;
}

используя функцию setUserObject(Object).
- При создании проекта, в настройках gwt приложения наследуется стиль по умолчанию gwt standart. Так вот, проблема в том, что в нем есть правила css, переопределяющие наши (в том числе body). Решить это можно двумя способами, вот первый, а можно просто удалить нежелательные строки из standard.css файла в директории gwt\standard\ (их там немного и они вначале).
- Для генерации документации по API используем вид from piston.doc import documentation_view.

После работы все как обычно и результат:



ps. На стороне сервера попробовал использовать Aptana 3.0, там действительно отменная поддержка Django темплейтов в PyDev (но наткнулся на баг, ctrl+space вешает IDE, может только у меня так?).

30 июня 2010 г.

musicmans.ru | Как сделать сайт на Django | Настраиваем Eclipse

Подготовка Eclipse

1. Качаем Eclipse на машину разработчика (windows, linux).

2. В Eclipse - Help->Install New Software, выбираем из выпадающего списка Helios - http://download.eclipse.org/releases/helios, выбираем:
General Purpose Tools - Marketplace Client 1.0.0.v20100611-0430
Это новый удобный клиент репозитория приложений для Eclipse. Следует учесть, что в этом репозитории находятся и платные приложения, так что, проверяйте информацию нажатием на кнопочку "i". Почитать обзор.

3. Заходим в Help-Eclipse Marketplace, устанавливаем pydev (поддержка python).
4. Заходим в Help-Eclipse Marketplace, устанавливаем mylyn.

Почитать про Mylyn здесь и здесь.

5. Обеспечиваем синхронизацию задач mylyn в eclipse и redmine.

6. Заходим в Help-Eclipse Marketplace, устанавливаем Subversive (считайте меня консерватором) (после перезапуска устанавливаем коннектор SVN Kit последней версии).

7. Устанавливаем Aptana (Aptana Studio 3.0.0 Beta, 2я не установилась на Helios) (редактирование шаблонов html, css, может быть и js).
Update Site: http://download.aptana.com/studio3/plugin/install

Subversion

Будем использовать через svn+ssh://. Устанавливаем subversion и ssh на сервер для управления кодом.
#apt-get install subversion ssh

Создаем репозиторий:

root@codeserver:~# cd /
root@codeserver:/# mkdir repos
root@codeserver:/# cd repos/
root@codeserver:/repos# svnadmin create musicmans


Добавляем пользователя и устанавливаем владельца:

#useradd -m svnuser
#chown -R svnuser:svnuser /repos/musicmans/

Проверяем, что пользователь может логиниться по ssh.
Далее, в eclise на машине разработчика переходим в перспективу SVN Repository Exploring, в Repository Location, и добавляем New-Repository Location.

Указываем URL: svn+ssh://codeserver/repos/musicmans/, указываем логин, пароль, включаем Enable Struсture Detection, ну и смотрим другие параметры.

После успешного подключения создаем структуру репозитория в New -> Project Structure, Monolithic layout.

Создание проекта

Далее, нам надо создать каркас django проекта и выложить его в trunk.

Как установить python (2.6), django (1.2), рассказывать не буду, мануалов масса.

В новом pydev появилась замечательная вещь, как создание Django проекта из мастера создания проектов.

Переходим в перспективу Pydev, в контекстном меню package explorer указываем New - Project:



Далее, введем название проекта, директорию, а также необходимо настроить интерпретатор python, нажав на кнопку autoconfig:


Выбираем версию django. Выбираем Database Engine. От обещанного sqlite3 я отказался, решив использовать postgresql как в разработке, так и на рабочем сервере. Считаем что, postgresql установлен на машине разработчика (мануалов масса на любую систему).

После окончания работы мастера наблюдаем примерно такую картину:



Еще в pydev появилось вот такое меню для проекта:



Поменяем кодировку проекта на UTF-8, если необходимо (пункт меню Properties).

Далее, расшарим проект в репозиторий.

Subversive замечательно справляется со структурой trunk, branches, tags.

Сделаем так, что у нас проект будет находится в trunk под именем backend, то есть trunk/backend, ведь в будущем у нас может появиться и другие проекты, которые надо будет разместить в транке, например проект gwt.

В контекстном меню проекта указываем -> Team - Share Project, далее несколько окон по умолчанию, в окне указания расположения проекта:
use specified name: backend
Нажимаем далее, в комментарии видим что-то похожее:
Share project "musicmans" into "svn+ssh://codeserver/repos/musicmans"
И коммитим изменения, в окне с коммитом необходимо добавить *.setting, *.pydevproject и *.project в svn:ignore (контекстное меню в списке ресурсов).
Перейдем в SVN Repository Exploring, в Repository Location нажмем на кнопку обновить:



Предварительную настройку директорий и проекта выполним в транке, а конкретные задачи создав ветку и переключившись в нее. Смотрите, как это просто делается в subversive:





Создаем и сразу переключаемся в ветку. Пока делать этого не будем. На этом настройка Eclipse пока закончена.

29 июня 2010 г.

musicmans.ru | Как сделать сайт на Django | Схема работы

Ну что же. Инструментарий у нас уже готов. Вникаем в общую схему работы.

Схема такая:
1. Разрабатываем локально, используя отладку Django в Eclipse (наверное будем использовать SQLite при разработке, чтобы было проще, плюс файл базы можно будет хранить в svn, для одного разработчика, я думаю, это нормально).
2. Subversion. Общепринятая структура svn проекта:

branches
tags
trunk

Как их сделать расскажу позже. Сейчас остановимся на теории.
Итак, trunk - рабочая копия проекта, trunk должен работать, не забываем про это.
Если trunk должен работать, то как коммитить недоделанные задачи? Для этого есть branches - ветки. Когда перед нами встает задача по модернизации или исправлению ошибок, создаем ветку (копию) из проекта trunk в branches.
После внесения изменений (и соответственных между ними коммитов/апдейтов ветки), выполняем слияние ветки с trunk.
tags - метки, это копии проекта в которые нельзя коммитить, обычно там хранятся копии релизов.

Если ничего не понятно, читаем книгу или ждем продолжения (рассмотрим вопрос, как это делается в Eclipse Subversive).

3. Используя Fabric, мы будем из tag/current с сервера с Subversion выкладывать релиз на сервер с сайтом, а также обновлять базу (с помощью South).

musicmans.ru | Как сделать сайт на Django | Начало

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

Технологии.

Серверная сторона - django. Конечно будем использовать сторонние django приложения, и не будем писать тесты, тестировать будут пользователи. :) Элементарные вещи о django рассматриваться не будут, для этого есть django book.

Клиентская сторона - наверное gwt. Пока не определился, но думаю внедрим.

Инструменты и техническая сторона

Техническая сторона - покупайте домен и vds. VDS можете купить два или сделать собственный сервер, например, дома, один для сайта, другой для хранения и управления кодом.
Собственно, предыдущие посты как раз были подготовкой к работе.
Система контроля версий - Subversion.
Управление проектом и баг-трекер - Redmine.
Среда разработки Eclipse (кстати вышел Helios 3.6) с pydev, Subversive + расширения по вкусу плюс второй экземпляр Eclipse для gwt.

Ну вот вроде бы и все. Если не все, допишу позже.
Сроки. Ориентируюсь на полгода до более-менее приличного сайта (потому что есть еще основная работа, к сожалению :) ).
Все этапы разработки сразу будут выкладываться на сайт http://musicmans.ru .

Следить за постами о разработке можно по тегу musicmans.ru.

27 июня 2010 г.

Дружим redmine и eclipse: mylyn

Продолжим заниматься redmine'ом.

Mylyn («майлин») — подсистема Eclipse управления заданиями.

Mylyn динамически подстраивает интерфейс Eclipse, оставляет только те элементы в дереве ресурсов, которые соответствуют текущей задаче. Mylyn логически продолжает такие «диалоги», как «Go Into», «Open Associated Perspective?»

Ставим в эклипс поддежку redmine для mylyn:

Eclipse redmine mylyn update site: http://redmin-mylyncon.sourceforge.net/update-site/nightly/

Скачиваем плагин для сервера отсюда.

Закачиваем плагин в директорию /vendor/plugins/ .

Перезапускам lighttpd:
# /etc/init.d/lighttpd restart

Заходим по адресу https://srv/redmine/mylyn/version , должны увидеть нечто такое:


2.6.4.stable
0.9.4.stable
2.3.5


а также сюда https://srv/redmine/admin/plugins

Другие варианты установки здесь.

Настройка клиента:

Далее, открываем перспективу planning в eclipse.



Добавляем репозиторий:





Настраиваем примерно следующим образом и нажимаем validate settings (что приятно не возникло проблем с http auth и https):



Далее создаем запрос задач (спросит автоматом после установки соединения) из redmine которые мы хотим видеть.

Далее пробуем создать задачу в eclipse: правой кнопкой на task list->New->Task...

27 декабря 2009 г.

GWT. Взаимодействие с Django

Вся работа в GWT имеет подробную документацию. В ней все понятно и прозрачно. Но наше дело тормозится тем, что в качестве бекенда у нас выступает Django. То есть стандартный GWT RPC нам не подходит. Встает вопрос о том, как обмениваться данными между GWT и Django.

Я долго раздумывал, какой интерфейс взаимодействия выбрать. Технология-то одна - ajax, а вот какой инструмент более удобен? Можно попробовать использовать RequestBuilder, но этот метод не совсем удобен и не совсем универсален. Поэтому я выбрал json-rpc. Для него уже все создано, как на стороне django, так и на стороне GWT.

Json-rpc, это легкий протокол удаленного вызова процедур, использующий для своего функционирования формат Json.
Пример запроса и ответа:

--> { "method": "echo", "params": ["Hello JSON-RPC"], "id": 1}
<-- { "result": "Hello JSON-RPC", "error": null, "id": 1}

Начнем с django. Добавляем поддержку json-rpc в наш проект.

Импортируем django-json-rpc и добавляем точку входа в urls.py.
 

from jsonrpc import jsonrpc_site
import myproj.myapp.views # подключаем файл, в котором буду храниться rpc функции

urlpatterns += patterns('',
url(r'^json/', jsonrpc_site.dispatch, name="jsonrpc_mountpoint"),
)

Возьмем пример с readme:
 

from jsonrpc import jsonrpc_method

@jsonrpc_method('myapp.sayHello')
def whats_the_time(request, name='Lester'):
return "Hello %s" % name

Запускаем сервер, запускаем шел django
 

./manage.py runserver 8080
./manage.py shell

И тестируем:
 

>>> from jsonrpc.proxy import ServiceProxy
>>> s = ServiceProxy('http://localhost:8080/json/')
>>> s.myapp.sayHello('Sam')
{u'error': None, u'id': u'jsonrpc', u'result': u'Hello Sam'}

В общем, в документе все написано. Также в приложении есть своей браузер, зайти на него можно по адресу http://localhost:8080/json/browse/ , добавив в urls.py, например так:
 

if settings.DEBUG:
urlpatterns += patterns('',
url(r'^json/browse/', 'jsonrpc.views.browse', name="jsonrpc_browser"), # for the graphical browser/web console only, omissible
)

urlpatterns += patterns('',
url(r'^json/', jsonrpc_site.dispatch, name="jsonrpc_mountpoint"),
)


Я нашел несколько неточностей в документации, так, там name="jsonrpc_browser" без буквы "r" на конце, плюс url браузера
идет после r'^json/', который перекрывает его вызов.

Итак, rpc в django у нас теперь есть. Переходим к клиентской части rpc в gwt.

Проделываем все операции, указанные в readme и... у меня не заработало.
 

09:36:42.942 [ERROR] [myapp] Errors in 'jar:file:/lovely.gwt.jsonrpc-0.7.jar!/lovely/gwt/jsonrpc/client/JSONServiceBase.java'
09:36:42.957 [ERROR] [myapp] Line 29: The type JSONServiceBase must implement the inherited abstract method ServiceDefTarget.setRpcRequestBuilder(RpcRequestBuilder)


Судя по всему, в GWT 2.0 изменились какие-то механизмы в сервисах JSON. Наверное класс JSONServiceBase раньше не требовал реализации метода ServiceDefTarget.setRpcRequestBuilder.
Что ж, давайте взглянем на исходники.
Действительно, функции setRpcRequestBuilder нет.

Проект не обновляется, разбираться времени нет, так что пробуем еще один вариант gwt-json-rpc.
По инструкции подключаем библиотеку. В инструкции написано что библиотека использует свой JSON кодер/декодер, поэтому можно использовать простые типы java: String, int, boolean, Array, HashMap, ArrayList, Vector, вместо классов GWT. В общем, она даже проще, чем lovely-gwt-jsonrpc.
У меня получился следующий код.

 

//Create a new JsonRpc instance
JsonRpc jsonRpc = new JsonRpc();

//Create a callback handler
AsyncCallback callback = new AsyncCallback() {

public void onFailure(Throwable caught) {
SC.say(caught.toString());
};

public void onSuccess(Object result) {
SC.say(result.toString());
};
};
jsonRpc.request(
"http://localhost:8080/json/",
"myapp.sayHello",
null,
callback);

Что такое SC смотрим здесь.

После запуска мы обнаруживаем, что все результаты попыток вызова функции попадают в onFailure. Обусловлено это скорее всего тем, что сервер Django и сервер gwt находятся на разных портах, а это противоречит Same Origin Policy.
Далее, я скомпилировал проект, чтобы скопировать его в статический путь в проекте Django, и запустить под сервером Django, чтобы не нарушать SOP. И обнаружил, что CsrfMiddleware не дает скомпилированному gwt приложению делать POST запросы. Но мы знаем, что фрейморки, вроде jQuery позволяли это с легкостью делать. А все потому, что gwt-json-rpc при создании RequestBuilder не создает заголовок вида "X-Requested-With: XMLHttpRequest", поэтому django (точнее middleware) считает, что запрос сделан с другого домена, и возвращает ошибку 403. Значит надо сообщить ему об этом. AJAX запросы считаются безопасными и не нуждаются в проверке, так как современные браузеры придерживаются SOP. Придется добавить данный заголовок в код библиотеки и пересобрать ее. Разработчику проблему описал. Может быть на момент прочтения статьи в ней будет прописан данный заголовок (функция JsonRpc.request):

builder.setHeader("X-Requested-With", "XMLHttpRequest");

Я его добавил сам и сделал новый jar. Компилируем проект, копируем в путь для статики в django, и проверяем - все должно работать.
Остался один ньюанс - работа в дебаг режиме и ajax запросы. Не будем же мы каждый раз компилировать проект, тем более терять все прелести дебага. Воспользуемся HTTP proxy servlet.
Качаем сервлет, копируем в папку WEB-INF/lib, правим web.xml, у меня примерно следующее:


HttpProxy
com.jsos.httpproxy.HttpProxyServlet

host
http://localhost:8080/json/




HttpProxy
/json/


Меняем путь запроса:

jsonRpc.request(
"/json/",
"myapp.sayHello",
null,
callback);


и проверяем работу в дебаг режиме.

Вот и все. Удачной разработки.

16 декабря 2009 г.

Google Web Toolkit 2, Eclipse, SmartGWT

Google Web Toolkit - В Google Web Toolkit (GWT) интерфейс AJAX пишется на языке программирования Java, а затем GWT кросс-компилирует его в оптимизированный JavaScript, автоматически работающий во всех основных браузерах. При разработке можно быстро проходить по привычному для разработчиков JavaScript циклу "изменить – обновить – посмотреть", а также отлаживать код Java построчно.

Eclipse (/iˈklɪps/, от англ. затмение[1]) — свободный фреймворк для разработки модульных кроссплатформенных приложений. Разрабатывается и поддерживается Eclipse Foundation.
Наиболее известные приложения на основе Eclipse Platform — различные «Eclipse IDE» для разработки ПО на множестве языков (например, наиболее популярный «Java IDE», поддерживавшийся изначально, не полагается на какие-либо закрытые расширения, использует стандартный открытый API для доступа к Eclipse Platform).

SmartGWT - Полная библиотека виджетов, основана на JS библиотеке SmartClient. Главная особенность- позволяет связывать пользовательские виджеты с серверными компонентами. Что позволяет делать управление данными на стороне сервера. Серьезный конкурент библиотеке Ext GWT. Распространяется как по платной так и бесплатной лицензиям. В платной лицензии есть возможность использования Enterprise объектов и визуального редактора виджетов.

Смысл ясен. Надо соединить все это вместе.

1. Скачиваем eclipse для java.
http://www.eclipse.org/downloads/

2. Ставим поверх Web Tools Platform (WTP) Project.
http://www.eclipse.org/webtools/

3. Ставим GWT plugin для eclipse.
http://code.google.com/intl/ru/eclipse/docs/getting_started.html

4. Создаем проект Web Application Project.


5. Скачиваем SmartGWT.
http://code.google.com/p/smartgwt/

6. Заходим в свойства проекта, добавляем в Java Build Path -> Libraries - Add External JARs библиотеки:
smartgwt.jar
smartgwt-skins.jar (если вы планируете изменить скин, в обратном случае, скин по умолчанию находится в основной библиотеке)

7. Заходим в директорию war, добавляем в главном html файле перед основным подключенным js файлом следующее (для указания пути статики SmartGWT):



8. Добавляем в ModuleName.gwt.xml:



9. В классе EntryPoint (точка входа нашего приложения) ищем функцию onModuleLoad();
Пробуем SmartGMT, дописывая следующее:

SC.say("Привет, мир!");

Плюс импорт в начало:

import com.smartgwt.client.util.SC;

10. Жмем Debug, переходим по адресу, который отображает консоль Develompment Mode, устанавливаем плагин для Вашего браузера.
Видим примерно следующее:

Далее работает в обычном режиме - точки останова, дебаггинг и прочее.

11. Компиляция для опубликования.


12. Ну и пощупать SmartGWT online можно здесь, а gwt - здесь.

ps. К сожалению плагина для Google Chrome под linux нет. Выражены некоторые надежды на появлении его в пятой версии браузера.
К счастью разработку это не затормозит, так как есть версия плагина для Firefox.

27 октября 2009 г.

Дебагинг django в eclipse c помощью PyDev

Pydev в сентябре переехал. Да еще его расширения стали Open Source:
Pydev Extensions is now merged with Pydev, and its once closed source code has become open source. Thus, there is no more Pydev Extensions, only the open source Pydev, with all the capabilities of Pydev Extensions incorporated.


Изменился и сайт апдейта для eclipse - http://pydev.org/updates .

А что нам это дает? А это нам дает бесплатную штуку под названием "Debug 'server' for remote debugging", с помощью которой можно дебажить django очень удобным способом.

Для начала выполняем условия, как написано здесь, в том числе заносим в PYTHONPATH в настройках Eclipse путь примерно следующего содержания
"eclipse\plugins\org.python.pydev.debug_1.5.0.1251989166\pysrc\" (найдете у себя подобный) и запускаем сервер (из перспективы debug):



Добавляем следующий код в manage.py (после if __name__ == "__main__":) проекта, что дает нам возможность обернуть PyDev брейкпоинты в pydevd.settrace(), который пересылает трейс Debug Remote серверу (для теста рекомендую сначала использовать --noreload и pydevd.settrace(), и убедиться, что трейс возникает именно на Debug Remote server, так же можно попробовать запускать проект не в режиме дебага, а в режиме run, трейс должен отправляться в любом режиме):


import sys

if len(sys.argv) > 1:
command = sys.argv[1]
if settings.DEBUG and (command == "runserver" or command == "testserver"):
# Make pydev debugger works for auto reload.
try:
import pydevd
except ImportError:
sys.stderr.write("Error: " +
"You must add org.python.pydev.debug.pysrc to your PYTHONPATH.")
sys.exit(1)

from django.utils import autoreload
m = autoreload.main
def main(main_func, args=None, kwargs=None):
import os
if os.environ.get("RUN_MAIN") == "true":
def pydevdDecorator(func):
def wrap(*args, **kws):
pydevd.settrace(suspend=False)
return func(*args, **kws)
return wrap
main_func = pydevdDecorator(main_func)

return m(main_func, args, kwargs)

autoreload.main = main




А для чего мы это, собственно говоря, делали? А чтобы запускать runserver без --noreload. Чтобы и изменение кода и брейкпоинты обрабатывались "онлайн".
Примерно вот такая картина:

1 июня 2009 г.

Установка git сервера на Freebsd 7.2 c клиентами EGit на Eclipse под Windows

Введение в git.

Система спроектирована как набор программ, специально разработанных с учётом их использования в скриптах. Это позволяет удобно создавать специализированные системы контроля версий на базе Git или пользовательские интерфейсы. Например, Cogito является именно таким примером фронтенда к репозиториям Git. А StGit использует Git для управления коллекцией патчей.

Git поддерживает быстрое разделение и слияние версий, включает инструменты для визуализации и навигации по нелинейной истории разработки. Как и Darcs, BitKeeper, Mercurial, SVK, Bazaar и Monotone, Git предоставляет каждому разработчику локальную копию всей истории разработки, изменения копируются из одного репозитория в другой.

Удалённый доступ к репозиториям Git обеспечивается git-daemon, SSH, или HTTP сервером. TCP-сервис git-daemon входит в дистрибутив Git и является наряду с SSH наиболее распространённым и надёжным методом доступа. HTTP метод доступа, несмотря на ряд ограничений, очень популярен в контролируемых сетях, потому что позволяет использование существующих конфигураций сетевых фильтров.


Установка.

cd /usr/ports/devel/git
make && make install

Для публичного доступа к репозиторию можно воспользоваться git-daemon.
Также возможен доступ через http (апач+dav+gitweb).
Я же выбрал более простой и надёжный путь - ssh.

Для начала определимся с сервером.
Создаем пользователя, который будет работать с репозиториями, а так же являться администратором gitosis: gituser (создаем без пароля).

$sudo adduser gituser

При создании, в качестве домашней указываем корневую директорию с репозиториями.

Для начала мы сосредоточимся на авторизации пользователя через ssh.
Для этого, проверим настройки sshd, примерно как здесь.

Устанавливаем gitosis, набор скриптов, которые выполняются при открытии ssh-сессии, позволяют использовать ssh ключи для авторизации в репозиториях, а также освобождают от необходимости создавать много пользователей в системе для доступа к репозиториям.

$git clone git://eagain.net/gitosis.git
$cd gitosis
$sudo python setup.py install

Далее надо создать gitosis-хостинг с авторизацией только по ключам:
То есть проинициализировать репозиторий самого gitosis в указанной нами директории.
Я решил управление gitosis оставить на сервере.

$ssh-keygen -t rsa

Эта команда создает в домашней директории пользователя gituser пару id_rsa и id_rsa.pub. Первый файл - секретный, должен быть закрыт от любого пользователя на системе, а так же не передаваться по сети.
Второй ключ публичный, мы его должны передать в gitosis при инициализации gitosis. Его рекомендуют скопировать в директорию, доступную всем для чтения, например /tmp . Далее инициализируем gitosis и его репозиторий.
(Первые две команды, в случае, если у вас не установлен sudo.)

#cd /usr/ports/security/sudo ; make install clean
#rehash
#sudo -H -u gituser gitosis-init < /tmp/id_rsa.pub
Initialized empty Git repository in /tank/gitrepos/repositories/gitosis-admin.git/
Reinitialized existing Git repository in /tank/gitrepos/repositories/gitosis-admin.git/

ключ -H обязателен, иначе команда sudo будет выполняться в домашнюю директорию предыдущего пользователя (например /root).

Теперь у нас есть несколько директорий в домашней директории gituser. Папка repositories предназначена для хранения репозиториев, там уже находится репозиторий настроек gitosis (gitosis-admin).

Если у вас старый setuptools, рекомендуют прописать следующие права:

sudo chmod 755 ~/repositories/gitosis-admin.git/hooks/post-update

Далее, заходим под пользователем gituser и забираем репозиторий администрирования gitosis:

$git clone gituser@YOUR_SERVER_HOSTNAME:gitosis-admin.git
$cd gitosis-admin

Это удаленно, а у так как у нас админ на этом же хосте, то локально:

#su gituser
$cd ~/tmp
$git clone ~/repositories/gitosis-admin.git gitosis-admin
$cd gitosis-admin

Создание "репозиториев" в gitosis.
Редактируем файл gitosis.conf:

[group projectteam]
members = vasya
writable = project

где project - название будущего репозитория.

Создаем публичный ключ в клиенте windows.
Для этого используем пакет msysGit. Я выбрал portable версию, ибо нам из пакета нужен только генератор ssh ключей (PortableGit\bin\ssh-keygen.exe).

>ssh-keygen -C “vasya” -t rsa

Обычно пара сохраняется в папку c:\\Documents and Settings\\Username\\.ssh на XP или c:\\Users\\Username\\.ssh на Vista. Заливаем публичный ключ (vasya.pub) в директорию gitosis-admin/keydir, место куда мы извлекли репозиторий настроек gitosis.

"Пушим" настройки в репозиторий gitosis.

git add keydir/vasya.pub
git commit -a -m "Allow vasya write access to project"
git push

После этого проверить, что файл конфигурации изменился (есть ссылка в домашней директории gituser), а также скопировались ключи в ~/repositories/gitosis-admin.git/gitosis-export/keydir. При загрузке в репозиторий gitosis сам извлекает изменившееся файлы в директорию gitosis-admin.

Создаем репозиторий на сервере под юзером gituser:

$mkdir ~/repositories/project.git
$cd project.git
$git --bare init

--bare обозначает, что у нас нет намерения хранить файлы самого проекта на сервере, только diff и файлы, которые генерирует сам git (проще говоря, структура git репозитория). Что кстати, совершенно достаточно даже для Git Plugin for Trac, который мы намереваемся установить.

Теперь нам необходимо создать ветку (branch), иначе EGit будет ругаться на отсутствие оных. Выполнить push на полностью пустом репозитории нельзя.
Для первого коммита автоматически создается бранч с именем master, в него же по умолчанию попадают следующие коммиты

#su gituser
$cd ~/tmp
$git clone ~/repositories/project.git project
$cd project
$echo "test" > test
$git add test
$git commit -a -m "initial branch"
$git push origin master

Попробуем получить проект через ssh с помощью плагина EGit.
Установка eclipse и самого плагина очень проста.
В меню eclipse выбираем File-Import, Git Repository. Выбираем протокол git+ssh:// , указываем путь:

git+ssh://gituser@SERVER/project.git

Самое главное! eclipse прописывает путь к ssh, как $HOME/ssh. Его необходимо поправить на $HOME/.ssh в меню:
Window-Preferences - General - Network Connection - SSH2. Там же можно управлять ключами и просматривать их. Если eclipse не найдет ключи ничего забираться не будет.
Дальнейшие действия по добавлению проекта интуитивно понятны.

Единственное, в новой версии появилась галочка Import projects after clone, которую надо снять, ибо она у меня привела к пустому списку проектов, попробуйте, может у вас получится. Это не страшно, по вышеприведенному примеру указано как просто сделать share project с извлеченного проекта на диске (плюс показано ниже).

Можно также забрать проект через консоль:

Запускаем PortableGit\git-cmd.bat и выполняем:

>git clone gituser@SERVER:project.git

Далее, создаем проект в eclipse, добавляем в него наш извлеченный проект (Import-File System), жмем на проекте Team-Share (Git) и все, наш проект теперь помечен, как гит репозиторий. Пробуем менять файлы, коммитить и пушить.



Если возникают какие-либо проблемы, то смотрим /var/log/auth.log .
А также в eclipse ( Help - About Eclipse - Configuration Details - View Error Log).
Также можно добавить после строчки [gitosis] в gitosis.conf:

loglevel=DEBUG

При задании которого при обращении к gitosis (через консольный клиент) будут выведена дополнительная информация при ошибках.

Об установке багтрекера Trac для git, а также использовании git в Visual Studio в следующий раз.

3 апреля 2008 г.

Установка Eclipse 3.3.2 на debian etch 86_64

Eclipse - IDE для прграммирования, написанная на java. Для установки свежей версии на 64 битном etch, используя java-package из коробки нужны небольшие хитрости.
1. Устанавливаем java-package.
2. от root:

cd /usr/share/java-package
cp -a sun-j2re1.5 sun-j2re1.6

редактируем sun-j2re1.6/install
первая строка: suffix=j2re1.6-sun

редактируем sun-j2re.sh
добавляем в секцию amd64|x86_64-linux-gnu

"jre-6-linux-amd64.bin")
j2se_version=1.5
j2se_expected_min_size=16 # 16542512 bytes
found=true
;;


Сохраняем и выходим.

3. качаем jre-6-linux-amd64.bin с sun.com
4. заходим под обычным пользователем и сохраняем бинарный файл в домашнюю директорию
5. выполняем $fakeroot make-jpkg jre-6-linux-i586.bin
6. удаляем пакеты gij и SableVM из системы.
7. проверяем $java -version
8. распаковываем и просто запускаем Eclipse.