Home

Реклама

Настроить

Предыдущие 20

10 Июн, 2009

Умань

C++ Developer Needed

Originally published at Блог FX'а. Please leave any comments there.

Нужен хороший C++-программист для интересного проекта (создание поискового движка для веб-сайта).

Требования:

  • Обязательны хорошие знания в следующих областях:
    • C++
    • Linux
    • Pthreads
    • Sockets
    • Алгоритмы (в частности графы)
  • Желательно знать:
    • Boost (Thread, Asio, Graph, etc)
    • Ruby/Rails
    • MySQL/PostgreSQL/BerkeleyDB
    • Паттерны проектирования

Работать нужно в офисе (как оказалось, для некоторых это критично). Офис находится в Днепропетровске, в центре города.

Ответы пишите сюда, в Skype (fxposter), Jabber (fxposter@gmail.com) или ICQ (625585).

PS. Для того, чтобы не появлялись вопросы типа “а причем тут рельсы?” - сам проект пишется на Ruby/Rails, часть поискового движка - на C++.

Метки:

31 Май, 2009

Умань

Google Wave

Originally published at Блог FX'а. Please leave any comments there.

Google Wave is a new tool for communication and collaboration on the web.

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

PS. Видео просмотрел на одном дыхании - классная идея, классная реализация, классная презентация. Советую всем без исключения. Возможно, после выхода этого продукта вы откажетесь от использования всяких wiki и e-mail.

9 Май, 2009

Умань

What Killed Smalltalk Could Kill Ruby, Too

Originally published at Блог FX'а. Please leave any comments there.

Еще одно, интересное на мой взгляд, видео. На этот раз - с RailsConf 2009. Выступает Роберт Мартин, известный в узких кругах под ником Uncle Bob (если вы еще не читаете блог его компании - начинайте, там пишут интересные вещи). Как можно догадаться из названия - доклад о том, что “убило” в своё время Smalltalk и чего нужно опасаться тем людям, которые программируют на Ruby. Доклад интересный, смешной, Боб, оказывается, отлично умеет повеселить публику.

Вердикт - смотреть обязательно, хотя бы для поднятия настроения. :)

Метки:

8 Май, 2009

Умань

Drop ACID and think about data

Originally published at Блог FX'а. Please leave any comments there.

Чрезвычайно интересное видео выступления Боба Ипполито на PyCon 2009, в котором он рассказывает о современных системах хранения данных. Очень заинтересовала Cassandra и Column-Oriented Databases. Очень рекомендую посмотреть всем, кто занимается построением высокопроизводительных систем, которые оперируют большим количеством данных. У меня как раз такой случай, так что пойду изучать Cassandra, LucidDB и C-Store.

И самое приятное - всех с праздничком, с Днем Победы!

1 Май, 2009

Умань

В Крым на денек

Originally published at Блог FX'а. Please leave any comments there.

Давно не писал здесь ничего. В какой-то степени это связано с тем, что в последнее время навалилось много дел - как по учебе, так и по работе (кстати, теперь я работаю в Dimalex). С другой стороны - на той же работе я сейчас занимаюсь не написанием кода, а разработкой требований, написанием ТЗ, проектированием архитектуры (Kpumuk, aleks raiden - вам отдельное спасибо за подсказки и ответы на мои глупые вопросы :)). Так что… Интересных постов о том, о чем я писал раньше - PHP, Symfony, ZF, etc. Тут, скорее всего до лета не будет. Зато, возможно, будет что-то о Hadoop и параллельной обработке большого количества данных… Не знаю еще. Мне многому предстоит научиться, т.к. опыта разработки высокопроизводительных приложений я не имею, но как раз этому я очень рад.

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

Всех с праздничком! :)

5 Апр, 2009

Умань

Workprint

Originally published at Блог FX'а. Please leave any comments there.

До сегодняшнего дня не сталкивался с этим понятием. Это один из видов “качества записи фильма”, т.е. стоит в одном ряду вместе с известными (по крайней мере мне) CamRip, TeleSynch, DVDRip, BDRip, HDTVRip, и т.д.

Что такое Workprint?

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

Что такое DVDRip, CAMRip, TS, TC, DVDSrc и т.д.

Более наглядно (скрины взяты из WP-версии X-Men Origins: Wolverine):

Самолет летит где-то над землей

Самолет летит где-то над землей

Две пули в голове

Две пули в голове

Метки:

1 Апр, 2009

Умань

Первое апреля

Originally published at Блог FX'а. Please leave any comments there.

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

