понедельник, 30 августа 2010 г.

Yii хотелки и меньше лапше-кода

Довольно часто, при работе с сессией в Yii, приходится писать код вот такого плана:

$nickName    = Yii::app()->user->getState('nickName');
$accessLevel = Yii::app()->user->getState('accessLevel');
.........................................................

Аналогично и при установке этих значений.


Было бы здорово иметь возможность передавать методам getState и setState массив параметров:

$data = Yii::app()->user->getState(array(
       'nickName',
       'accessLevel' 
));

или

Yii::app()->user->setState(array(
       'nickName'     => 'xoma',
       'accessLevel'  => 'superAdmin' 
));

воскресенье, 29 августа 2010 г.

JavaScript экономим на if или очередная экономия на спичках

Чем меньше по объему внешний JavaScript-файл, тем лучше (он быстрее загружается браузером и возможно (!) быстрее выполняется).

Мало какие сценарии JavaScript обходятся без конструкции if...else.

Типично она выглядит вот так (использую jQuery):

if($(this).is(':checked')){
    $('span.noAnonym').hide();
}else{
    $('span.noAnonym').hide();
}

Как видно из примера в блоках if и else всего по одному выражению.
В этом случае, конструкцию if...else можно заменить тернарным оператором ? :.

Перепишем предыдущий пример:

$(this).is(':checked') ? 
$('span.noAnonym').hide() :
 $('span.noAnonym').show();


Экономим 10 символов !!!

пятница, 27 августа 2010 г.

Yii. Конфликт имени модуля и контроллера.

Есть Yii приложение, у которого в настройках прописан модуль 'Page':

'page' => array(
     'class'  => 'application.modules.page.PageModule',
     'layout' => 'application.views.layouts.column2'
),

Так же есть простой контроллер 'PageController', расположенный в каталоге приложения 'controllers'.

При обращении по url типа: http://localhost/page/about - возникает ошибка, так как Yii пытается вызвать контроллер 'about' из модуля 'Page', а его нет.

При обращении по url http://localhost/Page/about (Page вместо page) - Yii вызывает контроллер Page и его экшн 'about' что мне и требовалось =).

Увеличиваем производительность труда =)

Всем, наверное, известно, что всякие твиттеры, жаберы, скайпы и прочие мессенджеры/социалки отнимают очень много рабочего времени. Для борьбы с этим, я в последнее время стараюсь не пользоваться всем выше перечисленным без острой необходимости. Твиттер, например, я читаю по пути домой (полтора часа в электричке способствуют этому =) ), хотя все же изредка пишу туда. Но сейчас речь не о том. Для разработки я использую Komodo Edit и он мне очень нравится, так вот, включив в нем полноэкранный режим (View->Full Screen) я заметил, что стал меньше отвлекаться на всякую ерунду, типа просмотра страниц/новостей и т.д. Все пространство занято рабочей областью редактора и ничего постороннего туда не пробивается, это помогает сосредоточиться на работе и не отвлекаться на всякий "шум".

Мораль: ИСПОЛЬЗУЙТЕ ПОЛНОЭКРАННЫЙ РЕЖИМ В ВАШИХ IDE!!!

qw - 'Quoted Words' или 'Quoted by Whitespace'

my @data = qw /Mojolicious Catalyst Dancer/;

Perl интерпретирует данные в выражении qw как строки в апострофах, т.е. там нельзя использовать интерполяцию переменных и символы типа '\n'

qw удалет пропуски (пробелы, табуляции, символы новой строки), а все остальное преобразует в список.

Для включения в список символа ограничителя - необходимо экранировать его с помощью '\'

  my @data = qw !Google Yahoo \! Rambler!;

Отрицательные индексы в массивах Perl

В Perl есть прекрасная возможность отсчитывать индексы не с начала массива, а с конца.

Пример:

   my @languages = ('Perl','Python','Php');
   say $languages[-3];
   #тоже самое что и $languages[0] - выведет "Perl"

Для обращения к последнему элементу массива вместо конструкции:

$#languages;
#конструкция $#имя_массива - вернет последний индекс массива

Можно использовать вот такую:

$languages[-1];

четверг, 26 августа 2010 г.

Вот нашел!

Нашел вот такой свой комментарий в файле с JavaScript-кодом =)

Больше 3-х лет прошло =)

Вы бы видели код!!! Ужос!!! Про jQuery я тогда и не знал =)


// JavaScript Document
// скрипт для проверки полей формы
//my function 8.06.2007

//================================================

среда, 25 августа 2010 г.

Flash-сообщения

Прикрутил к нашему самописному Perl-овому движку возможность использовать flash-сообщения.

Алгоритм прост:
1. Записать сообщение в сессию.
2. При следующем чтении этого сообщения - удалить его из сессии.

Вот и все! Жизнь стала проще и веселее =)!

MojoX::Validator первое знакомство

