LINUX.ORG.RU

Сообщения rsync

 

Ищу утилиту как parallel

Хочу утилиту как parallel но нужно чтоб она умела контроллировать stdout дочек, то есть

запустила она допустим 10 дочек и показывает stdout одной из них. Когда дочка, которой показывают stdout кончится, то текущий stdout подключился бы к другой дочке итп

короче хочу запускать параллельно и видеть лог не пакетами раз в 3-10 минут, а плавно бегущий по экрану.

PS: нужно для наблюдения за логами сборки

PPS: самому писать - пара часов, но лень.

 , ,

rsync
()

Бага? или удалили запросом к БД?

Создал я как-то опрос.

Сколько секретных чатов в Телеграм Вы используете?

Висел он долго, его не подтверждали и не режектили. Заглядывал время от времени, думал дождётся очереди.

а теперь он просто пропал из списка «неподтверждённые».

без режекта.

 , ,

rsync
()

а давайте добавим раздел?

кажется что было бы круто на ЛОР иметь свой раздел со статьями на технические темы

этакая конкуренция хабру была бы

что надо:

  • проверять на интересность
  • проверять на уникальность
  • попадать с главной

кто что думает?

 , ,

rsync
()

А кто в монге и репликации понимает?

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

беру докер от монги, собираю кластер в docker-compose

version: '3.4'
      
services:
  mongo-ev-1:
    networks:
      - mongo
    container_name: mongo-ev-1
    restart: on-failure
    image: mongo:4
    ports:
      - "7017:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: test
      MONGO_INITDB_ROOT_PASSWORD: test
      MONGO_INITDB_DATABASE: test
    command: mongod --replSet rs0
  
  mongo-ev-2:
    networks:
      - mongo
    container_name: mongo-ev-2
    restart: on-failure
    image: mongo:4
    ports:
      - "7018:27017"
    environment:
      MONGO_INITDB_ROOT_USERNAME: test
      MONGO_INITDB_ROOT_PASSWORD: test
      MONGO_INITDB_DATABASE: test
    command: mongod --replSet rs0
    links:
      - mongo-ev-1
    volumes:
      - ./docker-data/mongo:/docker-entrypoint-initdb.d
networks:
  mongo:
    driver: bridge

и кладу скрипт initCluster.sh в каталог docker-entrypoint-initdb.d :

mongo <<EOF
config = {
    "_id": "rs0",
    "members": [
        {
            "_id": 0,
            "host": "mongo-ev-1:27017"
        },
        {
            "_id": 1,
            "host": "mongo-ev-2:27017"
        }
    ]
};

rs.initiate(config, {"force": true});
rs.reconfig(config, { force: true });
EOF

Дальше смотрю как запущены в каждом докере монги:

docker exec -it mongo-ev-2 ps ax
  PID TTY      STAT   TIME COMMAND
    1 ?        Ssl    0:05 mongod --replSet rs0 --auth --bind_ip_all
   65 pts/0    Rs+    0:00 ps ax

видно что опция replSet установлена, всё ок

в docker logs вижу ошибки:

Implicit session: session { "id" : UUID("4ef9e731-3529-4db3-895c-4baabbc08ea7") } 
MongoDB server version: 4.2.0
{
        "_id" : "rs0",
        "members" : [ 
                {
                        "_id" : 0,
                        "host" : "mongo-ev-1:27017"
                },
                {
                        "_id" : 1,
                        "host" : "mongo-ev-2:27017"
                }
        ]               
}                       
{               
        "ok" : 0,
        "errmsg" : "This node was not started with the replSet option",
        "code" : 76,
        "codeName" : "NoReplicationEnabled"
}
2019-10-03T09:08:46.389+0000 E  QUERY    [js] uncaught exception: Error: Could not retrieve replica set config: {
        "ok" : 0,
        "errmsg" : "not running with --replSet",
        "code" : 76,
        "codeName" : "NoReplicationEnabled"
} :
rs.conf@src/mongo/shell/utils.js:1531:11

и что-то не вкурю что я не так делаю?

Перемещено a1batross из talks

 ,

rsync
()

Программирование курильщика (python) и нормального человека

Рассмотрим влияние языка программирования на мышление. На примере популярной библиотеки - aiohttp.

Допустим Вы программируете http-сервер.

Вам нужна функция добавления роутов в список.

Вы начинаете с универсальной:

