• Как проверить содержит ли элемент спика только определенные символы?

    @nirvimel
    Вот функция, которая проверяет, что в состав строки не входит ничего кроме цифр и знака +
    import re
    
    digits = re.compile(r'^[\d\+]+$')
    
    def is_string_valid(string):
        return bool(digits.match(string))
    Ответ написан
    3 комментария
  • Какова архитектура P2P приложений?

    @nirvimel
    Как устроена архитектура P2P приложений?

    Идея, на которой построено большинство P2P сетей называется DHT (Distributed hash table) (рус), эталонной реализацией этой идеи является Kademlia (рус).

    Каждому клиенту будет необходимо узнать адреса других клиентов. Как они смогут получить друг у друга актуальный список?

    Не существует никакого общего списка, в котором были бы перечислены все пиры сети. Невозможно мгновенно (за один запрос) получить информацию об интересующем пире (существует ли он вообще? активен ли? каков его реальный IP для подключения), но эту информацию можно достать из сети за несколько запросов: Кто знает Х? Кто знает кого-то, кто мог бы знать X? Кто знает кого-то, кто мог бы знать кого-то, кто мог бы знать X? и.т.д.

    Если приложение действительно децентрализованное, у него ведь не должно быть какого-то пира, который всегда будет знать список более актуальный, чем другие, верно?

    Именно так.

    Или всё таки, должны быть в сети какие-то доминирующие пиры?

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

    Тогда если они разом каким-то образом падают, вся система должна сама выбрать других доминантов?

    Их падение никак не повлияет на функционирование сети и уже подключенных к ней пиров. Но новые пиры "по холодному" не смогут подключиться никак, если ни один из "первоначальных" пиров не будет доступен.
    Ответ написан
    7 комментариев
  • Как прокачать новенький системный блок, не потеряв гарантии производителя?

    @nirvimel
    Собирать с нуля проще, дешевле и лучше (в плане получаемых результатов), чем кустарно апгрейдить вещь, изначально не предназначенную для агрейда.
    Вообще, фирменные системники - это специфический продукт, предназначенный не для тех кто серьезно разбирается в железе, а для тех, кто любит чтобы кто-то подумал за них (читай - взял бы на себя ответственность за выбор), и такие люди готовы платить (фактически доплачивать) за это. Например, менеджеры среднего звена, на чью голову свалилась необходимость закупать оборудование (компы) боятся допустить какую-то ошибку в выборе комплектации и желают прикрыться крутым брендом: "Я же выбрал Asus, а не кучу разных noname, все правильно сделал".
    Ответ написан
    1 комментарий
  • Оперативку на VPS дают с учетом ОС или без?

    @nirvimel
    Какова минимальная конфигурация сервера для vpn-сервера на 2-5 подключений? - тут в ответе приведен мой реальный опыт использования VPS с 128Мб RAM на борту.
    Ответ написан
    Комментировать
  • Как спарсить тег с плавающим расположением?

    @nirvimel
    PHP Simple HTML DOM Parser тут бессилен.
    А вот XPath легко решает проблему:
    //div[@class='primer']/p[@class='oposit part1 part2' and text()='Примечание']/following-sibling::div[@class='halfM indPar']/text()
    Ответ написан
    2 комментария
  • Полнодисковое шифрование Linux с ключом на USB флэшке?

    @nirvimel
    Есть же куча руководств в Сети.
    Например, это - вполне годное. Использовать Btrfs, разумеется, не обязательно. Собственно, вся суть сосредоточена в строках, добавляемых в /etc/mkinitcpio.conf и этой строке
    GRUB_CMDLINE_LINUX="cryptdevice=/dev/disk/by-label/SCOTTY:root:allow-discards cryptkey=/dev/disk/by-label/ISO:ext4:/<path/to/keyfile/on/flash drive>"
    добавляемой в /boot/grub/grub.cfg (точнее в /etc/default/grub, из которого он генерируется). Тут важно указать, что SCOTTY - это метка шифруемого тома, а ISO - это метка флешки (а не тип ФС).
    Ответ написан
    Комментировать
  • Как вычисляется время в электронике?

    @nirvimel
    На физическом уровне кварцевый генератор выдает сигнал строго определенной частоты. Эта частота резонанса в кристалле кварца, которая определяется только его физическими габаритами и (почти) не зависит от температуры, полей и прочих факторов внешней среды. По точности этот механизм совсем немного уступает атомным часам.
    Далее этот сигнал поступает на вход счетчика, который отчитывает количество тактов в единицу времени и генерирует прерывание, сигнализирующее об истечении единицы времени или инкрементирует регистр, в котором хранится значение времени в заданных единицах.
    Ответ написан
    1 комментарий
  • Приложение на Android для блокировки мобильных данных по принципу белого списка?

    @nirvimel
    DroidWall
    AFWall+
    или любой другой firewall.
    (Разумеется нужен root в любом случае).
    Ответ написан
    Комментировать
  • Какую БД лучше подходит для хранения данных от датчиков?

    @nirvimel
    RRDtool, например.
    Ответ написан
    Комментировать
  • Можно ли одновременно делать несколько исходящих звонков?

    @nirvimel
    Через один радиомодуль может осуществляться только одно соединение (звонок) одновременно. SIM через разъем физически подключатся к радиомодулю и не может быть подключена к нескольким модулям параллельно. Но даже если наколхозить какой-нибудь мультиплексор для SIM-слота (через SIM постоянно течет поток данных для кодирования/декодирования, обмануть этот механизм я даже не могу представить как), то Сеть все равно не впустила бы повторное подключение, при наличии активного подключения с тем же IMSI в данной соте, то есть второй радиомодуль с той же SIM просто не войдет в Сеть, и в логах Базы будет зафиксированная хакерская активность, связанная с данной SIM.
    Ответ написан
    Комментировать
  • Как узнать информацию о железе?

    @nirvimel
    1. py-cpuinfo
    2. psutil
    3. Еще можно заглянуть в исходники python-hwinfo и достать оттуда нужный функционал.
    Ответ написан
    Комментировать
  • Какова минимальная конфигурация сервера для vpn-сервера на 2-5 подключений?

    @nirvimel
    Сам много лет так использую VPS с 128 Мб на борту - полет нормальный. Кроме OpenVPN на этом же сервере у меня крутятся почтовый сервер и Jabber-сервер. Плюс в разное время тут же крутились мои парсеры на питоне и сайты на django с небольшой посещаемостью. Единственные проблемы, которые у меня возникали были связанны с попыткой запустить поверх всего этого еще и PostgreSQL-сервер. Но при помощи бубна в итоге я таки запустил его.
    С улыбкой смотрю на тех, кто отваливает по $5 в месяц за 512 Мб на DigitalOcean только ради того, чтобы прокинуть VPN.
    Ответ написан
  • Как получать email чтобы не был раскрыт сам факт получения?

    @nirvimel
    «Не следует множить сущее без необходимости».

    Уильям Оккам о почтовых ящиках.

    Смысл в том, что достаточного одного своего собственного почтового сервера на самом дешевом VPS (никаких D.O.), чтобы забирать свою почту когда- и как-угодно без досмотра любопытных глаз (которые считают своим долгом совать свой нос в каждый почтовый ящик). Для дополнительной безопасности можно подключатся к своему серверу через другой VPN, чтобы избежать идентификации через сопоставления трафика на IP сервера. Но даже без этих наворотов в базовом варианте эта схема дает гораздо более высокий уровень безопасности, чем любые цепочки ящиков на ЧУЖИХ серверах.
    Ответ написан
    Комментировать
  • Как массивы представлены в jvm?

    @nirvimel
    Массивы в JVM вполне настоящие, то есть занимают непрерывное пространство в памяти как на C/C++, то есть реализованы НЕ на списках.
    Операция доступа к элементу массива имеет сложность O(1), а JIT оптимизирует ее до одной машинной инструкции (на x86), то есть так же как доступ к локальной переменной на стеке или полю класса.
    Отдельный элемент массива - не то же самое, что отдельная переменная или поле класса, память, которую он занимает не будет освобождена до тех пор, пока не будет освобожден весь массив.
    Ответ написан
    2 комментария
  • Как спрогнозировать следующую дату визита клиента?

    @nirvimel
    Хотелось бы чтобы методика игнорировала случаи когда и клиент уехал в отпуск или еще что то.

    Модель сможет предсказывать вероятность того, что клиент вернется после продолжительного отсутствия (уехал в отпуск) только если это клиент раньше уже возвращался после продолжительного отсутствия или если этот клиент отнесен в группу клиентов, для которых прежде было характерно подобное поведение.
    Ответ написан
    Комментировать
  • Как сделать VPN или Прокси сервер с рекламой?

    @nirvimel
    1. Поставить Nginx в качестве прокси-сервера (статья об этом).
    2. Использовать модуль ngx_replace_filter (Nginx должен быть скомпилирован с этим модулем (предпочтительный вариант) или можно использовать готовую сборку openresty, в которой помимо этого есть еще много лишнего).
    3. В конфиге Nginx написать что-то типа
      replace_filter '<head>' '<head><script src="/ads/ads.js"></script>'
      и ваш скрипт окажется подключен ко всем пропускаемым html, у которых есть head.
    Ответ написан
    Комментировать
  • Как извлечь информацию из игры для анализа?

    @nirvimel
    Не существует никаких универсальных методов, подходящих для всех случаев. Такой вопрос можно задавать только по отношению к конкретной игре. В целом тут не обойтись без реверс-инжиниринга (если только игра не open source).
    Из числа самых общих подходов к этой проблеме можно упомянуть следующее (от простого к сложному):
    1. Анализ формата save-файла и извлечение необходимых данных из него. Часто это оказывается единственно возможный путь, не смотря на кажущееся неудобство такого подхода.
    2. Вычисление статических адресов в адресном пространстве процесса, по которым находятся переменные, в которых хранятся какие-то важные игровые параметры. Для этого давно существуют такие автоматизированные инструменты как ArtMoney. Но против современных игр все это практически бесполезно, так как все структуры данных хранятся в динамической памяти.
    3. Гонять игру под отладчиком, выявлять функции (точки входов в них) которые вызываются на определенные игровые события, анализировать параметры этих функций, искать среди них переменные, отвечающие за какие-то значимые игровые параметры. Потом писать патч к игре, в котором перехватывать эти функции и сохранять передаваемые параметру куда-нибудь, откуда их можно легко получить снаружи.
    Ответ написан
    3 комментария
  • На что поменять Adblock?

    @nirvimel
    У Adblock Plus есть куча форков и аналогов, выбирайте на свой вкус.

    uBlock Origin - самый серьезный конкурент (наглядный бенчмарк, демонстрирующий его экономичность в плане потребления ресурсов).

    Что касается меня, то я пока обхожусь классическим Adblock Plus в сочетании с RequestPolicy и NoScript Security Suite. И никакие белые списки меня волнуют, как только вижу какую-то гадость, моментально отрезаю ее соответствующим инструментом.
    Ответ написан
    Комментировать
  • Зачем использовать нестандартные типы данных (datetime, user, geopt) в базах данных?

    @nirvimel
    Смысл в том, что открывается возможность выполнять преобразования данных на стороне сервера без предварительной выборки. Например, можно быстро отфильтровать записи, с отметками времени, относящимися к определенному дню недели (за все время), произвести агрегацию данных в других полях и вернуть результат одной записью. С датой в unixtime в поле integer пришлось бы или вытаскивать полностью всю таблицу на клиент и там считать, или писать огромный велосипед на хранимых процедурах на сервере (и все равно это будет медленнее, чем встроенные функции, у которых предусмотрена даже оптимизация при поиске по индексу).
    С географическими координатами все еще интереснее. Как вы себе представляете задачу поиска/выборки всех, объектов в заданном радиусе от заданной точки, если координаты в таблице заданны широтой и долготой в полях integer? На плоской поверхности это еще относительно легко (все равно фильтрация пойдет в два этапа (с подзапросом, например), и на первом этапе будет выбираться много лишнего, так как целочисленные индексы не могут на лету фильтровать по вычисляемым выражениям). А что если радиус поиска/фильтрации измеряется сотнями и тысячами километров? Засада тут в том, что Земля то не плоская ... А для географических координат (как специальный тип данных) для этого существует специальная функция, в которой все это уже предусмотрено и решено, а еще под этот тип данных существует специальный тип индекса, позволяющий производить поиск и фильтрацию с меньшей вычислительной сложностью (то есть намного быстрее), чем по двум индексированным полям integer.
    Ответ написан
    Комментировать