Случайны выбор дневника Раскрыть/свернуть полный список возможностей


Найдено 802 сообщений
Cообщения с меткой

perl - Самое интересное в блогах

Следующие 30  »
rss_rss_hh_new

Персона: создатель Perl Ларри Уолл — «великодушный пожизненный диктатор»

Вторник, 27 Сентября 2016 г. 23:44 (ссылка)





Сегодня на «Хабре» уже был пост, посвященный дню рождения создателя языка Perl. Здесь хотелось бы подробнее поговорить о биографии и взглядах Ларри Уолла, о его мотивации к созданию языка программирования, а также привести несколько фрагментов из недавнего интервью.



Ларри Уолл – американский программист, лингвист и создатель языка программирования Perl, один из лидеров движения за бесплатный доступ к программному обеспечению.



Первые шаги



Ларри родился 27 сентября 1954 года в Лос-Анджелесе в семье потомственных протестантских пасторов. Мальчик рос в небольшом городке Брементоне в штате Вашингтон и мечтал стать служителем церкви. Это желание не сбылось, но сам Ларри считается одним из немногих религиозных персон в мире именитых программистов.



Учился Ларри Уолл в христианском учебном заведении – Тихоокеанском университете Сиэтла. В 1976 году он получил диплом бакалавра по специальности «Лингвистика». Во время обучения и проявились задатки будущего автора Perl. В течение трёх лет, будучи студентом, Ларри работал в университетском компьютерном центре.





После окончания университета Ларри и его жена (Глория Борн) работали переводчиками Библии, а затем оба поступили в аспирантуру Калифорнийского университета в Беркли. Молодая семья лингвистов по-прежнему видела своё будущее на церковном поприще.



Но настал переломный момент, и работа Ларри в компьютерном центре стала одной из причин того, что, несмотря на лингвистическое образование, он решил заняться компьютерными технологиями. Ларри считал это более перспективным занятием.



Он поступил на работу в Unisys и в Лабораторию реактивного движения НАСА (JPL). Свободное время будущий гуру занимался разработкой программ для UNIX.



Perl: не за славу, не за плату



В 1987 году Ларри Уолл создал язык программирования Perl. Он тогда работал системным программистом в американской компании Unisys. Цели, которые преследовал Ларри при разработке нового языка программирования, отражены в его названии — PERL, которое позднее стало расшифровываться как Practical Extraction and Report Language, то есть «практический язык извлечения данных и создания отчетов».







С 1995 до 2002 года Ларри Уолл работал в компании O’Reilly & Associates, издателя его книг. Уход был связан с получением гранта Фонда Perl.



В 2004 году Ларри занял пост старшего научного сотрудника, а фактически «главного программиста» в NetLabs.



Сейчас Ларри Уолл продолжает развивать язык Perl под патронатом O’Reilly и живёт вместе со своей женой-писательницей и четырьмя детьми в городке Маунтин-Вью в Калифорнии.



Целью автора языка Perl никогда не было получение денег. Напротив, он внёс существенный вклад в «культуру» бесплатного распространения программ с их исходными кодами. Новый язык программирования Уолл разрабатывал для того, чтобы решить проблемы, с которыми он как программист сам сталкивался в течение рабочего дня.



Когда первая версия языка вышла в свет, Ларри Уолл обеспечил открытый доступ и к исходному коду самой программы. Любой желающий может бесплатно скачать и пользоваться Perl независимо от того, нужен ли он ему для усовершенствования собственной странички или для создания мультимилионного Интернет-проекта.



Несмотря на то, что в операционной системе Unix, для которой был создан Perl, уже имелись многочисленные и разнообразные средства для обработки текстовой информации (awk, csh, grep, sed и другие), новый язык полюбился огромному числу системных администраторов и программистов. Он был легок в изучении и применении: синтаксис похож на С, Perl-программы не требовалось предварительно компилировать, исходные тексты было легко модифицировать. А самое главное — это был действительно очень практичный язык: с его помощью легко решалось большинство повседневных задач — от самых простых до очень сложных.



Активно пользуясь языком Perl, программисты из разных стран направляли Ларри Уоллу предложения добавить в него новые возможности или улучшить имеющиеся. Постепенно Perl превратился из средства обработки текстов в среде Unix в мощную универсальную систему программирования. В середине 1990-х годов, по мере развития интернета, Perl стал излюбленным инструментом web-мастеров для создания динамических сайтов и Internet-программирования.



Благодаря языку Perl стартовал Yahoo, с его же помощью создан Amazon и миллионы других сайтов.



24 декабря 2015 года в официальном блоге, посвящённом новостям разработки Perl 6, появилась поздравительная запись. Разработчики поздравили всех с наступающим католическим Рождеством, и с тем, что так долго ожидаемое взросление языка, наконец, состоялось. Фактически, язык готов к использованию в рабочих проектах, и разработчики обещают больше ничего существенно не менять.



С момента выхода первой версии Perl прошло почти 29 лет, с момента выхода самой популярной в данное время версии Perl 5 – более 20 лет. Как шутит Ларри Уолл, создатель языка и лидер его разработки, 6-я версия, возможно, когда-нибудь и заменит 5-ю – примерно лет через 40.



Версия Perl 6 была анонсирована более 10 лет назад – на Amazon ещё можно купить книгу про этот «вскоре выходящий» язык, изданную в 2004 году. И хотя некоторые утверждают, что 6-ка отличается от 5-ки не более, чем C++ от C, всё-таки идеология в Perl 6 эволюционировала достаточно сильно для того, чтобы назвать его более современным языком.



Ларри Уолл надеется, что преподаватели в институтах смогут, наконец, используя один и тот же язык, обучать студентов разным стилям программирования – функциональному, процедурному и объектному.







Логотипом Perl 6 выбрали бабочку. Как (полушутя) пояснил Уолл на конференции в октябре этого года, это было сделано специально для того, чтобы сделать язык привлекательным для 7-летних девочек.



Вопросы есть?



Недавно Ларри Уолл дал интервью Slashdot. Приводим несколько фрагментов из беседы.



Каким компьютером вы пользуетесь? Какие приложения предпочитаете?



Уже год или два я пользуюсь Lenovo X1 Carbon2 с 4-ядерным процессором. За исключением отвратительной раскладки клавиатуры и почти бесполезной ёмкостной сенсорной полоски он практически идеален для разработки, общение и проведения презентаций. На нем установлена операционная система Linux Mint.



Что касается редакторов… я использую разные. У меня нет каких-то конкретных предпочтений.



На компьютере я пользуюсь браузером Firefox, а на моем древнем гуглфоне стоит Chrome.

В работе я бы не смог обойтись без IRC или Git.



Каковы наиболее важные вещи, которым нужно уделить внимание при разработке нового языка программирования?



Важно все. Если вы не разрабатываете DSL (Domain Specific Language), а язык общего назначения, необходимо сделать выбор: навязать миру свою парадигму или реализовать поддержку нескольких парадигм. Лично мы предпочитаем второе.



Даже если вы сможете предусмотреть все, в процессе вы все равно обнаружите что-то, что могли сделать лучше. Ведь не существует идеального языка программирования. При разработке Perl мы использовали 50-60 различных принципов, но самый важный принцип таков: «Не существует самого важного принципа».



С другой стороны, если сконцентрироваться лишь на нескольких важных вещах, в вашем языке будут хорошо сделаны только они. И это тоже не плохо. Плохо, когда люди путают понятие «язык общего назначения» и «язык, обладающий тьюринг-полнотой»



Можете ли назвать эффективные методы управления проектами помимо модели «Великодушный пожизненный диктатор»?

«Великодушный пожизненный диктатор» (англ. Benevolent Dictator For Life, сокр. BDFL) — в контексте разработки свободного ПО, полуюмористический термин, обозначающий главу или основателя проекта, который сохраняет за собой право принимать окончательные решения. Впервые термин использовался по отношению к Гвидо ван Россуму, создателю языка Python.
Я знаю некоторые успешные проекты с демократическими принципами. Но большинство людей не готовы достаточно учиться, чтобы к их мнению можно было прислушиваться.



В сообществе Perl я известен как BDFL, но у меня «B» превалирует над «D». Тем не менее, я больше веду себя как верховный судья, чем как генеральный директор.



Чат IRC выполняет функцию конгресса: предлагает и обсуждает новые идеи. Многие решения я делегирую другим разработчикам и вмешиваюсь только когда вижу варианты, которые другие не видят. У меня есть право «вето», но я стараюсь использовать его как можно реже. Как бы сказала королева Елизавета, я стараюсь править, а не управлять.



Как вы относитесь к господству английского языка в ИТ-индустрии? Изменилось бы что-то, если бы место английского занял язык, не связанный с национальностью? Эсперанто например?



Если бы таким языком стал Японский, мы бы перешли на обратную польскую запись – такой принцип реализован в Forth и PostScript. Я не знал, что существуют люди, думающие по принципу ПОЛИЗ, пока не начал изучать японский.



С другой стороны, я рад, что это место занимает английский. По-моему, Эсперанто все-таки больше европейский язык, чем азиатский.



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



Так, в Perl 6 мы рассматриваем каждую графему в коде (из языков других народов) как изначально определенный символ, независимо от того, использует ли его Unicode-концорциум. Время исполнения нашего алгоритма индексации строк составляет O(1).



Насколько я знаю, в Swift тоже реализована поддержка родных языков. Однако там время выполнения алгоритма оценивается только в O(n). Так что, в Perl 6 это работает быстрее.



Если вам нужны китайские символы в именах идентификаторов – без проблем. Названия модулей на тамильском языке – без проблем. Мы обработаем все символы, которые поддерживает ваша файловая система. Хотите объявить новый оператор с эмодзи в виде веселой кошки? Без проблем.







Это Юникод, детка!


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/311166/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Лень, нетерпение и самомнение — три главных добродетели программиста. С днем рождения, Ларри Уолл

Вторник, 27 Сентября 2016 г. 12:57 (ссылка)