def add_route(self, method: str, path: str,
              handler: Union[_WebHandler, AbstractView],
              *, name: Optional[str]=None,
              expect_handler: Optional[_ExpectHandler]=None
             ) -> AbstractRoute:
    resource = self.add_resource(path, name=name)
    return resource.add_route(method, handler,
                              expect_handler=expect_handler)

Чтобы пользователю Вашей библиотеки было хорошо, Вы предоставляете ему возможность определить наследника Вашего класса, работающего с роутером, принимаете аргумент router. Таким образом, если юзеру что-то нужно - он доопределит поведение этой функции и будет радоваться жизни...

Затем Вам требуются частные случаи (есть желание упростить использование Вашей библиотеки). Вы хотите добавить add_post, Вы добавляете его, переиспользуя универсальный метод:

def add_post(self, path: str, handler: _WebHandler,
             **kwargs: Any) -> AbstractRoute:
    """
    Shortcut for add_route with method POST
    """       
    return self.add_route(hdrs.METH_POST, path, handler, **kwargs)

Всё идёт хорошо, Вы продолжаете работу. Добавляем другие методы, например add_delete:

def add_delete(self, path: str, handler: _WebHandler,
               **kwargs: Any) -> AbstractRoute:
    """
    Shortcut for add_route with method DELETE
    """
    return self.add_route(hdrs.METH_DELETE, path, handler, **kwargs)

Некоторое время всё еще идёт хорошо. Вы продолжаете работу. Нужно еще добавить методы add_get и так далее.

В этом месте Вы вспоминаете, что Вы программируете на Python. А язык определяет мышление, поэтому Вы пишете следующий вариант add_get:

def add_get(self, path: str, handler: _WebHandler, *,
            name: Optional[str]=None, allow_head: bool=True,
            **kwargs: Any) -> AbstractRoute:
    """
    Shortcut for add_route with method GET, if allow_head is true another
    route is added allowing head requests to the same endpoint
    """
    resource = self.add_resource(path, name=name)
    if allow_head:
        resource.add_route(hdrs.METH_HEAD, handler, **kwargs)
    return resource.add_route(hdrs.METH_GET, handler, **kwargs)

А и правильно! Если пользователи вдруг не огребут проблемы, почему их наследник не получает вдруг в add_route GET-определения, то их мышление же может вдруг выправиться, а это недопустимо!

PS: Тексты примеров взяты из aiohttp/web_urldispatcher.py Версия 3.5.4.

PPS: понимаю что мне скажут «переопредели еще и add_get». Это предложение как раз покажет нам еще раз в подробностях, что язык определяет мышление.

 ,

rsync
()

Прекрасная система тестирования в Python

class Foo():
    def __init__(self):
        print('конструктор')

    def __del__(self):
        print('деструктор')
        raise ValueError('плохой деструктор')


def test_foo():
    f = Foo()
    assert f, 'Инстанцирован'

И собственно работа:

$ pytest -sv test_e.py
=========================== test session starts ============================
platform linux -- Python 3.6.7, pytest-3.7.2, py-1.7.0, pluggy-0.8.1 -- /usr/bin/python3
cachedir: .pytest_cache
rootdir: /home/unera, inifile:
plugins: teamcity-messages-1.21, aiohttp-0.3.0
collected 1 item                                                           

test_e.py::test_foo конструктор
деструктор
Exception ignored in: <bound method Foo.__del__ of <test_e.Foo object at 0x7f5d99c2c198>>
Traceback (most recent call last):
  File "/home/unera/test_e.py", line 7, in __del__
    raise ValueError('плохой деструктор')
ValueError: плохой деструктор
PASSED

========================= 1 passed in 0.03 seconds =========================

Прямо даже уже и не знаю чо сказать. И правда, подумаешь - ну исключение какое-то. Не считать же тестирование неуспешным при этом, правда?

passed, Карл, passed!

 , ,

rsync
()

Код-инжекшены в убогом питон

да выбрасывает ексепшен, но выброс ексепшена == борьба со следствиями, а именно с кодинжекшеном.

>>> class Foo():
...     def __init__(self, **kw):
...             print(kw)
... 
>>> d = {'self': 'abc', 'a': 1, 'b': 2}
>>> 
>>> Foo(**d)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: __init__() got multiple values for argument 'self'

Ща адепты мне расскажут что так делать нельзя.

Типа в шаблон jinja нельзя передавать self. Придумайте новое имя. Ага.

Для специалистов: если атаковать не первый параметр (self), а скажем опциональный, то будет весело:

>>> class Foo():
...     def __init__(self, a=None, **kw):
...             print('a=', a, kw)
... 
>>> d = {'self1': 'abc', 'a': 1, 'b': 2}
>>> 
>>> Foo(**d)
a= 1 {'self1': 'abc', 'b': 2}
<__main__.Foo object at 0x7f9a14ec5a58>
>>>

 , ,

rsync
()

ненависть: Python-libxml деструкторы

Имеется популярнейшая библиотека работы с XML - libXML2.

Биндинги для неё есть для практически всех скриптовых языков. Есть они и для Python.

http://xmlsoft.org/python.html

смотрим пример кода

import libxml2, sys

doc = libxml2.parseFile("tst.xml")
if doc.name != "tst.xml":
    print "doc.name failed"
    sys.exit(1)
root = doc.children
if root.name != "doc":
    print "root.name failed"
    sys.exit(1)
child = root.children
if child.name != "foo":
    print "child.name failed"
    sys.exit(1)
doc.freeDoc()

разглядываем приведенный пример и задумываемся над последней строкой.

ХГМ.

Поскольку у Python «имеется» прекраснейшая возможность писать деструкторы к скалярам, то вот такая выдержка из документации имеет место быть:

Also note the need to explicitly deallocate documents with freeDoc() . Reference counting for libxml2 trees would need quite a lot of work to function properly, and rather than risk memory leaks if not implemented correctly it sounds safer to have an explicit function to free a tree. The wrapper python objects like doc, root or child are them automatically garbage collected.

Изучая эту библиотеку подробнее - выходим на прекрасные функции

  • freeDoc
  • xpathFreeContext
  • и так далее

Расскажите мне почему нормальные деструкторы программисту не нужны.

 , , , ,

rsync
()

ненависть: Python, где же ООП, ау?

в прошлый раз когда я тут поразбирал тесты курильщика python мне тут несколько адептов хором рассказывали про ООП.

Практически дословная цитата:

Ты, идиот! ООП не знаешь!

Ок, ООП.

Смотрим популярный фреймворк, например flask.

Вот пример кода из его документации:

from flask import request
@app.route('/login', methods=['POST', 'GET'])
def login():
    error = None
    if request.method == 'POST':
        if valid_login(request.form['username'],
                       request.form['password']):
            return log_the_user_in(request.form['username'])
        else:
            error = 'Invalid username/password'
    # the code below is executed if the request method
    # was GET or the credentials were invalid
    return render_template('login.html', error=error)

В каком еще другом языке есть веб-фреймворк с подобным надругательством над ООП?

 , , , ,

rsync
()

ненависть: python - тесты курильщика

@gaga, Вы просили о тестах, их есть у нас. Как выглядит тест на нормальном языке, пример:

use Test::More;
plan tests => 6;

require_ok 'User';
my $user = new User name => 'Вася';
ok $user => 'Пользователь инстанцирован';
ok !$user->id, 'У нового пользователя id отсутствует';
ok $user->save, 'Пользователь сохранён';
ok $user->id, 'Id назначен при сохранении';
is $user->foo, 'bla', 'Значение по умолчанию для foo';

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

Теперь тест курильщика, переписываем то же самое.

import pytest
import importlib

# без переменных уровня модуля или подобных хаков данные
# из теста в тест не передать
User = None
vuser = None

def test_import():
   User = importlib.import_module('User')
   assert User, 'Модуль загружен'

def test_constructor():
   vuser = User(name='Вася')
   assert vuser, 'Пользователь инстанцирован'

def test_id_presave():
   assert not vuser.id, 'У нового пользователя id отсутствует'

def test_save():
   assert vuser.save(), 'Пользователь сохранён'

def test_id_postsave():
   assert vuser.id, 'Id назначен при сохранении'

def test_default_foo():
   assert vuser.foo == 'bla', 'Значение по умолчанию для foo'

Итого:

  • тестовая система (самая распространенная - pytest) сделана так, чтобы пользователь писал максимально много букв не относящиеся к тестам
  • передача данных из теста в тест затруднена
  • лог тестирования страшенный не человеко- и не машино- читаемый
  • вторая по популярности (или первая?) тестовая система еще более многосложна, предполагает не только объявления функций, но и классов
  • со стороны тестовой системы отсутствует поддержка частых паттернов: например тестирование строк на регекспы (like/unlike, тестирование импортируемости, итп)
  • тестирование количества тестов так же крайне неочевидно
  • автоматический подсчет статистики числа пройденных тестов в большой системе - так же ППЦ, ввиду отсутствия машиночитаемости
  • масса типовых слов, которые зарезервированы как ключевые (str, list, is, in, from, и так далее) заставляет изобретать сложные имена переменным

