LINUX.ORG.RU

Сообщения DRVTiny

 

Tied-что-нибудь для автоудаления из списка по принципу ON DELETE CASCADE

Нужно так:

Есть список, в нём лежат ссылки на элементы хэша:

my $h={split //,q(abcdefghijklmn)};
my $a=[map \$h->{$_}, keys $h] ;

При удалении каких-то элементов из хеша хотелось бы, чтобы и в $a удалялись элементы... автомагически.

delete @{$h}{qw(a c m g)};
print Dumper $a;

Однако же:

$VAR1 = [
          \'f',
          \'d',
          \'l',
          \'b',
          \'h',
          \'n',
          \'j'
        ];

Если не удалять, а делать undef элементов хеша - ситуация уже становится полегче (можно виртуозно грепать список), вот только одна беда: таких списков over дофига, т.е. на самом деле $a является «одним-из-миллиарда» элементов другой структуры данных - и при удалении элементов из хеша проходить по всем таким спискам - это эпичнейший геморрой.

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

А есть ещё какие-то варианты? Как обеспечить некоторую связность структур данных, при которой если удаляются элементы из одной структуры - они исчезают из другой тоже?

 , ,

DRVTiny
()

Откуда такие зависимости у Log::Log4perl в CentOS?

Поставил yum'ом пакет perl-Log-Log4perl, а он за собой потянул библиотеки векторной графики, векторные шрифты, библиотеки для 3D-графики, какие-то огромные куски от иксов...

Собственно пруф: http://pastebin.com/ZtQVMt6i

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

Что за ад зависимостей такой в CentOS 7 и зачем rrdtools Log4perl'у?

 ,

DRVTiny
()

Какие у кого есть проекты и какая кому нужна в них помощь?

Собственно, интересно, какие у кого есть общественно полезные или даже коммерческие проекты и есть ли нехватка рук/мозгов в этих проектах.

Не обязательно IT.

 , , мирумир

DRVTiny
()

Как посмотреть с какой кодировкой подключился клиент MySQL?

К серверу MySQL подключен клиент, висит постоянно, можно спокойно узнать о нём всё, что нужно.

Но не знаю, собственно, как это сделать.

Клиентом является бинарник, который что-то внутри у себя не так переварил и стал вместо UTF8 отправлять строки в Latin-1.

Нужно убедиться в том, что действительно кодировка на стороне клиента некорректна, пользуясь, скажем, учётной записью root.

Как это сделать?

Спасибо!

 ,

DRVTiny
()

Там, где кучкуются R-маны... (за рюмкою пива иль с кофейною кружкой)

Я вот думаю: где можно пообщаться с горячими поклонниками языка R, поспрошать чего, научиться уму-разуму? :)

В идеале всё же оффлайн.

Понимаю, что все занятые и вообще время не то... но вдруг. Ну вот мало ли - бывает ведь в жизни «+8» распределений, отличных от нормального.

 , ,

DRVTiny
()

У земной орбиты есть ощутимый эксцентриситет, но он не влияет на температуру?!

Как так? Почему Земля вращается вокруг Солнца по слабоэллиптической орбите, но это не приводит к тому, что 2 раза в год на всей Земле средняя температура максимальна и 2 раза в год - минимальна?

Кто так строит? (С)

Почему??

Доколе???

 ,

DRVTiny
()

POSIX-семафоры в Perl: not implemented yet?

Правильно ли я понимаю, что ни одной реализации http://man7.org/linux/man-pages/man7/sem_overview.7.html для Perl'а не существует?

Там есть semget, semop, semctl, но это не POSIX-семафоры и семантика у этих функций весьма неудобная, особенно всякие чудесные константы для формирования флагов...

 ,

DRVTiny
()

Побитовые блокировки с использованием shared-memory

Я снова хочу невозможного в Perl :(

А именно (речь идёт о Linux, только о Linux, и да, мне абсолютно срать хотелось на переносимость кода в какую-либо иную ОС) :

1) Хочу, чтобы в виртуальное адресное пространство процессов отображалась одна и та же физическая страница

2) Хочу чтобы где-либо на этой странице памяти нашлось место для одного-единственного байта

3) Хочу, чтобы в этот байт можно было делать некий аналог ассемблерного BTS (bit-test-and-set): чтобы атомарным образом содержимое бита сначала сохранялось, а потом тут же устанавливалось

4) Таким образом у меня были бы целых 8 флагов, которые я мог бы использовать для блокировки процессов от повторного запуска: по сохранённому биту я бы определял, была ли блокировка, а если её не было - то я бы изменял значение бита на 1 и последующие инстансы уже не смогли бы сделать те или иные пакости.

