2009/12/27

Попадаются ж такие удивительные личности

Например http://www.itdumka.com.ua/index.php?cmd=showcatnodes&cat=1&page=1 блоговодец пишет откровеннейшею чушь о работе с PHP, занимается велосипедированием Smarty и всячески доставляет лулзов.
Но между тем, собирает большие коллекции паттернов и качественно их классифицирует http://www.itdumka.com.ua/index.php?cmd=shownode&node=11 Чувствую где-то подвох.
Ознакомьтесь с коллекцией, интересный сборник.
зы: в хидере картинка с надписью "мысли не обязаны умирать в голове"

2009/12/19

Не могу молчать!

DirectoryIndex, ну вы понимаете, в Apache, в частности, в .htaccess при наличии в списке index.php запрашивает сначала его, даже если он в списке последний!
У меня не осталось цензурных слов, чтоб выразить своё возмущение этим фактом!
Опасайся НЁХ!
upd: это как-то связано с чьими-то кешами

И ещё в RewriteCond нельзя использовать %1 - подстановку подвыражения из самих условий. sad but true

___

зы: немножко пользы для гуи-архов Паттерны меню от Азы Раскина, Usability.by можно почитывать

2009/12/16

йаСМИ в логах

Скучное краткое содержание чата онлайн-трансляции конференции, секция "Кадровый рынок в СМИ"

[14:37] http://twitter.com/media_magnit: блин у меня нет звука
[14:37] http://twitter.com/media_magnit: о есть!!
[14:37] http://twitter.com/media_magnit: в зале 5 человек и те без палева решили смыца
[14:38] http://twitter.com/media_magnit: блин я уже это видела кажеца
[14:40] http://twitter.com/media_magnit: кажется даже на Риве была эта презента
[14:40] rabotyahoff.mp: Чел на в первом ряду пиво потягивает )))
[14:41] http://twitter.com/media_magnit: да точно
[14:41] http://twitter.com/media_magnit: я уже видела эту презенту
[14:41] http://twitter.com/media_magnit: на РИфе и на РИве
[14:46] http://twitter.com/media_magnit: может в других залах интереснее...
[14:46] http://twitter.com/media_magnit: почему только этот показывают
[14:48] Гость 266: а кто сейчас говорит?
[14:48] Гость 266: HH.ru?
[14:48] Гость 266: а, суперджоб
[14:56] Гость 286: A so vtorogo zala net translyacii?
[14:56] Гость 266: нету
[14:56] Гость 266: хотя там сейчас самый сок
[14:58] AlterEgo: а можно второй зал как-нибудь все же транслировать сейчас?
[14:58] Фурашов Евгений: Офигительная секция! 27 минут! Снимаю шляпу... Итоговая конференция онлайн - СМИ ! ПОЗОР
[14:58] AlterEgo: кризис в отрасли
[14:59] AlterEgo: так что за 7 минут всё и было сказано. зп в онлайн-сми так себе
[14:59] AlterEgo: 7=27
[15:01] Администрация COMDI: Дамы и Господа, сессия номер 3 завершена. Трое докладчиков не приехали. Продолжение в 16-30.
[15:02] Гость 286: chto dalshe? zhdem sled sekciyu v 16.30?
[15:02] Фурашов Евгений: Зарплаты нормальные. Платить не за что. Вот Синодов делает в одно рыло свое СМИ - ему много пусть будет денег.
[15:05] Фурашов Евгений: Я вот такую штуку "трое докладчиков не приехали" - с трудом представляю на конференции, скажем , врачей. А у нас, болтолологов , да еще и из Инета - пожалуйста!
[15:05] Фурашов Евгений отключился
[15:07] Гость 266: мда
[15:08] Гость 296: жесть какая-то, зал пустой. пришли две тетки, поболтали так, что их и не слышно и все. за 20 минут завершили 3-ю секцию. а те, кто должны были приехать, сидят
[15:08] Гость 296: видимо дома и греются

2009/12/09

ubuntu и macos

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

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

2009/11/30

Разное, текущее

Немного ссылок и радостных вестей

Визуальные программирование сайтов чудесно =:)
Вот мне не нужен суперкреативный портал... В связи с чем берём YAML буилдер на основе фреймворка YAML, разумеется, и за пять минут накидываем схемку. Или 20 минут рассматриваем примеры самого ямла в поисках чего-нибудь поизящнее.
Затем сливаем свежий ИксЕдит, которому, оказывается, необходим гуглогирс... но миленькая сафари нас быстро выручила. Пять минут впиливания ИксЕдита в шаблон от Ямла и можно приступать.
Немного мороки с накручиванием аяксового функционала на шаблон, и готова главная (и единственная) страничка для Pronto cms::etc.

Хотя она и не готова, потому что перед этим я писал аяксовый подгрузчик модулей прямо в шаблон. Таким образом, получается отличнейший крышесрывный шаблонизатор на основе привычного верстальщикам HTML, без всяких тупых вставок на других языках, включая псевдоязыки. Причём, ха, это должно работать без предкомпиляции.
Ну, как вам? ;)
Про модули подробней буду писать завтра в процессе тестирования подгрузчика.

Пока меня не сожрали Ъ-верстальщики за неприкрытую рекламу css-фреймворков, я напоминаю, что не портал верстаем. И немножко им бальзама на куда-нибудь: вышел свежий http://code.google.com/p/zen-coding/, кто не в курсе - подробности с картинками здесь (и все твитеры, и прочие координаты)

Не прощаюсь

2009/10/31

Как написать фреймворк за два часа, часть 1, про Сущности и Хранилища

Наше тело получает жизнь из пустоты. Существование там, где ничего нет, составляет смысл слов: "Форма есть пустота". Слова же: "Пустота есть форма" свидетельствуют о том, что пустота содержит в себе вещи. Не следует полагать, что пустота и вещи суть различны.
Сегодня решил написать не про модули, а про сущности и хранилища; просили.
Вспомним договорённости.
Подумаем про хранилища. Напишем:
interface CRUD
{
public function & create();
public function & read($criteria);
public function update();
public function delete($criteria);
}
почему так? рассказываю дальше:
abstract class StorageEngine implements CRUD
{
protected $__entity;
function __construct($what)
{ $this->__entity = $what; }

function __destruct()
{ $this->update(); }

// здесь ещё раз список методов, т.к. конкретную реализацию оставим для неабстрактных классов
}
ясно? или не полностью?
Возврат значений по ссылке обеспечивает обратную связь сущности (ещё не объявленной) с хранилищем, которое деструктором закрывает сущность, сохраняет её на физическом уровне.
Методы обеспечивают элементарный доступ к сущностям, сложенным в хранилище.
create обеспечивает динамическое создание копии сущности (пока только в памяти времени исполнения)
read читает коллекции сущностей из физического хранилища
update сохраняет коллекцию обратно
delete удаляет быстро и беспощадно
$criteria - признак выборки, XPath