и тут еще мы не рассматриваем например ситуацию, что в начале теста система должна поднять некоторую инфраструктуру.

соответственно именно поэтому в питонячьих проектах тесты народ и не пишет обычно.

а еще эта хрень-кака молча глотает двойные


def foo():
   bla

def foo():
   ble

и вот где бы выбросить-то исключение? но нет же. Зачем? Надо же усложнить пользователю процесс поиска ошибки, а не упростить его!

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

ППЦ

PPS: а еще есть уродские декораторы. какой шизик их придумал? причины почему их придумали понятны: за отсутствием нормальных лямбд хоть какой-то заменитель

 , ,

rsync
()

Плохой Питон

по мотивам предыдущего треда.

Вот имеется функция.

def foo(bla):
   if bla > 10 and bla < 20:
        raise ValueError('Некорректно bla: какая-то херь!')

По данному коду:

  1. мы железно знаем что ошибку допустил код вызывающий нас
  2. поэтому правильно бросать исключение указывающее на строку нас вызывающую, а не на нас
  3. как бросить такое исключение?

хочу как в человеческом языке оператор

croak

PS: так же крайне удручает отсутствие полноценных лямбда-функций в этом говноязыке. Блин, как вы живёте без лямбд-то? только не надо мне тыкать в лямбда-оператор, я функцию хочу!

 ,

rsync
()

Ненависть: не люблю Python

Как люди программируют на этом языке? ППЦ

По роду деятельности приходится изучать это и после Perl такая тоска накатывает шоппц.

В процессе изучения пытаюсь ради интереса попереписывать свои простейшие скрипты которыми пользуюсь повседневно.

Например есть у меня скрипт «если курсор мыши в правом верхнем углу экрана, то не давать включать screensaver».

В нем есть такой вот блок, определяющий подключенные мониторы и их конфиг:

#!/usr/bin/perl

use 5.20.0;
use YAML;

my %list;
open my $fh, '-|', '/usr/bin/xrandr';
while(<$fh>) {
    if (/^(\S+)\sconnected\s+(primary\s+)?(\d+)x(\d+)([+-]\d+)([+-]\d+)/) {
        $list{$1} = {
            name        => $1,
            w           => $3,
            h           => $4,
            x           => int($5),
            y           => int($6),
            primary     => $2 ? 1 : 0
        }
    }
}

print YAML::Dump \%list;

Запускаем - рассказывает о подключенных мониторах в машиночитаемом виде:

---
DP-1:
  h: 1440
  name: DP-1
  primary: 0
  w: 2560
  x: 2560
  y: 0
DP-2-1:
  h: 1440
  name: DP-2-1
  primary: 0
  w: 2560
  x: 0
  y: 0
eDP-1:
  h: 1080
  name: eDP-1
  primary: 1
  w: 1920
  x: 1280
  y: 1440

вроде что может быть проще?

Однако пытаемся переписать это на python и натыкаемся:

  1. что open - не умеет работать с пайпами
  2. что про пайпы велосипедят 100500 модулей
  3. что у строк есть 100500 методов, но работа с регекспами вынесена в какой-то ужасно сдизайненный модуль `re`
  4. что эти 20 строк кода на Python превратятся в 200

и как вы с этим живете, мозахисты?

 ,

rsync
()

systemd - ППЦ

очередную попытку предпринимаю исследовать systemd и снова разбиваю нос о простые вещи.

итак простая казалось бы вещь - cryptsetup.

В его составе есть программа decrypt_derived, позволяющая делать крипто-swap'ы легким движением руки.

Но при переходе на systemd «вдруг оказалось» что эта гадость парсит /etc/crypttab самостоятельно, мало того - распознает swap'ы и заново их форматирует!

итого гугление вопроса как подружить systemd, cryptoswap с hibernate без необходимости вводить 100500 раз пароли приводит нас к чуть ни единственному решению: лезть в Grub и из настроек Grub управлять криптой, а от использования crypttab отказываться.

ну не пипец ли?

объясните мне: ЗАЧЕМ systemd пытается сломать КАЖДУЮ вещь с которой соприкасается? вот буквально - КАЖДУЮ!

ненавижу

 , , , ,

rsync
()

блокировка экрана и suspend

а вот почему все init'ы (и systemd и sysv) блокируют экран при resume, а не при suspend?

из за этого иногда видно что было на экране ноута до того как он уснул.

кто-нибудь занимался лечением этой проблемы?

 , , ,

