• Задача: Доступ к множеству устройств по SSH по доменным именам через сервер с 1 реальным IP. Возможно ли?

    @zibada
    Можно сделать через authorized_keys.

    Заводим специального пользователя, ему в ~/.ssh/authorized_keys добавляем ключи всех клиентов.
    Напротив каждого ключа можно прописать дополнительные параметры ssh, в том числе есть параметр command, который принудительно запускает команду при авторизации по этому ключу, командой делаем старт локальной ssh-сессии.
    Получается что-то вроде:
    command="ssh 10.0.1.1" ssh-rsa AAA...A+p1 client1
    command="ssh 10.0.1.2" ssh-rsa AAA...A+p1 client2
    ...
    


    После чего все клиенты просто соединяются с основным сервером на его обычный порт.

    С авторизацией на самих внутренних устройствах возможны варианты, например, private-ключи для авторизации на них можно выложить на основном сервере и указывать через параметр -i в команде.
    Ответ написан
    1 комментарий
  • Доступ к веткам в Mercurial?

    @zibada
    mercurial-server умеет идентифицировать пользователей по ssh-ключам (а не имени коммитера), и настраивать доступ к веткам.
    Коммитить локально что угодно никто никому запретить не в силах, но push будет блокироваться.
    Ответ написан
    2 комментария
  • Как хранить конфиги в репозитории?

    @zibada
    Сделать два файла — config.ext и config.local.ext, под контролем версий держать только первый, второй положить в игнор-лист.
    Научить приложение читать оба файла с приоритетом настроек из второго.
    Во втором переопределять только локально отличающиеся настройки типа паролей.
    Тогда при добавлении новых настроек или изменении старых не надо будет трогать «локальные» конфиги вообще.
    Ответ написан
    Комментировать
  • как отключить PHP парсинг Апаче файлов с названием, в середине содержащим .php?

    @zibada
    RemoveType .php .pht .phtml
    <FilesMatch "\.php$">
    	SetHandler application/x-httpd-php
    </FilesMatch>
    
    Ответ написан
    Комментировать
  • Сервер для mercurial

    @zibada
    mercurial-server
    есть в пакетах debian.
    Ответ написан
    Комментировать
  • Apache, mpm-itk и единая точка входа?

    @zibada
    используйте mod_alias:
    Alias /filemanager/ "/usr/share/filemanager/"
    и туда положить сам скрипт.

    физически это будет одна копия, но ни прав на запись, ни ftp-доступа у пользователей к ней не будет.
    права апача будут ставиться какие надо, в зависимости от хоста.
    Ответ написан
  • ORDER BY `вероятность`?

    @zibada
    тупое решение, если записей немного и не пугает делать full scan на каждый селект:

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

    select сводится к генерации нескольких рандомных чисел из диапазона [0, сумма_всех_приоритетов), и выборке элементов, где диапазон [сумма, сумма+свой_приоритет) включает хотя бы одно из выбранных чисел.
    insert — простое дописывание в конец, обновление суммы приоритетов
    delete — простое удаление
    update (изменение приоритета) — удаление+вставка если приоритет увеличился, простой апдейт, если уменьшился.

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

    итого — все операции за амортизированную O(1), кроме селекта, с которым все печально.

    для его оптимизации можно использовать spatial index (не в курсе насчет поддержки в современных БД), т.к. у нас запрос на принадлежность точки отрезку.

    честное и быстрое, но сложное решение:

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

    select одного элемента (для простоты далее рассматривается бинарное дерево):
    генерируем число от 0 до суммы приоритетов (хранится в корне), идем от корня:
    — если число меньше суммы приоритетов в левом поддереве, то налево
    — иначе — направо, и вычитаем из числа сумму приоритетов в левом поддереве
    — когда дойдем до листа — вернуть его id

    update/insert/delete — обычные операции с деревом с обновлением суммы приоритетов во всех промежуточных вершинах.

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

    производительность всех операций — O(logN), выборки — O(KlogN), где K — размер выборки.
    тоже есть проблема, что один элемент может выбраться несколько раз, чтобы это побороть, можно выбранные элементы удалять сразу после выбора (ну или просто обнулять приоритет), а в самом конце вставлять обратно.

    как все это хранить?
    ну если все влезает в память — то отлично, вешаем отдельного демона, который при старте строит дерево по исходной табличке и поехали.
    если нет — либо в базе (но эффективность работы с деревьями на реляционных базах это большой вопрос), либо в файлах, т.е., по сути, писать свой движок базы…
    но это уже явный overkill =) наверняка существуют готовые решения, которые все это уже делают.
    Ответ написан
    1 комментарий
  • GMail Instant Notifier

    @zibada Автор вопроса
    мда.
    как известно, хочешь сделать что-то хорошо — сделай это сам.

    ура открытым исходникам и стандартам =)
    на всякий случай, вдруг кому еще пригодится:
    патч для стабильной (0.9.x) ветки мирандового jabber.dll
    скачать бесплатно без регистрации без смс без вирусов патченый jabber.dll (0.9.28, Unicode, x86)

    серверная поддержка проверяется через service discovery, поэтому работе не-гмыльных аккаунтов патч не мешает.
    google apps на других доменах тоже поддерживаются.
    Ответ написан
    Комментировать
  • Помощь с настройкой FAR Manager 2.0?

    @zibada
    > — у него были вкладки (!!!)
    ConEmu
    делает из фара полноценное GUI приложение, с вкладками, драг-н-дропом и труколорностью.
    Ответ написан
  • Analytics сбивает всю статистику?

    @zibada
    изменять состояние по обычным GET-запросам — это зло, мало ли какие еще боты понабегут и начнут на все подряд «кликать».
    посылайте со страницы поиска результатов жаваскриптом POST-запрос на ваш скрипт статистики.
    примерно так же, как это сам аналитикс и делает.
    Ответ написан
    2 комментария
  • Где узнать, какое самое популярное разрешение экрана на сегодняшний день?

    @zibada
    разрешение экрана != размер окна браузера
    у меня браузер занимает ~2/3 экрана в ширину, и порой руки хочется оторвать горе-дизайнерам, которые пользователей с шириной окна меньше 1280 за людей не считают.
    хорошо, что таких меньшинство.
    Ответ написан
  • Apache2: перенос /server-status на поддомен

    @zibada
    <VirtualHost *:80>
    ServerName status.domain
    DocumentRoot /var/www # что угодно
    <Location />
    SetHandler server-status
    # allow, deny, ...
    </Location>
    </VirtualHost>
    Ответ написан
    1 комментарий
  • Альтернатива far менеджеру

    @zibada
    FTP пароли из TC, да и того же WinSCP воруют точно так же легко и в промышленных масштабах, необратимое шифрование там в принципе не сделать.

    используйте SFTP, настройте аутентификацию по запароленному public key через pageant и тот же FAR + WinSCP plugin к нему в качестве клиента.
    Ответ написан
    Комментировать
  • Есть ли здесь бывшие олимпиадники? Как олимпиады помогли Вам?

    @zibada
    умение быстро, безошибочно, коротко и не задумываясь писать многие простые вещи.
    (и не тупить потом по полчаса в отладчике на пустом месте)
    особенно тут помогает топкодер, который не прощает ошибок.
    задачи уровня 250-500 там редко требуют знания каких-либо сверхсложных алгоритмов.
    Ответ написан
    Комментировать
  • JQuery, JSON, iframe и кавычки вместе не работают?

    @zibada
    отдавать в iframe не json, а полноценный html + javascript:
    <script>parent.callback_func({json: "data"});</script>
    Ответ написан
    Комментировать
  • Методы парсинга BBCode?

    @zibada
    > Регулярки, как известно, не предназначены для парсинга вложенных конструкций.

    Действительно, теория нам подсказывает, что одной могучей регуляркой грамматику ббкодов не одолеть.
    Но это не значит, что регулярки в данной задаче вообще применять нельзя.
    (загляните в парсеры популярных форумов, например)

    Вкратце — одним проходом матчим самую глубоко вложенную пару тегов и заменяем на нечто, их не содержащее, повторяем в цикле, пока находится совпадение.
    Ответ написан
    1 комментарий