Понимаете ведь, что это только здесь всё так красиво :) Внутри там конкретный аксессор к конкретному хранилищу и много других радостей. К которому можно подключить доп. драйвер и простенький шаблонизатор SQL для совсем уж чудных запросов. Для наших задач вполне хватает $accessor->query('SELECT _read(:criteria)', $array('citeria'=>$criteria));
Как кому-то уже понятно, в качестве драйвера используется PDO::PG, а сами выборки переложены на могучие плечи субд, на пользовательские функции. (Конкретнно чтение, выборку по критерию правильнее было бы оформить через VIEW, но я пошёл по пути унификации. И ещё: в процессе написания функций я обнаружил, что постгрес поддерживает перегрузку функций - функции с одним именем, но разным набором параметров)


Про сущности же подумаем так:
interface XML
{
function asXML();
function XPath();
}
Это два метода, которые нам необходимы. Первый для преобразования объекта к читабельному виду, второй для удобной работы. Да-да, XPath гораздо удобней, чем in_array(). Освоение множеств XML и преобразований требует некоторого мозга, но особого труда не составляет, будем работать с нормальными технологиями.
Кто использовал XML с PHP, конечно же, уже узнал этот интерфейс :) Да, это SimpleXML. Не будем изобретать сущности, извините за тавтологию, воспользуемся имеющейся.
class Entity extends SimpleXMLElement implements XML
{
// здесь меня ожидало несколько весьма занятных ээ... особенностей реализации языка. например, нельзя переопределить конструктор. пришлось изобретать конструкцию загрузки сущностей из схем и других источников, типа такой

static function load($source)
{
if (isXML($source)) $xml = $source;
if (is_file($source)) $xml = file_get_contents($source);
return new self($xml);
}
}
Со статическими методами тоже получилось интересно, почти неделю парился, уже думал, что пхп не поддерживает их перегрузку. Оказалось ещё хитрее ;) До ветки 5.3 self указывает не на текущий класс, а на класс, в котором был написан. То есть наследовать от Entity можно только с переопределением загрузчика. Но в принципе, особой нужды в этом нет, SimpleXML дал нам Entity::getName(), который выдаст имя корневого элемента (здесь необходимо вспомнить правила оформления XML;)

Ещё в сущностях есть пара вспомогательных статических методов, которые не несут принципиальной смысловой нагрузки, их можно посмотреть в коде. На этом, вроде, всё про систему хранения.

Вопросы?

зы: ах да, пример
$sth = new EntityStorage( Entity::load('scheme.xml') );
$sth->create();
или
$data_collection = & $sth->read('user/profile[name="USERNAME"]');
foreach ($data_collection as $user)
{
print $user->id;
print $user->profile->name;
}
$user->profile->name = 'LASTUSER';
$sth->update();

и замечание напоследок: нет, это не ORM, здесь отсутствует преобразование из плоской формы в объектную. На Observer похоже, но отсутствует подписка на изменения. Как назвать, не особенно важно, оно работает =%)

2009/10/20

OpenID + php

Очень хорошо написано здесь http://www.oneid.ru/info/openid-php/ про библиотеку http://openidenabled.com/php-openid/ самая большая с обширной документацией. Много кода, требует cURL и матэкстеншн GMP

Но есть и альтернативные решения вроде http://www.phpclasses.org/browse/package/3290.html

upd: php-openid поддерживает и pgsql тоже =:)

upd2:

Не стал писать новую заметку, но увиденное слегка шокировало

файл примера из библиотеки:
// For OpenID 1, send a redirect. For OpenID 2, use a Javascript
// form to send a POST request to the server.

и оно действительно делает
$form_html = $auth_request->htmlMarkup(getTrustRoot(), getReturnTo(),false, array('id' => $form_id));
 
// otherwise, render the HTML.
print $form_html;

бред какой-то. мощнейшая библиотека, и столько хлама. надо переписывать, срочно.

там ещё и втф встречается типа
function & fn($param){ ... return new someClass($param) }

зы: документация уг, либо я её неправильно читаю. кста, если кому-нить захочется почитать доки, надо начать с класса Auth_OpenID_AuthRequest, а потом перейти к Auth_OpenID_Consumer. Auth_OpenID включить, разумеется, забыли; он находится в файле OpenID.php

2009/10/14

Как написать фреймворк за два часа, часть 0

Вы понимаете, что про два часа - выражение фигуральное; но всё же не лишено смысла. Именно написать фреймворк, т.е. сделать конечную реализацию, займёт существенно больше двух часов. Время реализации можно сократить предварительным планированием. Хороший план - половина работы ;)

Сейчас мы позанимаемся образцово-показательным проектированием и планированием. Да и вообще, делать что-либо без идеи и цели не имеет никакого смысла, пустая трата времени. Итак, приступим.

Определим цели. Во фреймворке необходимо обеспечить:
  • доступность понимания структуры и кода, чтобы начинающий программист мог его освоить
  • некоторый уровень технологий, чтоб джыдаю было не скучно
  • не изобретать велосипедов
  • зы: совсем забыл! заложить в архитектуру максимально возможный уровень расширяемости и не заниматься преждевременной оптимизацией
Осмотревшись, мы находим PHP - достаточно распространённый скриптовый язык с очень (ОЧЕНЬ!) низким уровнем вхождения. В принципе, это проблема пхп, из-за которой он получил дурную славу. Попробуем вернуть языку его достоинство.
Внутренним (и внешним) единым форматом передачи данных примем XML. Что может быть проще и технологичней?
И в случаях затруднений будем руководствоваться принципом KISS Keep It Simple, Stupid - Не тупи, будь проще.
Маленькое лирическое отсутпление. Во время работы в %COMPANYNAME% в среде программистов был изобретён принцип JMS Just Make Simple - Просто сделай проще. От часто прозносимых фраз: "Давай сделаем это проще", "Я знаю как проще". Стали ли они продолжать линейку JMS CMS, я не в курсе.
Продолжаем. Пишем мы фреймфорк для веба, то бишь, чтоб делать сайты. Сайт, в конечном итоге, это текст, причём, текст структурированный. Понятию тега разметки практически идеально соответсвует понятие блока. Да и визуальное оформление обычно составлено из вложенных блоков.
Введём основное понятие фреймворка: модуль - основная и единственная структурная единица фреймворка. Хотя, на самом деле,)) модуль может быть и исполняемым кодом, и шаблоном, и чем-нибудь ещё.
Введём соглашение: каждый модуль обязан возвращать XML. Всегда. Пусть пару строк, но возвращать (как будет видно дальше, мы немного отсутпим от правила, самую малость). Обратно, всё, что не является модулем, не обязано возвращать XML и всё, что не возвращает XML, не является модулем.

