# ПРОЦЕССЫ Ресурсы Цикл разработки ПО Waterfall RUP Agile Kanban Управление АРХИТЕКТУРА Ресурсы ПО для Архитектора Кто архитекторы? Архитектурные слои язык Archimate GAP-анализ SOA Типы интеграции Vision (Концепция) Проектное решение ESB Микросервисы и service mesh HTTP/REST RPC DDD АНАЛИЗ Ресурсы ПО для Аналитика Кто аналитики? Бизнес-процесс Требования Уровни и типы Источники Стейкхолдеры Нотации Сервисы DevOps CI/CD/CDP VM и Docker Контракты API Оценка задачи git Frontend Apache Регулярка Linux ТЕСТИРОВАНИЕ Ресурсы QA и QC Цикл тестирования Уровни тестирования Виды тестирования Баг-репорт Тестирование требований Тест-анализ и тест дизайн Интеграционное, API, E2E Тест план Метрики качества Автотесты Selenium XPATH Генератор данных Нагрузочное ДАННЫЕ Ресурсы MDM Big data Об информации SQL intro MongoDB intro БИБЛИОТЕКА Системная инженерия Станислав Лем Экстраполяция в будущее Политэкономия Сознание, интеллект

/ АНАЛИЗ АРХИТЕКТУРА ДАННЫЕ DevOps: + DevOps + Frontend + Apache web-server + Регулярные выражения + git + Javascript - Perl | Почерпнуть мудрость | CPAN | регулярка | поиск и замена | Mojolicious | ООП в Perl | DBI connection strings | всякое | Примеры скриптов | Часто используемые модули + Python + Ruby + Rust + Полезности в Windows + Linux Gaming Библиотека ПРОЦЕССЫ ТЕСТИРОВАНИЕ
Perl cheatsheet
Почерпнуть мудрость
CPAN
Апгрейд CPAN и всех установленных модулей до самой свежей версии: sudo perl -MCPAN -e 'upgrade' Насильная установка модуля в CPAN минуя тесты: force install clean <MODULE>::<submodule>
регулярка
.* ноль или больше любых символов. Синоним .{0,} .+ один или больше любых символов. Синоним .{1,} x? ноль или один символ 'x'. Синоним x{0,1} x* ноль или больше символов 'x'. Синоним x{0,} x+ один или больше символов 'x'. Синоним x{1,} [] только символ(ы), заключенные в [], например: [0-9] любая цифра в диапазоне от '0' до '9' [a-z] любая буква в диапазоне от 'a' до 'z' [a-zA-Z] любая буква в диапазоне от 'a' до 'z' или от 'A' до 'Z' [abc-], [-1] если нужен минус, то его нужно указать последним или первым [(+\\\]\t] внутри скобок нужно экранировать только ] и \ [^] все символы, КРОМЕ заключенных в [], например: [^0-9] любой символ, не входящий в диапазон от '0' до '9' [^a-z] любой символ, не входящий в диапазон от 'a' до 'z' x{} или [x]{} определённое количество символов подряд, например: x{m} ровно m символов x x{m,} по крайней мере m символов x x{m,n} от m до n символов x x{,n} до n (включительно) повторений символа x [a-z]{m} ровно m символов из диапазона от 'a' до 'z' По умолчанию квантификаторы жадные - захватывают максимально возможное число символов/сочетаний. Добавление ? делает их ленивыми - они захватывают минимально возможное. *? +? {m,n}? {m,}? /^1../ первый символ в строке /..9$/ последний символ в строке a|b|c 'a' или 'b' или 'c' () группировка символов (в Perl - заносит группу в спецпеременные $1, $2...), например: (abc) ищет сочетание abc (?=abc) позитивный поиск группы символов (группа должна присутствовать в искомой подстроке) (?!abc) негативный поиск группы символов (группа должна отсутствовать в искомой подстроке) (?:abc) т.н. non-capturing group - группа должна присутствовать в строке, но в результат её включать не надо \077 - восьмеричный символ \а - символ BEL (звонок) \b - начало или конец слова: слева(справа) - пусто или не буква/цифра, а справа(слева) - "слово" \B - не граница слова: слева(справа) - есть не-space символ \с[ - управляющие символы (комбинация Ctrl + символ, в данном случае это управляющий символ ESC) \d - одна цифра, то же, что и [0-9] \D - одна не-цифра, то же, что и [^0-9] \е - символ escape (ESC), \Е - конец действия команд \L, \U и \Q \f - символ прогона страницы (FF) \1 - следующая литера становится строчной (lowercase) \L - все последующие литеры становятся строчными вплоть до командй \Е \n - символ новой строки (LF, NL) \Q - вплоть до команды \Е все последующие метасимволы становятся обычными символами \r - символ перевода каретки (CR) \s - один space символ (пробел, горизонтальная/вертикальная табуляция, символ перевода каретки, новая строка и т.п.) \S - один не-space символ, то же что и [^\n\t\r\f] \t - символ горизонтальной табуляции (НТ, TAB) \u - следующая литера становится заглавной (uppercase) \U - все последующие литеры становятся заглавными вплоть до команды \E \v - символ вертикальной табуляции (VT) \w - алфавитно-цифровой символ (любая буква, цифра или символ подчеркивания) \W - любой символ, КРОМЕ букв, цифр и символа подчеркивания \x1B - шестнадцатиричный символ
поиск и замена
=~ /pattern/ (проверка соответствия строки маске) !~ /pattern/ (проверка НЕсоответствия строки маске) m/.../ - проверка совпадений (matching), ищет подстроку, совпадающую с указанным шаблоном, заданным регулярным выражением; После проверки в следующие переменные записывается: $1 - первое совпадение $2 - второе совпадение $+ - последнее совпадение $& - всё совпадение $` - всё до совпадения $' - всё после совпадения tr/.../ - замена текста (translation), заменяет выходной текст, но при этом он не использует регулярные выражения, осуществляя замену посимвольно; Пример: tr/iI/jJ/; # заменит символ i на j, а I на J s/.../.../ - выполняет подстановку (substitute) одних текстовых фрагментов вместо других, при помощи регулярных выражений; Эта функция заменяет часть строки, соответствующую PATTERN на REPLACE. $string=s/PATTERN/REPLACE/eg; Где 'e' и 'g' - необязательные параметры: g - заменяет все встречающиеся части строка, соответствующие PATTERN. Если этот параметр опущен - заменяет только первое соответствие. e - означает что REPLACE является выражением, а не просто строкой (в REPLACE содержатся переменные) Пример 1: $string="i:love:perl"; $string=~s/:/*/; # now $string="i*love:perl" $string=~s/:/*/; # now $string="i*love*perl" $string=~s/*/+/g; # now $string="i+love+perl" $string=~s/+/ /g; # now $string="i love perl" $string=~s/perl/cgi/; # now $string="i love cgi" Пример 2: $string="i love perl"; $string=~s/(love)/<$1>/; # теперь $string="i perl" # Здесь первое найденное слово "love" # присваивается переменной $1 Модификаторы (ставятся после второго слэша): /i игнорировать регистр /x игнорировать пропуски в шаблоне и разрешить комментарии /g заменить все одинаковые компоненты, а не один, как в отсутствии ключа g /gc не сбрасывается позиция при неудачном поиске. /s строка, в которой происходит поиск, состоит из одной строки /m строка, в которой происходит поиск, состоит из множества строк /o однократная компиляция /e правая часть s/// представляет собой выполняемый код Пример: $string="www22cgi44"; $string=~s/(\d+)/$1*3/eg; #сейчас $string="www66cgi132"; # Параметр 'e' показывает что $1*3 - вычисление, а не просто строка /ee правая часть s/// выполняется, после чего возвращаемое значение интерпретируется снова. ###################### Оператор q(text) заменяет строку text на строку, заключенную в одинарные кавычки(например если в q(text) поставить символ q(text\n), то напечатает text\n , т.е. \n это два символа, подобно print 'amam $file' напечатает amam $file). В данном случае почти все специальные символы не будут интерпретироваться внутри q(), исключая '\' $some=q(Don't may be); ###################### # Быстрая мультизамена my %replace = ( 'Water' => 'Вода', 'Wood' => 'Лес', 'Food' => 'Еда', ); my $regex = join "|", keys %replace; $regex = qr/$regex/; $something =~ s/($regex)/$replace{$1}/g;
Mojolicious
<% Строчный Perl %> <%= Выражение Perl, заменяемое результатом с XML экранированием %> <%== Выражение Perl, заменяемое результатом без какой-либо обработки %> <%# Комментарий, полезно для отладки %> % Строка Perl %= Строка выражения Perl, заменяемое результатом с XML экранированием %== Строка выражения Perl, заменяемое результатом без какой-либо обработки, НЕБЕЗОПАСНО при значениях принятых с клиента %# Строка комментария, полезно для отладки
Посмотреть header страницы, используя curl: curl -I http://localhost:48666/
ООП в Perl
# Perl OOP rules # There are three important rules in Perl object oriented programming: # - A class is a package. # - An object is a reference that knows its class. # - A method is a subroutine. package Being; use strict; # which value should we return in case of not defined value my $nothing = 'VOID'; # In Perl, we use a subroutine or method named new() to construct the object. The subroutine name is not mandatory so you can use any subroutine name you want, but be consistent. # Whenever you call the summon() method, Perl automatically passes the class name Being as the first argument to the special array @_. sub summon { my ($class,$args) = @_; # The built-in function bless is used to bless the reference to the class and return an instance of the class. # The following illustrates the syntax of the bless() function: # object = bless reference, classname; #my $self = bless {align => $args->{align}, # name => $args->{name}, # age => $args->{age}, # # set start to the current time # start => time # }, $class; my $self = {start => time}; $self->{name} = $args->{name} if defined $args->{name}; $self->{align} = $args->{align} if defined $args->{align}; $self->{age} = $args->{age} if defined $args->{age}; bless $self, $class; return $self; } # get name of the being sub get_name { my $self = shift; return defined($self->{name}) ? $self->{name} : $nothing; } # set new name for the being sub set_name { my ($self,$new_name) = @_; $self->{name} = $new_name if defined($new_name); return $self->{name}; } # get age of the being sub get_age { my $self = shift; return defined($self->{age}) ? $self->{age} : $nothing; } # set age for the being sub set_age { my ($self,$new_age) = @_; $self->{age} = $new_age if defined($new_age); return $self->{age}; } # get align sub get_align { my $self = shift; return defined($self->{align}) ? $self->{align} : $nothing; } # set align sub set_align { my ($self,$new_align) = @_; $self->{align} = $new_align if defined($new_align); return $self->{align}; } # return all properties of object especially formatted sub to_string { my $self = shift; my $result; print "-"x15,"\n"; foreach my $s (keys %$self) { $self->{$s} = $nothing unless defined $self->{$s}; $result .= "$s: $self->{$s}\n"; } return $result; } # If invoked with arguments, then interpret them as key+value pairs # already existed key will be overwritten sub add { my $self = shift; if (@_) { my %extra = @_; @$self{keys %extra} = values %extra; } } # clear properties of object sub purify { my $self = shift; foreach my $s (keys %$self) { print "Destroying the \"$s\" property in the name of Free Memory!\n"; delete $self->{$s}; } } # Create a method named DESTROY. # This will be invoked when there are no more references to the object, or else when the program shuts down, whichever comes first. # You don't need to do any memory deallocation here, just any finalization code that makes sense for the class. sub DESTROY{ my $self = shift; printf("$self dying at %s\n", scalar localtime); } 1; ------------------------------------------------------------------------------------------------------------------------- package BeingChild; # родительский класс use base Being; use warnings; use strict; # переопределяем конструктор sub new { my($class) = @_; my $self = Being::new($class); $self->{name} = 'Diz iz BeingChild'; return $self; } # тут можно объявить дополнительные методы 1; ------------------------------------------------------------------------------------------------------------------------- use strict; use warnings; # use our Being class use Being; # We called the method summon() of the Being class and get an object $mammoth. # We passed a hash reference to the summon() method containing align, name and age. my $mammoth = Being->summon({ align =>'Chaotic Neutral', name => 'Mammoth', age => 30000}); # We called the method summon() of the Being class and get an object $quetza. # We passed a hash reference to the summon() method containing name, align and age. my $quetza = Being->summon({ name => 'Quetzalcoatle', align =>'Chaotic Neutral', age => 15231}); # Another possible syntax-way to call method summon() of the Being class and get an object $something with no arguments. my $something = summon Being(); # We called the method add() of the Being class to add some properties to $something object $something->add(leg2 => 'right', arm2 => 'left', name => 'sometheng'); # print properties by using corresponding method print $mammoth->to_string(); print $quetza->to_string(); print $something->to_string(); # print property print $something->{name}; # We called the method purify() of the Being class to clean object's properties $something->purify();
DBI connection strings

MySQL: use DBI; my $dbh = DBI->connect('DBI:mysql:database=information_schema;host=localhost;port=3306','root','rootpassword',{AutoCommit=>0,RaiseError=>1,PrintError=>1}) or die $DBI::errstr;

MSSQL windows login: use DBI; my $dbh = DBI->connect('DBI:ODBC:Driver={SQL Server};Server=11.11.111.111;UID=DOMAINNAME/LOGIN;PWD=PASSWORD') or die $DBI::errstr;

MSSQL windows authentication: use DBI; my $dbh = DBI->connect('DBI:ADO:Provider=SQLOLEDB.1;Integrated Security=SSPI;Data Source=IP;Initial Catalog=DBNAME') or die $DBI::errstr;

всякое
CONTEXTS SIGILS ref ARRAYS HASHES void $scalar SCALAR @array %hash scalar @array ARRAY @array[0, 2] @hash{'a', 'b'} list %hash HASH $array[0] $hash{'a'} &sub CODE *glob GLOB SCALAR VALUES FORMAT number, string, ref, glob, undef REFERENCES \ reference $$foo[1] aka $foo->[1] $@%&* dereference $$foo{bar} aka $foo->{bar} [] anon. arrayref ${$$foo[1]}[2] aka $foo->[1]->[2] {} anon. hashref ${$$foo[1]}[2] aka $foo->[1][2] \() list of refs SYNTAX OPERATOR PRECEDENCE foreach (LIST) { } for (a;b;c) { } -> while (e) { } until (e) { } ++ -- if (e) { } elsif (e) { } else { } ** unless (e) { } elsif (e) { } else { } ! ~ \ u+ u- given (e) { when (e) {} default {} } =~ !~ * / % x NUMBERS vs STRINGS FALSE vs TRUE + - . = = undef, "", 0, "0" << >> + . anything else named uops == != eq ne < > <= >= lt gt le ge < > <= >= lt gt le ge == != <=> eq ne cmp ~~ <=> cmp & | ^ REGEX MODIFIERS REGEX METACHARS && /i case insensitive ^ string begin || // /m line based ^$ $ str end (bfr \n) .. ... /s . includes \n + one or more ?: /x ignore wh.space * zero or more = += last goto /p preserve ? zero or one , => /a ASCII /aa safe {3,7} repeat in range list ops /l locale /d dual | alternation not /u Unicode [] character class and /e evaluate /ee rpts \b word boundary or xor /g global \z string end /o compile pat once () capture DEBUG (?:p) no capture -MO=Deparse REGEX CHARCLASSES (?#t) comment -MO=Terse . [^\n] (?=p) ZW pos ahead -D## \s whitespace (?!p) ZW neg ahead -d:Trace \w word chars (?<=p) ZW pos behind \K \d digits (?<!p) ZW neg behind CONFIGURATION \pP named property (?>p) no backtrack perl -V:ivsize \h horiz.wh.space (?|p|p)branch reset \R linebreak (?<n>p)named capture \S \W \D \H negate \g{n} ref to named cap \K keep left part FUNCTION RETURN LISTS stat localtime caller SPECIAL VARIABLES 0 dev 0 second 0 package $_ default variable 1 ino 1 minute 1 filename $0 program name 2 mode 2 hour 2 line $/ input separator 3 nlink 3 day 3 subroutine $\ output separator 4 uid 4 month-1 4 hasargs $| autoflush 5 gid 5 year-1900 5 wantarray $! sys/libcall error 6 rdev 6 weekday 6 evaltext $@ eval error 7 size 7 yearday 7 is_require $$ process ID 8 atime 8 is_dst 8 hints $. line number 9 mtime 9 bitmask @ARGV command line args 10 ctime 10 hinthash @INC include paths 11 blksz 3..10 only @_ subroutine args 12 blcks with EXPR %ENV environment
Примеры скриптов
Часто используемые модули
Для некоторых модулей необходимо настроить локали. sudo locale-gen en_US sudo locale-gen en_US.UTF-8 sudo locale-gen ru_RU.UTF-8 sudo dpkg-reconfigure locales Обновляем модули для Perl'а из консоли CPAN (sudo нужно для доступа к записи файлов), заодно апгрейдим сам CPAN (может занять до 20 минут): sudo cpan upgrade install YAML install Mojolicious #для нижеследующей строки требуется установить пакет: sudo apt-get install build-essential install LWP::Simple install Mail::IMAPClient # для нижеследующей строки требуется force install Mojolicious::Plugin::ParamExpand force install Mojolicious::Plugin::FormFields # для нижеследующего требуется sudo apt-get install mongodb< install MongoDB # для нижеследующего требуется sudo apt-get install postgresql libdbd-mysql-perl libdbi-perl libdbd-pg-perl libpq-dev python-dev libmysql++-dev
# а также в CPAN'е: install Class::HPLOO install DBD install DBI install DBD::SQLite Math::GMP Math::Random::Secure # для нижеследующего требуется sudo apt-get install libgmp-dev openssl Net::SSH::Perl