• В каких языках есть встроенная возможность и синтаксис для удаления определенных методов и/или свойств наследуемых классов при создании класса?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Весь смысл наследования в том, что экземпляр класса B можно использовать и как экземпляр класса A (но не наоборот). Если из B удалить какой-то атрибут, то что будет с наследованием? Если просто пытаться его как-то скрыть, то это не поможет - ведь можно приведением типов экземпляр класса B превратить в экземпляр класса A и получить обратно свой доступ к нужному полю.

    И вообще, вот, например, есть библиотека, которая умеет работать с объектами класса A. Библиотека скомпилирована кем-то, её исходный код недоступен. Мы определяем класс-потомок B и далее используем функции библиотеки на объектах этого класса. Всё хорошо, но мы уже не можем запретить библиотеке работать с этим полем.

    PS: В своё время намного лучше понять ООП мне помогло чтение описания внутреннего устройства классов в Turborland Pascal. Устроены классы (в Pascal они называются объектами, но это не столь важно) примерно так:

    1. Ссылка на таблицу виртуальных методов (VMT)
    2. Поле 1.
    3. Поле 2.
    ...

    VMT устроена так:

    1. Ссылка на метод 1
    2. Ссылка на метод 2
    ...

    Наследуемый класс отличается от исходного тем, что у него более длинный список полей (но все поля исходного имеются в наличии и находятся по тем же самым смещениям), а также отличаются адреса переопределённых методов, плюс сама таблица VMT может быть длинее за счёт добавленных новых методов (но те же самые старые методы находятся по тем же смещениям).

    За счёт этого даже уже ранее скомпилированный код, ничего не знающий о наследуемых классах, работает с ними как со своими родными.
    Ответ написан
    5 комментариев
  • Поможете разобраться в принципе маршрутизации в схеме подключения?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Как написано - так и работает.

    Вот, например, правило:

    -A POSTROUTING -s 10.1.3.0/24 -o br0 -j SNAT --to-source 192.168.11.3

    Оно должно подменять source у пакетов, прилетевших с адресов 10.1.3.0/24 на выходе в интерфейс br0. Однако если мы пингуем 192.168.1.72, обратно пакеты приходят с адреса 192.168.1.72 и нигде не подменяются на 10.1.3.0/24. А, собственно, зачем их подменять?

    Решать задачу надо иначе. Надо или сделать SNAT (MASQUERADE) на 192.168.1.44 с адресов не только 10.1.3.0/24, но и 192.168.11.0/24 (в этом случае в wg-туннеле будут ходить адреса 192.168.11.0/24):

    192.168.1.44:
    -A POSTROUTING -s 10.1.3.0/24 -o enp4s0 -j MASQUERADE
    -A POSTROUTING -s 192.168.11.0/24 -o enp4s0 -j MASQUERADE

    Либо надо на 192.168.11.3 делать подмену в туннельные адреса, которые в свою очередь заменяются в местный IP уже на "той" стороне (в этом случае в туннеле будут ходить только адреса 10.1.3.0/24):

    192.168.11.3:
    -A POSTROUTING -o wg0 -j MASQUERADE

    192.168.1.44:
    -A POSTROUTING -s 10.1.3.0/24 -o enp4s0 -j MASQUERADE
    Ответ написан
  • В телеграме не подгружается картинка с Wordpress. Почему?

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

    Решение: находим бота WebpageBot, вводим ему ссылку - и он обновляет preview на серверах Телеграма. Только что проделал это с указанной ссылкой - и всё заработало.
    Ответ написан
    8 комментариев
  • Что будет, если зарегистрировать брендовый домен?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Очень много может зависеть от юрисдикции организации-владельца доменной зоны и от правил этой зоны. Не обладая юридически обоснованным правом на набор букв, можно как годами не испытывать проблем, так и нарваться на чьи-то зарегистрированные права.

    Например, мне известен совсем недавний случай, когда одна крупная международная компания (представленная и в России), производящая продукты питания и использующая некоторый зарегистрированный бренд из двух слов, потеряла домен первое_слово.company из-за того, что оно само по себе было чьим-то товарным знаком. При этом указанная компания могла бы зарегистрировать в _некоторых_ странах этот товарный знак и всё равно потерять домен по причине невладения таким товарным знаком в США.

    Аналогично может пострадать и Сбер, если домен с его названием будет зарегистрирован в юрисдикции, где у него нет товарного знака. В каком-нибудь Вьетнаме, например. Кстати, вьетнамские домены sber.vn и sberbank.vn свободны (наверняка в домене vn есть ограничения на регистрацию нерезидентами), а индонезийские sber.id и sberbank.id захвачены известным российским киберсквоттером.

    Также можно вспомнить, что в нулевые годы гугл долго не мог заполучить gmail.ru и google.ru, поэтому был вынужден ютиться в домене google.com.ru.

    Так что нет универсального ответа на этот вопрос. Если найдётся свободный домен, похожий на чей-то, то иногда может и прокатить. Но если домен будет не просто простаивать, а использоваться по отношению к тому же самому Сберу и хоть сколько-нибудь заметен, то ему это вряд ли понравится, а уж в США у Сбера вполне может найтись давно зарегистрированный товарный знак в качестве инструмента давления.
    Ответ написан
    Комментировать
  • Как запустить сеть без systemd-networkd (networkManager)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Потому что сетка /32 состоит из одного адреса 10.166.0.4. Маска /32 - это 255.255.255.255. А нужно /24 - 255.255.255.0. С ней всё заработает как надо.
    Ответ написан
    7 комментариев
  • Facebook api как зарегистрированным пользователям на сайте сделать рассылку на email?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это вопрос не к Facebook.

    Регистрация через Facebook устроена так: пользователь жмёт кнопку, его кидает на сайт Facebook, там его предупреждают, что такие-то данные будут переданы такому-то сайту. Включая e-mail (хотя пользователь может вручную запретить передавать именно его). После согласия Facebook передаёт сайту эти данные, в том числе e-mail, и вот в этот момент его надо сохранить в свою базу, чтобы дальше уже своими инструментами посылать письма.
    Ответ написан
    Комментировать
  • Как вывести ВСЁ закодированное json_encode(в php) содержимое файла в python?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Смотрим в сторону модуля json

    import json
    
    data = json.loads(dirtyJson)
    print (data["foo"]["bar"][666])
    Ответ написан
    Комментировать
  • Форматирование строк с округлением вниз?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно вот так сделать:

    math.floor(balance*100)/100
    Ответ написан
  • Как сделать кнопку Viber с шаблоном сообщения?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    viber://chat?number=%2B79123456789

    К сожалению, у Viber всё плохо с нормальным документально обоснованным форматом ссылок, и раньше уже переставали работать некоторые из них, например, viber://contacts больше не работает.

    Есть документация по deep link для ссылок на Public Accounts. Есть также такие официальные:

    viber://keypad?number=%2Bxxxxxx - открывает номеронабиратель Viber с этим номером
    viber://chat?service=xxxxxx - ссылка на Viber Service
    viber://more/qr - открывает QR-сканер
    Ответ написан
    Комментировать
  • Можно ли "разбить зеркало" не угробив систему (mdadm)?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если это именно зеркало (raid1), то да, можно работать на половинке зеркала, ведь она идентична второй половинке. Например, если с одним из дисков есть аппаратные проблемы, то его меняют, затем синхронизируют данные, причём всё это можно сделать без остановки системы (при наличии возможности горячей аппаратной замены диска).
    Ответ написан
  • Как вывести содержимое файла имея только команды echo и ls?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Владелец файла неважен, важно наличие доступа. Если доступа на чтение нет, то это всё, приехали.

    Так-то кратчайший вариант тут указали:

    echo `<-text.txt-`

    Но я думаю пользователя волновал именно минус в имени, а не наличие cat, и вот с этим побороться легко:

    cat -- -text.txt-
    cat ./-text.txt-
    Ответ написан
    Комментировать
  • Почему в среде Linux админов Vim - это тру, а Nano - для слабаков?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Вопрос в такой форме в принципе не очень корректен. Понятно, что vim может намного больше и намного круче, чем nano, но в конкретной ситуации важно не то, насколько крут используемый инструмент, а твоё личное умение решать задачи.

    Кто-то может быть и хорошо шпарит всякие клёвые штуки на vim, но элементарные задачи будет решать бездумными копипастами со Stackoverflow, чреватыми получением какого угодно (вплоть до деструктивного) результата. А в это же самое время опытный админ типа одного моего хорошего знакомого быстро и эффективно решит все проблемы в малоизвестном нынче, но весьма популярном лет 20 назад среди пересевших с DOS на UNIX редакторе joe. Ничего предосудительного в этом нет.
    Ответ написан
    Комментировать
  • Возможно ли динамически сформировать файл конфигурации, если требует указать к нему путь?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Можно сделать как-то так:

    echo some_file_content | command /dev/stdin

    Тогда команда получит в качестве имени файла /dev/stdin, который означает стандартный ввод и будет при чтении возвращать строку some_file_content. Но надо учитывать, что seek по такому файлу невозможен, поэтому если программа не просто читает файл построчно, а пытается перемещаться по нему, то это не сработает.

    Если не хочется занимать stdin или надо передать так несколько псевдофайлов, можно сделать так:

    command <(echo some_file_conten)

    Фактически command получит в качестве аргумента что-то типа /dev/fd/63. Можно убедиться, сделав

    ls -l <(echo hello)

    Но в целом не стоит слишком бояться создавать временные файлы. Это быстро, ведь если генерировать его непосредственно перед запуском, то данные сразу будут в дисковом кэше и прочитаются программой моментально.
    Ответ написан
    1 комментарий
  • Чьи права примонтированной папки в докер? Контейнера или хоста?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Это точно один и тот же файл? Можно сделать stat на файл в системе и отдельно в контейнере, зайдя в него по docker exec. Если inode у файла разный - это разные файлы. Возможно, с пробросом в докер что-то напутано.

    Как называется пользователь зависит от содержимого файла /etc/passwd, который в контейнере и на хосте разные. Пользователь в Linux идентифицируется по uid - это просто числовой идентификатор. Соответственно, uid=0 это root, теоретически его можно переименовать, но так никто не делает.
    Ответ написан
    Комментировать
  • Что означает '/' в 'NAME': BASE_DIR / 'db.sqlite3' в Django?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если посмотреть внимательнее, то BASE_DIR - это не строка, а экземпляр класса pathlib.Path, для которого определён оператор / между Path и str. Дока https://docs.python.org/3/library/pathlib.html
    Ответ написан
    Комментировать
  • Развалился raid1 массив или оба диска вышли из строя? Как быть в такой ситуации?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Всё нормально, на /dev/md# и не должно быть таблицы разделов. Почему возникла мысль, что что-то не так?
    Ответ написан
  • Какого посредника выбрать для интеграции crm и whatsapp?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Если речь идёт о сервисах, продающих за 200 рублей в месяц и подключающих за один день - это всё имитации WhatsApp Web. Легальный WhatsApp Business API стоит дороже и подключают его порой по 2-3 недели (из-за модерации на стороне Facebook).

    Указанные два относятся к категории имитаторов Web и это вовсе не скрывают. Но второй более известный и хотя бы предоставляется в России от имени ИП, первый же имеет явно кликбейтовое название, никаких реквизитов владельцев нет, плюс из контактов на сайте только телеграм-бот, короче, я бы поостерёгся. В любом случае, Важный и Ценный Аккаунт, Который Нельзя Поменять я бы не стал отдавать в подобные сервисы, поскольку в случае бана он будет потерян.

    Поставщиков имеет смысл выбирать в первую очередь по признаку наличия интеграции под нужную CRM.
    Ответ написан
    Комментировать
  • Как исправить .OSError: [Errno 22] Invalid argument при docker-compose up?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    В Windows используется COMPOSE_PATH_SEPARATOR=';', но это можно переопределить через env.

    Кроме того, в Windows компоненты пути разделяются обратным слешом, поэтому в данном случае docker-compose решил, что в COMPOSE_FILE одно имя файла, лежащего в текущем каталоге.
    Ответ написан
    Комментировать
  • Загрузочная запись в ISO образе?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Что значит "с помощью dd записал iso"? Нельзя в iso9660 просто так ковыряться внутри. Надо смонтировать (через loop device), достать файлы, внести изменения, собрать обратно.

    Чтобы диск остался загрузочным, надо понять, какой там загрузчик (вероятно, isolinux?) и пересобрать iso с учётом этого (например, для isolinux смотреть тут: https://wiki.syslinux.org/wiki/index.php?title=ISOLINUX).
    Ответ написан
    1 комментарий
  • Парсинг википедии с помощью Beautiful Soup?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Википедия, в отличие от большинства сайтов, не ставит задачу сокрытия данных от использования. Кроме её парсинга полезно рассмотреть альтернативные способы:

    1. Парсинг дампов SAX-парсером: https://dumps.wikimedia.org/ruwiki/latest/

    Главное в тексте находить нужные категории.

    2. Использование SPARQL к Wikidata: https://query.wikidata.org/

    Например, я наскоро набросал такой запрос, находящий все элементы субклассов "животное":

    select ?animal ?animalLabel where {
    # субкласс (wdt:P729) животного (wd:Q729)
      ?animal wdt:P279 ?animalSubClass.
      ?animalSubClass wdt:P279* wd:Q729.
      SERVICE wikibase:label { bd:serviceParam wikibase:language "ru,en". }
    }


    К сожалению, не всегда данные в Википедии хорошо размечены семантически, поэтому в подобную выборку может попасть не всё. Ну и полно будет извлечено из enwiki.
    Ответ написан
    Комментировать