Вспомним хитрое слово ReST, которое, в принципе, ничего конкретного не представляет, или, наоборот, представляет слишком многое. Это и технология, и способ, и принципы, и идея; остановимся на слове RESTful подход. Для нас это будет означать Человеко-Понятный Урл + принцип передачи параметров (формирования запросов) в модули + структурированность иерархии модулей, аналогичную URL.

Принцип работы сайтов, по большому счёту, заключается в получении данных, их сохранении и визуальном оформлении.
Основной единицей информации назначаем сущность - Entity. Сущность подготавливается по описанию. Это второй объект, который мы напишем. Первым будет, конечно, хранилище (Storage) сущностей. Хранилище должно реализовывать интерфейс CRUD Create Read Update Delete. Элементарно.
Введём второе соглашение: каждый объект, работающий с данными, принимает и\или возвращает объект типа "сущность".

Тут были упомянуты формы, хорошо бы объектик для работы с формочками по принципу принял-завалидировал-отдал, но об этом в следующей части.

Хм, теперь под выбранную идеологию подберём инструментарий. Это будет:
  • уже упомянутый PHP в связке с Apache. Тип связи с веб-сервером и сам веб-сервер могут быть любыми, это пока не принципиально, но Apache + mod_php весьма распространены, будем ориентироваться на такой тип.
  • т.к. XML клиенту (пользователю) не интересен, подключим XSLT и нагрузим преобразованиями клиента (браузер) - проверено, работает
  • добавим к этому грамотный CSS и какой-нибудь javascript framework: не мудрствуя долго, остановим выбор на jQuery
  • выбор физического воплощения хранилища представил некоторую проблему. Основное требование: нативное хранилище объектов. Но объектно-ориентированные базы весьма нетривиальны и не удовлетворяют требованию простоты фреймворка.
    Ещё одно лирическое отступление. В процессе поиска наткнулся на одно интересное решение: база не имеет собственного клиента, доступ через http RESTful или через API, возвращает xml или json, обращаться можно хоть из javascript. Оригинальное решение и достаточно старое. Но я не поставил вовремя закладку, а название забыл! %( Но в этот фреймворк тоже не подходит в виду излишней оригинальности.

    Остановился на PostgreSQL с дополнением для XML, кстати, прекрасно работает.
    Не забываем переложить бизнес-логику на базу, это её прямое назначение.

Итак, что мы насобирали:
RESTful + modulability (гхм)
XML
Entity-Storage-CRUD
PostgreSQL
PHP
Apache
XSLT+CSS+jQuery

Всё!
Энжой :)

За два часа вроде бы уложился

зы: тру пхп-кодер спросит: где же шаблонизатор? а вот php и есть шаблонизатор, если кто не в курсе

2009/10/09

Программисты, моноширинные шрифты и виндовс

Да, программеру без равномерных фонтов никуда. А какие фонты в винде, ну вы помните, да?
На этот курьер я смотрю лет десять, наверное. Надоело. Бесповоротно.

Было выяснено, что тру-джыдаи давно используют нормальные шрифты, как то: Terminus и Consolas; затем, в процессе сёрфинга, к ним добавились Liberation, Bitstream Vera, и вспомнился Monaco. Выгуглено было страниц под сотню и выяснено, что:
  • Consolas свободно сливается с сайта производителя. Но представляет собой Clear-Type шрифт, что мне не подходит технически: на ЖК с невысоким разрешением клеартайп размазывается между пикселями. Но кому глаз не режет - в принципе, хвалят.
  • Туда же, кстати, ушёл Bitstream Vera, который вроде бы и есть в поставке висты, но можно слить с гнома.
  • Monaco ищется достаточно легко, шрифт старый, известный. Но не нашёл русских букв.
  • Terminus я искал долго. В смысле, чтоб с кириллицей. Так и не нашёл. Без кирилицы - "первая ссылка в гугле". Если у кого вдруг есть terminus-cyr.ttf, пришлите, пожалуйста на почту.
  • В процессе поисков были обнаржуны залежи полезного, но буржуинского http://stackoverflow.com/questions/4689/recommended-fonts-for-programming, http://www.codeproject.com/KB/work/FontSurvey.aspx, http://damieng.com/blog/2007/11/14/droid-sans-mono-great-coding-font. А также поставлен растровый фонт из этой ветки. Первая удача! он заработал. Мне понравилось
  • И Liberation - это шрифт от RedHat. Можно взять с официального сайта. Было ли это ошибкой, но сначала я слил и поставил файл с самым большим номером версии, но шрифт в списке не показался. И я пошёл искать всё прочее, о чём выше. А потом я слил файл с самым коротким названием ;) и заработал Liberation Mono, остальные из пакета почему-то отказались.
Вот так мы поменяли шрифты =:)

Не прощаюсь

2009/10/07

Юзабилити не существует

текст готовился на хабр, но в связи с известно какими причинами не может быть там даже сохранён

Среди свитков, висящих на стене у господина Наосигэ, был свиток со словами: "К важным делам следует относиться легко".


Как я написал в каком-то каменте, меня не перестают удивлять люди, занимающиеся как бы "юзабилити". Хабрапипл вполне представляет, чем чреваты подобные хабразаявления.
Казалось бы, толпы народов съезжаются, устраивают конференции, изводят тонны макулатуры и человеко-лет. На что? А ни на что. Сейчас в очередной раз посмотрим, как получать деньги из воздуха.

Ведь и правда, нельзя делать подобные заявления голословно, нето %юзернейм% негодуэ оппоненты сильно расстраиваются.
Университетов мы кончали, распишем всё по трафарету.

Начнём с названия. Юзабилити - us-ability use-ability - хмм... возможность использования? в приниципе, это бинарное состояние: можно пользоваться \ нельзя пользоваться. Но километры копий не даром же сломаны?

Хорошо, вспомним, что "абилити" имеет характеристический оттенок, а "юз" может служить мерилом полезности. Наверное, предполагаем дальше, эти замечательные люди изучают степень пользибельности ээ... объектов окружающего мира, замеряют её специальными полезнометрами, строят кучу графиков и схем, по которым оказывается, что лимон, выращенный на солнечной стороне холма на 5 полезнопоинтов полезней.
На таком материале делают докторские.

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

Оно не является научной дисциплиной по причине отсутствия аксиоматического аппарата, объекта исследования и подхода изучения - это почти основные элементы, отличающие (характеризующие) науку от прочих сфер человеческой жизнедеятельности. (Не лезем в философию и проблему демаркации, ок?)
Но оно и не является сферой человеской деятельности! Так-то!
Словцо это обозначает всего лишь определение понятия в подразделе эргономики - микроэргономике. ("обозначает определение понятия" это я красиво загнул ;) вообщем, вы поняли, да?)

