• Отличая Symfony 2 и Yii?

    С Yii плотно не работал, потому просто мнение:

    ORM в Symfony (Doctrine2), имхо, мощнее чем в Yii по определенению. DataMapper+UoW vs ActiveRecord. Плюс хранлище на основе SQL СУБД без особых проблем может быть заменено на что-то другое, MongoDB, например, также из коробки почти. Но, вероятно, DM несколько тормознутее AR за счёт широкого использования отражений. Решается путем создания кастомных репозиториев, где хоть напрямую SQL вызывайте, не пользуясь DBAL.

    Доступ в sf2 может быть основан на чём угодно, главное реализовать isGranted(). На основе ролей — из коробки.

    Вообще модульность и низкая связанность сильная сторона sf2 (не в последнюю очередь из-за DI где нужно и где не нужно :) ). Другие full-stack PHP фреймворки, что поверхностно изучал, этим похвастаться не могут. В sf2 жёсткие связи используются мало, почти всё конфигурируется: не нужны предлагаемые абстракции роутера — напишите свой класс хоть на switch case, хоть на C, главное нужный интерфейс реализуйте и строчку в конфиге поправьте (а можно и не править, но, имхо, не стоит).
    Ответ написан
  • Сервер для Ruby?

    Буквально на днях столкнулся с этой задачей. Скажу сразу, что в рамках debian-way решить её не удалось — в репах всё старое и есть там немного. Можно, наверное, ruby и gem'ы оформить в виде deb-пакетов, собирать их локально и устанавливать на сервере через dpkg или поднять свой репозиторий, но я заморачиваться не стал. Установил RVM и уже через него ставил ruby и gem'ы. Взаимодействие с веб-сервером (Apache) — через passenger с «левого» репозитория.

    В общем получилось, что непосредственно из исходников ничего не собирал, но этим занимались команды {rvm,gem,bundle} install, а самая «страшная» (не debian-way) команда, которую запустил была bash -s stable < <(curl -s raw.github.com/wayneeseguin/rvm/master/binscripts/rvm-installer). Она же была первой.
    Ответ написан
    Комментировать
  • Php работа с регистром русских символов в UTF-8?

    Я хочу добиться красивого кода, без использования multibyte функций и явного преобразования кодировки средствами iconv().
    Фактически это означает, что вы хотите написать свой парсер utf-8 хотя бы для русского подмножества символов? :) Зачем?
    Ответ написан
    1 комментарий
  • В какой город переехать?

    Петропавловск-Камчатский почти по всем пунктам подходит, кроме доступного Интернета, лет 5 уже жду :(
    Ответ написан
    2 комментария
  • Являются ли заголовочные файлы предметом интеллектуального права?

    1. Да
    2. Нет
    3. Непонятен смысл вопроса, то ли вы хотите прелинковать к своей программе какую-то библиотеку, для которой есть .h файлы, то ли хотите написать свою реализацию этой библиотеки, совместимую по интерфейсу, то ли просто сделать аналог со схожими реализацие и интерфейсом.
    Ответ написан
    1 комментарий
  • Что вы делали для облагораживания разработки на php?

    Организовал так:
    — исходники в репе под Mercurial
    — клон репа на тестовом сервере, докрут указывает на нужный каталог
    — на продакшен деплой производится capistrano
    — если приходится править код в «экстремальных» условиях, то на сервере есть отдельный пользователь тоже со своим клоном репа и установленным capistrano, то есть даже срочная правка по ssh заключается в пулле свежих изменений с основного репа, внесение срочных, коммит в клон, пуш в основной, cap deploy
    Ответ написан
    2 комментария
  • Как php интерпретирует такое <?=$htmltitle?>?

    >Я бы кодера который мне в шаблоне в перемешку с html написал кучу php посадил бы накол.

    Вообще-то PHP сам является шаблонизатором прежде всего. Или за {{var}} вы не убиваете? Только php не нравится? А вообще <?= теперь (в 5.4) будет вообще неотключаемой (до 5.4 можно отключить, почему <?= и <? не рекомендовалось из соображений совместимости, <?php echo $var; ?> работает везде. Теперь везде (>=5.4)будет работать и <?=$var; теперь его можно смело использовать и вы чаще будете его видеть.
    Ответ написан
    Комментировать
  • Как правильно отказать кандидату после собеседования?

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

    А то многие жалуются, что толковых работников не найти, а что в нас, кому вечно отказывают, не толковое никто не объясняет. В итоге тратишь время на изучение каких-то вещей, которые тебе кажутся важными, но следующее собеседование показывает, что ошибся, и по кругу.
    Ответ написан
    Комментировать
  • Постоянное содержимое в MVC-веб-фреймворках?

    Если хочется соблюсти архитектурную чистоту, то, наверное, стоит присмотреться к PAC/HMVC
    Ответ написан
    1 комментарий
  • Куда пропали "User Contributed Notes" с php.net?

    Может быть решили отфильтровать устаревшее в преддверии выхода 5.4?
    Ответ написан
    Комментировать
  • Странности с поведением браузеров в кодировке get-параметров (Windows-1251 / UTF-8)

    В Файерфоксе параметр явно закодирован не в Utf-8. Должно быть ?param=test%20test=%D0%BF%D1%80%D0%B5%D0%B2%D0%B5%D0%B4. Чем кодировали?
    Ответ написан
  • Что делать, если есть идея, но нет возможности ее реализовать?

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

    С прототипом уже можно искать инвестора. Но надо отдавать себе отчёт, что они вкладываются не только и не столько в идею, сколько в их автора, в его способность организовать из прототипа/идеи работающий бизнес. Варианты типа «по вечерам и выходным буду работать» не проходят, ведь раз вы сами не увольняетесь, значит сами особо в успех не верите, не смотря на предполагаемое наличие денег «на еду», почему тогда должен верить инвестор и давать вам денег «на еду» и найм специалистов, не говоря о том, что «по вечерам» растягивает срок реализации, а значит и срок возврата его инвестиций, в разы.

    Продать прототип или, тем более, идею маловероятно. Продать можно уже работающий прибыльный бизнес.
    Ответ написан
    Комментировать
  • PHP, ООП. Практическое изучение

    Любую задачу (решаемую в принципе) можно реализовать как с ООП, так и без него (в процедурном стиле, например). «Прелести» ООП лучше всего чувствуются на больших проектах, где невозможно держать в голове все (глобальные) переменные и функции и способы их взаимодействия и приходишь к пониманию необходимости использовать более высокие уровни абстракции, чем отдельные значения и классические массивы из них. Начинаешь объединять семантически связанные данные в структуры (ассоциативные массивы в PHP), а функциям с ними работающим давать имена с префиксом (обычно) в виде названия (чисто семантическое) этих структур, чтобы хоть немного упорядочить глобальное пространство имён, получая функции вида user_login(array $user, $login, $password), user_logout(array $user) и user_is_logged(array $user). До простейшего ООП осталось сделать один шаг — перенести и функции (указатели на них в С, callback/имена в PHP) в эти структуры, но синтаксис вида call_user_func($user['user_login'], $user, $login, $password) мягко говоря неудобен и избыточен и тут в PHP4 вводят вместо него синтаксис $user->login($login, $password) и без него ты больше не можешь жить :)

    Если же до семантических концепций ООП не дойти на своей шкуре, то разницы между user_login(array $user, $login, $password) и $user->login($login, $password) почти нет, но даже на таком простом примере видно, что запись банально короче и глобальное пространство имён меньше используется, что особенно заметно при использовании IDE с автодополнением.

    Но это философское отступление было о некоторых прелестях ООП. Прямой ответ на вопрос «какую задачу?» — любую интересную хотя бы чуть-чуть. Желательно с развитой предметной областью, в которой ощущается интуитивно наличие нескольких абстракций разного уровня. Если для процедурного приложения вы создаёте несколько таблиц в БД или используете ассоциативные массивы для группировки семантически близких значений — то это, скорее всего, такая задача. Для большего wow-эффекта или просветления можно попробовать написать две версии одного приложения типа блога, одну в процедурном стиле, другую в ООП. Причём в первой желательно не использовать «промежуточные» решения типа ассоциативных массивов даже для mysql_fetch_assoc/array(), только бескомпромиссное mysql_fetch_row(). Если же без ассоциативных массивов вы уже разработки не представляете, то вы уже почти достигли ОО-просветления :)
    Ответ написан
    Комментировать
  • Вопрос по View (PHP MVC)?

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

    Использования наследования и включений шаблонов это следование другим практикам и паттернам непосредственно к MVC отношения не имеющим. Как, кстати, не имеет отношения к MVC и «запускается приложение из index.php, метод route разбирает запрос пользователя и отдает управление одному из методов соответствующего контроллера».

    При выборе между наследованием/декорирования и включение посоветовал бы делать упор на первое. Даже без использования шаблонизаторов типа Smarty или Twig оно осуществляется довольно легко с помощью функций ob_*, особенно если достаточно двухуровневого. Метод render может выглядеть примерно так:
    ob_start();
    require $template;
    $content = ob_get_clean();
    require 'layout.php';
    

    layout.php так
    <html>
    <body>
    <div id="header">Шапка</div>
    <div id="content">
      <?= $content ?>
    </div>
    </body>
    </html>
    

    А blog_index так
    <?php foreach($posts as $post): ?>
      <div class="post">
        <h1><?= $post->title ?></h1>
        <?= $post->content ?>
      </div>
    <?php endforeach ?>
    
    Ответ написан
    1 комментарий
  • Алгоритм написания бота для браузерной игры?

    Алгоритм простой:
    — выясняем протокол обмена (в простейшем случае урлы линков, по которым кликает пользователь, урлы обработчиков форм и данные форм, которые пользователь отправляет — вход сервера, возвращаемые страницы — выход)
    — инкапсулируем (для удобства) вызовы и ответы в термины игровой механики, чтоб вызывать функции «time_for_train = train_army('warrior', 100)», а не «tine_for_train = preg_match('/..../', file_get_contents('http://example.com/game.php?page=army_train&action=train&q=100'))»
    — пишем сценарий работы бота в терминах игровой механики
    Ответ написан
    1 комментарий
  • Персональные данные и SaaS

    Разработчик не отвечает ни за что в общем случае (ну, если только не создал заведомо вредоносную программу — тогда УК). Отвечает за всё владелец системы. В виду того, что более-менее приличный SaaS относится ко второй категории (идентификационные данные плюс дополнительные сведения) и первому объёму (Российская Федерация в целом), то он относится к первому классу, что означает необходимость не только аттестацию и лицензию, но и такой бред как защиту от утечек через излучение.

    Возможно для сегмента B2C есть лазейка во фразе «в целях исполнения договора», но в сегменте B2B наш юрист такой лазейки не нашел без того, чтобы с клиентов наших клиентов не брать письменное согласие на обработку ПДн третьими лицами, на что многие наши потенциальные клиенты не пойдут… Проект пришлось заморозить.
    Ответ написан
    Комментировать
  • В какой TimeZone хранить DateTime в БД?

    >Не нужно хранить сопоставления на сервере.

    Дополнительные сложности. Мало того, что нужен скрипт, который будет парсить все таймстампы на странице и преобразовывать их локально (а если NoScript стоит?), так ещё нужно локальную tz отправлять в запросах, связанных со временем.

    Мне видится оптимальным хранить в timestamp/UTC, пояс пользователя в профиле/куках, а при несовпадении с сохраненным определенного локально JS спрашивать «У вас в настройках сайта часовой пояс +4, а в настройках вашего компа +12. Скорректировать настройки сайта в соответствии с локальными?»
    Ответ написан