Первым постом, в который я чуть было не поверил, стал пост на SmashingMagazine о IE 8.1. Я, как ни в чем ни бывало, читаю пост. Радуюсь нововведениям. :) Когда дошел до “Firefox Extensions Support” - впервые подумал, что что-то не так. Когда прочем список протестированных дополнений - подумал, что здесь явно что-то не так. А когда прочел заголовок “Server-side code decompiler”, вспомнил, что сегодня первое апреля. И самое главное, что вот так всегда. :) Только обычно, я прочту пост, порадуюсь нововведениям, а потом до меня дойдет, что это прикол.

Помню, в прошлом году я долго радовался тому, что Doctrine переписали на C и засунули в PECL. Долго радовался. И только к вечеру я осознал, как я ошибался… :)

Метки:
Умань

21

Originally published at Блог FX'а. Please leave any comments there.

Начинаю праздновать :)

Метки:

10 Мар, 2009

Умань

Symfony 2.0 Presentation

Originally published at Блог FX'а. Please leave any comments there.

В сообществе симфонистов праздник - Фабьен наконец-то рассказал о том, что можно ожидать от следующей мажорной версии фреймворка:

IOC-контейнер

В презентации это называлось Dependency Injection Container. Подробнее о том, что это такое можно узнать в википедии: IOC, Dependency Injection. Либо спросите знакомых Java EE программистов, они должны знать, что это такое. :) За примерами лучше, опять же, обращаться к Java: Pico Container Introduction (достаточно просто и понятно), Spring IOC-container. Вкратце - скармливаем контейнеру классы и зависимости между ними и можем строить новые обьекты, которые будут построены на этих зависимостях (если у вам один обьект зависит от двух других, то они будут в него автоматически вставлены - через конструктор, методы, свойства, etc.). На PHP я IOC-контейнера ни разу не видел (хотя они есть) и… Не знаю, насколько он будет действительно удобен и нужен. Будем смотреть.

Новый шаблонный движок

Лучше смотреть презентацию - всё полностью переписано, много новых возможностей: шаблоны теперь не только file-based, но и memory-based (memcache, apc), database-based и т.д, появилось наследование шаблонов (привет, Django), все возможности предыдущих версий (типа partials, slots), думаю, останутся. Всё это будет приправлено отсутствием зависимостей от самой Symfony (как я понимаю, под “Independent library” они имеют ввиду именно это).

sfRequestHandler

Коротко и ясно - “Rails Metal in Symfony”.

Кстати говоря, довольно интересен тот факт, что засуетились все только сейчас, а ведь это не первая презентация о возможностях, которые нам приподнесут в Symfony 2.0 - на Symfony Camp 2008 об этом уже говорили. :)

17 Фев, 2009

Умань

Coworking в Днепропетровске

Originally published at Блог FX'а. Please leave any comments there.

О первом днепропетровском коворкинг-центре читаем на хабре.

Коворкинг (англ. Co-working, совместно работающие) — это модель работы, заключающаяся в том, что вместо того, чтобы работать дома, люди (часто фрилансеры) снимают общее помещение, оставаясь независимыми и свободными, но не испытывая при этом недостатка в общении, работая вместе, делясь идеями и помогая друг другу.

Википедия

Метки:

14 Фев, 2009

Умань

Мастер-класс по технологиям Java EE

Originally published at Блог FX'а. Please leave any comments there.

16 февраля 2009 года в рамках серии открытых лекций для университетов Украины, состоится открытый мастер-класс ведущего эксперта компании Exigen Services по Java EE-технологиям на тему:
«Стек технологий Java EE 5: что? зачем? почем?»

В настоящее время платформа Java Enterprise Edition является одним из наиболее используемых промышленных стандартов разработки распределённых бизнес-приложений. В ее состав входят множество технологий, каждая из которых имеет свою четко очерченную область применения, и разработчику, столкнувшемуся с необходимостью решения той или иной задачи, актуально понимание, что предлагает Java EE 5 для его нужд.

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

Данное занятие ориентировано на студентов старших курсов и молодых разработчиков ПО, обладающих базовыми знаниями языка Java и интересующихся технологиями Java EE и их использованием.

В программе:

  • место той или иной технологии в архитектуре;
  • узкие места стыков технологий;
  • где используется стек Java EE 5?
  • проще или сложнее?

Семинар пройдет 16 февраля в 13:00 по адресу Днепропетровск, ул. Козакова, 18, 14 корпус ДНУ, аудитория 108

Вход на мастер-класс – свободный.