...the extent to which a product can be used by specified users to achieve specified goals with effectiveness, efficiency and satisfaction in a specified context of use.

Э-э! посвятить всего себя изучению одного понятия - задача, достойная философа. Ещё раз к месту слово "докторская". Но я подозреваю малое количество мизантропов-отшельников среди этих удивительных людей.

Увидев этот свиток, мастер Иттэй добавил: "К несущественным делам следует относиться серьёзно".


Пойдём с другой стороны, попытаемся сформулировать род занятий "юзабелист" через перечисление (грязный антинаучный хак). Занятие представляет собой попытку предсказать реакцию (удовлетворённость) и поведение (продуктивность) определённых групп людей при попытке взаимодействия (эффективность) с продуктом.
Вот для чего сотни мегабайт букв, озаряет нас внезапная догадка! Юзабелист подобен древнему врачу, практически вслепую ведущего команду инженеров, проектировщиков, маркетологов, художников и рабочих сцены к светлому приятию конечным пользователем светлых идей, воплощённых в качественном продукте.

Метод блондинки и динозавра, на мой взгляд, даёт большую вероятность сразу, чем метод проверки сайта по продаже эксклюзивных скрепок магнатам в красных штанах, применённый на магнатах в синих штанах.
Не надо быть тонким знатоком человеческих душ, чтобы доказать, что у плотников нет интернета.

Попробуем дать хоть какое-то научное обоснование.

По моему скромному мнению, человеческими деяниями управляют два фактора. Точнее, даже один. Инстинкты. Не будем опускаться до полной павловщины, это сильное такое допущение, но остановимся, как на одном из самых понятных.
Так вот, люди всё делают либо по привычке, либо по глупости. По привычке выполняются знакомые операции, уже повторенные несколько раз: свет вкл\выкл, зубная щётка на полке слева, крестик справа сверху, ссылка - синяя и\или подчёркнутая, центр-клик = опен ин нью таб, поиск где-то рядом, в меню можно выбирать, между абзацами обычно отступ два\полтора интервала, колбаса хороша в салате. Это не только приобретённые инстинкты, но и врождённые, типа частоты дыхания, изменения состояния от воздействия определённых цветовых сочетаний, инстинкт слежения [взглядом], моргание, зевание.

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

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

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


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


Успехов и до новых встреч.

Юзабилити не существует! =;)

2009/10/01

Торвальдс о GIT

Хороший парень перевёл выступление Л. Торвальдса о GIT на Гуглтолк
Смотреть и слушать на хабре или ютубе

2009/09/17

как настроить отображение кириллических ссылок в firefox

Открываем about:config и ставим network.standard-url.escape-utf8 false

via http://linsovet.com/firefox-show-cyrillic-links

2009/09/05

YeAP Project

YeAP is Yet Another PHP yeap! Project
пилим мал-помалу
код фреймворка на гуглокоде http://code.google.com/p/yeap/ , цмс на его основе готовится в другом месте, хотя проскакивают куски в репозиторий
твиттер-тег (твитег %) #YeAP @dotAIDE

зы: да! я завёл твиттер; зачем, пока не совсем понял. тви хорош для спама, вирусной рекламы итп

upd: надо бы сменить твитег, а то всякие иносранцы пишут глупости

2009/08/29

SVN, externals, tags, properties и все-все-все

Правильно заданный известно куда вопрос дал совершенно замечательные мануалы
  • http://noc.od.anything3d.com/svn-book-html-chunk-ru/ - это перевод известнейшего свн-бука http://svnbook.red-bean.com/en/1.4/ "Version Control with Subversion" by Ben Collins-Sussman, Brian W. Fitzpatrick, C. Michael Pilato. Читайте с удовольствием :) Но учтите, что перевод неполный
  • http://tortoisesvn.net/docs/release/TortoiseSVN_ru/ не менее интересная книга "TortoiseSVN. Клиент Subversion для Windows" суровых шведских(?) парней Stefan Küng, Lübbe Onken, Simon Large. Преимущественно по клиенту TortoiseSVN, но это как раз, что мы искали. Много полезного про установку SVN на Windows, svnserve, apache, различные способы аутентификация, а также штучечки, фишечки и приёмчики работы с параметрами, свойствами, тегами и много чем, что могло бы облегчить жизнь, но не используется.
  • Статья http://www.rsdn.ru/article/devtools/VrezkaSVN.xml о хранении сложных проектов.
На сладкое http://tortoisesvn.net/node/369 проект Gurtle - issue tracker integration for TortoiseSVN (плагин к черепахе)

У меня пока всё
до новых встреч

2009/08/28

Debian, PostgreSQL и дополнительные функции (xml, cub, etc)

Напрыгавшись с бубном и выгуглив половину интернетов, ответственно заявляю: анонимус не в курсе, как поставить расширенные функции в постгре.

Решение просто, как ящик:
apt-get install postgresql-8.3 postgresql-contrib
(postgresql-contrib-8.3 - действительно экспериментальные функции, но мы-то искали xml. он в стандартном контриб-пакете имхо)

Внимание! Далее финт ушами: чтобы получить в распоряжение функции, их нужно проинсталлировать, т.е. выполнить sql скрипты. Примерно так:
localhost:/usr/share/postgresql/8.3/contrib# su postgres -c "psql -d DBNAME < pgxml.sql"
Обратите внимание на путь и на то, что команда выполняется от имени root. Дело в том, что пользователя postgres тоже нужно дополнительно настраивать, а мне на VPS немного лень.

И спасибо Илье Кантору за наводку http://archives.postgresql.org/pgsql-ru-general/2007-06/msg00020.php

зы: включение процедурного языка CREATE LANGUAGE; список языков SELECT * FROM pg_pltemplate;

upd: как настраивать pgsql на debian|ubuntu очень хорошо описано здесь http://welinux.ru/post/688/ - шаблонно, но основные моменты указаны

2009/05/14

Архитектурные шаблоны

http://en.wikipedia.org/wiki/Architectural_pattern_(computer_science) что нужно знать и понимать. Очень хорошо развивает абстрактное мышлешение

перевода на русский нет, перевод на украинский уныл

стартап с человеческим лицом

очень хороший рассказ про то, как люди работают http://www.unova.ru/article/wi2geo_video
как делали сайт Wi2Geo.ru

2009/04/30

jQuery.ready

Занимательная и научно-познавательная функция ready() в jQuery (хотя на самом деле это метод объекта) делает одну мегаполезную вещь. Как известно, в неё можно пихать document и она будет вызвана после полной загрузки документа со всеми скриптами, цссками и картинками.
Как известно меньшему количеству народа, в неё можно запихать любой элемент, и функция будет вызвана после полной загрузки этого элемента.

