суббота, октября 21, 2017

Дилетантский взгляд на серьёзную разработку на JavaScript или моё первое знакомтсво с React.js

На работе в круг моих обязанностей входит в том числе написание кода для фронтенда внутренней системы управления контентом. Естественно, это javascript. Но код по большей части пишется в стиле ES5 т.к. делалось изначально это всё очень давно, другими разработчиками и задолго до появления всяческих новомодных фреймворков.
В принципе, нет никакой проблемы продолжать писать в старом стиле и, как правило, я и продолжаю так делать иногда лишь добавляя незначительные куски кода с использованием ES6.
Но тут отдали нам на поддержку проект, написанный на react, нужно осваивать его значит. Давно уже хотел поближе познакомиться с js-фреймворками, и тут как раз появилась такая возможность.
Начал изучать матчасть, нарыл в интернете мануалов по реакту, начал пробовать написать свой первый "Hello, World".
Во многих руководствах в качестве одного из функциональных примеров приводят использование компонента React.createClass.
«Хорошо» подумал я, попробую его использовать. «Отсоси» сказал мне React версии 16.0, этот компонент был выпилен из этой версии и вынесен в отдельную библиотеку.
Хм, это странно. Как выяснилось, это хлопцы в версии 15.5 пометили метод createClass как deprecated. Потом выпустили ещё одну минорную версию 15.6, а после этого, менее чем через полгода выпустили мажорную версию 16, в которой функционал был удалён.
Вот эта лажа в духе Sebastian Riedel, создателя и основного разработчика перлового веб-фреймворка Mojolicious. Этот товарищ довольно часто выпиливает deprecated функции даже в минорных релизах, из-за чего я собственно и поставил для себя крест на perl как языке для серьёзной веб-разработки.
Как-то не вяжется с серьёзным проектом от facebook. Большее похоже на поделку какого-то васи, который по прихоти пятки левой ноги вносит несовместимые изменения.
В общем, с изучением React я пока решил повременить. Решил попрактиковаться в других сферах веб-разработки, подтянуть css и jquery.
Рано или поздно всё-равно придётся к нему вернуться, рабочие задачи никто не отменял, но первое знакомство у меня лично не задалось.
Ей-богу, vue.js выглядит гораздно серьёзнее и более зрелым на этом фоне, жаль, что мы его не используем.

вторник, октября 17, 2017

Переписал сайт planetgo.ru на Go

Наконец-то дошли руки переписать свой агрегатор на Go. Давно уже хотел этим заняться, но всё руки не доходили. Было несколько идей по улучшению работы сайта, по загрузке данных с ресурсов и пр., но внедрять их используя те технологии, на которых изначально было написан сайт(Perl, Mojolicious), не хотелось. Вот тут я немного описал по какой причине мне не хотелось дальше работать с моджо.
В итоге парсер ресурсов был переписан на питоне, а бэкенд сайта переписан на Go.
Что хотелось бы отметить про разработку на go после опыта на динамически типизированном языке? В первую очередь - это непривычность работы со строгой типизацией. Когда пишешь функцию/метод ты должен чётко значть, что у тебя будет на входе и на выходе. Динамически типизированные языки проще в этом плане.
Немного но сильно побесил встроенный шаблонизатор html/template. Чтобы скомпилировать шаблон из нескольких файлов, нужно предварительно корректно задать имя получившегося шаблона:
import (
 "html/template"
 "path/filepath"
)

files := []string{"base.tmpl", "index.tmpl"}
path := "root_path"
for i, file := range files {
 files[i] = filepath.Join(path, file)
}
tmpl := template.Must(template.New("index").ParseFiles(files...))
Поначалу, с непривычки никак не мог вкурить в некоторые моменты работы шаблонизатора. Пришлось лезть в исходники чтобы разобраться. Также пришлось разбираться с пакетом net/http, т.к. при написании кода хотелось по макисмуму использовать стандартную библиотеку языка чтобы лучше с ним позакомиться. Некоторое время потратил на создание
промежуточного обработчика запросов.
Сейчас сайт уже запущен и работает. Допиливаю небольшую админку, тоже на Go, вожусь с обработкой json для rest api.
В целом, язык очень годный, разрабатывать на нём приятно. Go fmt вообще крутая вещь.
В будущем постараюсь написать статьи по различным компонентам стандартной библиотеки, с которыми мне пришлось столкнуться в процессе разработки.

