среда, октября 22, 2014

.vimrc

Чтобы не искать, буду держать его тут.
runtime! debian.vim
syntax on
set hls
set tabstop=4
set shiftwidth=4
set smarttab
set et
" переносить длинные строки
set wrap
" наследовать отступы предыдущей строки
set autoindent
" умные отступы на основе синтаксиса
set smartindent
"подсветка любых пробелов на конце строки
au BufNewFile,BufRead * let b:mtrailingws=matchadd('ErrorMsg', '\s\+$', -1)
"подсветка табуляций, перед которыми или после которых есть пробелы
au BufNewFile,BufRead * let b:mtabbeforesp=matchadd('ErrorMsg', '\v(\t+)\ze( +)', -1)
au BufNewFile,BufRead * let b:mtabaftersp=matchadd('ErrorMsg', '\v( +)\zs(\t+)', -1)
" не разрешать курсору выходить за последний символ при выделении
set selection=old

if filereadable("/etc/vim/vimrc.local")
  source /etc/vim/vimrc.local
endif
set tabpagemax=15
map <F4> <Esc>:tabnext<CR>
map <F3> <Esc>:tabprevious<CR>
map <F5> <C-W>p
map <F6> <C-W>w

вторник, октября 21, 2014

Смена работы

Сменил место работы. Сегодня был первый день на новом месте.
Теперь на работу приходится как и всем, добираться транспортом. До этого полтора года работал удалённо из дома.
Эти полтора рабочих года были моим лучшим временем работы. Очень хороший и профессиональный коллектив, очень отзывчивые и приветливые коллеги.
"РЕГ.РУ", ты навсегда в моём сердце.

Python. Первое знакомство

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

Что ж, в сравнении с перлом некоторые вещи даются "сложно". Не в плане сложности для понимания(синтаксис языка довольно простой, если не сказать примитивный), а в плане принятия.

Тем не менее, процесс идёт, некоторые вещи уже даже начали нравиться и приятно удивлять. Например, сумма чисел фибоначчи для 30 на третьем питоне выполняется примерно вдвое быстрее чем на перле 5.18.

Уже есть в уме пара проектов, которые буду писать на пайтоне.

среда, сентября 03, 2014

Perl. Не используйте конструкцию "return $a or $b"

На компе недавно обновился перл до версии 5.20 и в рабочем коде словил варнинг "Possible precedence issue with control flow operator". Гугление показало, то, оказывается, перл код вида
sub mysub {
    my ( $a, $b ) = @_;
    return $a or $b;
}
интерпретатором будет воспринят как
sub mysub {
    my ( $a, $b ) = @_;
    ( return $a ) or $b;
}
т.е. функция/метод всегда будет возвращать $a в не зависимости от того, истиннен он или ложен. Поэтому в данном случае надо использовать оператор || вместо or хотя я всегда считал, что два обозначения одного и того же оператора. И в итоге наша функция будет выглядеть так:
sub mysub {
    my ( $a, $b ) = @_;
    return $a || $b;
}

воскресенье, июля 06, 2014

Next Gen PBX

Возвращаюсь к теме создания софта для ip-телефонии. Тема для меня не перестала быть интересной даже спустя год после смены деятельности с администрирования на программирование.
Уже больше года вынашиваю идею создания платформы для ip-телефонии с реализацией виртуализации на уровне самой платформы. Т.е., например, есть оператор связи мелкой или средней руки, который получил лицензию на телематические услуги и взял у ФАС пул городских номеров. И вот хочется этому оператору со своих клиентов стричь деньги не только за предоставление городского номера и телефонных линий, а, например, за услугу виртуальной АТС. Это чтобы клиент вообще не заморачивался с оборудованием, а только купил/взял в аренду телефонные аппараты.
И вот тут выходит на сцену платформа для предоставления услуг виртуальных АТС. Таких решений на рынке пока немного и все они, как правило, платные и очень(просто космически) дорогие или топорно сделанные(или и то и другое). Я хочу создать опенсорсную систему на базе IP PBX FreeSWITCH. Выбор данной pbx(а не того же астериска) обусловлен некоторыми факторами, главными из которых являются более серьёзный подход к разработке системы(этой мой взгляд со стороны), использование в качестве SIP-модуля библиотеки sofia, возможность(вроде как неиллюзорная) использовать платы расширения digium|sangoma|openvox, ну и вообще, за 8 лет астериск уже как-то поприелся, хочется чего-то свежего.
В настоящий момент пилю систему для аудио-конференций, планирую в будущем включить данную систему в состав телефонной платформы. Сейчас же просто, как проба пера, чтобы сформировать окончательный образ будущей системы и понабивать себе руку в написании кода асинхронного приложения.

среда, июля 02, 2014

Perl. Добавляем инкапсуляцию методам класса

Перл - замечательный язык с очень простой и понятной ООП-парадигмой. Из коробки мы имеем полиморфизм и наследование, но, к сожалению, не можем похвастаться инкапсуляцией.
Инкапсуляция, для тех кто не знаком с терминами, это сокрытие методов класса от посторонних лиц. Другими словами, мы в классе создаём различные методы, часть из которых доступна для вызова другими модулями/скриптами. Другая часть не должна быть вызвана нигде, кроме как в самом классе(private-метод) или в классе, который наследуется от данного класса(protected-метод).
В перле, как и в питоне, нельзя штатными средствами перекрыть доступ к методам класса. Применяется негласное соглашение, по которому методы(или функции), имена которых начинаются с нижнего подчёркивания, считаются приватными.