Я, скорее всего, пойду. Надеюсь, что там будет что-то интересное.

11 Фев, 2009

Умань

От заказчика

Originally published at Блог FX'а. Please leave any comments there.

что нужно - нужно разработать алгоритм позиционной игры неограниченной во времени и перевести стратегию на язык формул

Интересно, насколько корректно спросить у заказчика, что он выкурил? :)))

Метки:

9 Фев, 2009

Умань

What All Rubyist Should Know About Threads

Originally published at Блог FX'а. Please leave any comments there.

Смотрим, учимся и наслаждаемся.

PS. Несмотря на название - полезно отнюдь не только для “рубистов” (интересно, как адептов ruby называют на русском?).
PPS. Пора дизайн блога менять - видео не влазит. В FF3 смотреть можно, но если у вас с этим проблемы - идем на сайт RubyConf 2008 и смотрим видео там.

7 Фев, 2009

Умань

“Скрытые” записи с Symfony и Doctrine

Originally published at Блог FX'а. Please leave any comments there.

Под “скрытыми” записями сегодня будут пониматься “unapproved”-записи в таблице. Кому лень ходить по сылкам: иногда не все записи какой-нибудь таблицы нужно показывать пользователю, например - если я не хочу показывать некоторые посты в блоге. Обычно для этого я делаю поле, например, is_hidden, а затем выбираю все записи, где is_hidden = 0. Проблема состоит в том, что я обычный человек и могу забыть поставить нужное мне условие. Поэтому я хочу получить какое-нибудь простое, но очень эффективное решение такой проблемы. В ActiveRecord этим решением является default_scope. А я вам сегодня расскажу, как этого добиться в Doctrine.

Итак, представим, что у нас есть табличка Post:

Post:
  actAs:
    Timestampable: ~
  columns:
    title:     { type: string(128), notnull: true }
    text:      { type: text, notnull: true }
    is_hidden: { type: boolean, notnull: true, default: 0 }

Самый простой, на первый взгляд, подход - переопределять PostTable::createQuery(), чтобы этот метод возвращал уже Query с нужным нам “WHERE is_hidden = 0″. К сожалению, не всегда это помогает. Например, при выборке постов для какой-либо категории через $category->Posts этот метод не сработает.

Есть гораздо более простой способ сделать то, что нам нужно - использовать listener-ы. В Doctrine есть довольно много событий, которые мы можем “слушать” и на которые мы можем реагировать. В данном случае нам подходит событие “preDqlSelect”, которое входит в группу “DQL Hooks“, и которое вызывается перед выполнением запроса на выборку записей. Как нам нужно прореагировать на событие: взять Doctrine_Query из Doctrine_Event и добавить в него дополнительные условия выборки.

Самый простой способ - переопределить метод preDqlSelect в самой записи:

class Post extends BasePost
{
  public function preDqlSelect(Doctrine_Event $event)
  {
    $params = $event->getParams();
    $event->getQuery()->addWhere("{$params['alias']}.is_hidden = 0");
  }
}

В первой строке метода мы получаем параметры запроса, из которых нам нужен alias - можете считать это обычным alias-ом таблицы из SQL (в данном случае это alias таблицы в DQL), т.е. при таком DQL:

FROM Post p

alias-ом будет “p”.

Во второй строке мы получаем текущую query и добавляем в неё условие “is_hidden = 0″.

Мы не можем использовать ->where(), т.к. этот метод сотрет все имеющиеся части WHERE в запросе. В то же время ->addWhere и ->andWhere ведут себя так же, как и ->where при отсутствии where-части запроса.

Собственно, вот и всё - тепер у нас будут выбираться только “видимые” посты.

Во второй части будет показано, как сделать созданный в этом посте код более реюзабельным, а также как сделать так, чтобы в backend-е посты показывались полностью.

6 Фев, 2009

Умань

Теперь я безработный

Originally published at Блог FX'а. Please leave any comments there.

Собственно, сабж.

Не спрашивайте - почему и из-за чего. Сам виноват. :)

Но ничего! Что не делается - то к лучшему. Теперь у меня будет больше свободного времени, которое я с удовольствием потрачу на себя. В планах:

  • Все-таки прочесть “Рефакторинг” Фаулера и “Code Complete” МакКоннелла (хотя некто говорит, что он очень нудно пишет)
  • Поближе познакомиться с Ruby/Rails
  • Прочесть что-нибудь по .NET, ASP.NET и поюзать ASP.NET MVC

