среда, 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Гб. А так - ничего, вполне функциональная.

четверг, 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. Удаляем их и перезагружаемся.

пятница, 17 октября 2008 г.

Установка SMTP сервера на Ubuntu

Установить мейл-сервер проще простого. Соединяемся по SSH (например, с помощью Putty) и:

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
Установщик скопирует фреймворк в папку пакетов Питона.

красота :)

воскресенье, 10 августа 2008 г.

Обновляемся

Плавно перехожу на транковую версию Django. Предыдущие проекты писал на 0.96, и, как оказалось сильно отстал от жизни.

Например, официальная версия 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 и валидация не пройдет.

четверг, 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

четверг, 29 мая 2008 г.

Игра ФИДО 2.0 - античитерское обновление #1

Не так давно я запустил на Хабре весть об игре Фидо 2. Вполне ожидаемая реакция - за два часа сервер лёг. Но вот чего я не ожидал (да, наивный, верю в человеческую честность), так это такого количества читерских запросов. Они то и положили веб-приложение.

Больше всего народу понравилось закачивать старый злан на файлопомойки, ускорять время и взламывать себе подобных :) Вполне закономерно, что в обновлении я ограничил бонусы от закачки, поставил триггер на проверку продолжительности игрового дня и увеличил защиту атакуемого игрока. Кстати, теперь при атаке, независимо от опыта у атакуемого есть возможность отбится даже без фаервола ;)

Вот так-то.
Исходники в помощь: http://code.google.com/p/fido2/

понедельник, 26 мая 2008 г.

Django и Google App Engine: шаблоны и статические файлы

В предыдущем посте было рассказано, как создать простейший проект на GAE + Django. Сейчас давайте попробуем подключить к проекту шаблоны Django и поддержку статических файлов - таблиц стилей, скриптов и картинок.

Наш 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
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 тянул. И совсем необязательно постоянно быть в офисе заказчика.

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

среда, 9 апреля 2008 г.

Перевел 2 статьи с Web Worker Daily

Альтернативы домашнему офису

Есть некая ирония в том, что-бы быть веб-работником и проводить в домашнем офисе большую часть времени.

У вас есть возможности и технологии работать в любом месте где вы только захотите, и всё же большую часть времени вы сидите в компьютерном кресле - и наверное, редко видите солнечный свет. Временами у вас возникает сильное желание сменить декорации. Так почему-бы и нет? Новое окружение может повысить вашу креативность, дать свежее видение, или просто снова расшевелить старый проект.

Если у вас появилось желание покинуть привычное рабочеее пространство, вот несколько альтернатив...


7 советов как повысить продуктивность работы с Firefox

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

Полный перевод читайте на Стартаперах в разделе "Инструменты бедуина".

Анализ страницы на плотность ключевых слов

Нашел для себя неплохую онлайн-тулзу для анализа страницы на плотность слов - http://vface.controlstyle.ru/ns.php
Умеет различать различные словоформы, что очень приятно. Паралельно умеет оценивать "тошноту" страницы :)
Сейчас буду мучить страницы Стартаперов.Ру :)

четверг, 3 апреля 2008 г.

Фиолетовая корова

Вчера по совету в блоге Сета Година искал на Фликере картинку с фиолетовой коровой для проекта Стартаперы.РУ
С фиолетовыми коровами было туго, поэтому решил изменить цвет на пурпурный. Все равно в Фотошопе всё можно исправить :)))
Нашел вот такую забавную буренку:
Фотограф: adiything

Фоновая загрузка файлов на сервер

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

Похожий функционал я реализовал в одном 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

Где искать отличные, захватывающие фото

Если вам нужны фотографии для презентации, сайта или брошюры - попробуйте поискать на Фликере (Flickr).
Откройте расширенный поиск, установите флажок "Искать только фотографии с Creative Commons-лицензией" и ищите на здоровье. Этот тип лицензий позволяет свободно использовать фотографии в ваших работах. Такой себе подарок фотографов вам.

Уперто с: http://sethgodin.typepad.com/seths_blog/2008/03/where-to-find-g.html