С этим в принципе можно мириться и ваять код на pure-перл, не прибегая к ООП-фреймворкам типа Moose, что я в принципе всегда и делал - меня слегка пугает перспектива тянуть в своё приложение 100500 модулей ради одного функционала.
К счастью, благодаря статье в журнале pragmaticperl я узнал о модуле Attribute::Protected. Данный модуль написал Tatsuhiko Miyagawa, очень известный разработчик в мире Perl.
Модуль достаточно легковесный и имеет в зависимостях только Attribute::Handlers, который давно является модулем ядра perl.
Рассмотрим на примере, как можно с помощью указанного модуля добавить в наш класс инкапсуляцию.
Для наглядности создадим 2 модуля и один скрипт, который будет вызывать оба модуля. Один модуль будет наследоваться от другого.

MyModuleParent.pm :
package MyModuleParent;

use strict;
use warnings;
use Attribute::Protected;

sub new {
    my $class = shift;

    return bless {}, $class;
}

sub _private_method : Private {
    print "This is private method in package " . __PACKAGE__ . "\n";
}

sub _protected_method : Protected {
    print "This is protected method in package " . __PACKAGE__ . "\n";
}

sub public_method {
    print "This is public method in package " . __PACKAGE__ . "\n";
}

1;

MyModule.pm :
package MyModule;

use strict;
use warnings;

use parent 'MyModuleParent';

sub mymethod {
    print "This is simple method in package " . __PACKAGE__ . "\n";
}

sub call_protect_method {
    my $self = shift;
    $self->_protected_method;
}

sub call_private_method {
    my $self = shift;
    $self->_private_method;
}

1;

script.pl :
#!/usr/bin/perl

use strict;
use warnings;

use MyModule;
use MyModuleParent;

my $parent_object = MyModuleParent->new;
my $object = MyModule->new;

$object->public_method;         # OK
$object->mymethod;              # OK
$object->call_protect_method;   # OK
$object->call_private_method;   # NOT OK

$parent_object->public_method;       # OK
$parent_object->_protected_method;   # NOT OK
$parent_object->_private_method;     # NOT OK
Объект "$object" может вызвать публичный метод класса "MyModuleParent", т.к. от него наследуется класс "MyModule". Также, данный объект вызывает методы "call_protect_method" и "call_private_method", вызывающие в свою очередь protect и private методы класса "MyModuleParent" соответственно. Вызов метода "call_private_method" завершится с ошибкой _private_method() is a private method of MyModuleParent!, вызов метода "call_protect_method" завершится успешно. Прямой вызов из скрипта private и protected методов класса "MyModuleParent"(через объект $parent_object) завершится с ошибкой.

Таким образом, мы получаем малой кровью(а оверхед там действительно ничтожный, проверенно в дебаггере) надёжную инкапсуляцию методов, очень похожую на сишную и явовску, да к тому же сделанную почти полностью на базовых средствах языка. Модулю Attribute::Protected уже 13 лет, удивитильно, что его так мало используют.

воскресенье, июня 29, 2014

yet another conference server

Начал пилить демона для управления аудио-конференциями на базе ip-pbx FreeSWITCH. Сам демон будет выступать прослойкой между пользователями и сервером PBX.
В бытность свою работы с ip-телефонией вцелом и астериском в частности, не раз собирался заняться фрисвичом, да всё как-то руки не доходили и задач соответствующих не было. Зато теперь, в чине разработчика, полёт фантазий в плане приложений для телефонии уносит меня за дальние горизонты)) Специально для этих целей даже c++ начал изучать.
Но пока что пишу на перле и anyevent. Проект ещё в начальной стадии, готово процентов 20.
Думаю, что к осени будет готова хотя бы альфа-версия.

суббота, июня 28, 2014

Perl. Получить в модуле полный путь до файла модуля

Возник давеча такой вопрос: надо было в модуле, в не зависимости от того, кто и откуда его запускает, получать текущий PATH данного модуля.
Инструменты типа FindBin и Cwd не работали, т.к. они показывали путь до скрипта, который использовал данный модуль. Недолгое гугление выдало вот такое решение:
use File::Spec;

my $mod_dir = (File::Spec->splitpath( __FILE__ ))[1];
Вызов
File::Spec->splitpath( __FILE__ )
возвращает массив, в котором первым аргументом является имя файла, а вторым как раз будет полный путь от "/" до модуля.

среда, мая 28, 2014

perl 5.20

Сегодня релизнулся. В perlbrew себе собрал, играюсь.
На ЛОР новость ожидаемо вызвала срач адептов, неосилянтов и простомимопроходящих ))

суббота, апреля 19, 2014

*sh: перевод списка пакетов из стобца в строку

Иногда требуется удалить и вычистить определённый список пакетов, притом, хочется получить и список пакетов по-быстрому и без лишних тыканий мышкой. Например, потребовалось удалить все пакеты, относящиеся к libreoffice. Если делать долго, то сначала надо получить список пакетов командой
dpkg -l | grep libreoffice
потом вручную из списка выбрать пакеты и вставить их в команду удаления. Но есть способ ускорить эту операцию переведя список пакетов, относящихся к libreoffice(или к нужному вам пакету) из столбца в строку воспользовавшись командой
dpkg -l | grep libreoffice | awk '{print $2}' | tr '\n' ' '
данная команда переведёт список пакетов из столбца в строку, которую затем можно вставить в команду aptitude purge