На CPAN есть вот такой замечательный модуль для валидации данных (!) MojoX::Validate . Как видно из названия модуль предназначен для использования в фреймворке Mojolicious. Однако и отдельно от него он прекрасно работает, хотя и тащит за собой Mojo =(.

Пример использования:

use MojoX::Validator;

#создаем новый объект
my $validator = MojoX::Validator->new;        
#массовое добавдение полей для проверки
$validator->field([qw/ID USER_ID/])->each(sub{
   shift->required(1)->regexp(qr/^\d+$/)
});
#правило для одного поля 
$validator->field('NAME')->length(1,20);
#валидируем
$validator->validate({NAME => $name});
#получаем ошибки
$validator->errors;

Маленькая особенность.

Если в конструкции:
$validator->field([qw/ID USER_ID/])->each(sub{
shift->required(1)->regexp(qr/^\d+$/)
});  
указать только одно поле (в списке полей) - работать не будет!

Для одного поля используйте запись вида:
$validator->field('NAME')->length(1,20); 

Бложик индексируется

Этот мой маленький бложик начал индексироваться гуглом!
Скоро я захвачу мир =) !

вторник, 24 августа 2010 г.

Коварство rules urlManager в Yii

Долго мучился с проблемой, все описано вот тут

Валидируем UTF-ые строки в Yii

Начиная с версии 1.1.1 CStringValidator может принимать параметр "encoding". Выдержка из API:
the encoding of the string value to be validated (e.g. 'UTF-8'). Setting this property requires you to enable mbstring PHP extension. The value of this property will be used as the 2nd parameter of the mb_strlen() function. Defaults to false, which means the strlen() function will be used for calculating the length of the string.
Используйте его при валидации текстовых строк на русском языке.

Пример (часть метода rules модели):

array('question, answer', 'length', 'max'=>255,'encoding' => 'utf-8'),

И не забудьте прочитать статью о том, как включить поддержку Юникод в Yii

Оператор повторения строк в Perl

Оператор повторения строк в Perl - x.

Пример:

$str = 'xoma';
say $str x 3; #xomaxomaxoma

Пробел между переменной-строкой и знаком "x" обязателен.
Иначе возникнет неоднозначность и программа работать не будет.

Изучаем Perl. Упражнения к главе 2.

Ответы на упражнения к главе 2.


1
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

use constant PI => 3.141592654;

my $radius = 12.5;
say 2 * PI * $radius;
2
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

use constant PI => 3.141592654;

say 'Input radius:';

chomp(my $radius = <STDIN>);

say 2 * PI * $radius;
3
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

use constant PI => 3.141592654;

say 'Input radius:';

chomp(my $radius = <STDIN>);

my $circ = 2 * PI * $radius;

if($radius < 0){
    $circ = 0;
}

say $circ;

4
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

say 'input one number:';

chomp(my $one = <STDIN>);

say 'input second number:';

chomp(my $second = <STDIN>);

my $result = $one * $second;

say "$one * $second = $result";
5
#!/usr/bin/env perl
use strict;
use warnings;
use 5.010;

say 'input one string:';

chomp(my $string = <STDIN>);

say 'input repeat number:';

chomp(my $number = <STDIN>);

my $result = $string x $number;

say "result is $result";

Особо запомнилась конструкция вида:
chomp(my $radius = <STDIN>);

10 лет прошло

Составление концепции проекта

Казалось бы что может быть проще!
Есть проект, необходимо его описать и составить некую концепцию.
Для меня концепция - это краткое описание цели проекта, его преимуществ и достоинств. Однако на деле все оказывается не так просто.
Есть разрабатываемый проект - портал о достопримечательностях всего мира (http://ru.worldpoi.info/), необходимо изложить в письменном виде концепцию этого проекта.

Открываю новый текстовый файл в надежде, что сейчас слова потекут рекой...но не тут то было! Полнейший ступор! Я не знаю с чего и как начать!


Блин...думаю...думаю...Если что надумаю - выложу тут =)

понедельник, 23 августа 2010 г.

Доступ к настройкам модуля в Yii

При разработке на Yii довольно часто приходится иметь дело с модулями.
Каждый модуль может иметь свои настройки (переменные уровня модуля). Для получения доступа к такого рода настройкам из самого модуля я использую конструкцию типа вот такой:

Yii::app()->controller->module->propertyName;
Однако если настройки модуля необходимо получить из другого модуля этого же приложения  или из самого приложения - такой прием не подойдет, так как переменная module может быть не определена, если текущий контроллер  не принадлежит модулю.
Для этого применяется конструкция вида:
Yii::app()->getModule('user')->propertyName;

Здесь 'user' - название модуля, замените его на название своего модуля.
ВНИМАНИЕ!!! 
Название модуля пишется только в нижнем регистре, иначе не работает!

Второй вариант более универсальный и переносимый - стараюсь использовать только его.

Запарился с почтой от mail.ru

Все почтовики (Яндекс, Гугл и т.д.) "хавают" письма нормально, нет вот mail.ru начинает кочеврежиться. Косяк то конечно мой (лишняя запятая в хедере), но блин, все нормально переваривают, а мыло не хочет.

п.с. и рамблер !

