четверг, 19 мая 2011 г.

Установка RVM, Ruby, Rails, MySQL на Ubuntu

1. Установка MySQL с причендалами


$ sudo apt-get install mysql-server mysql-client libmysql-ruby libmysqlclient-dev

2. Установка RVM


$ sudo apt-get install build-essential bison openssl libreadline6 libreadline6-dev curl git-core zlib1g zlib1g-dev libssl-dev libyaml-dev libsqlite3-0 libsqlite3-dev sqlite3 libxml2-dev libxslt-dev autoconf libc6-dev ncurses-dev
$ bash < <(curl -s https://rvm.beginrescueend.com/install/rvm)
После установки должно вывалиться много текста. Внимательно читаем и правим файл .bashrc, иначе не взлетит. Перезапускаем консоль, проверяем что rvm жив:
$ type rvm | head -1 # должно сказать "rvm is a function"
$ rvm notes

3. Установка Ruby + Rails

$ rvm install 1.9.2
$ rvm use 1.9.2
$ ruby -v
$ gem install rails
$ rails -v
На данный момент рельсы версии 3.0.7

4. Пробуем создать rails-приложение

$ rails new abc -d mysql -J
$ cd abc/
На данный момент версия mysql2 - 0.3.2. Она работает только с рельсами 3.1. У нас же рельсы 3.0, по этому меняем в Gemfile строку
gem 'mysql2'
на
gem 'mysql2', '< 0.3'
Устанавливаем необходимые gem'ы
$ bundle install
Среди пакетов должен установиться mysql2 версии 0.2.7. Правим файл config/database.yml. Создаём базы
$ rake db:create
На всякий случай можно проверить, что базы созданы
$ mysql -uroot -p -e "show databases"

Всё.

вторник, 1 декабря 2009 г.

symfony 1.3 and 1.4 stable released

Ура! Версия 1.4 - это тоже, что и 1.3 минус устаревшие фичи.
Официальный анонс.

среда, 25 ноября 2009 г.

Symfony Custom Filter in Admin Generator

Небольшой snippet по расширению Form Filter.
Например есть табличка с заказами Order, табличка с товарами Product и связующая табличка OrderProduct. В backend необходимо добавить возможность фильтрации по id заказа (странно что symfony сама не добавляет в фильтр id) и по названию товара в заказе.

Первым делом изменяем OrderFormFilter:
class OrderFormFilter extends BaseOrderFormFilter
{
  public function configure()
  {
    $this->widgetSchema['id'] = new sfWidgetFormInput();
    $this->validatorSchema['id'] = new sfValidatorInteger(array('required' => false));

    $this->widgetSchema['prodname'] = new sfWidgetFormInput();
    $this->validatorSchema['prodname'] = new sfValidatorString(array('required' => false));
  }

  public function getFields()
  {
    $fields = parent::getFields();
    $fields['id'] = 'Number';
    $fields['prodname'] = 'Text';
    return $fields;
  }


  public function addIdColumnQuery(Doctrine_Query $query, $field, $value)
  {
    $query->andWhere('r.id = ? ', $value);
  }


  public function addProdnameColumnQuery(Doctrine_Query $query, $field, $value)
  {
    $query->leftJoin('r.Products p')->andWhere('p.name LIKE ?', "%$value%");
  }

}

Теперь нужно добавить новые поля в generator.yml:
      filter:
        display: [ id, prodname, ..... ]

среда, 4 ноября 2009 г.

Alt-Tab в NetBeans

В Windows глючит Alt-Tab в NetBeans. Лечится заменой look and feel.
В файле netbeans.conf добавляем в netbeans_default_options:
netbeans_default_options="...... --laf javax.swing.plaf.metal.MetalLookAndFeel"

p.s.
Записи с меткой note пишу в основном для себя, что бы не искать каждый раз одно и то же.

суббота, 10 октября 2009 г.

5 признаков плохого HTML кода

Недавно, в связи с редизайном одного проекта, пришлось перелопатить довольно большой объём HTML-кода. Ниже привожу 5 наиболее распространённых ошибок, про которые все знают, но почему-то не особо стараются их избегать.
  1. Использование тэга <br/> для вертикальных отступов
    Для отступов есть padding и margin в CSS, а <br/> нужен только для разрывов строк.

  2. Использование inline CSS
    Инлайн стили надо использовать только в крайних случаях. Тогда при редизайне не прийдётся выискивать стили в HTML-шаблонах. Да и страничка будет загружаться быстрее, т.к. CSS-файлы, как правило, кешируются.

  3. Использование инлайн JavaScript
    Аналогично предыдущему пункту. Старайтесь избегать кода вида <a onclick="...". Не стоит загромождать HTML код логикой. Лучше создать отдельный js-файл и навесить обработчик события из него.

  4. Использование таблиц для отображения нетабличных данных
    Про это и так предостаточно сказано, поэтому комментирвать не буду.

  5. Невалидный HTML
    Ваш HTML-код должен 100% проходить валидацию. Провериться можно на W3C Markup Validation Service,
    так же рекомендую расширение для FireFox - Html Validator.

вторник, 6 октября 2009 г.

Readonly fields in symfony

Иногда бывает необходимо просто отобразить поле в форме без возможности его изменения. Обычно это актуально для автогенерируемых полей, таких как created_at и updated_at. Проблема в том, что поля типа datetime отображаются в виде набора селектов (sfWidgetFormSelect) и простое навешивание атрибута readonly не поможет:
$this->widgetSchema['created_at']->setAttribute('readonly', 'readonly');
Наиболее простым выходом из ситуации будет замена виджета sfWidgetFormDateTime на sfWidgetFormInput:
public function configure()
{
  // ...
  $this->widgetSchema['created_at'] = new sfWidgetFormInput(array(), array('readonly'=>'readonly'));
  // ...
}

Если по каким-либо причинам понадобилось вместо поля ввода (input) отображать просто текст, то можно создать виджет myWidgetFormPlain
class myWidgetFormPlain extends sfWidgetForm
{
  
  protected function configure($options = array(), $attributes = array()) { }

  public function render($name, $value = null, $attributes = array(), $errors = array())
  {
    return $value ? $value : '&mdash;';
  }

}
При использовании этого виджета необходимо отключить валидатор:
public function configure()
{
  // ...
  $this->widgetSchema['created_at'] = new myWidgetFormPlain();
  unset($this->validatorSchema['created_at']);
  // ...
}

понедельник, 28 сентября 2009 г.

Routing cache в symfony

Уже довольно давно хотел написать об этом, но всё руки не доходили.
При довольно большом количестве ссылок иногда можно наблюдать ошибку такого плана
Allowed memory size of ******** bytes exhausted (tried to allocate ******* bytes) in app/cache/frontend/prod/config/config_core_compile.yml.php on line 3369
Происходит это из-за того, что кеш роутинга становится слишком большим.
Кеш представляет собой огромный сериализованный массив в файле
app/cache/frontend/prod/config/routing/symfony.routing.data.cache

Существует несколько вариантов решения этой проблемы, но для себя самым оптимальным я нашел просто отключение кеша для роутера. В factories.yml
all:
  routing:
    class: sfPatternRouting
    param:
      cache: { class: sfNoCache }
Почему я только сейчас пишу об этом? Да потому что только что вышла symfony 1.2.9, в которой как раз по дефолту и отключен кеш роутинга :)