Задать вопрос
  • Python вызов асинхронной функции с периодичностью?

    @to_east Автор вопроса
    Оказывается необходимо произвести еще одну задержку, после итерации, чтобы быть увереным, что расчет задержки будет в следующем интервале времени
    Код:
    import asyncio
    import time
    from datetime import datetime
    from dataclasses import dataclass
    
    
    @dataclass
    class State:
        value: int
    
    
    async def delayer(interval: float):
        while True:
            now = time.time()
            delay = interval - (now % interval)
            yield await asyncio.sleep(delay)
            await asyncio.sleep(interval / 3)
    
    
    async def updater(state: State, interval: float):
        async for _ in delayer(interval):
            state.value += 1
            print(f"{datetime.now()} updater {state.value}")
    
    
    async def main():
        state = State(0)
        update_interval = .2
    
        asyncio.create_task(updater(state, update_interval))
    
        while True:
            print(f"{datetime.now()} main {state.value}")
            await asyncio.sleep(.1)
    
    if __name__ == "__main__":
        asyncio.run(main())

    Вывод:
    2025-05-16 03:14:49.783501 main 0
    2025-05-16 03:14:49.801776 updater 1
    2025-05-16 03:14:49.886596 main 1
    2025-05-16 03:14:49.988087 main 1
    2025-05-16 03:14:50.001721 updater 2
    2025-05-16 03:14:50.090751 main 2
    2025-05-16 03:14:50.191829 main 2
    2025-05-16 03:14:50.200738 updater 3
    2025-05-16 03:14:50.293298 main 3
    2025-05-16 03:14:50.394093 main 3
    2025-05-16 03:14:50.401138 updater 4
    2025-05-16 03:14:50.495234 main 4
    2025-05-16 03:14:50.595979 main 4
    2025-05-16 03:14:50.601680 updater 5
    2025-05-16 03:14:50.696821 main 5
    2025-05-16 03:14:50.797915 main 5
    2025-05-16 03:14:50.800797 updater 6
    2025-05-16 03:14:50.899381 main 6
    2025-05-16 03:14:51.000355 main 6
    2025-05-16 03:14:51.000852 updater 7
    2025-05-16 03:14:51.101351 main 7
    2025-05-16 03:14:51.201208 updater 8
    2025-05-16 03:14:51.201701 main 8
    2025-05-16 03:14:51.302583 main 8
    2025-05-16 03:14:51.401710 updater 9
    2025-05-16 03:14:51.403641 main 9
    2025-05-16 03:14:51.505192 main 9
    2025-05-16 03:14:51.601012 updater 10
    2025-05-16 03:14:51.606743 main 10
    2025-05-16 03:14:51.707484 main 10
    2025-05-16 03:14:51.801544 updater 11
    2025-05-16 03:14:51.808309 main 11
    2025-05-16 03:14:51.909809 main 11
    2025-05-16 03:14:52.000806 updater 12
    2025-05-16 03:14:52.011606 main 12
    2025-05-16 03:14:52.113415 main 12
    2025-05-16 03:14:52.202388 updater 13
    2025-05-16 03:14:52.214291 main 13
    2025-05-16 03:14:52.315195 main 13
    2025-05-16 03:14:52.401254 updater 14
    2025-05-16 03:14:52.416091 main 14
    2025-05-16 03:14:52.517344 main 14
    2025-05-16 03:14:52.601120 updater 15
    2025-05-16 03:14:52.618772 main 15
    2025-05-16 03:14:52.720507 main 15
    2025-05-16 03:14:52.801609 updater 16
    2025-05-16 03:14:52.821462 main 16
    2025-05-16 03:14:52.923387 main 16
    2025-05-16 03:14:53.001534 updater 17
    2025-05-16 03:14:53.024396 main 17
    2025-05-16 03:14:53.126190 main 17
    2025-05-16 03:14:53.201231 updater 18
    2025-05-16 03:14:53.227011 main 18
    2025-05-16 03:14:53.329709 main 18
    2025-05-16 03:14:53.402908 updater 19
    2025-05-16 03:14:53.430889 main 19
    2025-05-16 03:14:53.532470 main 19
    2025-05-16 03:14:53.601380 updater 20
    2025-05-16 03:14:53.633968 main 20
    2025-05-16 03:14:53.735617 main 20
    2025-05-16 03:14:53.801714 updater 21
    2025-05-16 03:14:53.836654 main 21
    2025-05-16 03:14:53.938479 main 21
    2025-05-16 03:14:54.001544 updater 22
    2025-05-16 03:14:54.039524 main 22
    2025-05-16 03:14:54.140508 main 22
    2025-05-16 03:14:54.201517 updater 23
    2025-05-16 03:14:54.241385 main 23

    Вот где "main 7" в строчке, главный поток немного опережает выполнение updater-a, но для моей задачи это приемлемо, главное что updater не вызывается два раза подряд.
    Ответ написан
    Комментировать
  • Несовместимость сигнатуры функции?

    @to_east Автор вопроса
    Кажется дошло. Нужно передавать обработчик в атрибут, предварительно завернув обработчик в делегат:
    let defaultTcpHandler (host : string) (port : int) : Task<TcpClient> =
        task {
            let tcpClient = new TcpClient()
            let! _ = tcpClient.ConnectAsync(host, port) |> Async.AwaitTask
            return tcpClient
        }
    
    client.TcpHandler <- Client.TcpFactory(defaultTcpHandler)
    Ответ написан
    Комментировать
  • Получение копии записи с модифицированными полями?

    @to_east Автор вопроса
    Сочетание клавиш Ctrl+Alt+L все решает
    Ответ написан
  • Создание службы с запуском от Администратора?

    @to_east Автор вопроса
    Оказывается нужно добавить префикс домена к юзеру((DESKTOP-XXX/user1), тогда работает.
    Ответ написан
    Комментировать
  • Авторизация аккаунта Вконтакте - какие новые правила?

    @to_east
    665d5450174c5607992464.png
    Ответ написан
    Комментировать
  • Vk постинг через апи, авторизация?

    @to_east Автор вопроса
    Кажется я понял, чтобы получить расширенный доступ к своему приложению(Друзья, Стена, Сообщества), нужно загрузить паспортные данные в вк)
    Ответ написан
    Комментировать
  • Как внедрить текстовый редактор в проект на Django?

    @to_east
    Похоже тебе нужен wysiwyg
    Ответ написан
  • Как заблокировать определенные боты в Nginx?

    @to_east
    на PHP решение: https://github.com/JayBizzle/Crawler-Detect. Но если нужно чисто на нгинкс тогда наверное лучше https://openresty.org/ поставить с Луа будет проще чем в конфигах, имхо.
    Ответ написан
  • PHP смержить в один файл проект на composer?

    @to_east Автор вопроса
    Вот вроде есть https://www.php.net/manual/ru/function.get-declare... выводит список классов, думаю что можно слабать на основе этого свой скрипт сборки, только предварительно отфильтровать

    Updated:
    Вобщето лучше использовать сам лоадер композера, вот нашел метод getClassMap() который выводит список загруженных классов:
    <?php
    
    $loader = require_once __DIR__ . '/../vendor/autoload.php';
    $loader->getClassMap();

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

    @to_east Автор вопроса
    Пришлось немного повозится чтобы получить, то чего я хотел изначально.
    В процессе поиска решения, мне стало известно, что coreapi и swagger работают с разными json форматами, для конвертации формата я обратился за помощью к https://github.com/core-api/python-openapi-codec, плюс ко всему мне удобнее описывать спеки в yaml формате.
    Все привиденные файлы расположенны относительно джанго корневого проджекта:

    file: api/helpers/SwaggerAPICodec.py

    import yaml
    from coreapi.codecs.base import BaseCodec
    from coreapi.document import Document
    from coreapi.exceptions import ParseError
    from openapi_codec.decode import _parse_document
    
    
    class SwaggerAPICodec(BaseCodec):
        format = 'openapi'
        media_type = 'application/openapi+yaml'
    
        def decode(self, bytes, **options):
            try:
                data = yaml.safe_load(bytes)
            except ValueError as exc:
                raise ParseError('Malformed YAML. {}'.format(exc))
    
            base_url = options.get('base_url')
            doc = _parse_document(data, base_url)
    
            if not isinstance(doc, Document):
                raise ParseError('Top level node must be a document.')
    
            return doc
    
        def encode(self, document, **options):
            # TODO SwaggerAPICodec.encode() freeze
            raise AttributeError('.encode() method not yet developed.')

    file: api/views/ApiView.py

    from rest_framework.views import APIView as BaseAPIView
    from rest_framework.permissions import AllowAny
    from rest_framework_swagger import renderers
    from rest_framework.response import Response
    
    from api.helpers.SwaggerAPICodec import SwaggerAPICodec
    
    
    class ApiView(BaseAPIView):
        permission_classes = [AllowAny]
        renderer_classes = [
            renderers.OpenAPIRenderer,
            renderers.SwaggerUIRenderer,
        ]
    
        def get(self, request):
            codec = SwaggerAPICodec()
            bytestr = open('api/swagger.yaml', 'rb').read()
            schema = codec.decode(bytestr)
            return Response(schema)


    file: api/urls.py

    from django.urls import path
    from .views.ApiView import ApiView
    
    
    urlpatterns = [
        path('swagger/', ApiView.as_view()),
    	# ...
    ]


    Как видно файл схемы загружается локально но можно сделать и удаленно, при помощи coreapi.Client
    Ответ написан
    Комментировать
  • Подключение и использование svg иконок в css?

    @to_east Автор вопроса
    Все до меня дошло, проблема была в том что я не упомянул что собиралось все это дело на вебпаке, до этого использовал raw-loader для svg, короче это правило решило мою проблему:
    module: {
            rules: [
                {
                    test: /\.(eot|svg|woff|woff2|ttf)$/,
                    use: [{
                        loader: 'file-loader',
                        options: {
                            name: '[name].[ext]',
                            outputPath: 'fonts/',
                            publicPath: 'static/fonts/'
                        }
                    }]
                },
            ]
    Ответ написан
    Комментировать
  • Python обмен данными между процессами через Пайпы?

    @to_east Автор вопроса
    Немного не по теме спрошу, а возможно ли использовать Queue вместе с asyncio, для предотвращения гонок в совместно используемых данных, несколькими роутинами.
    И еще вопрос. На днях ознакомился навскидку с асинхронным программированием в Python, по сути все выполняется в одном потоке, просто эффективно распределяется процессорное время между тасками(поправьте, если не верно, или неточно), так вот зачем необходимы примитивы синхронизации, такие как Lock, Event, Condition, Semaphore(в модуле asyncio), если доступ имеет только один поток в одно время?
    Ответ написан
    Комментировать
  • Gruntjs импорт в исходном js-файле?

    @to_east Автор вопроса
    Нашел плагин https://www.npmjs.com/package/grunt-import-js который делает то что мне необходимо, но потом я для себя открыл browserify+babelify, это наверное будет более правильный подход для сборки...
    Ответ написан
    Комментировать
  • Gulp передача параметров между тасками?

    @to_east Автор вопроса
    Вобщем я пересмотрел, оказывается все проще:
    gulp.task('sass', function () {
    	gulp.watch(assets_dir + '/stylesheets/src/**/*.scss', function(e) {
    		console.log(e.path);
    		// Building
    	});
    });
    
    gulp.task('default', ['sass']);
    Ответ написан
    Комментировать
  • Как делается FormSet для отношения ManyToMany?

    @to_east
    Если я правильно понимаю - тебе нужно вывести несколько экземпляров форм с возможностью редактирования, то возможно это поможет(если вопрос актуален еще:)):
    # forms.py
    
    class EditThumbsForm(forms.ModelForm):
        class Meta:
            model = Thumb
            fields = ('src', )
        src = forms.CharField()
    
    
    EditThumbsFormSet = forms.inlineformset_factory(Video, Thumb, form=EditThumbsForm, extra=0)
    
    
    class EditVideosForm(forms.ModelForm):
        class Meta:
            model = Video
            fields = ('id', 'video_id', 'title', )
    
        id = forms.IntegerField()
        video_id = forms.IntegerField()
        title = forms.CharField()
    
    
    class EditVideosModelFormSet(BaseModelFormSet):
        def add_fields(self, form, index):
            super(__class__, self).add_fields(form, index)
            form.thumb_formset = EditThumbsFormSet(
                instance=form.instance,
                data=form.is_bound and form.data or None,
                files=form.is_bound and form.files or None,
                prefix='thumb-%s-%s' % (
                    form.prefix,
                    EditThumbsFormSet.get_default_prefix()
                )
            )
    
    EditVideosFormSet = forms.modelformset_factory(Video, EditVideosForm, formset=EditVideosModelFormSet, extra=0)

    Во вьюхе так:
    class EditVideosView(View):
        template_name = 'admin/edit_videos.html'
    
        def get(self, request):
            instance = Video.objects.all()
            formset = EditVideosFormSet(queryset=instance)
            return render(request, self.template_name, context={'formset': formset})

    А в шаблоне примерно так:
    {% for form in formset %}
        <li>
            {{ form }}
            {% if form.thumb_formset %}
                {{ form.thumb_formset.management_form }}
                <ul>
                {% for thumb in form.thumb_formset %}
                    <li>
                    {{ thumb.src }}
                    </li>
                {% endfor %}
                </ul>
            {% endif %}
        </li>
    {% endfor %}


    Если кратко то необходимо вначале создать формсет с основной модели при помощи modelformset_factory(), а потом уже добавлять связанные таблицы к основной при помощи inlineformset_factory()
    Ответ написан
    Комментировать
  • Как лечить спину айтишникам?

    @to_east
    Необходимо провести диагностику, это без вопросов, а вдруг у вас там опухоль или защемление нерва в поясничном отделе, тренажерные залы и йоги только усугубят эту ситуацию
    Ответ написан
    Комментировать
  • Конкурентность несколько вопросов?

    @to_east Автор вопроса
    Andrey Tsvetkov,
    Хорошо, спасибо за поддержку! Детальнее разберу твой пример для ясности.

    <-- After some time -->
    К сожалению твой пример вывалился с фатальной ошибкой
    fatal error: all goroutines are asleep - deadlock!
    
    goroutine 1 [chan receive]:
    main.main()
            c:/Users/chapplin/go/src/example1/test.go:59 +0x3cf
    
    goroutine 18 [chan receive]:
    main.writer(0xc04202c0c0, 0xc042050070)
            c:/Users/chapplin/go/src/example1/test.go:23 +0x5e
    created by main.main
            c:/Users/chapplin/go/src/example1/test.go:37 +0xf0
    exit status 2
    Для продолжения нажмите любую клавишу . . .

    Но потом, закоментил последнюю строчку
    // <- done
    Код отработал без ошибок.
    Тут вот дополнительный вопрос, по видимому sigfault в бесконечном цикле:
    func writer(result <- chan string, done chan bool) {
    	for line := range result {
    		fmt.Println(line)
    	}
    	done <- true
    }

    Может необходимо дополнительную проверку, и выходить по break из цикла, типа такого:
    func writer(result <- chan string, done chan bool) {
    	for line := range result {
            if (<- done) == true {
                break
            }
    		fmt.Println(line)
    	}
    	done <- true
    }

    И в завершении программы уже делать done <- true
    И зачем вообще этот done нужен, если он определен а явного использования нет?
    Ответ написан
    Комментировать
  • Инициализация встраиваемой структуры?

    @to_east Автор вопроса
    Похоже что нашел решение, но неуверен что оно правильное, код:
    package main
    
    
    import "fmt"
    
    
    type Parent struct {
        foo int
    }
    
    type Child struct {
        Parent *Parent
        bar int
    }
    
    func main() {
        var parent = &Parent{ foo: 12 }
        var child = &Child{ Parent: *&parent, bar: 111 }
        child.Parent.foo++
        fmt.Println(&parent.foo, &child.Parent.foo)
        fmt.Println(child.Parent.foo, parent.foo)
    }
    Ответ написан
    Комментировать
  • Структуры, указатели, массивы?

    @to_east Автор вопроса
    Ясно, благодарю за подробные разъяснения!
    Выходит нужно создавать массив указателей на nextWords структуру.

    разве что мы сначала вытащим её из мапы в переменную и вызовем метод на ней

    Кстати только что получилось такое проделать, на основе этого хотел сделать вызов (&myMap["hello"]).GetFirstItem() такого рода, но тоже фэйл вышел
    Ответ написан
    Комментировать