И, как оказалось, $.ready(element) вызывается не только после полной загрузки элемента, но и после показа этого элемента на экране. Т.е. для element style="display: none;" ready не работает; или отработает только когда этот элемент станет видимым.
В документации этого не вычитал, случайно обнаружил.

ps: причем, этот эффект не распространяется на дочерние элементы; ready будет выполнен для элемента внутри невидимого блока

2009/04/23

Правильная вёрстка

Просто пиар хорошего ресурса :)
http://www.xiper.net/ Сайт верстальщиков для верстальщиков. Много полезной информации о приёмах, решениях, хаках и глюках браузеров. Конечно, в наличии справка по хтмл и цсс.
И много, много полезных статей.

2009/04/11

PostgreSQL, Apache, PHP, Windows(tm) и онлайн мануалы

Начать хорошо бы матом.
Но вдруг этот блог кто-нибудь читает?

Кто-нибудь пытался включать постгрес-экстеншн? Вот я попытался. Нет экстеншена. (касается апач2.2 постгрес>8.3.1 пхп>5.2.8)
Нормальный запуск, в логах апача - ошибка: Системе не удаётся загрузить библиотеку...
Два часа тырканий по разным каталогам - обычная в винде ситуация, либо путь в дефолтный пропиши, либо длл переложи - и поиска нужной библиотеки ни к чему не привели. Не грузится, хоть тресни. Не работает php-way.

Гугл подсказал блог то ли поляка, то ли чеха http://bscsro.blogspot.com/2009/01/apache.html За что ему спасибо. Гику этому пхпшному.
Тот же гугл выдал итальянскую страницу мана в домене .id (Индонезия). Там в комментариях тот же самый рецепт. Смотрю в русский ман - нет камента. Украинский домен ua.php.net - есть камент. Русский ru.php.net - есть камент. Переключаю вкладку обратно - нет камента. Обновляю, всё равно нет. Всё, думаю, прощай крыша.
Поискал фильм посмотреть, обратно в браузер, смотрю адреса: один ru2.php.net, другой ru.php.net. Полегчало.
Так заодно мы узнали, что Ринет, который держит ru2.php.net, не любит пхп.

ах, да, рецепт.
http://ru.php.net/manual/ru/pgsql.setup.php#88042
необходимо загрузить клиента постгреса в тот же слой, что и транслятор пхп.
если вы использовали инсталляторы, то в конфиге апача есть такой камент:
#BEGIN PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL
PHPIniDir "C:/server/php/"
Loadfile "C:/server/php/php5ts.dll"
Loadfile "C:\server\pgsql\bin\libpq.dll"
LoadModule php5_module "C:/server/php/php5apache2_2.dll"
#END PHP INSTALLER EDITS - REMOVE ONLY ON UNINSTALL
добавлены строки принудительной погрузки библиотек

2009/04/10

yeap. Передача параметров

Непростая это задача - правильная передача параметров.
Мы ведь решили делать RESTful ;) систему. А описания принципа рэст говорят нам, что вся информация запроса содержится в uri (Точнее, наоборот: любая доступная информация однозначно идентифицируется uri, что, соот-но, см. утверждение выше.)
Но мы также решили сделать внутренним форматом (вообще, единственным форматом передачи) данных - XML.
Мы схитрим. Введём специальный параметр в uri, указывающий на то, что параметры переданы отдельно. Назовём его request. Кусок uri будет выглядеть так /path/parameters/request/ .
Далее, т.к. модуль сам разбирает свои параметры, то он сам знает, откуда брать параметры, то параметр request фактически является декларативным, для нас.
Вроде всё. Запоминаем и работаем дальше.

ps: зарезервируем на всякий случай $_REQUEST['module']['module_name'] для передачи параметров. хаком можно пользоваться и надо не забывать очищать. модуль-враппер-компоновщик параметров из массивов в хмл писать не будем. хотя надо бы. позже

2009/04/02

yeap. Ещё соглашения

Мы уже договаривались о некоторых соглашениях, касательно работы системы и модулей в ней. Обяжем модули возвращать XML такого свойства
[module name="module_name" path="fullpath"]
[head]
[title]
[meta = ]
[meta = ]
[link = ]
[script]
[description]
блок содрежит разного рода служебное и не очень описалово, типа автора, дата последнего изменения итп. делит важность с виджетом
[/description]
[/head]
[body] // %)
[widget]
это такая хитрая штуковина для визуального оформления, которая внедряется только по месту расположения модуля в документе. для разного рода рсс, разумеется, игнорируется
[/widget]
[data]
[row]
[smthng_field]
[/row]
[/data]
[/body]
[/module]

2009/03/31

Мотивация блоггеров

Мотвация и прочая статистика по блогосфере рунета
http://subscribe.ru/archive/optin.custom/200904/01194537.html
пример, как котерову сносит крышу http://habrahabr.ru/blogs/php/54785/
dklab.ru/lib/Dklab_ShortXSLT/ "упрощённый" XSLT

не мог не выматериться

Yass + jQuery

