среда, 30 сентября 2009 г.
воскресенье, 2 ноября 2008 г.
MS SQL Server
Понадобилось скачать сабж. Буду учить брата переводить 1С 7.7 на SQL. Нашёл на оф. сайте:
Microsoft SQL Server 2005 Express Edition
Microsoft SQL Server Management Studio Express
Експресс версия имеет ограничение на 1 процессор и размер базы в 4Гб. А так - ничего, вполне функциональная.
Microsoft SQL Server 2005 Express Edition
Microsoft SQL Server Management Studio Express
Експресс версия имеет ограничение на 1 процессор и размер базы в 4Гб. А так - ничего, вполне функциональная.
четверг, 30 октября 2008 г.
HP 530 - dvd привод работает в PIO-mode
В настройках IDE установлено "DMA если доступно", но привод упорно отказывался повиноватся и работал только в PIO. В результате запись диска занимала около часа и одно ядро поцессора и паралельно что-либо делать на ноутбуке было "некомфортно".
Гугление на тему обновления драйверов или прошивки не дало результата. Вся проблемма оказалась в настройках реестра.
Открываем HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}\000x
В подветках есть параметры MasterIdDataChecksum и SlaveIdDataChecksum. Удаляем их и перезагружаемся.
Гугление на тему обновления драйверов или прошивки не дало результата. Вся проблемма оказалась в настройках реестра.
Открываем HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Class\{4D36E96A-E325-11CE-BFC1-08002BE10318}\000x
В подветках есть параметры MasterIdDataChecksum и SlaveIdDataChecksum. Удаляем их и перезагружаемся.
пятница, 17 октября 2008 г.
Установка SMTP сервера на Ubuntu
Установить мейл-сервер проще простого. Соединяемся по SSH (например, с помощью Putty) и:
sudo apt-get install postfix
Возможно понадобится ключ --fix-missing
Программа установки попросит установить несколько параметров. Вниматено читаем тексты с подсказками и конфигурируем.
Затем:
sudo dpkg-reconfigure postfix
И релоад: /etc/init.d/postfix reload
И всё. У вас есть свой SMTP сервер :)
sudo apt-get install postfix
Возможно понадобится ключ --fix-missing
Программа установки попросит установить несколько параметров. Вниматено читаем тексты с подсказками и конфигурируем.
Затем:
sudo dpkg-reconfigure postfix
И релоад: /etc/init.d/postfix reload
И всё. У вас есть свой SMTP сервер :)
четверг, 16 октября 2008 г.
Вы заметили баннер справа?
Прочитал сегодня на Хабре заметку о фонде "Подари жизнь!" и не просто смог не добавить их баннер на свои стартапы и блоги. Потратил 10 минут, а может так статься, кому-то это спасет жизнь. У наших давних друзей в понедельник умерла девочка. 22 года, как говорится жить да жить. Маленька дочурка осталась без мамы.
Не будьте чёрствыми. Будьте людьми.
Не будьте чёрствыми. Будьте людьми.
вторник, 12 августа 2008 г.
Готовлю голый Ubuntu сервер для Django проекта
Итак, у меня в руках голый девелопмент сервер на Ubuntu. Задача: настроить сервер для проекта на Django framework.
Процесс установки всего добра (по редакции гугля плюс немного отсебятины):
sudo apt-get install python
sudo apt-get install subversion
sudo apt-get install mysql-server
sudo apt-get install python-mysqldb
sudo apt-get install python-imaging
sudo apt-get install libapache2-mod-python
/etc/init.d/apache2 restart
Открываю вкладочку Фаерфокса по адресу сервера и...
It works!
Идем дальше:
sudo apt-get install phpmyadmin
http://адреснашегосервера/phpmyadmin
Django берем с svn, временно сохраняем в какую-то папочку:
svn co http://code.djangoproject.com/svn/django/trunk/
Затем из trunk - python setup.py install
Установщик скопирует фреймворк в папку пакетов Питона.
красота :)
Процесс установки всего добра (по редакции гугля плюс немного отсебятины):
sudo apt-get install python
sudo apt-get install subversion
sudo apt-get install mysql-server
sudo apt-get install python-mysqldb
sudo apt-get install python-imaging
sudo apt-get install libapache2-mod-python
/etc/init.d/apache2 restart
Открываю вкладочку Фаерфокса по адресу сервера и...
It works!
Идем дальше:
sudo apt-get install phpmyadmin
http://адреснашегосервера/phpmyadmin
Django берем с svn, временно сохраняем в какую-то папочку:
svn co http://code.djangoproject.com/svn/django/trunk/
Затем из trunk - python setup.py install
Установщик скопирует фреймворк в папку пакетов Питона.
красота :)
воскресенье, 10 августа 2008 г.
Обновляемся
Плавно перехожу на транковую версию Django. Предыдущие проекты писал на 0.96, и, как оказалось сильно отстал от жизни.
Например, официальная версия django-tagging 0.2.1 не работает с транком Django :) Нужно использовать svn версию: http://django-tagging.googlecode.com/svn/trunk/
Или вот еще, при импорте теперь нужно писать полный путь, включая имя проекта. т.е.
не прокатит, нужно писать
Иначе может произойти двойной импорт. Всё бы ничего, но в случае двойного импорта newforms админка матюкнётся AlreadyRegistered и валидация не пройдет.
Например, официальная версия django-tagging 0.2.1 не работает с транком Django :) Нужно использовать svn версию: http://django-tagging.googlecode.com/svn/trunk/
Или вот еще, при импорте теперь нужно писать полный путь, включая имя проекта. т.е.
from appname.models import *
не прокатит, нужно писать
from projectname.appname.models import *
Иначе может произойти двойной импорт. Всё бы ничего, но в случае двойного импорта newforms админка матюкнётся AlreadyRegistered и валидация не пройдет.
среда, 9 июля 2008 г.
четверг, 19 июня 2008 г.
Популярные AJAX библиотеки теперь можно загружать с сервера Google
Google Code начал хостить популярные библиотеки JavaScript - JQuery, Prototype и другие.
А знаете, что это значит? Можно указать в своей странице загружать эти .js с сервера Google. И библиотеки будут загружатся пользовательским браузером всего один раз, независимо от количества посещаемых сайтов.
http://code.google.com/apis/ajaxlibs/
Утянуто у rossp
понедельник, 2 июня 2008 г.
Установка Text Link Ads на Python-сайте
Решил использовать сервис Text Link Ads для продажи ссылок с одного своего англоязычного сервиса (PR страниц 3-4). И столкнулся с тем, что для сайта на платформе Python/Django они не предлагают готового Ad-кода.
Гугление не дало результата и я включил моск.
Для сайтов на платформе Blogger они предлагают размещать RSS-поток с ссылками. Почему бы не использовать и мне такой вариант, подумал я. Все просто - берем RSS-гаджет и подключаем его к своему TLA-аккаунту.
Мне приглянулся "Simple rss reader" из гаджетов Google. Простотой в настройке и установке.
Что получилось, можно посмотреть на Getting tasks done
Гугление не дало результата и я включил моск.
Для сайтов на платформе Blogger они предлагают размещать RSS-поток с ссылками. Почему бы не использовать и мне такой вариант, подумал я. Все просто - берем RSS-гаджет и подключаем его к своему TLA-аккаунту.
Мне приглянулся "Simple rss reader" из гаджетов Google. Простотой в настройке и установке.
Что получилось, можно посмотреть на Getting tasks done
четверг, 29 мая 2008 г.
Игра ФИДО 2.0 - античитерское обновление #1
Не так давно я запустил на Хабре весть об игре Фидо 2. Вполне ожидаемая реакция - за два часа сервер лёг. Но вот чего я не ожидал (да, наивный, верю в человеческую честность), так это такого количества читерских запросов. Они то и положили веб-приложение.
Больше всего народу понравилось закачивать старый злан на файлопомойки, ускорять время и взламывать себе подобных :) Вполне закономерно, что в обновлении я ограничил бонусы от закачки, поставил триггер на проверку продолжительности игрового дня и увеличил защиту атакуемого игрока. Кстати, теперь при атаке, независимо от опыта у атакуемого есть возможность отбится даже без фаервола ;)
Вот так-то.
Исходники в помощь: http://code.google.com/p/fido2/
Больше всего народу понравилось закачивать старый злан на файлопомойки, ускорять время и взламывать себе подобных :) Вполне закономерно, что в обновлении я ограничил бонусы от закачки, поставил триггер на проверку продолжительности игрового дня и увеличил защиту атакуемого игрока. Кстати, теперь при атаке, независимо от опыта у атакуемого есть возможность отбится даже без фаервола ;)
Вот так-то.
Исходники в помощь: http://code.google.com/p/fido2/
понедельник, 26 мая 2008 г.
Django и Google App Engine: шаблоны и статические файлы
В предыдущем посте было рассказано, как создать простейший проект на GAE + Django. Сейчас давайте попробуем подключить к проекту шаблоны Django и поддержку статических файлов - таблиц стилей, скриптов и картинок.
Наш Django проект будет называтся dvk, и содержать приложение main. В папке приложения создаем каталог для шаблонов templates:
Чтобы среда знала, где искать файлы шаблонов, нужно прописать путь в файле настроек проекта settings.py
Теперь можно создать файл шаблона main.html в папке шаблонов. Наш шаблон не будет делать ничего сверх полезного :) Просто скажем браузеру "Hello world!"
Для вывода страницы создадим процедуру-контроллер в файле views.py и привяжем её к обработке запроса главной страницы сайта в urls.py
Теперь можно протестировать наше приложение - dev_appserver.py dvk
Откройте браузер с адресом http://127.0.0.1:8080/ и у вас отобразится "Hello world!" :-)
Чтобы Google App Engine обрабатывал статические файлы, нужно в файле настроек GAE приложения включить в секцию handlers параметр static_dir:
Параметр url указывает, по какому адресу будут доступны файлы, а значение параметра static_dir - имя и расположение папки. В нашем примере она располагается в корне проекта и имеет имя static. Теперь в шаблонах можно обращаться к статическим файлам, например для загрузки таблицы стилей: link href="/static/main.css" type="text/css" rel="stylesheet"
Использованные материалы:
Django on Google App Engine: Templates and static files
Configuring an App
Наш Django проект будет называтся dvk, и содержать приложение main. В папке приложения создаем каталог для шаблонов templates:
dvk/
main.py
app.yaml
dvk/
manage.py
settings.py
urls.py
main/
__init__.py
models.py
views.py
templates/
Чтобы среда знала, где искать файлы шаблонов, нужно прописать путь в файле настроек проекта settings.py
import os
ROOT_PATH = os.path.dirname(__file__)
TEMPLATE_DIRS = (
ROOT_PATH + "/main/templates",
)
Теперь можно создать файл шаблона main.html в папке шаблонов. Наш шаблон не будет делать ничего сверх полезного :) Просто скажем браузеру "Hello world!"
Hello world!
Для вывода страницы создадим процедуру-контроллер в файле views.py и привяжем её к обработке запроса главной страницы сайта в urls.py
#dvk/dvk/main/views.py
from django.shortcuts import render_to_response
def index(request):
return render_to_response("main.html")
#dvk/dvk/urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns("",
(r"^$", "dvk.main.views.index"),
)
Теперь можно протестировать наше приложение - dev_appserver.py dvk
Откройте браузер с адресом http://127.0.0.1:8080/ и у вас отобразится "Hello world!" :-)
Чтобы Google App Engine обрабатывал статические файлы, нужно в файле настроек GAE приложения включить в секцию handlers параметр static_dir:
application: dvk
version: 1
runtime: python
api_version: 1
...
handlers:
- url: /static
static_dir: static
...
Параметр url указывает, по какому адресу будут доступны файлы, а значение параметра static_dir - имя и расположение папки. В нашем примере она располагается в корне проекта и имеет имя static. Теперь в шаблонах можно обращаться к статическим файлам, например для загрузки таблицы стилей: link href="/static/main.css" type="text/css" rel="stylesheet"
Использованные материалы:
Django on Google App Engine: Templates and static files
Configuring an App
пятница, 9 мая 2008 г.
Django приложение на Google App Engine в 12 шагов
В этом туториале рассказывается, как создать простое Django приложение с использованием Google App Engine. Предполагается, что у вас уже есть аккаунт в Google App Engine.
1. Для начала нужно зарегистрировать имя приложения в GAE и установить у себя тулкит. Среда Google App Engine работает только с Python 2.5 (2.5.1, 2.5.2). Вместе с Питоном должен быть установлен и Django 0.96 (0.96.1) (.../python/libsite-packages/django).
2. Создайте папку для вашего приложения. Имя и размещение не имеет значения. У меня папка называется "dvk".
3. В папке приложения создайте файл main.py
Этот файл запускается на выполнение, когда пользователь открывает в браузере страницу вашего веб-приложения.
4. Создайте файл app.yaml
Имя приложения естественно подставьте по своему вкусу :)
5. Из папки приложения выполните команду создания нового Django-проекта:
Маленькое замечание: Всего у нас будет 2 папки проектов - папка GAE-проекта и папка Django-проекта внутри неё. Внешний проект выполняет роль обёртки.
В файле настроек Django-проекта settings.py нужно удалить всё, что относиться к настройкам БД, админке, аутентификации и сессиям. Google App Engine не поддерживает модели Django, поэтому эти модули работать не будут.
6. Теперь можно протестировать наше GAE+Django приложение
Откройте браузер с адресом http://127.0.0.1:8080/ и у вас отобразится стандартная страница Django с сообщением It worked!
7. Создайте Django апликейшн в папке Django-проекта.
8. Теперь самое время добавить модель данных. Мы создадим простой класс Visitor, который будет хранить информацию обо всех посетителях сайта.
При добавлении или изменении моделей в Google App Engine не требуется проводить синхронизацию с базой данных. Она выполняется автоматически.
9. Теперь создадим процедуру-контроллер. Она будет записывать в базу данных параметры посетителя нашей веб-страницы и отображать список всех посетителей.
10. В файле диспетчера URL-ов укажем, что наша процедура ответственна за обработку запроса главной страницы сайта.
11. Протестируйте своё приложение открыв окно браузера по адресу http://127.0.0.1:8080/. При каждом обновлении веб-страницы будет добавлятся новая строка и соответственно новый объект Visitor будет записан в БД. GAE также автоматически создает админ-панель приложения - http://127.0.0.1:8080/_ah/admin/
12. Теперь можно заливать наше приложение на GAE: appcfg.py update dvk
При первом выполнении команда попросит авторизироваться.
Использованные материалы:
Running Django on Google App Engine
Django on Google App Engine in 13 simple steps
__________________________________
Мои переводы:
Начинайте бизнес создавая стартап
Интервью Пола Грэма для Found|READ
Как выглядит рабочее место в XXI веке
1. Для начала нужно зарегистрировать имя приложения в GAE и установить у себя тулкит. Среда Google App Engine работает только с Python 2.5 (2.5.1, 2.5.2). Вместе с Питоном должен быть установлен и Django 0.96 (0.96.1) (.../python/libsite-packages/django).
2. Создайте папку для вашего приложения. Имя и размещение не имеет значения. У меня папка называется "dvk".
3. В папке приложения создайте файл main.py
import os, sys
os.environ["DJANGO_SETTINGS_MODULE"] = "dvk.settings"
ROOT_PATH = os.path.dirname(__file__)
sys.path.append(ROOT_PATH)
# Google App Engine imports.
from google.appengine.ext.webapp import util
# Force Django to reload its settings.
from django.conf import settings
settings._target = None
import django.core.handlers.wsgi
import django.core.signals
import django.db
import django.dispatch.dispatcher
# Unregister the rollback event handler.
django.dispatch.dispatcher.disconnect(
django.db._rollback_on_exception,
django.core.signals.got_request_exception)
def main():
# Create a Django application for WSGI.
application = django.core.handlers.wsgi.WSGIHandler()
# Run the WSGI CGI handler with that application.
util.run_wsgi_app(application)
if __name__ == "__main__":
main()
Этот файл запускается на выполнение, когда пользователь открывает в браузере страницу вашего веб-приложения.
4. Создайте файл app.yaml
application: dvk
version: 1
runtime: python
api_version: 1
handlers:
- url: /static
static_dir: static
- url: /.*
script: main.py
Имя приложения естественно подставьте по своему вкусу :)
5. Из папки приложения выполните команду создания нового Django-проекта:
django-admin.py startproject dvk
Маленькое замечание: Всего у нас будет 2 папки проектов - папка GAE-проекта и папка Django-проекта внутри неё. Внешний проект выполняет роль обёртки.
dvk/
main.py
app.yaml
dvk/
manage.py
settings.py
urls.py
В файле настроек Django-проекта settings.py нужно удалить всё, что относиться к настройкам БД, админке, аутентификации и сессиям. Google App Engine не поддерживает модели Django, поэтому эти модули работать не будут.
6. Теперь можно протестировать наше GAE+Django приложение
cd ..
dev_appserver.py dvk
INFO 2008-04-08 19:08:10,023 appcfg.py] Checking for updates to the SDK.
INFO 2008-04-08 19:08:10,384 appcfg.py] The SDK is up to date.
INFO 2008-04-08 19:08:10,404 dev_appserver_main.py] Running application dvk on port 8080: http://localhost:8080
Откройте браузер с адресом http://127.0.0.1:8080/ и у вас отобразится стандартная страница Django с сообщением It worked!
7. Создайте Django апликейшн в папке Django-проекта.
manage.py startapp main
8. Теперь самое время добавить модель данных. Мы создадим простой класс Visitor, который будет хранить информацию обо всех посетителях сайта.
#.../dvk/dvk/main/models.py
from google.appengine.ext import db
class Visitor(db.Model):
ip = db.StringProperty()
added_on = db.DateTimeProperty(auto_now_add=True)
При добавлении или изменении моделей в Google App Engine не требуется проводить синхронизацию с базой данных. Она выполняется автоматически.
9. Теперь создадим процедуру-контроллер. Она будет записывать в базу данных параметры посетителя нашей веб-страницы и отображать список всех посетителей.
#.../dvk/dvk/main/views.py
from django.http import HttpResponse
from dvk.main.models import Visitor
def main(request):
visitor = Visitor()
visitor.ip = request.META["REMOTE_ADDR"]
visitor.put()
result = ""
visitors = Visitor.all()
visitors.order("-added_on")
for visitor in visitors:
result += visitor.ip + u" visited on " + unicode(visitor.added_on) + u""
return HttpResponse(result)
10. В файле диспетчера URL-ов укажем, что наша процедура ответственна за обработку запроса главной страницы сайта.
#.../dvk/dvk/main/urls.py
from django.conf.urls.defaults import *
urlpatterns = patterns("",
(r"^$", "mashname.main.views.main"),
)
11. Протестируйте своё приложение открыв окно браузера по адресу http://127.0.0.1:8080/. При каждом обновлении веб-страницы будет добавлятся новая строка и соответственно новый объект Visitor будет записан в БД. GAE также автоматически создает админ-панель приложения - http://127.0.0.1:8080/_ah/admin/
12. Теперь можно заливать наше приложение на GAE: appcfg.py update dvk
При первом выполнении команда попросит авторизироваться.
Использованные материалы:
Running Django on Google App Engine
Django on Google App Engine in 13 simple steps
__________________________________
Мои переводы:
Начинайте бизнес создавая стартап
Интервью Пола Грэма для Found|READ
Как выглядит рабочее место в XXI веке
среда, 16 апреля 2008 г.
Перевод статьи Web Worker Tip: Don’t Go Dark
Перевёл еще одну интересную статью с Web Worker Daily
Не уходи в тень, будь на виду!
Большое преимущество независимой работы это возможность находиться в окружении, которое нравиться – в домашнем офисе, интернет-кафе, или коворкинг центре. Хоть даже в парке, лишь бы Wi-Fi тянул. И совсем необязательно постоянно быть в офисе заказчика.
Но это палка о двух концах: вы можете заплатить за свою свободу уходом в категорию "ни слуху, ни духу". Заказчикам очень важно получать от вас сигналы...
Не уходи в тень, будь на виду!
Большое преимущество независимой работы это возможность находиться в окружении, которое нравиться – в домашнем офисе, интернет-кафе, или коворкинг центре. Хоть даже в парке, лишь бы Wi-Fi тянул. И совсем необязательно постоянно быть в офисе заказчика.
Но это палка о двух концах: вы можете заплатить за свою свободу уходом в категорию "ни слуху, ни духу". Заказчикам очень важно получать от вас сигналы...
среда, 9 апреля 2008 г.
Перевел 2 статьи с Web Worker Daily
Альтернативы домашнему офису
Есть некая ирония в том, что-бы быть веб-работником и проводить в домашнем офисе большую часть времени.
У вас есть возможности и технологии работать в любом месте где вы только захотите, и всё же большую часть времени вы сидите в компьютерном кресле - и наверное, редко видите солнечный свет. Временами у вас возникает сильное желание сменить декорации. Так почему-бы и нет? Новое окружение может повысить вашу креативность, дать свежее видение, или просто снова расшевелить старый проект.
Если у вас появилось желание покинуть привычное рабочеее пространство, вот несколько альтернатив...
7 советов как повысить продуктивность работы с Firefox
Для многих из нас Firefox это браузер, в котором мы проводим большую часть дня. Эти советы помогут сделать более эффективной работу в Firefox...
Полный перевод читайте на Стартаперах в разделе "Инструменты бедуина".
Есть некая ирония в том, что-бы быть веб-работником и проводить в домашнем офисе большую часть времени.
У вас есть возможности и технологии работать в любом месте где вы только захотите, и всё же большую часть времени вы сидите в компьютерном кресле - и наверное, редко видите солнечный свет. Временами у вас возникает сильное желание сменить декорации. Так почему-бы и нет? Новое окружение может повысить вашу креативность, дать свежее видение, или просто снова расшевелить старый проект.
Если у вас появилось желание покинуть привычное рабочеее пространство, вот несколько альтернатив...
7 советов как повысить продуктивность работы с Firefox
Для многих из нас Firefox это браузер, в котором мы проводим большую часть дня. Эти советы помогут сделать более эффективной работу в Firefox...
Полный перевод читайте на Стартаперах в разделе "Инструменты бедуина".
Анализ страницы на плотность ключевых слов
Нашел для себя неплохую онлайн-тулзу для анализа страницы на плотность слов - http://vface.controlstyle.ru/ns.php
Умеет различать различные словоформы, что очень приятно. Паралельно умеет оценивать "тошноту" страницы :)
Сейчас буду мучить страницы Стартаперов.Ру :)
Умеет различать различные словоформы, что очень приятно. Паралельно умеет оценивать "тошноту" страницы :)
Сейчас буду мучить страницы Стартаперов.Ру :)
четверг, 3 апреля 2008 г.
Фиолетовая корова
Вчера по совету в блоге Сета Година искал на Фликере картинку с фиолетовой коровой для проекта Стартаперы.РУ
Фотограф: adiything
С фиолетовыми коровами было туго, поэтому решил изменить цвет на пурпурный. Все равно в Фотошопе всё можно исправить :)))
Нашел вот такую забавную буренку:
Фотограф: adiythingФоновая загрузка файлов на сервер
Все, кто пользуется GMail замечали, что приаттаченные файлы потихоньку загружаются на сервер через несколько секунд бездействия и затем поля с именами файлов заменяются на чекбоксы.
Похожий функционал я реализовал в одном Django-проекте с помощью JQuery.
При выборе ползователем логотипа для визитки, файл логотипа прозрачно загружается на сервер, обрабатывается и затем "отдается" браузеру. и пользователь видит, что в макете логотип поменялся на выбранный им.
Реализация
После загрузки страницы запускается периодический вызов функции LoadLogotype()
Функция LoadLogotype() проверяет, выбран или изменился ли файл логотипа и, если это так, то отправляет форму "uploadphoto" на сервер.
Форма имеет параметр target="upload_frame", то-есть она не будет инициировать переход на другую страницу. Все изменения будут касаться только скрытого фрейма. После отправки формы в этом фрейме загрузиться отданный сервером результат.
Серверная функция обработки загрузки логотипа сохраняет файл в папке пользователя. Также загружаемый файл проверяется по списку alloved_files – защита от загрузки пользователем неразрешенных файлов.
Как результат функция отдает URL к файлу.
Результат рендеринга шаблона done.html попадет в невидимый IFRAME "upload_frame". Скрипт находит в родительском документе элемент "card_logotype" и заменяет URL картинки на отданный сервером.
В результате пользователь видит изменение логотипа на выбранную картинку. Весь процесс происходит без полного обновления страницы. Изменяется лишь содержимое скрытого фрейма и картинка логотипа.
Посмотреть как это работает, можно здесь: http://bicards.pythondevside.com/
Кросс-пост в Хабрахабр
Похожий функционал я реализовал в одном Django-проекте с помощью JQuery.
При выборе ползователем логотипа для визитки, файл логотипа прозрачно загружается на сервер, обрабатывается и затем "отдается" браузеру. и пользователь видит, что в макете логотип поменялся на выбранный им.
Реализация
После загрузки страницы запускается периодический вызов функции LoadLogotype()
<script type="'text/javascript'" src="'/appmedia/jquery.js'"></script>
<script language="JavaScript" type="text/javascript">
var previous_logo = "";
//-----------------------------------------------------------------------------
function LoadLogotype() {
var card_logo = $("#card_logo").val();
if ((card_logo != "") && (previous_logo != card_logo)) {
previous_logo = card_logo;
document.getElementById("uploadphoto").submit();
}
}
//-----------------------------------------------------------------------------
$(function() {
setInterval("LoadLogotype()", 1000);
});
</script>
Функция LoadLogotype() проверяет, выбран или изменился ли файл логотипа и, если это так, то отправляет форму "uploadphoto" на сервер.
Форма имеет параметр target="upload_frame", то-есть она не будет инициировать переход на другую страницу. Все изменения будут касаться только скрытого фрейма. После отправки формы в этом фрейме загрузиться отданный сервером результат.
…
<form id="uploadphoto" target="upload_frame" enctype="multipart/form-data" action="/upload_logo/" method = "post">
Логотип: <input id="card_logo" name="card_logo" type="file">
</form>
…
<iframe id="upload_frame" name="upload_frame" style="display:none">
…
Серверная функция обработки загрузки логотипа сохраняет файл в папке пользователя. Также загружаемый файл проверяется по списку alloved_files – защита от загрузки пользователем неразрешенных файлов.
Как результат функция отдает URL к файлу.
#------------------------------------------------------------------------------
def upload_logo(request):
'Handles upload of logo images'
alloved_files = ('.jpg', '.jpeg', '.png', '.gif')
id = request.session['our_id']
path = settings.MEDIA_ROOT + 'uploads/%s/' % id
if not os.path.isdir(path):
try:
os.makedirs(path)
except:
return "Error: could not create directory to upload files!"
for image_file in request.FILES:
filename = request.FILES[image_file]['filename']
name, ext = os.path.splitext(filename)
if ext not in alloved_files:
continue
if filename == '':
continue
content = request.FILES[image_file]['content']
f = open(path + filename, 'wb')
try:
f.write(content)
finally:
f.close()
content = {
"image": "/appmedia/uploads/%s/%s" % (id, filename),
}
return render_to_response("done.html", content, context_instance=RequestContext(request))
Результат рендеринга шаблона done.html попадет в невидимый IFRAME "upload_frame". Скрипт находит в родительском документе элемент "card_logotype" и заменяет URL картинки на отданный сервером.
<html>
<head>
<script language="JavaScript" type="text/javascript">
parent.document.getElementById('card_logotype').src="{{image}}"
</script>
</head>
<body>
</body>
</html>
В результате пользователь видит изменение логотипа на выбранную картинку. Весь процесс происходит без полного обновления страницы. Изменяется лишь содержимое скрытого фрейма и картинка логотипа.
Посмотреть как это работает, можно здесь: http://bicards.pythondevside.com/
Кросс-пост в Хабрахабр
среда, 2 апреля 2008 г.
Настойчивость
Быть настойчивым не значит использовать одну и ту же тактику для достижения цели снова и снова. Это утомляет.
Настойчивость - это двигаться к одной и той же цели.
Оригинал: Persistence
Настойчивость - это двигаться к одной и той же цели.
Оригинал: Persistence
Где искать отличные, захватывающие фото
Если вам нужны фотографии для презентации, сайта или брошюры - попробуйте поискать на Фликере (Flickr).
Откройте расширенный поиск, установите флажок "Искать только фотографии с Creative Commons-лицензией" и ищите на здоровье. Этот тип лицензий позволяет свободно использовать фотографии в ваших работах. Такой себе подарок фотографов вам.
Уперто с: http://sethgodin.typepad.com/seths_blog/2008/03/where-to-find-g.html
Откройте расширенный поиск, установите флажок "Искать только фотографии с Creative Commons-лицензией" и ищите на здоровье. Этот тип лицензий позволяет свободно использовать фотографии в ваших работах. Такой себе подарок фотографов вам.
Уперто с: http://sethgodin.typepad.com/seths_blog/2008/03/where-to-find-g.html
Подписаться на:
Сообщения (Atom)