Tags: linux

аватара

неРабочее

Случайно как-то выяснилось, что если собрать nginx с опциями

--with-cc-opt="-Os -static -static-libgcc"  --with-ld-opt="-static"

То можно получить статический бинарник, который будет лезть за libnss и всякой такой мутью от libc ради резолва имён пользователей и хостов. 

Если сделать chroot --userspec=oxpa:oxpa /empty/dir nginx, то будет замечательно работать, пока не нужно резолвить хосты.

А если это платная версия nginx'а, то в ней есть resolve для адресов серверов, по крайней мере. Что решит абсолютно бОльшую часть проблем. И в итоге можно будет запускать nginx в совершенно пустой папке (а без всяких /proc и /dev он и так прекрасно живёт).

А пока этот резолвер платный — просто указывать адреса вместо имён и всё будет отлично. И никаких патчей никуда не надо.

аватара

postgres bdr

Так как документация у bdr 'more or less cryptic' я накидаю сюда пару команд, которые использовал, чтобы поднять двухстороннюю репликацию в постгресе (завтра переделаю и дополню)
Collapse )
аватара

(no subject)

Очень-очень хочется найти человека, который хочет нарисовать шаблон сайта "за еду". Есть общее понимание, чего хочется от сайта, но совершенно не из того места растут руки.
Если вы вдруг знакомы с кем-то, кто готов взять за это неблагодарное дело - я буду вам очень благодарен



Случайно накопал в интернетиках вот такую штуку:
https://deepthought.isc.org/article/AA-01113/0/Case-Insensitive-Response-Compression-May-Cause-Problems-With-Mixed-Case-Data-and-Non-Conforming-Clients.html

Если коротко, то на запрос "ya.ru", днс может ответить ya.RU. Чем несколько удивит некоторые клиенты. Хотя ответы должны сравниваться case insensitive, это не всегда так.
В общем, для обхода этой проблемы в bind добавили опцию no-case-compress.
Нюанс в том, что в bind 9.9.5 проблема есть, а опция добавлена в 9.9.7 и я не смог её перенести в 9.9.5: то не собирается дебка, то bus error на запуске bind'а.
В общем, теперь я счастливый пользователь unbound'а.
аватара

(no subject)

разбавлю сегодняшнее нытьё о людях нытьём о работе:

html, css и js - просто АД.

Сегодня пришлось написать в прототип array ещё один метод в js'е. Ну потому что нельзя каждый раз использовать однотипный фильтр для получения объектов с нужными свойствами из списка. Теперь я могу сделать arr.by_attr('MyAttr', value). Выдадут элементы из arr, у которых elem.MyAttr == value. Очень удобно, я считаю. Но почему нет в исходном варианте - непонятно. Наверняка же используется всеми...

Отдельного упоминания стоит css. у меня есть конструкция из div ul. В одном месте, при сворачивании списка, li элемент "отскакивает" вниз на время сворачивания. И там надо добавить wrapping div, чтобы в нём выставлять отрицательный margin. А в другом месте всё работает как есть.
И ещё фокус оттуда же: как всегда показывать на странице scroll bar? html {height:101%}. Сука! html должен занимать 101% высоты. Тогда всегда будет скроллбар. Это самый кроссбраузерный и надёжный способ.
Ещё в css'е нельзя задать свойства элемента, за которым идёт другой определённый элемент. Только у последнего в цепочке определяемых. Это, правда, хотят поправить в последнем стандарте. Но пока это не работает нигде (и фиг знает, когда начнёт).
CSS, в современном виде, создан для того, чтобы веб дизайнеры страдали.

Впрочем, после переезда на ангулар, js код на странице стал куда лучше. Прямо-таки намного лучше. Как только отказываешься от манипуляций с DOM через jQuery, всё сразу так хорошо...
аватара

(no subject)

Сегодня я узнал про realpath, который умеет вычислять относительный путь между файлами. Очень удобно для скриптов.
Ещё узнал про питоновский argparse (наследник optparse). Тоже очень, просто безумно удобная штука. И куда более лаконичная, чем optparse.
аватара