Ура?

Подозреваю, что нет.

Мне кажется, и меня это немного пугает, что в Perl5 принято делать блокировки файлами, а гвозди забивать микроскопом, для обладания которым нужно сдать экзамен по вождению марсохода (намекаю на геморрой с правами и путями на любой ФС). Я прав?

P.S. Я пробовал IPC::ShareLite: мало того, что оно вообще не о том (мне НЕ нужно блокировать ресурс в shared memory, у меня самоцель - сам lock), так ещё и работает в на скорую руку состряпаннях тестах - весьма странно (flock вёл себя куда адекватнее).

 , locking,

DRVTiny
()

«Разделяй и властвуй»: как обрабатывать списки «порциями»

Есть, например, такие задачи: 1) нужно брать поля для SQL-вставки из ну очень длинного списка. Если формировать всю команду INSERT одним залпом - будет фейл. Формирую, стало быть, частями, разбивая исходный список на удобоваримые «порции». Кстати, такую же вставку можно было бы делать и вообще распараллелено

2) есть у меня список, который нужно обрабатывать как «упорядоченный хеш», т.е. что-то вроде

["Great"=>"Britain", "Northern"=>"Ireland", "Patrice"=>"Lumumba", "Communism"=>"Young of world"]
. Вот хотелось бы брать из него по два элемента как в обычном while (my ($key,$val)=each %hash) - и таким образом перестать беспокоиться, начать жить...

Но тут у меня на пути встаёт пресловутый TMTOWTDI. А именно то, что на Perl-е совсем не хочется писать нормальные циклы, а хочется каких-нибудь лютых извращений наподобие такого:

@a=split //,do { open my $fh, q(/etc/fstab); join ("",map { chomp; $_ } <$fh>)};
say
  join("\n", 
    map {
      join("",grep defined $_, @a[$_*20..($_+1)*20]) 
    } 0..int(@a/20-1)
  );

В общем... фундаментальный вопрос: как правильно, а главное - эстетично (ведь Perl - это прежде всего язык эстетов) решить задачу обработки массива по частям, не прибегая к дурацким вычислениям и уж упаси Боже - к мелкобуржуазным циклам for(;;)?

На что я намекаю... В «примитивном» BASH есть, например, такая вот архиполезная конструкция:

$ echo {0..115..20}
0 20 40 60 80 100

Неужели на Perl'е это без чудесной арифметики никак не реализуется?

Спасибо! :)

 divideatimpera,

DRVTiny
()

Как включить в код на Си сигнатуру, которую не уберёт оптимизатор?

Собственно, нужно, чтобы после компиляции кода на Си - через strings exe_file, либо просто fgrep 'строка' exe_file было видно строку, включенную туда просто как «сигнатура» - признак того, что это именно тот файл, который я компилировал.

При этом строка текста не используется никак. Я проверял: неиспользуемые строки, потенциально засоряющие сегмент данных компилятор с обычным уровнем -O2 конечно же удаляет. Как бы это так сделать, чтобы всё же некий «неудаляемый» признак можно было оставить в исходниках, при этом не изменяя ничего в рабочем коде или изменяя абсолютно минимально?

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

 

DRVTiny
()

Как удалить файл только если он не открыт более никем?

Пишу приложение, работающее в режиме «демона».

Использую PID-файл и как блокировку от повторного запуска, и как просто файл, содержащий PID процесса.

В принципе мне бы хватило алгоритма «сделал flock(LOCK_EX) после форка - сделал flock(LOCK_UN) на выходе». Для самого Perl'а этого бы хватило за глаза. Но для удобства и для порядку так сказать хотелось бы невозможного: закрывать PID-файл и затем удалять его.

Есть опасения race conditions: я могу закрыть файл, потом следующий мой инстанс получит управление и откроет его, после чего я возьму и удалю уже открытый файлик. Таким образом, будет существовать инод, содержащий PID следующего инстанса, но у файла уже не будет записи в каталоге и с точки зрения Shell-скриптов, например, PID-файл уже не будет существовать.

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

А вообще кто что думает по этому поводу?

 , ,

DRVTiny
()

In-memory хранилище с развитыми блокировками

Очень нужно некое гибридное хранилище данных. Изначально это кеш медленных данных, получаемых из БД Zabbix'а Но в процессе работы приложения, запускаемого под hypnotoad (all glory to Mojolicious в первую очередь, но hypnotoad тоже молодец :)) - AnyEvent'ом запускается целая куча процессов под разные задачи:

1) Расчёт состояния IT-подсистем на разных уровнях иерархии

2) Выдача текущего слепка данных пользователю по запросу