Если у вас есть какие-то пожелания насчет блога (например, хотите увидеть статью по какой-нибудь тематике) - пишите в комментах!

PS. Хотя, надеюсь, в скором времени для меня найдется работа.

Метки:

1 Фев, 2009

Умань

У меня ни на что не хватает времени

Originally published at Блог FX'а. Please leave any comments there.

И лучшее этому подтверждение:

I need more time

Life sucks…

Метки:
Умань

Bugfix-ы в OpenSource Software

Originally published at Блог FX'а. Please leave any comments there.

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

  1. Послать всё нафиг и начать искать другую библиотеку (так обычно поступают люди, только начинающие пользоваться библиотекой)
  2. Забить на надоедливый, но некритичный баг
  3. Уведомить разработчиков и ждать…
  4. Забить на разработчиков, поправить всё самому (если есть возможность) и продолжать работать дальше (я не зря говорил про исходные коды)
  5. Забить на разработчиков, поправить всё самому и отослать разработчикам все изменения и т.д.

На самом деле меня интересует вопрос - как часто вы прибегаете к варианту №5? Лично я гораздо чаще вижу “а, хрен с ними со всеми, щас пофиксим по быстрому и всё” (№4)  и “да ну его нафиг, ковыряться самим в этих исходниках, щас сделаем тикет, пусть разработчики смотрят” (№3), “млять, ну что же эта за херовая программа, но, блин, деваться некуда…” (№2).

31 Янв, 2009

Умань

Doctrine admin generator + sfDoctrineGuardPlugin + disabled security = bug

Originally published at Блог FX'а. Please leave any comments there.

Есть в Symfony такая штука, как генератор админки на основании описанных моделей. Подробно о самом генераторе админки лучше читать здесь (кстати, я не понял, а про propel:generate-module теперь в Symfony Book не рассказывается ничего, что ли?).

Я вчера столкнулся с багом, который ошибочно описал здесь, а затем правильно - здесь. Кто не хочет читать мой кривой английский - читаем дальше. Баг воспроизводится при наличии трех условий:

  1. класс myUser наседуется от sfGuardSecurityUser из плагина sfDoctrineGuardPlugin
  2. для всего приложения (или только для модуля админки) отключена проверка безопасности (is_secure: off, в общем)
  3. пользователь не авторизован

В этом случае вы получите вот это сообщение:

You don’t have the required permission to access this page.

Решение описано в первом моём тикете:

Нужно заменить в файле “<путь к библиотекам symfony>/lib/plugins/sfDoctrinePlugin/data/generator/sfDoctrineModule/admin/template/actions/actions.class.php” (это шаблоны для генератора админки Doctrine) эти строки:

if (!$this->getUser()->hasCredential($this->configuration->getCredentials($this->getActionName())))
{
  $this->forward(sfConfig::get('sf_secure_module'), sfConfig::get('sf_secure_action'));
}

на эти:

credentials = $this->configuration->getCredentials($this->getActionName());
if (!empty($credentials) && !$this->getUser()->hasCredential($credentials))
{
  $this->forward(sfConfig::get('sf_secure_module'), sfConfig::get('sf_secure_action'));
}

Баг некритичный, так что можно, в принципе, от него не избавляться, а подождать, пока изменения внесут в главный репозиторий. Просто если встретите его - не удивляйтесь. Лично я долго не мог понять - почему у меня не работает is_secure: off.

Умань

Doctrine

Originally published at Блог FX'а. Please leave any comments there.

Последнюю неделю работаю с Symfony 1.2 и Doctrine. Так вот, если раньше я хвалил Doctrine, то теперь… В общем, после нескольких дней работы с ней захотелось плеваться… На первый взгляд всё замечательно, но как только начинаешь копать глубже начинается ужас. Мне очень не хочется рассказывать про эти баги и недоделки (причина банальна - просто лень вспоминать, выискивать по истории icq/jabber о всех багах, которые я нашел). У меня было не очень хорошее впечатление о Propel, но, по крайней мере, когда я работал с ним, у меня была уверенность, что всё будет работать и ничего не сломается, если я что-то добавлю/изменю. С Doctrine такой уверенности лично у меня нет (хотя коллеги тут подсказывают, что всё наладится :)) - такое впечатление, что “еще чуть-чуть” - и все развалится. Это мнение исключительно субьективное, обьяснять я его не буду, если кто-то что-то желает узнать - прошу в icq/jabber, все контакты есть в сайдбаре моего блога.

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

Имеем следующий код:

// Category has many Posts
$category = Doctrine::getTable('Category')->find(1);
$posts = $category->Posts;

Задача состоит в том, чтобы в $posts были посты, отсортированным по какому-нибудь полю бд. Причем, естественно, хочется, чтобы посты были отсортированы не только про вот такой их выборке через LazyLoading, но и при Eager Loading, т.е.:

$category = Doctrine::getTable('Category')->createQuery('c')->leftJoin('c.Posts')->fetchOne(); // выборка всех данных одним запросом
$posts = $category->Posts; // запроса к бд не проиходит

На самом деле, про Eager Loading я с самого начала не думал, но, я думаю, со мной никто спорить не будет, что если сортировка должна быть в одном случае - она обязанна быть и во втором.

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

При вызове свойства $category->Posts, будет вызываться метод $category->getPosts(), который мы и будем переопределять:

class Category extends BaseCategory
{
  public function getPosts() // в идеале сюда должен передаваться параметр $load, но пока о нем забудем
  {
    return Doctrine::getTable('Post')
        ->createQuery()
          ->orderBy('column ASC')
          ->where('category_id = ?', $this->id)
        ->execute();
  }
}

Красиво? Как по мне - не очень, т.к. несмотря на наличие уже указанной связи - использовать её я не могу, приходится строить query заново.

Возможно, связью я воспользоваться могу, об этом нужно подумать… Пока писал пост пришла в голову идея, но проверять лень.

Запускаем. Пробуем:

$category = Doctrine::getTable('Category')->find(1);
$posts = $category->Posts;
$posts = $category->Posts;
$posts = $category->Posts;
$posts = $category->Posts;

И что мы видим? 5 запросов к бд. Хмм. Убираем метод getPosts. Запускаем тот же код. В итоге - два запроса. Я, конечно, понимаю, что это я такой плохой и лентяй еще к тому же, но ведь можно было сделать подобное “кеширование” для связей автоматически (если кто знает, как это сделать - дайте знать, походя дофига времени по кодам доктрины я не нашел место, где это можно сделать). Ладно, сделаем “кеширование”:

public function getPosts()
{
  if (!isset($this->_references['Posts']))
    $this->_references['Posts'] = Doctrine::getTable('Post')
        ->createQuery()
          ->orderBy('column ASC')
          ->where('category_id = ?', $this->id)
        ->execute();
  return $this->_references['Posts'];
}

Запускаем уже запомнившийся нам код. Ну слава богу - два запроса.

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

Ну, вроде более-менее готово. По крайней мере - можно пользоваться, а нам только это и нужно.

Теперь об Eager Loading. О нем я сам даже и не вспоминал, т.к. у меня не было ни одной идеи - как его реализовать (нужно было опять копаться в исходниках Doctrine, а это мне уже, порядком, поднадоело). Как вдруг, откуда ни возьмись, появился пост в блоге доктрины: Cookbook Recipe: Relation DQL Behavior. Советую прочесть его и комментарии (благо, их там немного). Вы увидите в комментариях и меня, говорящим спасибо за Eager Loading, а также указавшим на то, что в случае Lazy Loading-а решение не работает. На что мне ответили:

You’re right the above won’t work, but you shouldn’t ever be doing that :) You should always load your data through full DQL queries and avoid lazy loading data

Ага. Благодарю покорно. Зачем тогда вообще делать Lazy Loading, если его не нужно юзать. Может, мне банально удобнее написать $category->Posts и получить посты тогда, когда это реально нужно, а не при выборке категории. Да, я получу два запроса вместо одного, ну и что? Это не O(n), а я не привык оптимизировать то, что нормально работает и так.

И напоследок: на самом деле проблему вполне можно было бы решить путем наследования от класса связи и его расширения. Однако сделать это в Doctrine сне не судилось, т.к. в отношениях hasOne, hasMany намертво зашиты стандартные классы связей Doctrine, а жаль. Такие связи - это плохо, т.к. они статичны и не способствуют хорошему расширению системы. С другой стороны - не мне критиковать jwage, самбы я вряд ли сделал что-то подобное, по крайней мере сейчас.

PS. Долго думал, как назвать пост. Так и не придумал… :(

30 Янв, 2009

Умань

Новый URL для RSS Feed-ов

Originally published at Блог FX'а. Please leave any comments there.

Уже многие писали о том, что все аккаунты FeedBurner-а переезжают на Google и меняют URL всех RSS Feed-ов. Мои аккаунты, естественно, не исключение. Новые адреса:

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

Метки:

Предыдущие 20

Реклама

Настроить