Сначала немного пиара Yass (вдруг кто не в курсе, что это - так это JavaScript библиотека для работы с селекторами http://yass.webo.in/)
Что видит юзер, когда приходит на сайт? Он видит несколько примеров, код и таблицу сравнения скорости работы. О, прикольно! быстро работает! - говорит юзер и уходит дальше, потому как непонятно, для чего всё это надо. На самом деле, надо это только для выборки селекторов.

Как мне рассказал один username%#javascript@rusnet.ru, который достал разрабов, функциональность yass укладывается в несколько методов:
_ (селектор, корень, неКэшировать) -- основной метод для выбора элементов
_.ready (функция) - позволяет назначать функции на выполнение по загрузке DOM-дерева на странице.
_.bind (объект(ы) или CSS-строка, событие, обработчик) -- метод для назначения обработчиков для элемента, эементов или эементов, соответствующих заданному CSS-селектору
_.load(алиасы, обработчик) -- метод для модульной загрузки произвольных модулей. Зависимости модулей на данный момент разделены - , в последней редакции это будет изменено на #. Обработчикзадается в виде строки, а не функции (и вызывается при загрузке каждого модуля через eval).
_.postloader (элемент script) -- проверяет, загружен ли текущий тег script и запускает всю логику обработчиков (если удовлетворены все зависимости для загрузки данного модуля).

Возникает вопрос: а дальше? Хочется ведь какой-то функциональности, кроме выборки всех первых абзацев с определённым классом внутри всех блоков? Хочется как-то подружить yass и jQuery.

Как подружить yass и jQuery? Решение простое как враппер

<script type="text/javascript" src="http://yass.webo.in/yass.0.3.8.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>
<script>
    jQuery.noConflict();
    var $ = function(.){return ('string'==typeof .)?jQuery(_(.)):jQuery(.);};
</script>

* This source code was highlighted with Source Code Highlighter.


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

2009/03/29

7 этапов построения масштабируемых веб-приложений.

это перевод со слайдов отсюда http://www.profyclub.org/articles/290/3341
  1. Семь составляющих веб-приложений
    автор: John Engates
  2. На повестке (регламент встречи):
    • Что мы ждём от веб-приложений
    • Типичный сценарий работ
    • Неплохие примеры
    • Вопросы и ответы

  3. Чего мы ждём от сайтов

    • Масштабируемость
    • Высокая степень эксплуатационной готовности (полезности), высокая отдача
    • Производительность (эффективность работы?)
    • Простота управления
    • Низкая стоимость (обслуживания, в том числе)
    • Изобилие рюшечек Множество приятных неожиданностей
    • И что он будет нам делать бабло, много бабла!

    Это и есть семизначная мантра клиента-директора, думающего о заказе корпоративного сайта

  4. Высокая готовность. Определение:
    Высокая готовность (High Availability HA) - это такой подход к проектированию и реализации, который бы гарантировал известную степень уверенности в их (проектирования и разработки) непрерывности. Так-то!
    Как это выглядит на примерах:
    • ваш сайт всегда работает и доступен
    • юзеры счастливы
    • вы не теряете денег из-за технических простоев
    • (и это не увеличивает затраты на обслуживание сверх необходимого)

    Это была мантра техдира проекта

  5. Что на самом деле называется масштабируемостью
    Масштабируемость (расширяемость) - это ожидаемое свойство системы, которое показывает её возможность к росту доходов в приятной форме, или легко увеличиваться по необходимости
    (Дядька загнул круто. Масштабируемость - это способность системы к расширению и росту. Ну и увеличению доходности, да)

    Чем не выражается масштабируемость:
    • чисто наращиванием мощностей (2МГц -> 3МГц)
    • чем-то вроде операционных систем (Solaris vs Linux)
    • особенностью софтовых технологий (Java - Python - Rails)
    • особенностями платформ (Intel - AMD)
    • оптимизацией кода (10 строк против 1000, утверждает этот дядька, ничего не решает)
    • выбором технологии хранения (SAN vs NAS)

  6. большими красными буквами

    РАСШИРЯЕМОСТЬ И ПРОИЗВОДИТЕЛЬНОСТЬ - НЕ ОДНО И ТОЖЕ

  7. картинки с примерами
    красивые машинки, автомобильные развязки и писсуары





  8. Истина первая:

    Ничто не может множится, если таковым не спроектировано.

  9. Истина вторая:

    Если что-либо было спроектировано частями, может их наращивать без проблем.

  10. Очень интересная "шкала боли" (игра слов с предыдущими пунктами)
  11. Типовые сценарии развития

    Этап 1. Начало
    • Простая архитектура
      - файрвол и балансировщик
      - пара веб-серверов
      - сервер БД
      - внутреннее хранилище

    • Невеликая сложность и проблемность, быстрая разработка, богато фич разного рода и всё быстро
    • Никакой избыточности (втч и в рабочей силе), низкая стоимость работ - прекрасный стартап!

  12. Этап второй, всё тоже самое, но чуть-чуть по-больше
    • Успешное ведение бизнеса - залог хороших отношений с законом
    • Добавим немного файрволов и балансировщиков
    • Добавим чуть больше веб-серверов для производительности
    • Устаканим схему БД и соптимизируем её с помощью DBA (консультанта)
    • Добавим баз
    • Переведём хранилище на SAN или DAS
    • Всё ещё просто, подходит для перспективных приложений

  13. Этап третий - Первые симптомы
    • Публичность
    • Устанавливается Squid или Vanish в режиме обратных прокси, или очень хороший балансировщик - для кеширования статичного контента
    • Добавляем ещё сколько-то веб-серверов (управление контентом уже доставляет немалый головняк)
    • Единственная БД не будет разделена когда-либо (раздельные операции чтения-записи - вся запись ведётся на единственный мастер сервер с несколькими вторичными серверами для чтения)
    • Может возникнуть необходимость чё-нить переписать в приложении

  14. Картинка "Расширяемость применительно к серверам баз данных"
  15. Этап четвёртый - Боли усиливаются
    • Кеширование на memcache
    • Репликация не работает для всего (единственная база для записи - много баз для записи - результат: репликация работает долго)
    • Приходит осознание необходимости разделения баз (конечно же, если ваша БД поддерживает этот механизм)
    • Приходит осознание распределённых хранилищ для контента
    • Необходимо серьёзное преобразование архитектуры приложения и базы (а разрабы могут не обладать подобным скилом)

  16. Этап пятый - Реально головняк!
    • Приходит м-р Паника и остаётся жить.
      Разве мы не могли сделать всё это раньше? (Список этого:
      - Полное переосмысление приложения\бизнес-модели
      - И почему мы не запланировали расширяемость системы на момент принятия решений по архитектуре? )
    • Невозможность делимости как фичи приложения - что ещё мы можем использовать? (Варианты
      - Разделение основанное на географическом принципе, по фамилии, по userID, etc
      - Создание кластеров пользователей (пользовательская кластеризация)
    • Поведение приложения должно быть идентично на каждом пользовательском кластере
    • Использование стурктуры хешей или мастер-сервера БД для определения какого пользователя на какой кластер подключить

  17. Этап шестой - Приход, мал-мала полегчало
    • Расширяемая архитектура приложения и базы
    • Удовлетворительное быстродействие
    • Снова можно добавлять новую функциональность
    • Оптимизация чего-нибудь в коде
    • Продолжаем расти, но теперь вполне управляемо

  18. Этап седьмой - Исход в неизвестность
    • Где нас ещё поджидают узкие места?
      - Обеспечение питанием, площадь размещения
      - Каналы и прочее - насколько велик ваш хостер?
      - Проблемы систем защиты и балансировщиков нагрузки
      - Хранилища данных
      - Люди и проблемы
      - Технологические ограничения расширяемости баз данных - всё ещё хотите хранить данные по схеме ключ-значение?
    • Что там насчёт "все яйца в одну корзину"?
      - один датацентер
      - одна копия данных
      - проблемы репликации данных и балансировки по географичекому принципу

  19. Добрые советы
    • Не изобретайте колесо, скопируйте у кого-нибудь другого
    • Думайте просто
      - Все вещи, сделанные проще некуда - не так уж просты. - А. Эйнштейн
    • Думайте горизонтально... не вертикально... в любых случаях (может, это идиома такая?)
      Насколько затратно? - вместо - Насколько быстро?
    • Используйте подходящее обеспечение и оборудование
    • Решайте проблемы легко и просто
      - Приводите планы в действие
      - Разделяйте различные сервисы
      - Не проводите много изменений за один раз (это называется итеративность)
  20. Ещё немного добрых советов
    • Не тратьте времени на оптимизацию оптимизации ("Преждевременная оптимизация преждевременна" (c)#phpclub@undernet.org)
      - Возьмите вашу [правильно спроектированную] архитектуру, часто подстраивайте решения [под неё], и редко оптимизируйте (или никогда)
    • Проверяйте возможности к расширению подходящими нагрузочными тестами
      - Сделайте это привычной практикой до того, как вы начнёте думать об их необходимости
    • Используйте кеширование до того, как почуствуется необходимость
    • Много памяти и 64-битная платформа помогут вам (Use the Force, Luck! :)
    • Проверяйте новые возможности до того, как выбор между производительностью и масштабируемостью станет проблемой
      - Nice to have vs. have to have. И будет вам щасте:)

  21. Управляйте изменениями помня об доступности сайта
    • Нельзя недооценивать необходимость правильной постановки технологического процесса и документации
    • Избавьтесь от управленцев
      - Разработка - тестирование - выпуск
      - Работайте уместно сохраняя конъюнктуру
    • Используйте системы контроля версий
      - Понятно, да: RCS, CVS, Subversion
    • Отслеживайте выпуски (короче, issue tracking - добрый совет использовать трекинговую систему. имхо помощь в разработке оказывают специализированные системы багтрекинга, а не хлам типа trac - у него другие задачи. Если и использовать систему контроля, то это должен быть комбайн, в котором прозрачно отслеживаются таймлайны, что-то типа eGroupWare. Кстати, этот совет противоречит отказу от менеджмента)
    • Используйте стандарты кодирования
    • Измените схему работ
      - Планирование - тестирование - выполнение
      - Оптимизированная на высокую доступность инфраструктура
Дальше там реклама и спасибы.
1080слов, 7530знаков

x00.yeap Принципы мега-системы

Ориентиры:
  1. Модульность (ох, как много светлых вострых копий разбилось об эту стену и дерзких сердец угасло. Но мы-то - старые циники; плюс - терять уже нечего)
    Модульность - это система блоков и плагинов. Необходимо разработать и воплотить такой принцип движка, чтобы наращивание (урезание) функциональности не оказывало влияния на прочий функционал.
    зы: модули не отменяют нормальных уровней абстракции
  2. KISS - Keep It Simple, Stupid (вдруг кто не в курсе) - "Будь проще, идиотина"
    & JMS - Just Make Simple - "Тупо сделай проще". Принцип был придуман совместно во время работы в %companyname%. Одна из любимых программерских фраз была: "Давай сделаем это ещё проще"

  3. В принципе, на этом можно было бы и закончить ;) потому что дальше технические подробности.
    Внутренний формат представления данных: XML (andnearbird), включая протоколы, интерфейсы и пр. (кроме, разве что, JSON)
  4. База данных (наверняка, понадобится ;) PostgreSQL.
    Почему? По сумме критериев: она достаточно мощна (вдруг кто-нить соберётся делать порталы?), распространена у хостеров, не-MySQL, на постгре можно делать нормальную бизнес-логику. Тем более, что нас модули - желющие могут и поменять.
    Кстати, подключение конкретных обработчиков и надо сделать модулями-плагинами.
  5. Шаблонизатор. Какой шаблонизатор?! о_О
    а) PHP - лучший шаблонизатор
    б) у нас же XML - для него есть XSLT
    в) можно сказать, что это будет шаблонизатор pull типа (смарти типа push)