3) Обновление структуры данных (иерархии объектов инфраструктуры мониторинга) из БД Zabbix'а

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

В общем, я как человек осторожный, чрезвычайно люблю блокировки, неделимые транзакции и проч. подобные вещи.

С этим нет проблем, например, у Cache::FastMmap. Я потестил его - на 700-ах конкурирующих процессах блокировки отлично работают, процессы по сути «выстраиваются в беспорядочную очередь», с минииальными накладными расходами. Модуль мне очень понравился, но... мне ужасно неудобно то, что я в этот кеш должен запихивать json-строки. Потому что это кеш, а мне нужно именно хранилище двойного назначения, позволяющее обращаться непосредственно к РСУБД раз в минуту за совсем небольшими порциями данных и раз в час - за относительно крупными.

Вопрос: есть ли что-то подобное Cache::FastMmap, но позволяющее хранить не строки и числа, а структуры данных Perl? При этом работающее достаточно быстро. Мне было бы достаточно какого-нибудь XS-ного аналога упомянутого кеш-движка, внутри хранящего всё в BSON (Binary JSON), но отдающего всё-таки структуры данных Perl.

Заранее спасибо за советы!

 , ,

DRVTiny
()

Благословенные замыкания: кто, где, когда использовал?

Я в принципе не люблю ООП, а в Perl5 и тем более (реализация просто ужасная). Но вопрос реализации объектов через благословение closure меня заинтересовал.

Я уже не первый объектный класс так пишу, и в общем могу сказать, что полноценный «закрытый» доступ к свойствам объекта, гарантирующий, что пользователь не полезет в твой объект напрямую, даже если он этого очень захочет - это вполне здравая идея, которая уже давно реализована везде и всюду, но почему-то только не в Perl5. Замечу, что в том же Moose мне удавалось «расковырять» объект и получить доступ к его свойствам, минуя все хитросплетения has-определений, всяких private'ов и «ro».

А вот с closure'ами такие вещи не прокатывают: достаточно локализовать набор переменных в конструкторе, благословляющем ссылку на процедуру - и все эти переменные будут доступны уже только внутри blessed closure.

Самая идея не нова: она упоминается в толстых книгах O'Reily (Например, «12.7.5. Using Closures for Private Objects» в самой известной из них), откуда я её и почерпнул. Тем не менее, я поискал в гугле на эту тему, изучил некоторые реализации ООП-шных нахлобучек, выложенных на CPAN'е - и не нашёл тех перловиков, которые тоже предпочитают благословлять замыкания.

Вопрос: почему так? Чем плоха идея-то?

 bless, ,

DRVTiny
()

Целочисленное деление: какой алгоритм используется в Intel?

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

Но, возможно, я и неправ. Кто-нибудь в курсе, какой алгоритм используется в микропрограмме процессоров Intel-семейства?

 ,

DRVTiny
()

Как ловить исключения внутри AnyEvent-обработчика?

Есть AnyEvent-обработчик, внутри которого происходит ошибка - и он тихо валится без всякого зазрения совести. Подумываю над Try::Tiny или даже eval'ом, но интересуют best practices по ловле таких проблем внутри AnyEvent-handler'ов. Искал в гугле - не нашёл. Складывается впечатление, что у разработчиков под AnyEvent всегда всё работает идеально и никогда ничего не падает (во что, конечно, слабо верится).

Что посоветуете?

Спасибо!

 , ,

DRVTiny
()

Именованная capture group и [^\g{name}]

Почему такой матчинг регулярным выражением работает неверно?

