akkerman
Рейтинг
+9.82
Сила
18.57

akkerman

Ганц Аккерман

avatar
Да, совершенно верно, поправил!

В настоящем отдадочном модуле ( ссылка на github ) уже давно нет кода, даже похожего на этот, он уже прогрессировал до записи в несколько файлов сразу, хотя пока не имеет фильтрации, позволявшей бы сообщениям с теми или иными признаками уходить в разные файлы (как это делает syslog).
avatar
Исходный файл выглядит так:

<p><strong>Module Name:</strong> google-http-client</p>
<p><strong>Module Group:</strong> com.google.http-client</p>
<p><strong>Module Version:</strong> 1.19.0</p>
<p><strong>Module Name:</strong> usndex-http-client</p>
<p><strong>Module Group:</strong> com.usndex.http-client</p>
<p><strong>Module Version:</strong> 0.10.2</p>
avatar
Парсит строки HTML'я, выдёргивает из разных строк по частям запись, собирая все её части перед тем, как добавить очередную строку в массив CSV. Запись собирается в хэш KeyFilled. До тех пор, пока там не окажутся все 3 в данном случае поля — новая строка в CSV добавлена не будет. После же формирования новой строки хэш очищается, чтобы начала собираться новая строка.
avatar
Областей применения масса, но классический конечно — это организация списковых структур и графов. Предполагается, что для двунаправленных списков linkedTo связанных объектов будут взаимно указыват друг на друга, а в случае однонаправленных списков — linkedTo должен быть в том объекте, из которого идёт ссылка.
С точки зрения графики такой класс удобен для отрисовки чего-то вроде UML-диаграмм, например.
avatar
Всегда пожалуйста! Сейчас сам активно пользуюсь, поднято параллельно 4 туннеля и есть тенденция к разрастанию.
А вообще ещё здорово помогают опции /etc/ssh/ssh_config:
ServerAliveInterval 5
ServerAliveCountMax 17280
avatar
Этой опции ещё не было тогда, когда писалась эта заметка :)
avatar
>и перезапуска apparmor всё нормально стало запускаться.
А я сколько с этим бился… Но даже если бы я и догадался, что это apparmor, до шага добавления соотв. правила дело бы просто не дошло: первое, что я бы сделал — это отключил его к лешему, ибо не люблю такие вещи, которые мне палки в колёса ставят. А так да, я OpenLDAP никогда не компилирую в /usr/sbin, у меня есть свой подход, когда подобный крупный «целевой» (супротив «вспомогательного» типа системынх утилит и библиотек) софт ставится в /opt/SoftwareID/VersionID, что-то вроде /opt/OpenLDAP/2.4.35
avatar
BASH пишется Just for fun, то есть ради наслаждения процессом и результатом, поэтому его разработчики часто забывают «рекламировать» крутые фичи языка. С другой стороны, если бы они доказали всем, что BASH — это самобытный и весьма оригинальный язык программирования, то затем им пришлось бы долго и нудно объясняться в связи с тем, что это, пожалуй, ещё и один из самых медлительных ЯП. Например, обработка файлов циклами на BASH может быть разумна вообще только в случае ну очень маленьких ones, да и в целом производительность циклов на BASH оставляет желать примерно в 10^4 степени раз лучшего :)
avatar
В смысле >(command) :)
avatar
Что является стандартным выводом команды внутри <(command)?
avatar
Спасибо за отличную статью!
Особенно заинтересовала конструкция >(command).
Например:

cat /etc/ftab /etc/fstab 1> >(sort | sed -r '/^\s*#/d') 2> >(wc -l)

В результате всё выводится правильно, но в момент завершения команда словно «подвисает» в ожидании ввода, но не намертво: после нажатия enter наконец-таки оная завершается. Почему так???
avatar
Ого! taha, спасибо, не знал о такой возможности. Похоже, в (( кроется ещё много интересного родом из «больших» языков семейства Си…
avatar
taha, теперь представьте, что будет, если в данном блоке будут использоваться многострочные циклы, условные операторы, если вы разобьёте одну строку на две для лучшей читаемости. И сейчас у вас $ERR будет содержать только выведенное в STDERR последней из выполнявшихся команд :)
avatar
В смысле, только те переменные, которые будут объявлены явным образом с помощью declare. Но я как раз активно использую хэши, и уже испытал определённые трудности в связи с таким поведением try
avatar
У функции try есть другая большая проблема: все переменные, которые будут объявлены внутри её блока окажутся локальными переменными функции и станут недоступны на выходе из неё!
avatar
Тогда уж ERR+= :)
Главный смысл этой конструкции именно в использовании eval. И если уж на то пошло, ничто не мешает Вам проверить на выходе STDERR: если в переменной есть что-то, значит, всё не так уж гладко. Можно в т.ч. это «не гладко» сравнить с регулярным выражением, если наперёд известно, какие примерно ошибки могут возникать.
avatar
Согласен, так оптимальнее.
Код, которые мы «пробуем на зуб», должен исполняться как функция, так или иначе всегда возвращающая реальный статус своего выполнения. Т.е. в данном случае всё-таки

ls /rrr && ls /ddd && ls /ggg && ls /tmp

либо:

declare -i errc
for d in /rrr /ddd /ggg /tmp; do
 ls $d; errc+=$?
done
! (( errc )) 
avatar
Кстати, я немного упростил функцию, так что она теперь стала совсем уж элементарной обёрткой для eval :)
В прошлом варианте крайне некрасиво выглядело использование глобальной переменной ret_ (коль скоро она не была объявлена ключевым словом local), при полном отсутствии на то объективной необходимости.
avatar
Я рад, что мой код заинтересовал Вас! :)
Я сделал exchange потоков STDOUT(#1) и STDERR(#2), чтобы STDERR записать в переменную. Потом я «вернул на место» STDOUT конструкцией 2>&1. Это всё было сделано для того, чтобы и овцы были целы, и волки сыты: теперь STDERR сохранён в глобальной переменной, а STDOUT можно получить, например, при помощи обратных кавычек.
Полным аналогом обмена потоков является обычный обмен значениями переменных.
Например, так это делается в assembler'е (забудем про то, что есть инструкция xchg и красивый хак с использованием xor):
mox cx,ax
mov ax,bx
mov bx,cx
У меня в качестве такой вспомогательной «переменной» (наподобие регистра cx) выступает поток под номером 3 :)
Ещё раз спасибо за вопрос!
avatar
Собственно, чтобы slapd слушал на 636-м порту, нужно, чтобы серверу slapd в параметрах ключа -h передавался URL вида ldaps://host:636/ или просто ldaps:///, если нужно, чтобы слушал на всех сетевых интерфейсах на стандартном ldaps-порту 636.