Ядро.
Ядром системы будет пхп. Что за странный выбор, спросите вы? Что эдакового вы хотите видеть в ядре, чего нет в пхп, спрошу я вас?

MVC.
МВЦ не существует.

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

Виджеты!
Работают только с визуальной частью плагинов.
Очень интересно, но непонятно пока, как это подключать.

Helpers
Хелперы - весьма полезная штука. Посмотрим, как оно уживётся с пул-шаблонизатором.

ps: http://code.google.com/p/yeap/

2009/03/27

авторское право

http://habrahabr.ru/blogs/copyright/55609/#comment_1491273
цитаты законов, регулирующих право автора на интеллектуальный труд. с чувством, с толком, с расстановкой, наездами и распальцовкой. рекомендую
Два сообщения.
а) Просто информация.
jumpidea.com хорошая идея. унылое воплощение. им нужен дизайнер и корректор

б) Слухи.
компания (холдинг?) a1 скупает стартапы. первоначально это выглядит как организация конкурсов и преложения о сотрудничестве. без комментариев.

2009/03/26

Apache, PHP, MySQL, Windows, SVN (part 2)

Apache 2.2

Server Information
Если сервер находится в домене, и вы хотите светиться в интранете, и в сети правильно настроены днс+дхцп, то лучше согласиться с автоопределёнными параметрами, кроме почты.
Но в принципе, localhost www.localhost admin@localhost тоже удачный выбор.
(Всё равно нам локалхост не нужен будет, все сервера будем разворачивать на виртуальных хостах.)
+ Установить как сервис.

Custom setup
Я оставляю только Apache Runtime и меняю каталог \server\apache

Всё.
Обратившись браузером на localhost видим оптимистичное It Works!

Останавливаем службу apache2.2

Идём в каталог конфига апача (у нас \server\apache\conf\) редактируем httpd.conf
раскомментируем строки относящиеся к mod_rewrite и vhost

Устанавливаем PHP
Выбираем путь. Все привыкли уже? \server\php
Ставим как модуль апача2.2 (в следующем окне указываем путь к конфигу апача, только что его редактировали)
Самое интересное ;) экстеншены - расширения. Джентельменский набор:
CURL
gd2
Multi-byte string functions
MySQL
PDO - MySQL (PDO - PostgreSQL, PDO - SQLite, PDO - Firebird)
Sockets
XSL
zip

ну ещё PostgerSQL себе поставил, mcrypt, mhash, Tidy, XML-RPC
Finish

Проверяем: в httpd.conf внизу появились строки про загрузку пхп5 как модуля

Если у вас в процессе установки появились ошибки, значит что-то вы сделали неправильно. Скорее всего, вы забыли остановить службу веб-сервера.

SVN-client
Как говорил Джон Коннор: "Easy money". Сами.
В свн надо запомнить две основные команды: update (up) и commit, и две дополнительные: checkout (co) - сливает инфу из репозитория с внешнего сервера на локаль, import - вылить инфу из локаля в предварительно сформированный(!!!) репозиторий.

Apache-VHOST
Настройки находятся в extra\httpd-vhost.conf
Копируем одну из секций. Настраиваем:

# много инструкций, найдите две самые нужные
<VirtualHost dummy-host2:80>
    ServerAdmin webmaster@dummy-host2
    DocumentRoot "C:\htdocs\dummy-host2\trunk\htdocs"
    ServerName dummy-host2
    ServerSignature Off
    ServerAlias www.dummy-host2
    ErrorLog "logs/dummy-host2.error.log"
    CustomLog "logs/dummy-host2.access.log" common