(no subject)

Под катом будет кусочек кода, который вряд ли кому-нибудь интересен ;) Кусочек кода "найдите 10 отличий":

[код на питоне]
import mysql.connector
cnx = mysql.connector.connect(database=db, host=host, user=user, password=pwd)
cnx.set_charset_collation('utf8', 'utf8_general_ci')
cursor = cnx.cursor(prepared=True)
stmt = 'insert into mtb (date, nick, phrase, id) values (?, ?, ?, ?)
cursor.execute(stmt, (i.get('date'), i.get('author').encode('utf-8'), i.get('phrase').strip().encode('utf-8'), cf_id))
cnx.commit()



import mysql.connector
cnx = mysql.connector.connect(database=db, host=host, user=user, password=pwd)
cnx.set_charset_collation('utf8', 'utf8_general_ci')
cursor = cnx.cursor()
stmt = 'insert into mtb (date, nick, phrase, id) values (?, ?, ?, ?)
cursor.execute(stmt, (i.get('date'), i.get('author').encode('utf-8'), i.get('phrase').strip().encode('utf-8'), cf_id))
cnx.commit()

запрос выполняется в базу несколько раз с разным i и одним и тем же cf_id.
В первом случае, некоторые записи нарушают constraint на 'id' (связан с другой таблицей). Почему? Потому что в случае prepared statement экранирование, почему-то, работает плохо и часть phrase сыпется в id. Если запрос заранее не компилить и не использовать бинарный протокол к базе, то всё ок. Но какого ж чёрта?! Почему вдруг plain text работаэ лучшэ ?!
У меня тут слегка древние версии всего этого хозяйства, так что, наверно, всё давно пофикшено...
Коллега говорит, коннектор надо выкинуть и использовать Mysqldb классы. Попробую тоже.


В связи с этим и некоторыми другими проблемами по работе, вдруг осознал, что стараюсь использовать то, что могу разобрать по винтикам. Вот Mysql мне разобрать сложно, потому я стараюсь его (и другие СУБД) не использовать: проблем с ними всегда куча, а с какой стороны начинать разбирать - непонятно. Исключение составляет oracle, в котором проблем куча, разобрать не получается, но всегда куча гайдов как чинить.
Вот линуксы я могу разобрать по винтикам. Разобрать, собрать, запчасти упаковать обратно... Наверно потому у меня windows последнее время оторопь и вызывает.
аватара

(no subject)

Сегодня узнал, что rpm spec можно отлаживать макросами %dump и %trace. Впросто вписать их куда нужно и посмотреть, как работает. Надо попробовать, нету ли %debug.
Ещё узнал, что есть параметризованные макросы. Работают достаточно муторно, пример можно описать так:
%define macro() echo %1
%{macro param}

UPD ещё в макросах есть полнофункциональный getops со всеми его плюшками. Но на трезвую голову создавать макросы с параметрами я не стал бы
аватара

(no subject)

Вчера прилетело обновление ubuntu с 12 до 14. В целом, круто: нажал кнопочку и обновилось. Но я опять слегка отхватил от своего lvm'а (который очень хотелось, хотя он и не поддерживался в 10ке и до сих пор advanced штука). Вернусь домой - посмотрю хоть чего получилось. Внешне после первой загрузки - всё круто.
Ещё коллеги нашли правильную память для хьюлетов. Вместо 28к за плашку бредованую под HP, можно купить такую же за 6 от kingston. Теперь забить сервер памятью стало куда реальнее %) Надо посмотреть, сколько стоит второй проц и может разориться.


Проблема с emulex карточкой и rss решилась неожиданно, после осмотра broadcom'овской на другом сервере. Оказывается, на этих двух карточках rss отключался, если mac в пакетах не соответствовал mac'у сетевушки. В свою очередь, смена мака привела к другим фокусам, которые приводят к росту нагрузки на процессор. Думаю. Intel таки рулит: у них rss конфигурится по количеству очередей и работает независимо от mac'а на устройстве. То есть, как и написано в документации.