среда, 13 января 2010 г.

Идиоматический способ проверки класса в Ruby

Раньше, для того, чтобы проверить название класса в Ruby я делал примерно так:
p = Provider.first
if p.class == Provider
puts "p is Provider"
end
Идиоматический способ для такой проверки:
p = Provider.first
if Provider === p.class
puts "p is Provider"
end
Полезная информация об идиоматических методах в Ruby.

Подкасты, которые я слушаю


А какие вы слушаете подкасты? Делитесь в комментариях!

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

Mac OS X Terminal.app, vim клавиши home и end

В Terminal.app по умолчанию неправильно работают клавиши Home и End. Для их правильной настройки необходимо перейти в меню «Терминал → Настройки → вкладка Настройки → Клавиатура».



Далее нужно найти в списке либо создать действия с клавишами «home» и «end». В строку редактирования нужно ввести:

home \033[H
end \033[F



Вставка \033 осуществляется нажатием клавиши Esc. Данный способ починит поведение этих клавиш в командной строке Terminal.app, но в текстовом редакторе vim они по-прежнему будут не работать. Для того, чтобы они там работали добавим следующие строки в файл .vimrc в домашней директории (редакатировать этот файл нужно в редакторе vim):


imap <C-v><Home> <Home>
map <C-v><Home> <Home>
imap <C-v><End> <End>
map <C-v><End> <End>

Вместо комбинаций, выделенных жирным шрифтом нужно нажимать реальные сочетания клавиш - Ctrl-V и клавиши Home и End. В итоге должно получиться что-то вроде этого:

imap ^[[H
map ^[[H
imap ^[[F
map ^[[F

Когда все действия будут выполнены, нужно будет перезапустить Terminal.app и всё должно работать нормально.

воскресенье, 9 августа 2009 г.

Ruby: получение максимального/минимального значения в массиве

В настоящий момент изучаю замечательный фреймворк Rails, а попутно язык Ruby. В нём любые данные являются объектом и минимальное или максимальное значения массива можно получить очень удобным способом:

array = [ 10, 50, 180, 13, 86, 253 ]
array.max #=> 253
array.min #=> 10

вторник, 28 июля 2009 г.

Agile Web Developement with Rails: цитаты

Ребята, написавшие книгу по разработке на Rails настоящие юмористы. Вот цитаты оттуда:

The answer is both simple and subtle. Rails does some Ruby magic so that the instance variables of the controller object are injected into the template object. As a consequence, the view template can access any instance variables set in the controller as if they were its own.

Some folks press the point: “just how do these variables get set?” These folks clearly don’t believe in magic. Avoid spending Christmas with them.


The buyer uses Depot to browse the products we have to sell, select some to purchase, and supply the information needed to create an order. The seller uses Depot to maintain a list of products to sell, to determine the orders that are awaiting shipping, and to mark orders as shipped. (The seller also uses Depot to make scads of money and retire to a tropical island, but that’s the subject of another book.)


Our customer has one last request (customers always seem to have one last request).

Jesse James Garrett named this style of interaction AJAX (which once stood for Asynchronous JavaScript and XML but now just means Making Browsers Suck Less).

среда, 8 июля 2009 г.

PHP: расход памяти при циклических связях

Очисткой мусора, а именно, удалением ненужных переменных в PHP занимается сборщик мусора (англ. garbage collector, gc). Конкретно, сборщик мусора удаляет переменную в тот момент, когда теряют актуальность все ссылки на неё. Это может быть завершение функции, в которой была определена переменная, либо присваивание переменной и всем ссылающимся на неё переменным значения null. Однако, в некоторых случаях сборщик мусора оказывается бесполезен, в таких случаях вся ответственность за очистку памяти возлагается на программиста.

Одним из таких случаев являются циклические зависимости, которые встречаются в коде достаточно часто, даже казалось бы в самых обычных вещах. К примеру, у нас есть объект, который поддерживает определенное количество сервисов. Массив объектов-сервисов хранится в свойстве класса. По определенным причинам, объект-сервис должен содержать в себе ссылку на экземпляр объекта, к которому он относится.

class WD_Object
{
private
$arServices;

public function
__construct()
{
$this->arServices = array();
}

public function
AppendService($obService)
{
$this->arServices[] = $obService;
}
}

class
WD_Service
{
private
$obObject;

public function
__construct($obObject)
{
$this->obObject = $obObject;
}
}


Здесь наблюдается циклическая зависимость: объект класса WD_Object содержит ссылку на объекты класса WD_Service, и наоборот, объекты класса WD_Service содержат ссылку на объект класса WD_Object. Сборщик мусора не сможет самостоятельно удалить эти объекты. Но мы можем удалить их вручную, добавив метод destroy в класс WD_Object:

public function destroy()
{
$this->arServices = null;
}


Отдельно хотелось бы заметить, что это нельзя проделать в деструкторе объекта (в функции __destruct) из-за того, что он вызывается только в то время, когда объект будет удалён сборщиком мусора, а он удалён не будет из-за наличия циклической зависимости. Потому обнуление массива дочерних сервисов вынесено в отдельный метод.

У проблемы достаточно глубокие корни, сложность поиска подобных зависимостей заключается в том, что сборщик мусора должен посмотреть все объекты в памяти, чтобы обнаружить циклическую зависимость, а эта процедура несет большие временные затраты. Для версии 5.3 был предложен патч, однако он не набрал достаточное количество голосов, чтобы быть включённым в релиз.

Update: в 5.3 все-таки можно опционально включить сборщик циклических зависимостей вызвав функцию gc_enable().

пятница, 3 июля 2009 г.

Отключение системного динамика в Ubuntu

Очень надоедает писк системного динамика в Ubuntu. Есть способ его отключения посредством выключения соответствующего модуля:

sudo modprobe -r pcspkr

Однако, по непонятным для меня причинам, этот способ моей системе не помог. Получилось отключить динамик в настройках композитного менеджера окон CompizConfig.


Нужно убрать галку с пункта "Слышимый сигнал".

среда, 20 мая 2009 г.

Internet Explorer <script> и <link> в innerHTML

Столкнулся с неожиданной проблемой во всеми нелюбимом браузере. Ситуация такая: скрипт получает ответ на AJAX-запрос и записывает этот ответ в DOM-элемент посредством изменения свойста innerHTML последнего. В ответе, в том числе, содержаться следующие строки:

<link rel="stylesheet" type="text/css" href="/bitrix/components/2008/people.add.block/templates/.default/style.css" />
<script type="text/javascript" src="/bitrix/js/main/utils.js"></script>
<script type="text/javascript" src="/bitrix/js/main/popup_menu.js"></script>
Все прекрасно работает в Firefox, но не работает в IE, а именно, не подключается файл со стилями. Оказывается, в IE есть проблемы с записью таких тэгов посредством изменения свойства innerHTML. Решение в таком случае простое:

Для тэга script нужно добавить атрибут defer и добавить перед всем блоком тэгов тэг <br>. Понятия не имею почему добавлять нужно именно этот тэг, но с ним всё замечательно работает. Но, так как нам не нужен лишний перевод на новую строку, все это можно оформить следующим образом:

<div style="display: none;"><br></div>
<link rel="stylesheet" type="text/css" href="/bitrix/components/2008/people.add.block/templates/.default/style.css" />
<script defer type="text/javascript" src="/bitrix/js/main/utils.js"></script>
<script defer type="text/javascript" src="/bitrix/js/main/popup_menu.js"></script>

Подробнее на форуме.

пятница, 8 мая 2009 г.

Отладочный тулбар PHPEd для Firefox

Те, кто использует в своей работе замечательную IDE PHPEd от компании NuSphere наверняка сталкивались с проблемой отладки скриптов в браузере Firefox. В частности, чтобы завершить сессию отладки приходилось вручную (либо с помощью дополнения Web developer) убивать куку DBGSESSID.

Но, оказывается, не все так печально, благо энтузиастом с форума компании NuSphere было написано дополнение, представляющее собой отладочный тулбар.

четверг, 30 апреля 2009 г.

My office workplace


А это моё рабочее место.