# так подключают mod_rewrite
    <Directory "C:\htdocs\dummy-host2\trunk\htdocs" >
        Options Indexes FollowSymLinks MultiViews
        AllowOverride All
#         ^ вот так
        Order allow,deny
# это порядок уровней доступа
        Allow from all
    </Directory>

# тоже полезно
    <FilesMatch "^\.ht">
        Order allow,deny
        Deny from all
        Satisfy All
    </FilesMatch>

</VirtualHost>


* This source code was highlighted with Source Code Highlighter.


Редактируем файл hosts. Куча манов в интернетах
Запускаем сервис

Alles gut!
:)

Apache, PHP, MySQL, Windows, SVN

MySQL
Разумеется, выборочная установка
Изменяем пути на что-нибудь типа \server\mysql\ и для хранения данных \server\mysql\data\
Я ещё и документацию отключаю - только потому, что её всегда можно на сайте посмотреть.

Соглашаемся на конфигурацию. Внимание! Конфигурация проводится один раз! Если не получится - самое простое решение: переустановить сервер.
Хмм... у меня не запустилась. Идём в старт-меню, ищём там конфигуратор.
Детальная конфигурация.
Девелоперская машина.
Мультифункциональная.
Для движка InnoDB указываем путь хранения файлов, желательно не на FAT-разделе - это связано с особенностями движка.
Колличество коннектов не особенно важно для нас.
Включить доступ через порт 3306 (можно изменить, если несоклько серверов). Я за Strict mode.
Далее мультиязычность: установка второй кнопы равнозначна выбору utf8 в треттьем пункте.
Устанавливать как сервис (можно выбрать имя сервиса для использования в команде net start или для нескольких серверов).
Включить каталог mysql/bin в системные пути, и тогда можно просто запускать консоль командой mysql в любом месте.
Внимание! root password! запомните его. Восстановлению забытых рутовых паролей посвящено много страниц в интернетах.
Execute.
У меня не стартовал сервис. Думаю, я забыл перезагрузку. Сейчас проверим

ps: действительно, перезагрузка устанавливает mysql как сервис.
проверяем работу. консоль (Winkey+R, cmd, Enter), mysql -uroot -p{вашпароль}
подключилось? - хорошо, сервер работает.
У меня не подключилось.
mysql -uroot
help set password;
set password for root = password('вашпароль');
упс, не получилось, читаем хелп внимательней, исправляем.
quit;

Настраиваем Komodo

Edit - Preferences
a) enable Show Buton Text, disable Show Start Page
code) enable autocomplite
editor) show line number
key bindings) delete line Ctrl-Y, duplicate line Ctrl-D, previous file Ctrl-Shift-Tab, next file Ctrl-Tab, Undo Alt-Backspace, Redo Alt-Shift-Backspace, Focus on Project Pane Ctrl-1, Focus on Editor Ctrl-2, Focus on Toolbox Pane Ctrl-3, Focus on Bottom Pane Ctrl-4
indentation) width on each tab = 4, Language settings: PHP, HTML, JavaScript - enable Prefer 4 4
smart editing) Use tab - на любителя, disable Hyperlinks, Syntax Checking я ставлю 2500мсек
save options) Clean trailing whitespace
font&colors) я ставлю схему medium
internationalization) Language specific utf-8 without BOM
language) после установки пхп вернуться и поставить правильные значения
в серверах можно поставить фтп и прочее, но мы-то ведь пользуемся умным свн-ом ;)

Идем Tools - Add-ons ищем и ставим Komodo Source Tree
удаляем или отключаем ненужное

Инструментарий разработчика, или как нам обустроить винду

очень быстро и кратко

http://portableapps.com/suite Firefox, Thunderbird, OpenOffice + ещё что-то в одном флаконе
для разработчика к Firefox комплект плагинов Adblock plus, Web Developer, Firebug, Regular Expressions Tester, SQL Injection

двухпанельный filemanager http://www.freecommander.com/ru/fc_u3_ru.htm или http://portableapps.com/apps/utilities/xenon_portable (не смотрел ещё)
архиватор 7-zip
маленький редактор (чтоб где-нить подправить) с поддержкой юникода и подсветкой Notepad++
плейер http://www.aimp.ru/
видео плейер + комплект кодеков K-Lite Codec Pack

аська (в принципе, переносима) http://rnq.ru/ , или http://mdc.ru/download.php (+jabber+irc), или миранда, или выбери себе сам
irc http://www.kvirc.ru/
скайп 3.8
ластфм
что ещё?

для параноиков без корпоративной прокси файрволл+антивирус http://www.personalfirewall.comodo.com/download_firewall.html

Apache, PHP, MySQL качаем с официальных сайтов последние stable версии (*.msi желательно), и PostgreSQL для души :)
ах да, комплект WAMPS: SVN клиент здесь: http://tortoisesvn.tigris.org/
SVN Server for Windows также существует, но уже не устанавливается на мой лицензионный в2к

ИДЕ: http://www.activestate.com/komodo_edit/ правильный выбор. Есть зенды, эклипсы и прочая муть типа нетбинс от СанМС - пробовал всё, остановился на Komodo
к нему не забываем ставить плагин SourceExplorer

ничего не забыл?
semagic ещё, чтоб в блоги писать :)
Семаджик умеет отправлять записи в блоггер, вокс и на ещё какие-то хитрые сервера

2009/03/24

Концепция изменилась!

Итак, концепция изменилась.
Мне надоело работать унылую работу над унылым проектом в унылом недоофисе (бывш. складской барак 19века постройки) без отопления и без коллег. И я не пошёл на работу. Как я вчера ответил одному иностранному другу на вопрос "Каг делО?" - I want drop my job & will have my work (конечно, это неверная конструкция :) надо бросить работу и заняться, наконец, делом.
А дело будет такое: я хочу, чтоб работа нашла меня сама :)
И в промоцелях буду
  • вести этот блог
  • писать очередную CMS (принципы и условия позже)
  • писать статьи с пометкой "заказные". Их можно купить.
  • писать в ленту http://www.plurk.com/zenaround (на твиттере так же https://twitter.com/zenaround) об успехах, объявлениях и разном
Ах да, "высокие цели". Помимо ожидания горы будем копить на ноутбук.

2009/02/27

Замечательная статья о том, как FriendFeed отказалась от структурного хранения информации в БД. Есть небольшой анонс-перевод на русский.
Для затравки кусочек:
FriendFeed (а это нагруженная система, конкурирует с Twitter) описала собственную модель данных. С ростом базы (MySQL) столкнулись с естественными проблемами - индексирование занимает много времени, join-ы работают все дольше и дольше. В качестве ответной меры решили отказаться от реляционной модели представления данных и хранить просто свойства объектов.