Списки и массивы в Perl

Я все время путался в терминах, что такое список и что такое массив в Perl.  
Перечитывая "Изучаем Perl" обнаружил, что там дается простое и понятное определение.
Список содержит упорядоченную коллекцию скалярных значений. 
Массив представляет собой переменную для хранения  списка. 
Список - это данные, а массив - переменная. 
В программе можно создать списочное значение, которое не хранится в массиве, но любая переменная массива содержит список.

воскресенье, 22 августа 2010 г.

Отдача нескольких файлов через PHP

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

суббота, 21 августа 2010 г.

Mojo 0.999929

Поставил Mojo 0.999929.
Все хочу подробнее "поковырять" Mojo и Mojolicious - да вот все времени не хватает =(.

 Для тех кто не знал/забыл - для установки/обновления этого замечательного Perl-фреймворка введите (ubuntu):

sudo cpanp install  Mojo

пятница, 20 августа 2010 г.

Ассоциативность операторов в Perl

Я уже и забыл, что есть такая штука как "ассоциативность" операторов и что она бывает правая и левая. Ассоциативность определяет в какой последовательности выполняются операторы с одинаковым приоритетом.

Пример:

5**6**8 # в какой последовательности будет выполнено возведение в степень ?
Правильный ответ:

5**(6**8)  # так как опертатор ** имеет правую ассоциативность
В "книге с ламой" очень правильно написано:

Нужно ли заучивать таблицу приоритетов и ассоциативности ?  
НЕТ!
Никто этого не делает!

Если возникает неоднозначность - просто используйте скобки!
Тем самым вы облегчите жизнь тому, кто будет поддерживать ваш код!

Perl от ActiveState

Про Perl

Оказывается, практически любая комбинация знаков препинания используется в Perl для каких-нибдуь целей. Так что если у вас наступит творческий кризис, пустите кошку прогуляться по клавиатуре и отладьте результат.
"Изучаем Perl" стр.55

четверг, 19 августа 2010 г.

Yii как я форматирую код

При разработке на Yii очень часто приходится иметь дело с формами и с моделями.
Формы (потомки CFormModel)  и модели (CActiveRecord), как правило, принимают параметры и что-то с ними делают =). При этом часто можно видеть записи вида:

$model = new Model();
$model->attr_1 = 'attr_1';
$model->attr_2 = 'attr_2';
.......................................

Такая "кишка" присваиваний выглядит в коде не очень здорово.

Вместо этого можно и нужно использовать метод setAttributes.
Если еще и отформатировать код как-нибудь вот так:
     $registration = new Registration();
$registration->setAttributes(array(
'email'    => $email,
'nickName' => $login,
'password' => $pass,
));
if($registration->save()){
    }
Жизнь становится прекраснее!

Аналогично форматировать  можно и код  выборки данных, используя ORM Yii:
$answers = Question::model()->answered()->with('user.profile','fromUser')->findAll(array(
'condition' => 't.userId = :userId',
'limit'     => self::STREAM_PER_PAGE,
'offset'    => $already,
'params'    => array('userId' => $user),
'order'     => 't.creationDate DESC'
)); 


Пусть Ваш код будет приятным для чтения и просмотра!

--message при svn commit

Заметил в себе дурную привычку: при коммите кода в репозиторий в сообщении для коммита либо вообще ничего не указываю, либо указываю одно и тоже сообщение по 100 раз.

Вот например сегодня сделал уже 3 коммитатаким образом:

svn commit --message "Правки по схеме Станислава"

Интересно через месяц я вспомню что это за "Схема Станислава" и почему по ней около 100 коммитов в репозитории?

Сжимаем JavaScript в Yii

Очень модная и что самое главное - ПОЛЕЗНАЯ тема последнего времени в веб-разработке это "Клиентская оптимизация".
Всякие там сжатия, объединения, спрайты, оптимизация картинок и еще много много всего.

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

В своих PHP-проектах я в основном использу фреймворк Yii и именно для него написал простую консольную команду для сжатия жабаскрипта.

скачать
краткое описание

Мой очередной бложик

Решил реанимировать этот свой бложик!

Буду писать сюда всякую очевидную ерунду, может оно кому и пригодится =)

Основные темы - Perl, Php, JavaScript и прочие страшные слова =)

Иногда буду ругаться матом - так что не удивляйтесь =)

Больших статей и заметок тут не будет - за этим посылаю вас на http://allframeworks.ru/ и http://andrey.opeykin.ru/.

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

Посмотрим что получится!

п.ы. что-то очень много смайликов наставил =) =) =)

Интерполяция переменной в Perl

В строке, заключенной в двойные кавычки, переменная интерполируется, т.е. заменяется своим значением.

my $str = 'Hello!';
print "$str world"; # Hello world!

Perl берет максимально длинное имя переменной, т.е. написав

print "$strworld";

мы не получим того что ожидали =( Так как Perl будет искать переменную $strworld, которой нет!

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

print "${str}world"; 

Обратите внимание знак $ (сигил) остается за скобками =)