«Мне кажется, я иногда вижу сны на Perl`e»

— Ларри Уолл




  1. Ларри всегда по определению прав по поводу того, как Perl должен себя вести. Это значит, что у него финальное право вето на основные функциональные возможности.

  2. Ларри позволительно менять свое мнение по любому вопросу спустя какое-то время, независимо от того, использовал ли он Правило 1.

Уяснили? Ларри всегда прав, даже когда ошибается.







Компактная биография Ларри выглядит вот так (Geek-код): GC/CS/E/H/IT/L/M/MU/PA/P/S/SS/TW/O d(+++)>+ s: a+>++>+++$ C++++$ UBAHS*++++$ P+++++(--)$ L !E? W+>++ N+++@ K+++>++++++@ w$ !O M->+ V--() PS+(-) PE(++) Y+ PGP->+ t+() 5 X? R>* tv@ b++>+++ DI+++ D? G(-) e++>+++@ h----() r+++ y++++ (расшифровка)



Ларри, как потомственный пастор, в детстве мечтал стать служителем церкви. Но пришлось идти в ИТ. Студетнтом он 3 годаработал в компьютерном центре университета. После универа, вместе с женой работали переводчиками Библии, изучали лингвистику, в надежде на то, что где-нибудь в Африке обнаружется племя со своим языком, но без письменности, и они разработают под этот язык письменность и одарят туземцев. В роли туземцев, спустя годы, оказались программисты.



Из-за денег, Ларри успел поработать в Unisys, NASA (JPL) и O'Reilly.



Из-за лени, нетерпения и самомнения Ларри написал rn (популярный клиент для Usenet) и утилиту patch (под UNIX). Чтобы стать пожизненным великодушным диктаторм, он написал язык Perl.



Ларри верит в типологию Майерс-Бриггс (INFP), а еще он двукратный мировой чемпион по запутанному коду на С.









Perl



«Большая часть в изучении языка Perl — это изучение того как Ларри (автор языка) мыслит. Следовательно, как только вы сможете мыслить также, как это делает Ларри, вы будете знать, что должен делать Perl в каждом случае. Но пока вы учитесь, следует порой заглядывать в документацию.»


«There’s More Than One Way To Do It» («Есть больше одного способа сделать это») — девиз языка Perl. Этот принцип с самого начала имелся в виду при создании данного языка программирования. В соответствии с этой идеей синтаксис языка предоставляет программисту множество возможностей для записи одного и того же алгоритма, позволяя выбирать ту из них, которая кажется наиболее удобной и эффективной в данном конкретном случае. С одной стороны, это упрощает написание кода — нужно знать лишь один способ из многих, с другой — усложняет чтение чужого кода, т.к. для этого нужно знать все способы, которые могут встретиться.



Логотипом Perl 6 выбрали весёленькую бабочку. Как (полушутя) пояснил Уолл на конференции в октябре 2015 года, это было сделано специально для того, чтобы сделать язык привлекательным для 7-летних девочек.



Немного перлов от Ларри



«Путешествие в тысячу миль продолжается со второго шага.»



«Настоящие программисты могут написать ассемблерный код на любом языке.»



«Теперь основным приоритетом станет исправление ошибок, которые случайно могут быть приняты за новые возможности.» (про Perl 6.0.0)



«И существует мета-мета, мета-мета-мета цель. Это, конечно, наслаждаться жизнью. Когда ты молод, то наслаждаться жизнью это значит „я наслаждаюсь жизнью“. Когда ты становишься чуть старше, как я, то начинаешь наслаждаться помогая другим людям наслаждаться жизнью. Ну и тут есть баланс.»



«Истинное величие измеряется в количестве свободы, которую вы даете другим, а не в количестве людей, которых заставляете сделать то, что хотите.»



«Мы все согласны с необходимостью компромисса. Мы просто не можем согласиться на компромисс, когда это необходимо.»



International Obfuscated C Code Contest (IOCCC)



If you want to program in C, program in C. It's a nice language. I use it occasionally...


«Международный Конкурс запутывания кода на С» — конкурс программирования, в котором задачей участников является написание максимально запутанного кода на языке С.

Ларри выиграл дважды.


  • Grand prize in most well-rounded in confusion (1986/wall/wall.c)

  • Most Useful Obfuscation (1987/wall/wall.c)



1986
#define _c(C)_ (C)&('|'+3):c_()(C)>>('\n'-3) __; /**/
#define C char*
#define keyboard ",,B3-u;.(&*5., /(b*(1\036!a%\031m,,,,,\r\n"
#define main(o,oo)oo(o){
#define _ ;case
C
#define c_(cc)c cc=
#define C_(sand)_O(sand)witch
o=keyboard;
#define __ ;break;
C
ccc(
cc)
C
cc;
{
C
cccc=
cc;int
#ifndef lint
#define keyboard "dijs QH.soav Vdtnsaoh DmfpaksoQz;kkt oa, -dijs"
#endif
c;
main(;c_(=(*cc);*cc++)c,for);
#define _O(s)s
main(0xb+(c>>5),C_(s))
_'\v'
:__ _'\f':
main(c,C_(s));
_c(8098)_c(6055)_c(14779)_c(10682)
#define O_(O)_O(O)stem(ccc(
_c(15276)_c(11196)_c(15150)
#define _C ;return
_c(11070)_c(15663)_c(11583)
}
__
default
:c_(+)o[c&__LINE__-007];
main(c_(-)'-'-1,C_(s))_
0214
:_
0216
:c_(+)025 _
0207
:c_(-)4 _
0233
:c_(+)' '-1;
}}c_(&)'z'+5;
}_C cccc;
}main(,cc)
C
#define O write(1,
c="O";
O_(sy) keyboard));
main(;;,for);
read(0,
c,1);*
c_(&)'~'+1
;O ccc(
c),
'\0');
main(*c,
C_(s));_
4
:O_(sy)";kkt -oa, dijszdijs QQ"))_C
_
13
:O o+' ',
3
)
#undef main
__ _ 127:O"\b \b",3)__
default
:O
c,1)
__}}}main(){
cc();

# The grand prize in most well-rounded in confusion

Larry Wall
System Development Corporation
Santa Monica
California
US of A

## Judges' comments:

The original version did not have a ';' character in the first line.
This caused a number of System V C pre-preprocessors to gripe about a
syntax error.

This program is a masterpiece of obfuscation and humor. Larry Wall
(the hacker who gave us rn and patch) asks you to compile and consider
the warning message generated by the C compiler. Then execute the
program and type charters into its standard input. You will see why
the compiler documents the program.

Copyright (c) 1986, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
granted provided this this copyright and notice are included in its entirety
and remains unaltered. All other uses must receive prior permission in writing
from both Landon Curt Noll and Larry Bassel.



}


1987
#define iv 4 
#define v ;(void
#define XI(xi)int xi[iv*'V'];
#define L(c,l,i)c(){d(l);m(i);}
#include
int*cc,c,i,ix='\t',exit(),X='\n'*'\d';XI(VI)XI(xi)extern(*vi[])(),(*
signal())();char*V,cm,D['x'],M='\n',I,*gets();L(MV,V,(c+='d',ix))m(x){v)
signal(X/'I',vi[x]);}d(x)char*x;{v)write(i,x,i);}L(MC,V,M+I)xv(){c>=i?m(
c/M/M+M):(d(&M),m(cm));}L(mi,V+cm,M)L(md,V,M)MM(){c=c*M%X;V-=cm;m(ix);}
LXX(){gets(D)||(vi[iv])();c=atoi(D);while(c>=X){c-=X;d("m");}V="ivxlcdm"
+iv;m(ix);}LV(){c-=c;while((i=cc[D=getchar()])>-I)i?(c?(c ++I)v)pipe(VI);cc=xi+cm++;for(V="jWYmDEnX";*V;V++)xi[V^' ']=c,xi[V++]
=c,c*=M,xi[V^' ']=xi[V]=c>>I;cc[-I]-=ix v)close(*VI);cc[M]-=M;}main(){
(*vi)();for(;v)write(VI[I],V,M));}l(xl,lx)char*lx;{v)printf(lx,xl)v)
fflush(stdout);}L(xx,V+I,(c-=X/cm,ix))int(*vi[])()={ii,li,LXX,LV,exit,l,
d,l,d,xv,MM,md,MC,ml,MV,xx,xx,xx,xx,MV,mi};

# Most Useful Obfuscation

Larry Wall
Unisys - System Development Group Santa Monica
9132 Kester Ave
Panorama City, CA 91402 USA

## Judges' comments:

### Try:
lwall | bc | lwall
input: x*x
input: c^2

### Also try:
lwall | bc and lwall | cat

What we found amazing was how the flow of control was transferred
between subroutines. Careful inspection will show that the array of
pointers to functions named 'vi' refers to functions which seem to not
be directly called. Even so, these pointers to functions are being
used as an argument to signal. Can you determine why this is being
done and how it is being exploited?

Some compilers complained about this file, so we changed: '=++I' to '= ++I'.

Copyright (c) 1987, Landon Curt Noll & Larry Bassel.
All Rights Reserved. Permission for personal, educational or non-profit use is
granted provided this this copyright and notice are included in its entirety
and remains unaltered. All other uses must receive prior permission in writing
from both Landon Curt Noll and Larry Bassel.





Дополнительные материалы

























Decoded Geek Code
GEEK TYPE CODE [GC/CS/E/H/IT/L/M/MU/PA/P/S/SS/TW/O]

Geek of Classics, Geek of Computer Science, Geek of Engineering, Geek of Humanities, Geek of Information Technology, Geek of Literature, Geek of Math, Geek of Music, Geek of Performing Arts, Geek of Philosophy, Geek of Science (Physics, Chemistry, Biology, etc.), Geek of Social Science (Psychology, Sociology, etc.), Geek of Technical Writing, Geek of Other.



GEEK DRESS CODE [d(+++)>+]

My tendencies on this issue range from: «I dress a lot like those found in catalog ads. Bland, boring, without life or meaning.», to: «I tend to wear conservative dress such as a business suit or worse, a tie. Good leisure-wear. Slacks, button-shirt, etc. No jeans, tennis shoes, or t-shirts.» But someday I'd like to say: «Good leisure-wear. Slacks, button-shirt, etc. No jeans, tennis shoes, or t-shirts.»



GEEK SHAPE CODE [s:]

I'm an average geek.



GEEK AGE CODE [a+>++>+++$]

My age is 40-49. But someday I'd like to say: «My age is 50-59.» But someday I'd like to say: «My age is 60 and up. Getting paid for it!»



GEEK COMPUTERS CODE [C++++$]

I'll be first in line to get the new cybernetic interface installed into my skull. Getting paid for it!



GEEK UNIX CODE [UBAHS*++++$]

I use BSD, AIX, HPUX, SunOS/Solaris and some other(s) not listed. I am the sysadmin. If you try and crack my machine don't be surprised if the municipal works department gets an «accidental» computer- generated order to put start a new landfill on your front lawn or your quota is reduced to 4K. Getting paid for it!



GEEK PERL CODE [P+++++(--)$]

My tendencies on this issue range from: «I am Larry Wall, Tom Christiansen, or Randal Schwartz.», to: «Perl users are sick, twisted programmers who are just showing off.» Getting paid for it!



GEEK LINUX CODE [L]

I know what Linux is, but that's about all.



GEEK EMACS CODE [!E?]

I refuse to categorize myself on Emacs. Emacs? I don't even know what that is…



GEEK WORLD WIDE WEB CODE [W+>++]

I have the latest version of Netscape, and wander the web only when there's something specific I'm looking for. But someday I'd like to say: «I have a homepage. I surf daily. My homepage is advertised in my .signature.»



GEEK USENET CODE [N+++@]

I read so many news groups that the next batch of news comes in before I finish reading the last batch, and I have to read for about 2 hours straight before I'm caught up on the morning's news. Then there's the afternoon… But that varies…



GEEK KIBO CODE [K+++>++++++@]

I've gotten mail from Kibo. But someday I'd like to say: «I am Kibo. But that varies...»



GEEK MICROSOFT WINDOWS CODE [w$]

Getting paid for it!



GEEK OS/2 CODE [!O]

I refuse to categorize myself on OS/2.



GEEK MACINTOSH CODE [M->+]

Macs suck. All real geeks have a character prompt. But someday I'd like to say: «A Mac has it's uses and I use it quite often.»



GEEK VMS CODE [V--()]

My tendencies on this issue range from: «I would rather smash my head repeatedly into a brick wall than suffer the agony of working with VMS. It's reminiscent of a dead and decaying pile of moose droppings. Unix rules the universe.», to: «I've used VMS.»



GEEK POLITICS & SOCIAL ISSUES CODE [PS+(-)]

My tendencies on this issue range from: «My whole concept of liberalism is that nobody has the right to tell anybody else what to do, on either side of the political fence. If you don't like it, turn the bloody channel.», to: «Label records! Keep dirty stuff off the TV and the Internet.»



GEEK POLITICS & ECONOMIC ISSUES CODE [PE(++)]

My tendencies on this issue range from: «Distrust both government and business.», to: «Keep the government off the backs of businesses. Deregulate as much as possible.»



GEEK CYPHERPUNKS CODE [Y+]

I have an interest and concern in privacy issues, but in reality I am not really all that active or vocal.



GEEK PGP CODE [PGP->+]

I don't have anything to hide. But someday I'd like to say: "«Finger me for my public key»."



GEEK STAR TREK CODE [t+()]

My tendencies on this issue range from: «It's a damn fine TV show and is one of the only things good on television any more.», to: «It's just another TV show.»



GEEK BABYLON 5 CODE [5]

I've seen it, I am pretty indifferent to it.



GEEK X FILES CODE [X?]

X Files? I don't even know what that is…



GEEK ROLE-PLAYING CODE [R>*]

Role-Playing? That's just something to do to kill a Saturday afternoon. But someday I'd like to say: «I thought life WAS role- playing?»



GEEK TELEVISION CODE [tv@]

I watch only the shows that are actually worthwhile, such as those found on PBS. But that varies…



GEEK BOOKS CODE [b++>+++]

I find the time to get through at least one new book a month. But someday I'd like to say: «I consume a few books a week as part of a staple diet.»



GEEK DILBERT CODE [DI+++]

I am a Dilbert prototype.



GEEK DOOM CODE [D?]

Doom? I don't even know what that is…



THE GEEK CODE [G(-)]

My tendencies on this issue range from: «I know what the geek code is and even did up this code.», to: «What a tremendous waste of time this Geek Code is.»



GEEK EDUCATION CODE [e++>+++@]

Got a Baccalaureate degree. But someday I'd like to say: «Got a Masters degree. But that varies...»



GEEK HOUSING CODE [h----()]

My tendencies on this issue range from: «Married with children — Al Bundy can sympathize.», to: «Friends come over to visit every once in a while to talk about Geek things. There is a place for them to sit.»



GEEK RELATIONSHIPS CODE [r+++]

Found someone, dated, and am now married.



GEEK SEX CODE [y++++]

Male. I have a few little rug rats to prove I've been there. Besides, with kids around, who has time for sex?



[подробнее про код тут]









С днем роджения, Ларри!

Разработчики компании Edison (которая разработала сотни парсеров сайтов и сервис по рассылке push-уведомлений для банка) присеоединяются к поздавлению.
Original source: habrahabr.ru.

https://habrahabr.ru/post/310938/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Лекции Техносферы. Программирование на Perl (осень 2015)

Вторник, 30 Августа 2016 г. 15:27 (ссылка)





Сегодня мы предлагаем вам ознакомиться с одним из курсов Техносферы, который посвящён программированию на Perl. Этот курс открытый — на него может записаться любой студент или аспирант МГУ имени М.В. Ломоносова. Также в Техносфере есть еще несколько открытых курсов, 1 сентября на них открывается запись. В этом семестре вас ждет приятное дополнение: они будут подкреплены методическим материалом, который будет содержать достаточно информации, чтобы по нему можно было вспомнить материал любой лекции и при необходимости более глубоко её изучить.



Цель курса «Программирование на Perl» — узнать возможности языка (его сильные и слабые стороны), научиться писать программные продукты на этом языке, научится быстро ориентироваться в чужом коде. Под катом находятся все лекции в формате видео и краткое описание к ним.



Лекция 1. Введение









История создания языка Perl. Сравнение производительности. Примеры проектов. Документация (perldoc). Настройка окружения. Запуск скриптов (perlrun). Модуль Deparse. Модуль Data::Dumper. Модуль DDP. Отладка perl-скриптов (perldebug).



Лекция 2. Синтаксис и данные









Базовый синтаксис (условия, циклы, управляющие функции, постфиксная нотация). Переменные (основные типы, ссылки, интерполяция). Функции (декларирование, аргументы, контекст, прототипы, встроенные функции, grep/map/sort, eval). Операторы (порядок исполнения, особенные операторы, числа и строки).



Лекция 3. Модульность и повторное использование









Include. Блоки фаз. Package. Экспорт. Версии. Pragmatic modules. No. Symblo tables. CPAN.



Лекция 4. Регулярные выражения и юникод









Поддержка Unicode (определения, строки и октеты, преобразования, UTF8-flag, ввод/вывод). Регулярные выражения (сопоставление, поиск и замена, транслитерация, классы символов, модификаторы, группы, оглядывания, захваты, квантификаторы, работа с юникодом, отладка).



Лекция 5. Общение с внешним миром









Работа с файлами. Perl IO backend. Взаимодействие процессов. Работа с сокетами. Сериализация (преобразование данных в двоичный вид, JSON, CBOR, MSGPACK, Storable, XML). Разбор входных параметров.



Лекция 6. ООП









Методы. Примеры. Наследование. Method resolution order. Детали. Moose-like.



Лекция 7. Работа с базами данных









SQL. DBI. Connect. SQL-инъекции. Prepare, execute. Fetchrow. Fetchall_arrayref. Fetchall_hashref. Selectrow. Selectall. Ошибки. Транзации. Last_insert_id. DBIx::Class. Файлы. Resultset, result. Search. Find, single. Count. Relations. Join. Prefetch. Update, delete. Many_to_many. Storage. DBIx::Class::Schema::Loader. SQL::Translator. Memcached.



Лекция 8. Веб-приложения изнутри









Протокол HTTP. CGI, mod_perl, FastCGI, PSGI. Веб-фреймворки. Механизмы безопасности в приложениях.



Лекция 9. Асинхронно-событийное программирование









Работа операционной системы (параллелизм и псевдопараллелизм, состояние процесса и переключение контекста, степень многозадачности, системный вызов, блокирующие операции ввода-вывода). Обработка N параллельных соединений (accept + fork, C10k, неблокирующие операции ввода-вывода, событийный цикл). AnyEvent (замыкания, функции с отложенным результатом, интерфейс AnyEvent, Guard). Coro.



Лекция 10. Ускоряем Перл. Расширяем «С»









Генерация XS-модулей. Макропроцессор. Типы данных изнутри. Работа со стеком. Typemaps. Встраивание Perl (perlembed).



Лекция 11-12. Тестирование. Анализ производительности









Функциональное тестирование. Тестирование производительности. Нагрузочное тестирование. Юзабилити-тестирование. Тестирование интерфейса пользователя. Тестирование безопасности. Тестирование локализации. Тестирование совместимости. Профилирование. Бенчмарки. Поиск утечек в Pure Perl. Поиск утечек в XS.



Подписывайтесь на наш youtube-канал Технострим Mail.Ru! Там вы найдете все лекции, мастер-классы и трансляции наших образовательных проектов.
Original source: habrahabr.ru.

https://habrahabr.ru/post/308826/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Гейзенбаг, или как Луна портит код

Вторник, 30 Августа 2016 г. 15:16 (ссылка)

Луна убывает, такое бывает… ©Земфира

Гейзенбагом называют ту разновидность программных глюков, которая возникает не пойми откуда, не поддается отладке и обнаружению. Словом, ведет себя как тот самый Неуловимый Джо или кроковский кот из недавнего поста. Мне по работе приходилось сталкиваться с такими и про себя я называл это эффектом квантовой механики до тех пор, пока не узнал, что близкое по смыслу название уже давно придумали. Бывает, посылаешь заказчику отладочный бинарник, который всего лишь записывает в журнал больше событий вокруг предполагаемого источника проблемы и после этого проблема исчезает!

heisenbug /hi:'zen-buhg/ n.

A bug that disappears or alters its behavior when one attempts to probe or isolate it.







Предлагаю вашему вниманию свою небольшую познавательную коллекцию квантовых эффектов в программировании.



Эпизод I, OpenOffice не печатает во вторник



Историю этого замечательного багрепорта можно почитать на Ubuntu Launchpad, а я вкратце изложу суть для тех, кому не сподручно читать по ссылке. В системной утилите file был баг из-за которого, файлы содержащие в 4-м байте Tue определялись как Erlang JAM. Дефект присутствовал в версиях file 4.21 и 4.24 и был вызван ошибкой в magic файле.



anon@x-X:~$ echo "1/2 Tue" >> file && file file
file: Jan 22 14:32:44 MET 1991\011Erlang JAM file - version 4.2
anon@x-X:~$ file --version
file-4.21
magic file from /etc/magic:/usr/share/file/magic


Это приводило к тому, что по вторникам для бажной версии file временные отметки PostScript файлов были похожи на Erlang JAM.



%%CreationDate: (Tue Mar 3 19:47:42 2009)


При отправке задания на принтеры семейства Brother, OpenOffice запускал рутину проверки PostScript файла, которая завершалась ошибкой, потому что обнаруживала тип файла Erlang JAM. Исправление, в основном, свелось к экранированию пробела.



 +# 4.2 version may have a copyright notice!
-+4 string Tue Jan 22 14:32:44 MET 1991 Erlang JAM file - version 4.2
-+79 string Tue Jan 22 14:32:44 MET 1991 Erlang JAM file - version 4.2
++4 string Tue\ Jan\ 22\ 14:32:44\ MET\ 1991 Erlang JAM file - version 4.2
++79 string Tue\ Jan\ 22\ 14:32:44\ MET\ 1991 Erlang JAM file - version 4.2


Впрочем, и с бажным file проблема устранялась просто, однако к тому моменту гейзенбагу уже исполнилось 9 месяцев!



sed -e '/^%%CreationDate:/s/Tue/tue/' > $INPUT_TEMP


Эпизод II, Луна и Perl



Однажды на просторах сети мне попался этот прекрасный экземпляр ИТ юмора. Изнывая от скуки, разработчик Debian решил вычислить зависимость багрепортов от фазы Луны и быстренько написал такой скриптец.



Perl скрипт
#!/usr/bin/perl -w

use strict;
use warnings;

use constant PI => 3.1415926535;

use feature "say";

use SOAP::Lite;
use Astro::Coord::ECI::Moon;

my $soap = SOAP::Lite->uri('Debbugs/SOAP')->proxy('http://bugs.debian.org/cgi-bin/soap.cgi');

if (!defined($ARGV[0])) {
die "E: must have a source package!\n";
}

my @bugs = $soap->get_bugs(src=>$ARGV[0])->result();

my $bugsdata = $soap->get_status(@bugs)->result();
my $moon = Astro::Coord::ECI::Moon->new();
my %count = ( 'new' => 0, 'first' => 0, 'full' => 0, 'last' => 0);

foreach my $bug (keys %$bugsdata) {
my $time = $$bugsdata{$bug}->{date};
my $phase = $moon->phase($time);
if ($phase <= 45 * PI / 180 || $phase > 315 * PI / 180) {
$count{'new'} = $count{'new'} + 1;
} elsif ($phase <= 135 * PI / 180 && $phase > 45 * PI / 180) {
$count{'first'} = $count{'first'} + 1;
} elsif ($phase <= 225 * PI / 180 && $phase > 135 * PI / 180) {
$count{'full'} = $count{'full'} + 1;
} elsif ($phase <= 315 * PI / 180 && $phase > 225 * PI / 180) {
$count{'last'} = $count{'last'} + 1;
}
}

say "Number of bug submissions during new moon : " . $count{new};
say "Number of bug submissions during first quarter: " . $count{first};
say "Number of bug submissions during full moon : " . $count{full};
say "Number of bug submissions during last quarter : " . $count{last};


Результат для пакета nbd был обнадеживающим, зависимость явно проклевывалась.



wouter@carillon:~code/perl$ ./debbugsmoon nbd
Number of bug submissions during new moon : 2
Number of bug submissions during first quarter: 10
Number of bug submissions during full moon : 1
Number of bug submissions during last quarter : 3


Для наукообразности можно даже в R проверить гипотезу функциональной зависимости. Данных маловато, но цифры внушают — p-value = 0.005853.



> chisq.test(c(2, 10, 1, 3));
Chi-squared test for given probabilities

data: c(2, 10, 1, 3)
X-squared = 12.5, df = 3, p-value = 0.005853

Предупреждение:
В chisq.test(c(2, 10, 1, 3)) :
аппроксимация на основе хи-квадрат может быть неправильной


Я решил повторить эксперимент спустя 6 лет, и что бы вы думали?



[5153:23311 0:604] 06:09:39 Вс авг 28 [mikayel@redeye: +4] ~ 
(4:604)$ ./debbugsmoon.pl nbd
Number of bug submissions during new moon : 1
Number of bug submissions during first quarter: 12
Number of bug submissions during full moon : 3
Number of bug submissions during last quarter : 1


С этим nbd что-то явно не так, лунные фазы теперь давят сильнее!



> chisq.test(c(1, 12, 3, 1))
Chi-squared test for given probabilities

data: c(1, 12, 3, 1)
X-squared = 19.471, df = 3, p-value = 0.0002185

Предупреждение:
В chisq.test(c(1, 12, 3, 1)) :
аппроксимация на основе хи-квадрат может быть неправильной


Возможно, найдутся примеры и поярче, если проверить все 43 тысячи пакетов Debian Linux, но думаю это будет не лучшей тратой времени.



Эпизод III, Луна и LISP



Плохому танцору не всегда удаются сложные па, а программистам изредка гадит Луна. Нам об этом известно, благодаря хакерам старой школ, издавшем в 1983-м г. Словарь Хакера, у которого есть и другое название — the Jargon File. С тех пор книга выдержала еще несколько изданий и стала своего рода классикой жанра. В статье Phase of the Moon [1] есть довольно занятная байка на тему.



Однажды, Guy Steele [2], в то время еще студент MIT, словил баг в коде MacLisp [3], записывающей временные метки в отдельный файл содержащий формы, включив туда стандартную функцию приближенного вычисления фазы Луны. По неподтвержденным данным бажную программу также писал Gerry Sussman [4]. Изредка программа сбоила, причем случалось это каждый месяц в одно и то же время из-за того, что первая запись выкатывалась на новую строку, не обозначая комментарий символом ";". Длина первой записи зависела от временной метки и определенной фазы, то есть превышала широту страницы в 80 символов в зависимости от лунного календаря!



В той же статье упоминается еще один случай, когда в ЦЕРН сбоила программа обсчета результата экспериментов на ускорителе LEP коллайдера [5]. Долгие поиски причин сбоев наконец-то привели к разгадке. Кольцо периметра LEP, в 27 км. длиной, было очень незначительно деформировано из-за гравитации Луны. Эта история стала частью фольклора в среде физиков, получив название Ньютоново Возмездие. За достоверность деталей этой истории не могу поручиться, так как т. н. приливные деформации известны уже десятки лет как. Хотелось бы узнать мнение Хабра на этот счет.



Эпизод IV, мой Гейзенбаг



Был у меня на старом ноуте совершенно безумный баг, который приводил к полному или частичному зависанию ОС в время прослушивания музыки через USB наушники, причем чаще всего к зависанию приводило прослушивание интернет-радио. Я это терпел пару-тройку лет а затем, поняв, что ничего не меняется от смены версий ядра Linux, Xorg и драйверов, отправил багрепорт в Gentoo Bugzilla.



This happens for already 4 years with kernels starting 2.6.20 to 2.6.31. Similarly it happened on «HP nc 6220» based no intel chipset running «Debian Linux 5.x.» again USB headphones were Plantronics DSP 300.

Surprisingly it never happens under liveCD, I tested few times keeping audio-streaming for 1 hour and nothing crashed.



В вольном переводе, это жалоба на то, что гейзенбагу уже 4 года и он одинаково хорошо себя чувствует на версиях Linux ядра с 2.6.20 по 2.6.31, на чипсете AMD Radeon Xpress 200M и интеловском 915GM, но почему-то не прижился на LiveCD дистрибутивах.



В момент зависания нигде сообщения об ошибке не возникало и только в /var/log/messages появлялась запись: N URBs still active, где N — четное число < 10. Скорее всего падеж происходил в модуля ядра snd_usb_audio, небрежно обрабатывался и приводил систему в ступор.









Последняя запись в багрепорте, что я поменял опции аппаратного ускорения для открытого графического драйвера radeon



Option "AccelMethod" "EXA" #было
Option "AccelMethod" "XAA" #стало


после чего проблема испарилась, но непонятно как и зачем, ведь это изменение никаким образом не связано с snd_usb_audio.







  1. ^ Автор так обозначил разновидность Гейзенбага. По ссылке, the Jargon File, версия 4.3.3.

  2. ^ Автор книги Common Lisp the Language, один из создателей языка програмимрования Scheme.

  3. ^ Диалект языка программирования Lisp, разработанный в лаборатории искусственного интеллекта MIT.

  4. ^ Один из создателей языка программирования Scheme, со-автор книги Structure and Interpretation of Computer Programs.

  5. ^ Большой электрон-позитронный коллайдер.


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/308462/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Эффективное кеширование. От теории к практике

Пятница, 29 Июля 2016 г. 19:07 (ссылка)

image



Как правило, статьи о кешировании начинаются за здравие, а заканчиваются LRU кешем. Попробуем переломить эту тенденцию? Начнем с того, чем LRU плох, а закончим за здравие. Я надеюсь.



Вне зависимости от того, строите ли вы хайлоад сервис для миллионов посетителей или проектируете мобильное приложение, пишите операционную систему или СУБД — ключевое звено, влияющее на конечную стоимость системы и на отзывчивость интерфейса/сервиса — это кеш.



Спрашивая на собеседованиях какие алгоритмы кеширования вы знаете — как правило слышишь в ответ, ммм… LRU Cache… Зато если спросить про алгоритмы сортировки, вероятность услышать что-то помимо «Пузырек» — значительно выше. Человек готов потратить несколько дней на поиск оптимальной библиотеки ресайза изображений или веб фреймворка, не понимая, что реализовав эффективный кеш, он может взять в принципе любую библиотеку со схожими характеристиками, так как кеш — минимизирует обращения к ней, сгладив разницу в быстродействии.



Для Relap.io, как для хайлоад сервиса, кеширование особенно важно. Например, вчера мы показали рекомендации на различных сайтах 789301033 раз. Поэтому у нас густо обмазано кешем все: рекомендации, картинки, реклама и так далее.



Не все кеши одинаково полезны





Хороший пример LRU Cache.



На конкурсы алгоритмов его обычно не берут. Никто не хочет иметь ничего общего с неудачником. Сложно придумать более неэффективный алгоритм. Единственный алгоритм, у которого LRU Cache выигрывает по эффективности — это, наверно, просто очередь, например, FIFO. Тем не менее, LRU встроен везде и всюду как дефолтный и, к сожалению, часто единственный алгоритм, так как он прост в реализации.



Вам хотелось бы пользоваться сайтом, приложением или операционной системой, которая тормозит, неэффективна и жрет ресурсы как не в себя, но зато она написана на простом в реализации языке, например, условном бейсике? Если нет — добро пожаловать под кат.





Я люблю правило Парето. На стат значимой выборке его можно применять абсолютно ко всему.



Давайте попробуем:


  • 20% усилий приносят 80% результата,

  • 20% товаров приносят 80% прибыли,

  • на 20% урлов приходится 80% просмотров,

  • 20% кода реализуют 80% функционала.





Это довольно интересная закономерность справедливая для больших массивов данных. Казалось бы, причем тут Парето?



<Лирическое отступление>

Несколько лет назад мы писали приложение под андроид для Surfingbird. Мы перешли на RX Java. Асинхронизировали все что можно. Сгладили все переходы анимацией, тем не менее осталась одна нерешенная проблема, это постоянные перезагрузки картинок. И ваше приложение буквально кишит картинками, и они постоянно ротируются меняются и вам не хватает памяти для их размещения.



Признаюсь, я поначалу думал что все дело в имаджлоадере. Достаточно выбрать эффективный и вуаля. Я пересмотрел все. Пикассо, Фейсбуковский fresco, UIL не помню уже все названия. Но проблема оставалась. Картинки грузились где то чуть быстрее, где то чуть плавнее, но они грузились. Тогда я сел, и написал свой. Простой. Чистый. Легкий. И это не помогло. Глупые имаджлоадеры продолжали постоянно теребить картинки нервируя пользователя и никак не могли отделить зерна от плевел. Тогда я вспомнил о правиле Парето.





Если предположить, что 20% картинок — показываются 80% раз — все встает на свои места. Единственное что осталось понять — какие именно картинки надо хранить.



Как работает LRU cache?





Давайте рассмотрим сферическое приложение в вакууме. Пусть это будет мессенджер, его проще всего представить.



скриншот_из_телеграмм.jpg



Если внимательно посмотреть на скриншот, то можно увидеть, что сообщения пользователей сопровождаются аватарками, а в теле сообщений — встречаются картинки. Перед вами стоит задача — сделать максимально плавный интерфейс. Давайте еще раз взглянем на скриншот выше. Мы видим 2 повторяющиеся автарки в диалоге, и затем юзер 1 прислал большую картинку.




  • Пришла аватарка 1 — 100 на 100 пикселей, мы записали в кеш 100*100*4 байт.

  • Пришла аватарка 2 — 100 на 100 пикселей, мы записали в кеш 100*100*4 байт.

  • Пришла аватарка 1 — мы подняли ее в очереди наверх.





Пока все идет неплохо.



Пришла картинка 1024 на 768 пикселей, мы записали в кеш 1024*768*4 байт — и БАМ! Наши прекрасные аватарки выбило напрочь из кеша. Теперь там торжественно валяется картинка, которую нужно было показать один раз и не нужно было кешировать.



Как победить?





Если посмотреть, например, на библиотеку AQuery, то разработчик предлагает разделить кеш на несколько кучек. Отдельная кучка для маленьких аватарок, отдельная кучка для больших картинок. Уже хлеб кстати, но это решение не универсально, требует программирования и внимания, а хочется всего и сразу. Так как все интересное уже было придумано до нас — самое время взглянуть на то, какие еще существуют алгоритмы кеширования.



Статья в вики



Простите, что я тут чуть чуть сжухлю, и опишу очень коротко прописные истины.



LRU — не использованный дольше всех вылетает из кеша.

MRU — последний использованный вылетает из кеша (специфичный кейс, бережем старье).

LFU — реже всего использованный вылетает из кеша.



Это база. Вас может испугать что затраты на вычисления растут с ростом сложности алгоритмов, но не критично. Попробуйте сравнить время лукапов по ключам в памяти со временем рендеринга картинки 1024 на 768. А именно это произойдет если алгоритм «промахнулся».



SNLRU (сегментированный LRU) — заводим несколько «коробочек» с LRU. Сперва кладем в первую коробочку, при повтороном запросе перекладываем во вторую из второй — в третью.



Если назвать коробочки — будет понятнее:


  • Cold — первая коробочка,

  • Warm — вторая,

  • Hot — третья.





Это уже неплохой алгоритм, он используется в недрах freebsd, если не ошибаюсь. По крайней мере я сталкивался с ним в данном контексте.



Mid point LRU — сегментированный LRU в котором всего две коробочки.



MQ — сегментированный LRU в котором запоминаем. Запоминается позиция с которой элемент вылетел — и при повторном запросе — возвращается туда, где был, если не вылетел из очереди запомненных позиций. По сути кеш быстрее прогревается в случае циклической ротации элементов (какашечки могут стать популярными). Выглядит как довольно странный юзкейс.



ARC, GCLOCK — и прочие более сложные алгоритмы придется на время вынести за скобки. Не то чтобы они плохие или неинтересные, тот же ARC используется (точнее, наверное, использовался, судя по данной преисполненной боли статье: www.varlena.com/GeneralBits/96.php) в postgreSQL. Не удержусь от небольшой цитаты:



Database systems often use LRU algorithms but many are switching to other algorithms to better handle a variety of behaviors not handled well by LRU. For example, one one-time very large sequential scan might flood the cache with pages that are not expected to be used again any time soon. The cache then is not helpful until it is re-populated with more commonly used pages.




2Q — или две очереди, примечателен тем, что сохраняя простоту реализации, он прекрасно адаптируется. Кеш разделяется на три части, как в сегментированном LRU, но с более сложной стратегией:




  • Первая часть In — FIFO входящий кеш в который помещаются новые элементы.

  • Вторая часть Out — FIFO исходящий кеш, в который перемещаются элементы, вытесненные из коробочки In.

  • Третья часть Hot LRU кеш для элементов, запрошенных из Out.





Стратегия вытеснения из кеша:




  • элементы запрошенные из In никуда не двигаются. Вытесненные из In элементы — перемещаются в Out.

  • элементы запрошенные из Out — попадают в рай, в коробочку Main. Вытесненные же из Out (не использованные) — попадают сразу в ад (null).





Ссылка на каноническое описание.



Во первых — это красиво. Коробочку Main — делаем, например, 20% (помните о Парето?) именно тут скопятся наши аватарки. А вот Out — надо сделать побольше, процентов 60. Так как это «отстойник».



В чем прелесть In — новые элементы спокойно спускаются по FIFO трубе из In в Out, не подпрыгивая и никуда не перемещаясь по мере запросов. А вот если опять запросили (например пользователь подскролил вверх) и, картинка успела перейти из In в Out — вот она картинка победительница. Кеш на уровне архитектуры корректирует некие типичные корреляции, присутствующие в обычной жизни. И после внедрения исчезли постоянные перезагрузки в условиях ограниченного размера памяти. Парето сработал. Но мы еще не раз вернемся к Парето.



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



Реализация на java, бам!
import java.util.*;

/**
* 2Q: A Low Overhead High Performance Buffer Management Replacement Algorith
* Based on description: http://www.vldb.org/conf/1994/P439.PDF
* Created by recoilme on 22/08/15.
* email: vadim-kulibaba@yandex.ru
*/
public class TwoQueuesCache {
/** Primary container */
private final HashMap map;
/** Sets for 2Q algorithm */
private final LinkedHashSet mapIn, mapOut, mapHot;

private final float quarter = .25f;
/** Size of this cache in units. Not necessarily the number of elements. */
//private int size;
private int sizeIn;
private int sizeOut;
private int sizeHot;

private int maxSizeIn;
private int maxSizeOut;
private int maxSizeHot;

private int putCount;
private int createCount;
private int evictionCount;
private int hitCount;
private int missCount;

/**
* Two queues cache
* @param maxSize for caches that do not override {@link #sizeOf}, this is
* this is the maximum sum of the sizes of the entries in this cache.
*/
public TwoQueuesCache(int maxSize) {
if (maxSize <= 0) {
throw new IllegalArgumentException("maxSize <= 0");
}

calcMaxSizes(maxSize);

map = new HashMap(0,0.75f);

mapIn = new LinkedHashSet();
mapOut = new LinkedHashSet();
mapHot = new LinkedHashSet();
}

/**
* Sets sizes:
* mapIn ~ 25% // 1st lvl - store for input keys, FIFO
* mapOut ~ 50% // 2nd lvl - store for keys goes from input to output, FIFO
* mapHot ~ 25% // hot lvl - store for keys goes from output to hot, LRU
* @param maxSize
*/
private void calcMaxSizes(int maxSize) {
if (maxSize <= 0) {
throw new IllegalArgumentException("maxSize <= 0");
}
synchronized (this) {
//sizes
maxSizeIn = (int) (maxSize * quarter);
maxSizeOut = maxSizeIn * 2;
maxSizeHot = maxSize - maxSizeOut - maxSizeIn;
}
}
/**
* Sets the size of the cache.
*
* @param maxSize The new maximum size.
*/
public void resize(int maxSize) {

calcMaxSizes(maxSize);
synchronized (this) {
HashMap copy = new HashMap(map);
evictAll();
Iterator it = copy.keySet().iterator();
while (it.hasNext()) {
K key = it.next();
put(key,copy.get(key));
}
}
}

/**
* Returns the value for {@code key} if it exists in the cache or can be
* created by {@code #create}. If a value was returned, it is moved to the
* head of the queue. This returns null if a value is not cached and cannot
* be created.
*/
public final V get(K key) {
if (key == null) {
throw new NullPointerException("key == null");
}

V mapValue;
synchronized (this) {
mapValue = map.get(key);
if (mapValue != null) {
hitCount++;
if (mapHot.contains(key)) {
// add & trim (LRU)
mapHot.add(key);
sizeHot += safeSizeOf(key, mapValue);
trimMapHot();
}
else {
if (mapOut.contains(key)) {
mapHot.add(key);
sizeHot += safeSizeOf(key, mapValue);
trimMapHot();
sizeOut -= safeSizeOf(key, mapValue);
mapOut.remove(key);
}
}
return mapValue;
}
missCount++;
}

/*
* Attempt to create a value. This may take a long time, and the map
* may be different when create() returns. If a conflicting value was
* added to the map while create() was working, we leave that value in
* the map and release the created value.
*/

V createdValue = create(key);
if (createdValue == null) {
return null;
}

synchronized (this) {
createCount++;

if (!map.containsKey(key)) {
// There was no conflict, create
return put(key,createdValue);
}
else {
return map.get(key);
}
}
}

/**
* Caches {@code value} for {@code key}.
* @return the previous value mapped by {@code key}.
*/
public final V put(K key, V value) {
if (key == null || value == null) {
throw new NullPointerException("key == null || value == null");
}

if (safeSizeOf(key, value) > maxSizeIn) {
//throw new IllegalArgumentException("value size is too big for store");
System.out.println("Warning! TwoQueuesCache:"+"value size is too big for store in cache.\n" +
"MaxSizeIn: "+maxSizeIn+ "\nStored: "+safeSizeOf(key, value)+
"\nKey:"+key.toString()
);
}

if (map.containsKey(key)) {
// if already have - replace it.
// Cache size may be overheaded at this moment
synchronized (this) {
V oldValue = map.get(key);
if (mapIn.contains(key)) {
sizeIn -= safeSizeOf(key, oldValue);
sizeIn += safeSizeOf(key, value);
}
if (mapOut.contains(key)) {
sizeOut -= safeSizeOf(key, oldValue);
sizeOut += safeSizeOf(key, value);
}
if (mapHot.contains(key)) {
sizeHot -= safeSizeOf(key, oldValue);
sizeHot += safeSizeOf(key, value);
}
}
return map.put(key, value);
}
V result;
synchronized (this) {
putCount++;
final int sizeOfValue = safeSizeOf(key, value);
//if there are free page slots then put value into a free page slot
boolean hasFreeSlot = add2slot(key, safeSizeOf(key, value));
if (hasFreeSlot) {
// add 2 free slot & exit
map.put(key, value);
result = value;
}
else {
// no free slot, go to trim mapIn/mapOut
if (trimMapIn(sizeOfValue)) {
//put X into the reclaimed page slot
map.put(key, value);
result = value;
}
else {
map.put(key, value);
mapHot.add(key);
sizeHot += safeSizeOf(key, value);
trimMapHot();
result = value;
}
}

}
return result;
}

/**
* Remove items by LRU from mapHot
*/
public void trimMapHot() {
while (true) {
K key;
V value;
synchronized (this) {
if (sizeHot < 0 || (mapHot.isEmpty() && sizeHot != 0)) {
throw new IllegalStateException(getClass().getName()
+ ".sizeOf() is reporting inconsistent results!");
}

if (sizeHot <= maxSizeHot || mapHot.isEmpty()) {
break;
}
// we add new item before, so next return first (LRU) item
key = mapHot.iterator().next();
mapHot.remove(key);
value = map.get(key);
sizeHot -= safeSizeOf(key, value);
map.remove(key);
evictionCount++;
}
entryRemoved(true, key, value, null);
}
}

/**
* Remove items by FIFO from mapIn & mapOut
* @param sizeOfValue
* @return
*/
private boolean trimMapIn(final int sizeOfValue) {
boolean result = false;
if (maxSizeIn < sizeOfValue) {
return result;
}
else {
while (mapIn.iterator().hasNext()) {
K keyIn = null;
V valueIn;
if (!mapIn.iterator().hasNext()) {
System.out.print("err");
}
keyIn = mapIn.iterator().next();
valueIn = map.get(keyIn);
if ((sizeIn + sizeOfValue) <= maxSizeIn || mapIn.isEmpty()) {
//put X into the reclaimed page slot
if (keyIn == null) {
System.out.print("err");
}
mapIn.add(keyIn);
sizeIn += sizeOfValue;
result = true;
break;
}
//page out the tail of mapIn, call it Y
mapIn.remove(keyIn);
final int removedItemSize = safeSizeOf(keyIn, valueIn);
sizeIn -= removedItemSize;

// add identifier of Y to the head of mapOut
while (mapOut.iterator().hasNext()) {
K keyOut;
V valueOut;
if ((sizeOut + removedItemSize) <= maxSizeOut || mapOut.isEmpty()) {
// put Y into the reclaimed page slot
mapOut.add(keyIn);
sizeOut += removedItemSize;
break;
}
//remove identifier of Z from the tail of mapOut
keyOut = mapOut.iterator().next();
mapOut.remove(keyOut);
valueOut = map.get(keyOut);
sizeOut -= safeSizeOf(keyOut, valueOut);
}
}
}
return result;
}

/**
* Check for free slot in any container and add if exists
* @param key
* @param sizeOfValue
* @return true if key added
*/
private boolean add2slot(final K key, final int sizeOfValue) {
boolean hasFreeSlot = false;
if (!hasFreeSlot && maxSizeIn >= sizeIn + sizeOfValue) {
mapIn.add(key);
sizeIn += sizeOfValue;
hasFreeSlot = true;
}
if (!hasFreeSlot && maxSizeOut >= sizeOut + sizeOfValue) {
mapOut.add(key);
sizeOut += sizeOfValue;
hasFreeSlot = true;
}
if (!hasFreeSlot && maxSizeHot >= sizeHot + sizeOfValue) {
mapHot.add(key);
sizeHot += sizeOfValue;
hasFreeSlot = true;
}
return hasFreeSlot;
}


/**
* Removes the entry for {@code key} if it exists.
*
* @return the previous value mapped by {@code key}.
*/
public final V remove(K key, V replace) {
if (key == null) {
throw new NullPointerException("key == null");
}

V previous;
synchronized (this) {
previous = map.remove(key);
if (previous != null) {
if (mapIn.contains(key)) {
sizeIn -= safeSizeOf(key, previous);
mapIn.remove(key);
}
if (mapOut.contains(key)) {
sizeOut -= safeSizeOf(key, previous);
mapOut.remove(key);
}
if (mapHot.contains(key)) {
sizeHot -= safeSizeOf(key, previous);
mapHot.remove(key);
}
}
}

if (previous != null) {
entryRemoved(false, key, previous, null);
}

return previous;
}

/**
* Called for entries that have been evicted or removed. This method is
* invoked when a value is evicted to make space, removed by a call to
* {@link #remove}, or replaced by a call to {@link #put}. The default
* implementation does nothing.
*
*

The method is called without synchronization: other threads may
* access the cache while this method is executing.
*
* @param evicted true if the entry is being removed to make space, false
* if the removal was caused by a {@link #put} or {@link #remove}.
* @param newValue the new value for {@code key}, if it exists. If non-null,
* this removal was caused by a {@link #put}. Otherwise it was caused by
* an eviction or a {@link #remove}.
*/
protected void entryRemoved(boolean evicted, K key, V oldValue, V newValue) {}

/**
* Called after a cache miss to compute a value for the corresponding key.
* Returns the computed value or null if no value can be computed. The
* default implementation returns null.
*
*

The method is called without synchronization: other threads may
* access the cache while this method is executing.
*
*

If a value for {@code key} exists in the cache when this method
* returns, the created value will be released with {@link #entryRemoved}
* and discarded. This can occur when multiple threads request the same key
* at the same time (causing multiple values to be created), or when one
* thread calls {@link #put} while another is creating a value for the same
* key.
*/
protected V create(K key) {
return null;
}

private int safeSizeOf(K key, V value) {
int result = sizeOf(key, value);
if (result < 0) {
throw new IllegalStateException("Negative size: " + key + "=" + value);
}
return result;
}

/**
* Returns the size of the entry for {@code key} and {@code value} in
* user-defined units. The default implementation returns 1 so that size
* is the number of entries and max size is the maximum number of entries.
*
*

An entry's size must not change while it is in the cache.
*/
protected int sizeOf(K key, V value) {
return 1;
}

/**
* Clear the cache, calling {@link #entryRemoved} on each removed entry.
*/
public final void evictAll() {
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
K key = it.next();
it.remove();
remove(key, map.get(key));
}
mapIn.clear();
mapOut.clear();
mapHot.clear();
sizeIn = 0;
sizeOut = 0;
sizeHot = 0;
}

/**
* For caches that do not override {@link #sizeOf}, this returns the number
* of entries in the cache. For all other caches, this returns the sum of
* the sizes of the entries in this cache.
*/
public synchronized final int size() {
return sizeIn + sizeOut + sizeHot;
}

/**
* For caches that do not override {@link #sizeOf}, this returns the maximum
* number of entries in the cache. For all other caches, this returns the
* maximum sum of the sizes of the entries in this cache.
*/
public synchronized final int maxSize() {
return maxSizeIn + maxSizeOut + maxSizeHot;
}

/**
* Returns the number of times {@link #get} returned a value that was
* already present in the cache.
*/
public synchronized final int hitCount() {
return hitCount;
}

/**
* Returns the number of times {@link #get} returned null or required a new
* value to be created.
*/
public synchronized final int missCount() {
return missCount;
}

/**
* Returns the number of times {@link #create(Object)} returned a value.
*/
public synchronized final int createCount() {
return createCount;
}

/**
* Returns the number of times {@link #put} was called.
*/
public synchronized final int putCount() {
return putCount;
}

/**
* Returns the number of values that have been evicted.
*/
public synchronized final int evictionCount() {
return evictionCount;
}

/**
* Returns a copy of the current contents of the cache, ordered from least
* recently accessed to most recently accessed.
*/
public synchronized final Map snapshot() {
return new HashMap(map);
}

@Override public synchronized final String toString() {
int accesses = hitCount + missCount;
int hitPercent = accesses != 0 ? (100 * hitCount / accesses) : 0;
return String.format("Cache[size=%d,maxSize=%d,hits=%d,misses=%d,hitRate=%d%%," +
"]",
size(), maxSize(), hitCount, missCount, hitPercent)
+"\n map:"+map.toString();
}
}







Обратите внимание на контейнеры:

    /** Primary container */
private final HashMap map;
/** Sets for 2Q algorithm */
private final LinkedHashSet mapIn, mapOut, mapHot;




Управление «кучками» реализовано на супербыстрых и экономичных по памяти LinkedHashSet, нам не важно значение, важно лишь в какой «кучке» какой ключ находится в данный момент. Это ключ к быстродействию.



Больше практики. Допустим мы хотим прикрутить его к имадж лоадеру — пул реквест к пикассо: github.com/square/picasso/pull/1134

Но вообще это не обязательно. Нормальные либы — позволяют подключить произвольный алгоритм кеширования — достаточно скопипастить класс и переопределить кеш (glide вроде умел, picasso, начиная с какой то версии)



Я уже не помню точных цифр по хитрейту в своем случае. Помню только что у LRU — хитрейт был более 70% но менее 80. У 2Q — чуть более 80%. Но чудо произошло. Потому что все, что нам надо — это закешировать 20% инфы, которая составит 80% трафика. Чудо еще кстати состояло в том, что по скорости 2Q был быстрее LRU.



У нас в Relap.io, несколько реализаций кешей, например моя — github.com/recoilme/2qcache (вообще я не перл программист, это моя первая и надеюсь единственная программа на этом языке, единственный ее плюс — она простая).



Поэтому рекомендую посмотреть на реализацию 2Q на перле от нашего ведущего разработчика:



Реализация на перле, бам: github.com/grinya007/2q



Итак, не важно, что вы пишете: сайт, хайлоад-сервис, мобильное приложение или операционную систему, реализовав единожды умный алгоритм кеширования, вы можете использовать его повсеместно, экономя ресурсы и нервы пользователя.
Original source: habrahabr.ru.

https://habrahabr.ru/post/306252/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Запуск сценариев автоматизации sparrow на удаленных серверах с помощью инструменатрия SparrowDO/SparrowUP

Пятница, 29 Июля 2016 г. 14:34 (ссылка)

Sparrow — система многоцелевых сценариев, спроектированная для разработки и запуска разнообразных скриптов автоматизации. В зависимости от требуемых задач — это может быть развертывание и настройка приложений, мониторинг или тестирование северной инфраструктуры или же решение других вопросов — другими словами — выполнение любых скриптов в автоматическом режиме.



До недавнего времени запуск подобных сценариев был ограничен консольным клиентом ( sparrow или sparrowdo ), сегодня я бы хотел презентовать пилотный проект по автоматической установке и запуску sparrow сценариев на удаленных серверах посредством централизованного web сервиса — SparrowUP.





Установка SparrowUP



SparrowUP — это web приложение, которое ставится на отдельный сервер, с которого инициируется установка и запуск sparrow сценариев на других серверах. Транспортом в данном системе выступает ssh. SparrowUP инициирует ssh сессии в рамках которых происходит:




  • установка sparrow клиента на целевом сервере ( операция "bootstrap" )

  • установка необходимого набора sparrow плагинов на целевом сервере

  • запуск установленных плагинов с набором указанных параметров на целевом сервере ( параметры запускаемых плагинов определяются в так называемом sparrow сценарии, смотрите далее )



Для того, что бы все это работало необходимо обеспечить беспарольный доступ со SparrowUP сервера на целевые сервера, так же sudo привилегии для пользователя, из под которого выполняются ssh команды.



Итак, установим SparrowUP:



Т.к. SparrowUP делегируют всю логику выполнения сценариев клиенту SparrowDO, необходимо сначала данный клиент.



В свою чоереь SparrowDO написан на Perl6, поэтому сначала установим необходимые perl6* зависимости ( Perl6, panda ), все подробности установки описаны здесь — http://rakudo.org/how-to-get-rakudo, для экономии времени не буду приводить здесь весь цикл установки. Установив Perl6 и pandа, ставим Sparrowdo как Perl6 модуль:



$ panda install Sparrowdo


Теперь ставим web приложение SparrowUP ( оно свою очередь написано на Perl5/Mojolicious ):



$ git clone https://github.com/melezhik/sparrowup.git
$ cd sparrowup
$ carton


Создадим базу данных, необходимую для работы SparrowUP:



$ bash utils/populate_db.bash


Скачаем репозитарий со sparrow сценариями:



$ git clone https://github.com/melezhik/sparrowdo-test.git


Структура репозитария должна быть следующей:



project-dir/sparrowfile
project2-dir/sparrowfile
project3-dir/sparrowfile
и так далее


Таким образом, каждая папка-проект должна содержать один файл — sparrowfile с описанием sparrow сценария, формат и структура которого описаны в документации по SparrowDO. Вот как, например может выглядеть сценарий по установки CPAN пакетов Moose и DBIx::Class :



#!/usr/bin/env perl6

use v6;

use Sparrowdo;

task_run %(
task => 'cpan-package',
plugin => 'cpan-package',
parameters => %(
list => 'Moose DBIx::Class',
install-base => '/opt/lib/perl'
),
);


А вот как выглядит список проектов в репозитарий со сценариями https://github.com/melezhik/sparrowdo-test:



$ ls -1

complex
cpan-package
cpan-package2
df-check
git-base
group
nano-setup
package-generic
perl-app
proc-validate
README.md
service
templater


Далее мы должны настроить конфигурационный файл SparrowUP ( /etc/sparrowup.conf ), указав директорию, в которую мы зачекаутили репозиторий со сценариями и так же директорию, в которой SparrowUP будет сохранять файлы отчетов ( директория должна быть доступна на запись пользователю из под которого будет запущен сервис SparrowUP ), вот как это выглядит на моей машине:



$ /etc/sparrowup.conf
{
'repo' => '/home/melezhik/projects/sparrowdo-test/',
'reports_dir' => '/home/melezhik/whatsup-reports'
}


Окей, теперь можно запускать web сервис SparrowUP, для просты примера воспользуюсь обычным "nohup" ( для production системы можно конечно же написать отдельный инит скрипт ):



$ cd sparrowup
$ nohup carton exec morbo app.pl


Зайдя по адресу 127.0.0.1:3000 убедимся, что интерфейс доступен:



image



Запуск sparrow сценариев



Список выполненных задач пока пуст. Давайте запустим несколько задач, используя репозитарий со сценариями. Например проверим, что у нас достаточно места на диске:



$ cat df-check/sparrowfile

use v6;

use Sparrowdo;

task_run %(
task => 'check my disk',
plugin => 'df-check',
parameters => %(
threshold => 70
)
);


image



Запущенная задача добавляется в очередь задач, о чем нас уведомляют.



image



Выполнение задач происходит асинхронно. Что бы задачи попавшие в очереди начали выполнятся необходимо запустить обработчик задач ( это можно было сделать еще в самом начале установке перед запуском сервиса, просто в момент написания статьи я забыл об этом :)



$ cd sparrowup
$ nohup carton exec ./app.pl minion worker &


Приложение SparrowUP написано на фреймворке Mojolicious и в качестве шедулера задач как следствие используется модуль Minion — все кому интересно могут обратится к документации для знакомства с данными инструментами.



Окей, спустя какое-то время шедулер начнет выполнять задачу:



image



image



И мы сможем увидеть результат в виде SparrowUP отчета:



image



А вот как, например, будет выглядеть отчет сценария proc-validate, который проверяет, что процесс nginx сервер запущен в системе:



$ cat proc-validate/sparrowfile

use v6;

use Sparrowdo;

task_run %(
task => 'check my process',
plugin => 'proc-validate',
parameters => %(
pid_file => '/var/run/nginx.pid',
footprint => 'nginx.*master'
)


);



image



Заметим, что запуск новой задачи возможен и программным способом посредством HTTP API:



$ curl 127.0.0.1:3000/df-check -d server=127.0.0.1 


Вы так же можете указывать дополнительные параметры, например, задать имя пользователя и номер порта для ssh соединения:



$ curl 127.0.0.1:3000/df-check -d server=192.168.0.1 -d ssh_user=sparrow -d ssh_port=23


Перезапуск задачи может быть осуществлен либо повторным выполнением заданного проекта для того же сервера, либо кнопкой "Reschedulle Job".



Ограничения ( что еще предстоит сделать или обсудить )




  • операция "bootstrap" — установка sparrow клиента на целевом сервере ( если клиент еще не установлен ) — реализована только для серверов под управлением дистрибутива CentOS. Если заинтересует — пишите — добавлю поддержку других дистрибутивов.




  • нет возможности настраивать через web интерфейс SparrowUP параметры ssh соединения для различных целевых серверов, на которых запускаются sparrow сценарии, сейчас я правлю конфиг ~/.ssh/config и пробрасываю ключи (ssh-copy-id) вручную на сервере, на котором запущен SparrowUP. Не уверен, правда, что такого рода настройки вообще есть смысл вытаскивать наружу, через web интерфейс.




  • сделать возможным настраивание цветовой схемы отчетов ( сейчас черный фон — не самое приятное для глаз решение ;)



Заключение



На этом знакомство с сервисом SparrowUP можно завершить. Спасибо за внимание!



Как обычно, жду вопросов и конструктивных замечаний.



PS Всех, кого это касается — поздравляю с днем системного администратора!



PS2 В конце статьи традиционно опрос, напрямую не касающийся основного топика.





какую систему мониторинга вы используете


























































Никто ещё не голосовал. Воздержавшихся нет.





Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.


Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/306684/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Как развивался Perl — необычный язык, созданный лингвистом для программистов

Понедельник, 11 Июля 2016 г. 16:44 (ссылка)





Язык программирования Perl создал Ларри Уолл (Larry Wall) в 1987 году, когда он работал системным программистом в американской компании Unisys. Цели, которые преследовал Ларри при разработке нового языка программирования, отражены в его названии — PERL, которое позднее стало расшифровываться как Practical Extraction and Report Language, то есть «практический язык извлечения „данных“ и „создания“ отчетов».



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



Хотя, по другой версии, Ларри назвал созданный им язык по имени своей невесты.





Ларри Уолл



На становление Perl повлияли языки Ada, Basic, Fortran, Lisp, Pascal и, конечно, язык C. Perl впитал в себя разные течения компьютерной науки: процедурное, модульное, функциональное и объектно-ориентированное программирование, макрообработку текста, а кроме этого — культуру ОС Unix, с ее богатым набором команд и утилит, стройной продуманной архитектурой и унифицированным подходом к представлению данных.



Наследие Unix



Решающее влияние на развитие языка Perl оказала среда Unix, в которой он разрабатывался. С самого начала эта операционная система создавалась небольшой группой программистов для самих себя. Поэтому принципы, заложенные в ней, ориентированы на удобство повседневного применения человеком: все делалось максимально функционально, кратко, единообразно. Например, большинство системных настроек хранится в обычном текстовом виде, так что их может читать и исправлять человек, вооруженный простым текстовым редактором.



Для тех, кто знаком с операционной системой Unix, этот материал не будет новым. Но многим программистам, работающим с MS-DOS и Windows, важно познакомиться с принципами программирования, основанного на инструментальных средствах (softwaretools), которое зародилось и развивалось вместе с ОС Unix. О них написали замечательную книгу известные программисты Брайан Керниган (Brian W. Kernighan) и Филип Плоджер (Philip Plauger). Вот основные положения этого подхода.



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



• Поставленная задача решается путем взаимодействия небольших программ за счет последовательной обработки данных каждой из них.



• При разработке этих небольших программ следует ориентироваться на их максимально независимое использование, чтобы их можно было применять для решения других задач. Таким образом, постепенно создаются инструментальные средства (ИС) для дальнейшего универсального применения.



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



• Объединение инструментальных средств в приложения производится средствами командного языка ОС: перенаправление ввода-вывода, создание программных конвейеров (направление выходного потока одной программы на вход другой).



• Основным форматом хранимых данных для инструментальных средств выступают текстовые файлы, одинаково хорошо подходящие для программной обработки и чтения их человеком.



• Для эффективной обработки слабо структурированной текстовой информации применяются регулярные выражения.



Благоприятные факторы



Язык быстро распространился среди пользователей сети Usenet. Несмотря на то, что в операционной системе (ОС) Unix, для которой был создан Perl, уже имелись многочисленные и разнообразные средства для обработки текстовой информации (awk, csh, grep, sed и другие), новый язык полюбился огромному числу системных администраторов и программистов. Он был легок в изучении и применении: синтаксис похож на С, Perl-программы не требовалось предварительно компилировать, исходные тексты было легко модифицировать. А самое главное — это был действительно очень практичный язык: с его помощью легко решалось большинство повседневных задач — от самых простых до очень сложных.







Активно пользуясь языком Perl, программисты из разных стран направляли Ларри Уоллу предложения добавить в него новые возможности или улучшить имеющиеся. Постепенно Perl превратился из средства обработки текстов в среде Unix в мощную универсальную систему программирования. В середине 1990-х годов, по мере развития интернета, Perl стал излюбленным инструментом web-мастеров для создания динамических сайтов и Internet-программирования.



Благодаря своим мощным встроенным средствам работы с текстовыми данными Perl широко используется для обработки информации в форматах HTML и XML.



Perl стал непременным компонентом любой поставки ОС семейства Unix (например, FreeBSD, Linux или Solaris). Кроме этого, к настоящему времени Perl реализован практически для всех современных аппаратных платформ (суперкомпьютеры, RISC, Macintosh, PC, наладонные компьютеры) и операционных систем (AIX, Linux, MacOS, MS-DOS, NetWare,OS/2, QNX, Solaris, Windows, VMS и так далее).



Это дает возможность легко переносить популярные Perl-программы из одного операционного окружения в другое. (К слову сказать, примеры к этому курсу лекций проверялись под операционными системами SuSE Linux 10.0, MS Windows XP Professional SP2, и MS Pocket PC 2003Premium Edition v. 4.20).



Несомненно, его широкому применению способствовало и то, что он распространяется бесплатно на условиях одной из лицензий: либо GNU GeneralPublic License (GPL), либо Artistic License — на выбор. Но главное, что в нем есть все средства, чтобы отлично выручать профессионалов и неопытных программистов, когда требуется быстро решать разные системные и прикладные задачи — от самых простых до весьма сложных. В результате Perl стал одним из самых успешных проектов движения open source (с открытыми исходными кодами) — наряду с Apache, Linux, PHP и Python.



Необычный язык программирования



Принципы разработки Perl сильно отличаются от применявшихся в программировании до этого. Новаторский характер языка был связан с уникальными особенностями личности автора, Ларри Уолла, и его разносторонними интересами.



Во время обучения в университете Ларри Уолл получил лингвистическое образование. Кроме того, он занимался программированием и работал в университетском компьютерном центре.



Возможно, главная заслуга Ларри как автора Perl заключается в том, что ему удалось создать язык, учитывающий свойства и принципы естественного языка: ситуативную многозначность конструкций, разумную избыточность (и за счет этого стилевое разнообразие), максимальную адаптированность к различному уровню знаний носителей языка, гибкость и выразительность синтаксических средств. Все это придает особый творческий вкус самому процессу «сочинительства» на этом языке.



Пишущие о языке Perl невольно употребляют термины «идиома», «метафора», «синоним», «контекст» и т.п., обычно применяемые к естественным языкам. А сам Ларри Уолл, описывая язык Perl, широко пользуется лингвистическими терминами: существительное, глагол, предложение, единственное и множественное число, местоимение.



Выдающийся лингвист Б.Л. Уорф заметил: «Язык формирует наш способ мыслить и определяет, о чем мы можем думать». Эту же мысль подтверждает Дж. Бентли в книге «Жемчужины творчества программистов», описывая случай, когда именно особенности языка программирования APL натолкнули разработчика на оригинальное решение задачи с массивами. В этом смысле Perl как язык для воплощения замыслов программиста, не сковывает фантазию разработчика, дает ему максимальную свободу самовыражения, а иногда даже подсказывает нестандартные решения.



В качестве недостатков языка упоминают:


  • отсутствие механизма статической типизации;

  • избыточность языковых средств;

  • отсутствие модульности;

  • «извращенную» реализацию ООП.



Лингвистические принципы Perl



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



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



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

$we->shall(do($it)) if $you->want($it); # или

if $you->want($it) { $we->shall(do($it)) }


Принцип свободы в естественных языках предполагает, что всегда есть несколько вариантов выражения одной и той же мысли. Как и в естественных языках, в Perl одного и того же результата можно достичь несколькими способами, используя различные выразительные средства языка. Это так называемый принцип TIMTOWTDI- сокращение читается «Тим Тоуди» и расшифровывается как «There is more than one way to do it»: «есть более одного способа сделать что-то». В соответствии с ним каждый разработчик выбирает тот вариант языковой конструкции, который больше подходит ему в конкретной ситуации, больше соответствует его стилю или уровню знания языка.



Подобный подход полностью противоположен строго формальному взгляду на языки программирования, когда главными целями разработки становятся однозначность и минимизация языковых конструкций. Но с точки зрения психологии и языкового мышления «лингвистический подход» во многом более продуктивен, как это ни парадоксально! Ведь он стимулирует творчество, привлекая человеческий опыт применения естественного языка, — и писать программы на Perl становится увлекательно и интересно. Наверное, поэтому программирующие на Perl так любят словечко «fun» (весело, забавно).



Первые версии и «Верблюжья книга»



Ларри Уолл начал разработку Perl в 1987 году, когда работал программистом в Unisys. Версия 1.0 была выпущена и анонсирована 18 декабря 1987 года как «„замена“ для awk и sed».



Perl 2 был выпущен в 1988 году. Основным нововведением в нём был переработанный механизм регулярных выражений.



Perl 3, выпущенный в 1989 году, получил возможность обрабатывать потоки двоичных данных.



Изначально, единственной документацией для Perl была единственная (огромной длины) man-страница. В 1991 году была выпущена книга «Programming Perl» (известная многим программистам как «Верблюжья книга» (Camel Book) из-за изображения на обложке), которая, де-факто, стала стандартом языка.







В то же самое время, версия языка была «поднята» до 4 й — не столько чтобы указать на значительные изменения, сколько чтобы обозначить, что эта версия языка документирована книгой. Perl 4 прошёл через серию релизов, остановившись на Perl 4.036 в 1993 году.



Perl 5



Разработка Perl 5 была начата в 1994 году. В то же время был создан список рассылки perl5-porters для координации работы над портированием Perl 5 на различные платформы. Он до сих пор остаётся основным форумом по разработке, обслуживанию и портированию Perl 5.



Perl 5.000 был выпущен 17 октября 1994 года. Он включал в себя полностью переписанный интерпретатор, а также много новых языковых возможностей, таких, как объекты, ссылки, локальные переменные (my $var_name) и модули. Особенно важной частью были модули, так как они предоставили механизм расширения языка без модифицирования интерпретатора. Это позволило стабилизировать интерпретатор, но при этом, дало возможность обычным Perl-программистам добавлять в язык новые возможности. Perl 5 находится в активной разработке по сей день.



Perl 5.001 был выпущен 13 марта 1995 года. Perl 5.002 увидел свет 29 февраля 1996 года с новой поддержкой прототипов. Это позволило авторам модулей создавать функции, которые вели себя так же, как и встроенные функции Perl. Версия Perl 5.003 появилась 25 июня 1996 года и устранила обнаружившиеся проблемы с безопасностью.



Одно из важнейших событий в истории Perl 5 случилось за пределами собственно языка и было следствием поддержки модулей. 26 октября 1995 года начала свою работу CPAN (Comprehensive Perl Archive Network — «всеобъемлющая сеть архивов Perl»), которая стала репозиторием модулей Perl, а также исходного кода самого языка. На данный момент сеть насчитывает более 25 000 модулей, созданных более чем 8000 программистами.



Perl 5.004 был выпущен 15 мая 1997 года и содержал, кроме всего прочего, пакет UNIVERSAL, который давал языку основной объект, от которого автоматически происходили все классы. Была также включена возможность запрашивать версию модулей. В дополнение к этому Perl стал поддерживать Microsoft Windows, а также ряд других операционных систем.



Perl 5.005 увидел свет 22 июня 1998 года. Этот релиз включал в себя несколько улучшений процессора регулярных выражений, новые перехваты в бэкенд с помощью модулей B::*, оператор кавычек qr// для регулярных выражений, большой выбор других новых модулей, а также поддержку ряда операционных систем, в частности, BeOS.



2000-е годы



Perl 5.6 был выпущен 22 марта 2000 года. Главные изменения включали поддержку 64-битных систем, представление строк в стандарте Юникод, поддержку больших файлов (файлы больше 2 Гб) и ключевое слово our. Во время разработки Perl 5.6 было принято решение изменить схему наименования версий на более близкую к другим проектам с открытым исходным кодом. За версией 5.005_63 следовала версия 5.5.640; согласно плану, версиям в разработке должны были присваиваться нечётные номера, стабильным версиям — чётные.



В 2000 году Ларри Уолл выступил с призывом к сообществу активно обсуждать предложения к следующей версии Perl. Результатом этого обсуждения стал361 документ RFC (Request for Comments — «запрос комментариев»), которые были использованы в разработке Perl 6.



В 2001 году была начата работа над окончательным документом, подводящим итог предложениям к созданию нового поколения Perl. Результат был представлен не в виде формального документа, а в качестве сводки всех RFC. К этому времени Perl 6 существовал исключительно в виде описания языка.



Perl 5.8 был впервые выпущен 18 июля 2002 года и с этого времени получал ежегодное обновление. Последняя версия Perl 5.8, под номером 5.8.9, увидела свет 14 декабря 2008 года. Perl 5.8 улучшил поддержку Юникода, добавил новую реализацию ввода-вывода, добавил поддержку многопоточности, увеличил числовую точность и добавил несколько новых модулей.



В 2004 году началась работа над Синопсисом (Synopsis) — первоначально задуманном как ряд документов, подводящих итоги окончательного документа, упоминавшегося выше. Однако постепенно этот ряд документов и стал спецификацией Perl 6. В феврале 2005 года Отриус Тан начала работу над Pugs — интерпретатором Perl 6, написанном на Haskell. Это было первой настоящей попыткой воплотить Perl 6 в реальность. Эта попытка заглохла в 2006 году.



Когда тебе за 20



18 декабря 2007 года, в день 20-летней годовщины Perl 1.0, была выпущена версия Perl 5.10.0. Эта версия содержала в себе ряд заметных нововведений, приближающих её к Perl 6. Одними из таких нововведений стали новые операторы switch (названных «given»/«when»), обновление регулярных выражений, а также «умный» оператор совпадения «~~».





«Жемчужный» юбилей



Примерно в это же время всерьёз началась разработка новой реализации Perl 6, известной как Rakudo Perl, разработанной в связке с виртуальной машиной Parrot. С ноября 2009 года Rakudo Perl регулярно обновляется каждый месяц и является на данный момент самой полной реализацией Perl 6.



Значительное изменение процесса разработки Perl 5 произошло после появления Perl 5.11. Сообщество разработчиков перешло на ежемесячный цикл выпусков, с планированием даты выпуска на три месяца вперёд.



12 апреля 2010 года Perl 5.12.0 был представлен общественности. Выдающиеся нововведения включают в себя поддержку нового синтаксиса package NAME VERSION, оператор Yada Yada (служащего для маркировки кода-заполнителя, который ещё не реализован), полное решение «проблемы 2038 года» (Y2038), перегрузку операторов регулярных выражений, поддержку DTrace (фреймворка динамической трассировки), а также полную поддержку стандарта Unicode 5.2.



7 сентября 2010 года был выпущен Perl 5.12.2, а 21 января 2011 — Perl 5.12.3. Эти выпуски содержат обновление модулей, а также некоторые изменения в документации. Версия 5.12.4 выпущена 20 июня 2011. Последняя версия этой ветви, 5.12.5, выпущена 10 ноября 2012.



Крайняя пятилетка



14 мая 2011 выпущен Perl 5.14. Поддержка JSON стала встроенной, начиная с версии 5.14.2. Последняя версия этой ветви, 5.14.4, выпущена 10 марта 2013.



20 мая 2012 выпущен Perl 5.16. Значимым новшеством является возможность указать нужную версию Perl, которую надо эмулировать, позволяя пользователям обновить Perl, но сохранить работоспособность старых скриптов, которые иначе стали бы несовместимыми с новой версией. Ядро Perl 5.16 поддерживает Unicode 6.1.



18 мая 2013 выпущен Perl 5.18. Значимые нововведения включают новые зацепки dtrace, лексические функции, увеличение числа включенных в ядро функций, пересмотр реализации хешей из соображений безопасности, поддержка Unicode 6.2.



27 мая 2014 года была выпущена новая стабильная версия — Perl 5.20.0. Разработка велась примерно 12 месяцев, начиная с Perl 5.18.0, и содержит примерно 470 000 изменённых строк среди 2900 файлов от 124 авторов.



В декабре 2015 года вышел Perl 5.22.1. Разработка велась 6 месяцев.



9 мая 2016 года была выпущена новая стабильная версия языка программирования Perl 5.24.0. Разработка велась примерно 11 месяцев, начиная с Perl 5.22.0, и содержит примерно 360 000 изменённых строк среди 1800 файлов от 77 авторов.



Согласно данным на июль 2016 года, индекс TIOBE, который измеряет рост популярности языков программирования, показал, что Perl занимает 9 место:





Это на 2 позиции выше, чем в прошлом году.



Perl 6



Как отмечается в «Википедии», Perl 6 — очередная версия языка программирования Perl (с точки зрения строения, Perl 6 удобнее рассматривать как самостоятельный язык программирования). Является революционным развитием языка, последний написан практически «с чистого листа». Впервые за всю историю Perl разработка новой версии была начата с написания спецификаций, которые претерпевают изменения и по сей день.



Perl 6, компилируя программу, создаёт байт-код, который в дальнейшем исполняет виртуальная машина. Тот же подход применяется в технологиях Java и .NET Framework.



Фактически, можно говорить о новом языке, имеющим с предыдущей версией Perl общие корни, но не совместимом с ней, хотя в спецификациях предполагался режим совместимости.



Разработка Perl 6 началась в 2000 году и продолжается и по сей день.



Изначально Perl задумывался, как инструмент, по быстродействию сравнимый с откомпилированными Unix-утилитами. Быстрота работы должна была обеспечиваться за счет того, что исполняющая система Perl читает исходный текст Perl-программы и компилирует его «на лету», затем сразу интерпретирует откомпилированную программу.



Ларри Уолл в шутку провозгласил три главных добродетели программиста: лень, нетерпение и самомнение. По его мнению, Perl спроектирован так, чтобы соответствовать этим качествам разработчика.
Original source: habrahabr.ru (comments, light).

https://habrahabr.ru/post/305402/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Приглашаем на YAPC::Russia 2016

Четверг, 23 Июня 2016 г. 14:18 (ссылка)





В субботу 25 июня в московском офисе Mail.Ru Group пройдёт ежегодная конференция YAPC::Russia, посвящённая языку программирования Perl и его сообществу. В разные годы она проходила в Москве, Киеве и Санкт-Петербурге. На конференцию съезжаются Perl-профессионалы из разных городов и стран, чтобы обменяться опытом, завести новые знакомства в своей сфере и пообщаться с единомышленниками в неформальной и приятной обстановке. Программа встречи ждет вас под катом.



10.00 — сбор гостей



11.00 — Елена Шишкина, Mail.Ru Group. Валидаторы сложных структур, или как мы делали новый API



11.45 — Ксения Боброва, ACI Worldwide. Continious integration Perl кода с Jenkins и Gerrit

В этом докладе будет рассказано, как применить Gerrit Code Review и Jenkins для автоматизации доставки Perl-кода с локальной машины разработчика на продакшен.



12.30 — Николай Мишин, «Мастер-Домино». Использование Eclipse в качестве редактора Perl



12.55 — Евгений Вансевич, Mail.Ru Group. Анализ памяти в Perl. Tips&Tricks

Рано или поздно возникает ситуация, когда приложение начинает занимать много памяти, или начинает течь. Доклад Евгения посвящён тому, что делать в подобных ситуациях, и как их избежать. Будут рассмотрены инструменты анализа памяти в Perl, начиная от того, чем занята память процесса, оценкой оверхеда по данным, заканчивая поиском утечек памяти. Полученные знания будут применены на практике.



14.00 — ОБЕД



14.30 — Алексей Мележик, EPAM Systems. Sparrow — повторно используемые сценарии автоматизации

Sparrow — система распространяемых многоцелевых сценариев, позволяющая быстро создавать и повторно использовать любые сценарии автоматизации. Область применения: деплоймент, управление конфигурациями, автоматическое тестирование, аудит и мониторинг. Вы создаёте свои сценарии и загружаете их в виде плагинов в центральный репозитарий SparrowHub, а другие могут их использовать. Система написана на Perl5. Сценарии (плагины) пишутся на Perl, Bash, Ruby — на ваш выбор. Существует внутренний DSL для верификации работы сценариев (Outthentic::DSL). Отчёты сценариев предоставляются в виде TAP. Система может использоваться самостоятельно с помощью консольного клиента, а также легко интегрируется (используя другие средства как «транспорт») с существующими системами управления конфигурациями, такими как chef, ansible, rex.



15.15 — Алексей Машанов, Mail.Ru Group. Perl быстрее, чем Perl

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



15.40 — Павел Лиморенко, Mail.Ru Group. Мониторинг: демон, который читает логи

Представьте, что у вас на машине запущено множество сервисов, каждый из которых постоянно (и интенсивно) что-то пишет в /var/log/service_name.log. Как уследить за их работой? И ведь хочется это делать в реальном времени! А теперь усложним задачу: у вас ферма из 500 таких машин. И 50 коллег, причём каждый хочет отыскивать в логах что-то свое. Мы в Почте Mail.Ru научились с этим справляться и написали на Perl удобный инструмент, принципом работы которого хотим поделиться с вами.



16.25 — Николай Мишин, «Мастер-Домино». Реализация паттерна «Наблюдатель» на Moose



16.50 — Иван Панченко, Postgres Professional. Как асинхронно работать из Perl с PostgreSQL

Замечательный AnyEvent::HTTP::Server многоуважаемого Монса позволяет строить очень компактные и производительные перловые микросервисы. Как-то раз мне нужно было поднять такой сервис в качестве интерфейса к PostgreSQL (даже к нескольким). Конечно, существуют хорошие альтернативные неперловые решения — C2H5ОН или просто модуль ngx_postgres. Но, как известно, Perl гибче. С PostgreSQL из Perl все привыкли работать с DBI — а для асинхронной работы он не годится. Оказывается, есть альтернатива. В этом коротком докладе будет показано, как с помощью AnyEvent строить асинхронные микросервисы, внутри которых — PostgreSQL.



17.15 — КОФЕ-БРЕЙК



17.30 — Михаил Озеров, Mail.Ru Group. Реализация конечного автомата для работы со сложными сценариями платежных систем (и не только)



18.15 — Андрей Еньшин, Mail.Ru Group. Perl method invocation



18.40 — Lighting Talks



20.00 — After Party



Для всех, кто не сможет присутствовать, мы организуем прямую видеотрансляцию.



Участие бесплатное, но необходимо зарегистрироваться.



Адрес: Москва, Ленинградский пр. 39, стр. 79, офис Mail.Ru Group.



До встречи!

Original source: habrahabr.ru.

https://habrahabr.ru/post/303856/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Разработка Docker контейнеров с помощью системы многоцелевых сценариев Sparrow

Четверг, 02 Июня 2016 г. 14:28 (ссылка)

В этой статье я хотел бы рассказать как можно создавать сценарии сборки имиджей для Docker контейнеров с помощью системы многоцелевых сценариев Sparrow*.



Читать дальше →

https://habrahabr.ru/post/302278/

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество
rss_rss_hh_new

Вышла версия 2.0 Perl плагина для IntelliJ IDEA

Четверг, 26 Мая 2016 г. 19:32 (ссылка)






Стала доступна для загрузки вторая версия Perl плагина для IDE от JetBrains. В этой версии появилась последняя из крупных фич, которую я хотел реализовать — отладчик.

Читать дальше →

https://habrahabr.ru/post/301910/?utm_source=habrahabr&utm_medium=rss&utm_campaign=best

Метки:   Комментарии (0)КомментироватьВ цитатник или сообщество

Следующие 30  »

<perl - Самое интересное в блогах

Страницы: [1] 2 3 ..
.. 10

LiveInternet.Ru Ссылки: на главную|почта|знакомства|одноклассники|фото|открытки|тесты|чат
О проекте: помощь|контакты|разместить рекламу|версия для pda