rsync
()

поделки Поттеринга: хочу простую вещь - как?!

Хочу чтобы всунул наушники в разъем и выполнилась бы команда

mpc play

а когда высунул наушники, то выполнилась бы команда

mpc stop

Мне выкрутили руки (Firefox) и обязали установить PulseAudio.

теперь я не знаю как делать простые вещи с этим мегаприложением, «управляющим» звуком.

сабж!

Перемещено leave из talks

 ,

rsync
()

systemd: вопросы

установил систему на новый ноут и попробовал пожить на systemd, не получилось - снес.

что выбешивает:

  • рестартишь какого-то демона, а оно тебе и говорит «ошибка при рестарте подробности смотри в
    journalctl -xe

    Вопрос: а нельзя настроить чтобы вело себя нормально: показывало проблему сразу на экране?

  • почему
    journalctl -xe
    открывает какой-то поток логов где-то в середине и можно листать как вверх так и вниз? это для сумасшедших придумано? причем вниз листать можно на много-много экранов и там события совсем не связанные с проблемой
  • сложную сеть как я понял без GUI на хосте с systemd и настроить-то нельзя? Есть внятные хауту как не устанавливая ifupdown поднять скажем wpasupplicant?
  • как логи в нормальный читаемый режим переключить?

в общем я снёс его пока, подождём еще лет 5, может доработают до ума...

доклад окончил, украшайте

 ,

rsync
()

как изменить номер раздела GPT?

когда-то подарили мне MacBook, я на нем снёс все кроме раздела восстановления и поставил Linux.

поскольку раздел восстановления имел номер 2 и мешался под ногами, то я как-то назначил ему номер 6 (последний) и удвинул в конец диска.

а теперь хочу восстановить все назад и отдать ноут другому человеку - соответственно надо восстановить.

а чет хоть убей не помню как я номер у раздела поменял. а у macos крышу сносит от того что номер у нее 6 а не 2.

никто не знает как поменять номер раздела на GPT не снося его?

 , , , ,

rsync
()

Telegram, socks, dante помогите настроить

Не хочется отказываться от телеграма. Пытаюсь себе в Германии настроить socks5 сервер с авторизацией. Взял dane и не получается.

Конфиг:

logoutput: syslog stdout /var/log/sockd.log
internal: eth0 port = 1080
socksmethod: username rfc931 none #rfc931
user.privileged: proxy
user.unprivileged: nobody
user.libwrap: nobody
client pass {
       from: 0.0.0.0/0 port 1-65535 to: 0.0.0.0/0
       log: connect error
}

создал в системе юзера «tgm»,

su - tgm
могу в юзера зайти

в телеграме прописал socks, однако сам dante на каждый коннект телеграмы ругается:

error after reading 23 bytes in 0 seconds: could not access user "tgm"'s records in the system password file: Permission denied

и я не вгоняю чего Permission-то которого debied?

кто настраивал?

Перемещено Shaman007 из talks

 , ,

rsync
()

Фильтрация спама: покритикуйте идею

сижу вот дожидаюсь когда важное письмо прорвется сквозь грейлистинг и думаю.

с одной стороны грейлистинг очень эффективен:

sudo greylist stats
Statistics since Wed Dec 14 13:09:24 2011 (2273 days and 23 hours ago)
----------------------------------------------------------------------
2206 items, matching 1835702 requests, are currently whitelisted
   0 items, matching       0 requests, are currently blacklisted
  85 items, matching      90 requests, are currently greylisted

Of 502119 items that were initially greylisted:
 -  56980 ( 11.3%) became whitelisted
 - 445139 ( 88.7%) expired from the greylist

а с другой стороны вот блин иногда затупит нужный сервер и хоть отключай его (грейлист)!

и вот думаю, а если грейлист переделать таким способом. Сделать чтобы работал в совокупности с imap (соответственно подойдет только тем кто СВОЮ почту майнтенит).

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

ну и когда ждешь чет срочного - есть место куда заглянуть.

как думаете, будет работать схема?

 , , ,

rsync
()

Vim: синтаксическая раскраска части файла

имеется [условно] текстовый файл. Ну или файл на языке X (скажем C++).

в файле открываем коментарий и в коментарии имеется код на lua

/*

function bla()

end
*/

Вопрос: можно ли в коментариях проставить Vim'у какой-то тег, чтобы он код на Lua покрасил как Lua код?

ну или скажем SQL у python в тройных кавычках.

 

rsync
()

RSS подписка на новые темы