2009/12/27
Попадаются ж такие удивительные личности
2009/12/19
Не могу молчать!
2009/12/16
йаСМИ в логах
2009/12/09
ubuntu и macos
2009/11/30
Разное, текущее
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(); }// здесь ещё раз список методов, т.к. конкретную реализацию оставим для неабстрактных классов}
Возврат значений по ссылке обеспечивает обратную связь сущности (ещё не объявленной) с хранилищем, которое деструктором закрывает сущность, сохраняет её на физическом уровне.
interface XML{function asXML();function XPath();}
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);}}
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
- доступность понимания структуры и кода, чтобы начинающий программист мог его освоить
- некоторый уровень технологий, чтоб джыдаю было не скучно
- не изобретать велосипедов
- зы: совсем забыл! заложить в архитектуру максимально возможный уровень расширяемости и не заниматься преждевременной оптимизацией
Маленькое лирическое отсутпление. Во время работы в %COMPANYNAME% в среде программистов был изобретён принцип JMS Just Make Simple - Просто сделай проще. От часто прозносимых фраз: "Давай сделаем это проще", "Я знаю как проще". Стали ли они продолжать линейку JMS CMS, я не в курсе.
- уже упомянутый PHP в связке с Apache. Тип связи с веб-сервером и сам веб-сервер могут быть любыми, это пока не принципиально, но Apache + mod_php весьма распространены, будем ориентироваться на такой тип.
- т.к. XML клиенту (пользователю) не интересен, подключим XSLT и нагрузим преобразованиями клиента (браузер) - проверено, работает
- добавим к этому грамотный CSS и какой-нибудь javascript framework: не мудрствуя долго, остановим выбор на jQuery
- выбор физического воплощения хранилища представил некоторую проблему. Основное требование: нативное хранилище объектов. Но объектно-ориентированные базы весьма нетривиальны и не удовлетворяют требованию простоты фреймворка.
Ещё одно лирическое отступление. В процессе поиска наткнулся на одно интересное решение: база не имеет собственного клиента, доступ через http RESTful или через API, возвращает xml или json, обращаться можно хоть из javascript. Оригинальное решение и достаточно старое. Но я не поставил вовремя закладку, а название забыл! %( Но в этот фреймворк тоже не подходит в виду излишней оригинальности.
Остановился на PostgreSQL с дополнением для XML, кстати, прекрасно работает.
Не забываем переложить бизнес-логику на базу, это её прямое назначение.
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
Смотреть и слушать на хабре или ютубе
2009/09/17
как настроить отображение кириллических ссылок в firefox
via http://linsovet.com/firefox-show-cyrillic-links
2009/09/05
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 о хранении сложных проектов.
У меня пока всё
до новых встреч
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;
2009/05/14
Архитектурные шаблоны
перевода на русский нет, перевод на украинский уныл
стартап с человеческим лицом
как делали сайт Wi2Geo.ru
2009/04/30
jQuery.ready
Как известно меньшему количеству народа, в неё можно запихать любой элемент, и функция будет вызвана после полной загрузки этого элемента.
И, как оказалось, $.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. Передача параметров
2009/04/02
yeap. Ещё соглашения
2009/03/31
Мотивация блоггеров
http://subscribe.ru/archive/optin.custom/200904/01194537.html
dklab.ru/lib/Dklab_ShortXSLT/ "упрощённый" XSLT
не мог не выматериться
Yass + jQuery
Что видит юзер, когда приходит на сайт? Он видит несколько примеров, код и таблицу сравнения скорости работы. О, прикольно! быстро работает! - говорит юзер и уходит дальше, потому как непонятно, для чего всё это надо. На самом деле, надо это только для выборки селекторов.
Как мне рассказал один 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 этапов построения масштабируемых веб-приложений.
- Семь составляющих веб-приложений
автор: John Engates - На повестке (регламент встречи):
- Что мы ждём от веб-приложений
- Типичный сценарий работ
- Неплохие примеры
- Вопросы и ответы
- Чего мы ждём от сайтов
- Масштабируемость
- Высокая степень эксплуатационной готовности (полезности), высокая отдача
- Производительность (эффективность работы?)
- Простота управления
- Низкая стоимость (обслуживания, в том числе)
Изобилие рюшечекМножество приятных неожиданностей- И что он будет нам делать бабло, много бабла!
Это и есть семизначная мантра клиента-директора, думающего о заказе корпоративного сайта - Высокая готовность. Определение:
Высокая готовность (High Availability HA) - это такой подход к проектированию и реализации, который бы гарантировал известную степень уверенности в их (проектирования и разработки) непрерывности. Так-то!
Как это выглядит на примерах:- ваш сайт всегда работает и доступен
- юзеры счастливы
- вы не теряете денег из-за технических простоев
- (и это не увеличивает затраты на обслуживание сверх необходимого)
Это была мантра техдира проекта - Что на самом деле называется масштабируемостью
Масштабируемость (расширяемость) - это ожидаемое свойство системы, которое показывает её возможность к росту доходов в приятной форме, или легко увеличиваться по необходимости
(Дядька загнул круто. Масштабируемость - это способность системы к расширению и росту. Ну и увеличению доходности, да)
Чем не выражается масштабируемость:- чисто наращиванием мощностей (2МГц -> 3МГц)
- чем-то вроде операционных систем (Solaris vs Linux)
- особенностью софтовых технологий (Java - Python - Rails)
- особенностями платформ (Intel - AMD)
- оптимизацией кода (10 строк против 1000, утверждает этот дядька, ничего не решает)
- выбором технологии хранения (SAN vs NAS)
- большими красными буквамиРАСШИРЯЕМОСТЬ И ПРОИЗВОДИТЕЛЬНОСТЬ - НЕ ОДНО И ТОЖЕ
- картинки с примерами
красивые машинки, автомобильные развязки и писсуары - Истина первая:
Ничто не может множится, если таковым не спроектировано. - Истина вторая:
Если что-либо было спроектировано частями, может их наращивать без проблем. - Очень интересная "шкала боли" (игра слов с предыдущими пунктами)
- Типовые сценарии развития
Этап 1. Начало- Простая архитектура
- файрвол и балансировщик
- пара веб-серверов
- сервер БД
- внутреннее хранилище - Невеликая сложность и проблемность, быстрая разработка, богато фич разного рода и всё быстро
- Никакой избыточности (втч и в рабочей силе), низкая стоимость работ - прекрасный стартап!
- Простая архитектура
- Этап второй, всё тоже самое, но чуть-чуть по-больше
- Успешное ведение бизнеса - залог хороших отношений с законом
- Добавим немного файрволов и балансировщиков
- Добавим чуть больше веб-серверов для производительности
- Устаканим схему БД и соптимизируем её с помощью DBA (консультанта)
- Добавим баз
- Переведём хранилище на SAN или DAS
- Всё ещё просто, подходит для перспективных приложений
- Этап третий - Первые симптомы
- Публичность
- Устанавливается Squid или Vanish в режиме обратных прокси, или очень хороший балансировщик - для кеширования статичного контента
- Добавляем ещё сколько-то веб-серверов (управление контентом уже доставляет немалый головняк)
- Единственная БД не будет разделена когда-либо (раздельные операции чтения-записи - вся запись ведётся на единственный мастер сервер с несколькими вторичными серверами для чтения)
- Может возникнуть необходимость чё-нить переписать в приложении
- Картинка "Расширяемость применительно к серверам баз данных"
- Этап четвёртый - Боли усиливаются
- Кеширование на memcache
- Репликация не работает для всего (единственная база для записи - много баз для записи - результат: репликация работает долго)
- Приходит осознание необходимости разделения баз (конечно же, если ваша БД поддерживает этот механизм)
- Приходит осознание распределённых хранилищ для контента
- Необходимо серьёзное преобразование архитектуры приложения и базы (а разрабы могут не обладать подобным скилом)
- Этап пятый - Реально головняк!
- Приходит м-р Паника и остаётся жить.
Разве мы не могли сделать всё это раньше? (Список этого:
- Полное переосмысление приложения\бизнес-модели
- И почему мы не запланировали расширяемость системы на момент принятия решений по архитектуре? ) - Невозможность делимости как фичи приложения - что ещё мы можем использовать? (Варианты
- Разделение основанное на географическом принципе, по фамилии, по userID, etc
- Создание кластеров пользователей (пользовательская кластеризация) - Поведение приложения должно быть идентично на каждом пользовательском кластере
- Использование стурктуры хешей или мастер-сервера БД для определения какого пользователя на какой кластер подключить
- Приходит м-р Паника и остаётся жить.
- Этап шестой - Приход, мал-мала полегчало
- Расширяемая архитектура приложения и базы
- Удовлетворительное быстродействие
- Снова можно добавлять новую функциональность
- Оптимизация чего-нибудь в коде
- Продолжаем расти, но теперь вполне управляемо
- Этап седьмой - Исход в неизвестность
- Где нас ещё поджидают узкие места?
- Обеспечение питанием, площадь размещения
- Каналы и прочее - насколько велик ваш хостер?
- Проблемы систем защиты и балансировщиков нагрузки
- Хранилища данных
- Люди и проблемы
- Технологические ограничения расширяемости баз данных - всё ещё хотите хранить данные по схеме ключ-значение? - Что там насчёт "все яйца в одну корзину"?
- один датацентер
- одна копия данных
- проблемы репликации данных и балансировки по географичекому принципу
- Где нас ещё поджидают узкие места?
- Добрые советы
- Не изобретайте колесо, скопируйте у кого-нибудь другого
- Думайте просто
- Все вещи, сделанные проще некуда - не так уж просты. - А. Эйнштейн - Думайте горизонтально... не вертикально... в любых случаях (может, это идиома такая?)
Насколько затратно? - вместо - Насколько быстро? - Используйте подходящее обеспечение и оборудование
- Решайте проблемы легко и просто
- Приводите планы в действие
- Разделяйте различные сервисы
- Не проводите много изменений за один раз (это называется итеративность)
- Ещё немного добрых советов
- Не тратьте времени на оптимизацию оптимизации ("Преждевременная оптимизация преждевременна" (c)#phpclub@undernet.org)
- Возьмите вашу [правильно спроектированную] архитектуру, часто подстраивайте решения [под неё], и редко оптимизируйте (или никогда) - Проверяйте возможности к расширению подходящими нагрузочными тестами
- Сделайте это привычной практикой до того, как вы начнёте думать об их необходимости - Используйте кеширование до того, как почуствуется необходимость
- Много памяти и 64-битная платформа помогут вам (Use the Force, Luck! :)
- Проверяйте новые возможности до того, как выбор между производительностью и масштабируемостью станет проблемой
- Nice to have vs. have to have. И будет вам щасте:)
- Не тратьте времени на оптимизацию оптимизации ("Преждевременная оптимизация преждевременна" (c)#phpclub@undernet.org)
- Управляйте изменениями помня об доступности сайта
- Нельзя недооценивать необходимость правильной постановки технологического процесса и документации
- Избавьтесь от управленцев
- Разработка - тестирование - выпуск
- Работайте уместно сохраняя конъюнктуру - Используйте системы контроля версий
- Понятно, да: RCS, CVS, Subversion - Отслеживайте выпуски (короче, issue tracking - добрый совет использовать трекинговую систему. имхо помощь в разработке оказывают специализированные системы багтрекинга, а не хлам типа trac - у него другие задачи. Если и использовать систему контроля, то это должен быть комбайн, в котором прозрачно отслеживаются таймлайны, что-то типа eGroupWare. Кстати, этот совет противоречит отказу от менеджмента)
- Используйте стандарты кодирования
- Измените схему работ
- Планирование - тестирование - выполнение
- Оптимизированная на высокую доступность инфраструктура
1080слов, 7530знаков
x00.yeap Принципы мега-системы
- Модульность (ох, как много светлых вострых копий разбилось об эту стену и дерзких сердец угасло. Но мы-то - старые циники; плюс - терять уже нечего)
Модульность - это система блоков и плагинов. Необходимо разработать и воплотить такой принцип движка, чтобы наращивание (урезание) функциональности не оказывало влияния на прочий функционал.
зы: модули не отменяют нормальных уровней абстракции - KISS - Keep It Simple, Stupid (вдруг кто не в курсе) - "Будь проще, идиотина"
& JMS - Just Make Simple - "Тупо сделай проще". Принцип был придуман совместно во время работы в %companyname%. Одна из любимых программерских фраз была: "Давай сделаем это ещё проще" - В принципе, на этом можно было бы и закончить ;) потому что дальше технические подробности.
Внутренний формат представления данных: XML (andnearbird), включая протоколы, интерфейсы и пр. (кроме, разве что, JSON) - База данных (наверняка, понадобится ;) PostgreSQL.
Почему? По сумме критериев: она достаточно мощна (вдруг кто-нить соберётся делать порталы?), распространена у хостеров, не-MySQL, на постгре можно делать нормальную бизнес-логику. Тем более, что нас модули - желющие могут и поменять.
Кстати, подключение конкретных обработчиков и надо сделать модулями-плагинами. - Шаблонизатор. Какой шаблонизатор?! о_О
а) PHP - лучший шаблонизатор
б) у нас же XML - для него есть XSLT
в) можно сказать, что это будет шаблонизатор pull типа (смарти типа push)
Ядро.
Ядром системы будет пхп. Что за странный выбор, спросите вы? Что эдакового вы хотите видеть в ядре, чего нет в пхп, спрошу я вас?
MVC.
МВЦ не существует.
Модули.
Плагины являются самодостаточными или наследованными компонентами.
На вход получают дозу XML, или не получают. Выдают свой XML, как правило. Плагинов без вывода очень мало.
Подключаются
Виджеты!
Работают только с визуальной частью плагинов.
Очень интересно, но непонятно пока, как это подключать.
Helpers
Хелперы - весьма полезная штука. Посмотрим, как оно уживётся с пул-шаблонизатором.
ps: http://code.google.com/p/yeap/
2009/03/27
авторское право
цитаты законов, регулирующих право автора на интеллектуальный труд. с чувством, с толком, с расстановкой, наездами и распальцовкой. рекомендую
а) Просто информация.
jumpidea.com хорошая идея. унылое воплощение. им нужен дизайнер и корректор
б) Слухи.
компания (холдинг?) a1 скупает стартапы. первоначально это выглядит как организация конкурсов и преложения о сотрудничестве. без комментариев.
2009/03/26
Apache, PHP, MySQL, Windows, SVN (part 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
Разумеется, выборочная установка
Изменяем пути на что-нибудь типа \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
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 (а это нагруженная система, конкурирует с Twitter) описала собственную модель данных. С ростом базы (MySQL) столкнулись с естественными проблемами - индексирование занимает много времени, join-ы работают все дольше и дольше. В качестве ответной меры решили отказаться от реляционной модели представления данных и хранить просто свойства объектов.