$a=qq("jkj"kjkkj");
say "captures: \n\t".join(', '=>do { my $c=0; map $c++.': ('.$_.')', @l } ) 
 if @l=$a=~m/^\s*(?<Q>['"])([^\g{Q}]+)\g{Q}\s*$/;

Выводит:

captures: 
        0: ("), 1: (jkj"kjkkj)

И это печально: непонятно, почему

[^\g{Q}]
- не работает...

Я пробовал вместо этого

[^(??{ $+{Q} })]
- аналогично, матчит всё подряд.

ЧЯДНТ?

Ответ:

В [] можно использовать только классы символов. Всё остальное будет принято «as is», внутри [] правила интерполяции отличаются от правил для остального регулярного выражения.

Если нужно делать «негативный матчинг» для паттерна известной длины, можно использовать конструкцию:

(?!\g{name}).{LENGTH}

LENGTH нужно подставить числом

Если длина паттерна равна 1 (символ), то просто

(?!\g{name}).

- что имеет смысл «символ, для которого предыдущий символ в предпросмотре не видел \g{name}» :)

 ,

DRVTiny
()

Параллельность обработки запросов и наивный кеш на структуре данных

Есть «веб-сервис»,в котором хотелось бы кешировать операции запросов в РСУБД с целью делать запросы в РСУБД по поводу состояния объектов мониторинга не чаще, чем «период кеширования».

Как обычно: если объекта в кеше нет или объект есть, но он неактуален - сделать запрос в РСУБД (после чего создать новый или обновить старый объект в кеше), иначе - взять из кеша.

Мне бы хватило кеша полностью in-memory, на структуре данных Perl.

Модификация переменной-«кеша» уровня модуля - работает. То есть, к некоторому моему удивлению, можно запросто при вызове curl http://localhost:port/mojo/route1 и http://localhost:port/mojo/route2 - модифицировать одну и ту же глобальную переменную, и все модификации будут благополучно сохраняться.

Как так может быть и к чему это может привести?

То ли запросы обрабатываются и morbo, и hypnotoad'ом последовательно, то ли... здесь мысль заходит в тупик, поскольку параллельность запросов вроде бы обеспечивается не fork'ом (ведь кеш успешно модифицируется из двух разных запросов), но, очевидно, и не thread'ами. В таком случае, учитывая тот факт, что на уровне ОС кроме процессов, потоков исполнения («тредов») и прерываний ничего в общем-то нет и та же асинхронная обработка происходит в потоках исполнения... что же всё-таки внутри параллельности обработки запросов hypnotoad'ом?

 hypnotoad, ,

DRVTiny
()

HAProxy как способ общения с SSL-сервером не-SSL дружественным клиентам?

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

Хочу вроде бы простую вещь: чтобы haproxy:

1) Создал SSL-туннель с удалённым сервером, предоставляющим «услугу» (в данном случае - LDAP)

2) Клиенты подключались бы к HAProxy без шифрования, а уже он общался бы с сервером через SSL

С учётом того, что клиенты на самом деле на том же localhost'е, что и haproxy - секьюрность явно не страдает.

Читаю доки к HAProxy - и постоянно сталкиваюсь с тем, что либо предлагается весь трафик шифровать, либо только от клиента до HAProxy. А мне как раз нужно чтобы только между HAProxy и серверами трафик был шифрованным.

Как быть? Где описана именно такая, stunnel-подобная конфигурация haproxy?

Спасибо!

Solved:

global
	log	127.0.0.1 local4
	pidfile	/var/run/haproxy/pidfile
	daemon
	stats   socket /var/lib/haproxy/stats
	ssl-server-verify none	
defaults
    	mode tcp
	log global
    	timeout connect 5000ms
    	timeout client 50000ms
    	timeout server 50000ms
frontend FE_ldap
	bind 0.0.0.0:389
	option tcplog
	default_backend BE_ldaps
backend BE_ldaps
	option ssl-hello-chk
	option ldap-check
	option tcpka
	server ldap01 remote.server1.com:636 ssl verify none crt /etc/ssl/certs/thisServer_cert_and_privKey_here.pem check check-ssl fall 1 rise 1 inter 2s
	server ldap02 remote.server2.com:636 ssl verify none crt /etc/ssl/certs/thisServer_cert_and_privKey_here.pem check check-ssl fall 1 rise 1 inter 2s backup

 , ,

DRVTiny
()

Classic Perl-style функция для разыменования неизвестной ссылки в список

Когда в очередной раз нонадобилось написать что-то вроде «если пользователь передал ссылку на список, то раскрыть в список, если ссылку на хеш - раскрыть в хеш, иначе - вернуть пустой список» - меня внутренне передёрнуло от 100500-й уродливой конструкции с вложенными iif'ами (которые «condition?valIfTrue:valIfFalse») - и я накатал вот это.

Понимаю, что говнокод, но, блин, мне он кажется дико симпатичным :)

sub deref2list {
 ({'ARRAY'=>sub{ @{$_[0]} },'HASH'=>sub { %{$_[0]} } }->{ref $_[0]} || sub {()})->($_[0]) 
}

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

Как-то так:

my $l=[
    {"e"=>"Estonia","f"=>"Finland"},
    ["g"=>"Gvinea-Bissau","h"=>"Holland"],
    "Moonland",
    sub { "MGIMO forever" }
]; 
my %h=("a"=>"Angola",map deref2list($_), @{$l});

 ,

DRVTiny
()

Оффлайн-курсы по R

Посоветуйте, пожалуйста, годные курсы по языку R в Москве , желательно с возможностью всё-таки оффлайнового посещения.

Спасибо!

 ,

DRVTiny
()

RSS подписка на новые темы