вторник, мая 23, 2017

Пробую свои силы в python и go

Расширяю свой кругозор и пробую для себя новые технологии.
Не так давно дошли руки до книги "Простой Python. Современный стиль программирования" которую я купил себе на день рождения в прошлом году.
Решил переписать сайт planetgo.ru с перла на питон и go. С фреймворком Mojolicious всё по-прежнему очень печально. Не так давно там опять сломали обратную совместимость в минорной версии. После этого я окончательно решил для себя, что иметь дело я с ним больше не хочу.
Сейчас дописываю парсер на питоне. Веб-сервер будет работать на гошке. Может быть в будущем запилю статейку о том как сделать простенький веб-сервер на стандартном net/http с использованием tamplate'ов на go. Статей в рунете об этом не так уж и много.

вторник, октября 27, 2015

филосовское про системы контроля версий

А ведь когда-то, не так уж и давно(~3 года назад) я считал svn отличной системой контроля версий и искрене не понимал, зачем нужен этот ваш новомодный git. И там и там есть коммиты и мёрджи, в обоих системах сложные конфликты разруливаются вручную и вроде бы как и системы брэнчей приняты для работы в обоих системах.
Но поработав пару лет на гите и вернувшись(по производственной необходимости) обратно на svn, я испытываю такие же чувства, как если бы меня с порше пересадили на москвич)) вроде бы ездить можно и в повороты входит, а удобство управления и комфорт в использовании абсолютно несравнимые)

четверг, октября 22, 2015

Perl. Получить ссылку на скачивание дистрибутива по имени модуля.

На работе запонадобилось накачать модулей используя их канонические имена вида 'Foo::Bar'. Лазить на cpan и вручную качать, понятное дело, неправильно. К тому же, часть модулей содержалась в дистрибутиве других модулей, как например, Catalyst находится в составе Catalyst::Runtime.
Конечной моей задачей был скрипт, которому я на вход даю имя модуля, а он мне на выходе отдаёт ссылку на скачивание данного модуля с cpan.
Недолгое гугление вывело меня на модуль MetaCPAN::Client, который позволяет работать с metacpan через API.
В итоге, для скачивания модуля имеем такой код:
#!/usr/bin/env perl

use 5.014;
use strict;
use warnings;

use MetaCPAN::Client;

my $module_name = $ARGV[0] or die "Can't get module name";

my $mclient = MetaCPAN::Client->new;
my $module  = $mclient->module( $module_name );

say $mclient->release( $module->distribution )->download_url;
Проверяем:
% perl load_module.pl List::Util
https://cpan.metacpan.org/authors/id/P/PE/PEVANS/Scalar-List-Utils-1.42.tar.gz
Что и требовалось.

пятница, октября 09, 2015

Сравнение скорости работы Perl 5 и Perl 6. Считаем сумму чисел Фибоначчи

Стало интересно, насколько последний релиз ракуды быстр в сравнении с пятым перлом. До этого ранее ради интереса сравнивал быстродействие перла 5 в сравнении с питоном и руби. Сравнивал рассчётом суммы первых 30-ти чисел Фибоначчи. Перловка там проигрывала питону с рубями.
Теперь вот решил сравнить насколько шестёрка хороша в данной задаче.

Итак, что имеем:
% perl -v
This is perl 5, version 18, subversion 2 (v5.18.2) built for x86_64-linux-gnu-thread-multi

% perl6 -v
This is perl6 version 2015.09 built on MoarVM version 2015.09

Код на perl 5:
#!/usr/bin/perl

use strict;
use warnings;

sub fib {
    my $n = shift;
    if ( $n < 3 ) {
        return 1;
    }

    return fib($n-1) + fib($n-2);
}

print fib(30) . "\n";

Код на perl 6:
#!/usr/bin/env perl6

sub fib ( Int $n ) {
    if ( $n < 3 ) {
        return 1;
    }

    return fib($n-1) + fib($n-2);
}

fib(30).say;
результаты:
% time perl fib.pl
832040

real 0m0.757s
user 0m0.756s
sys  0m0.000s

% time perl6 fib.pl6
832040

real 0m8.946s
user 0m8.912s
sys  0m0.028s
Что-то как-то совсем не быстро и с большой нагрузкой на проц(в случае с перлом 6). Разница в скорости работы почти в 12 раз!
Понятно, что перл 6 - это виртуальная машина, которая медленно запрягает но быстро едет, но как-то цифры всё-равно не радуют. Другое дело что раньше разница в работе была ещё более впечатляющей, разрабы оптимизируют код, ускоряют работу интерпретатора Rakudo и это не может не радовать.
Буду надеяться, что к стабильному релизу p6 мощЕй ещё добавят. Может даже что-нибудь напишу для себя на нём.

четверг, октября 08, 2015

Perl 6 релизнулся

Ларри Уолл представил первую версию перла 6. Даже не верится в это. Я всегда шестую перловку воспринимал как нечто нереальное, что никогда не случится, но к чему всегда принято стремиться))
И вот случился релиз. Пока только тестовый, но стабильную версию должны представить в конце этого года.
Синтаксис у шестёрки чудоковатый. Двойные сигиллы $. $^ $!, ещё больше возможностей сделать одну вещь различными способами. Но есть и интересные моменты. Явное объявление классов и методов, возможность строгой типизации по необходимости, вроде как параллельность из коробки и пр.
Но всё же данный язык я всерьёз не рассматриваю. На повестке у меня стоит Go, возможно ещё C++. На шестёрке вряд ли что-то серьёзное напишут, но наблюдать буду с интересом, вдруг чудо всё-же произойдёт))

P. S. по традиции в камментах к новости на ЛОР'е и опеннете разразился спор хейтеров и любителей языка. Традиция, ничего не поделаешь))

четверг, августа 27, 2015

Квантовые вычисления

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

понедельник, мая 18, 2015

Встреча гоферов в Новосибирске

22 мая 2015 в Новосибирске Яндекс проводит встречу местного сообщества гоферов.
Участие свободное, но требуется регистрация.
Подробнее про встречу на сайте яндекса

вторник, апреля 21, 2015

Агрегатор статей про Go в рунете

Запилил сайт http://planetgo.ru, который подтягивает и отображает новые статьи про язык Go, написанные в рунете.
Сделано по аналогии с сайтом planetperl.ru.
Пока среди источников только хабр, но уже на подходе пара сайтов, на которых периодически всплывают статьи про Go.

Сам сайт написан на перле с mojo. В отдалённом будущем возможно перепишу на Go

среда, марта 04, 2015

запилил плагин для моджо

Написал плагин для добавления в Mojolicious моделей(Model из MVC), похожих в работе на модели веб-фреймворка Catalyst.
По схеме подключения модели в моджо написал статью в прагматикперл.
Плагин автоматически создаёт папку Model в проекте и автоматом генерит в это папке модуль Base.pm, который будет являться родительским для остальных моделей. Генерация папки, использование базовой модели и имя базовой модели регулируются опциями при подключении плагина.
Сам модуль -  Mojolicious::Plugin::BModel
Имя 'Mojolicious::Plugin::Model' заняли буквально за пару дней до меня. Не зря говорят, что умные идеи приходят разным людям одновременно))

В настоящий момент занимаюсь написанием более внятной доки к модулю и тестами. Пользоваться можно уже сейчас.

среда, октября 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__ )
возвращает массив, в котором первым аргументом является имя файла, а вторым как раз будет полный путь от "/" до модуля.