Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860

Получение имени съемного накопителя

20.12.2018, 12:01. Показов 2923. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго дня всем! Не знал в каком разделе написать. Знаний в области Линукса мало...
Мне необходимо написать простую программу, начал на Сишарпе. Для отлова событий изменения ядра использую udev API. Вызываю сишные методы.
Я вот не пойму, правильно - ли я выбрал направление с работой через udev? У меня с горем пополам получилось получить событие action (add/remove), но как получить имя я не знаю. Флешка у меня распознается как dev/sda, вторая как /dev/sdb
Путь в syspath = "/sys/devices/soc0/soc/2100000.aips-bus/2184000.usb/ci_hdrc.0"/ Все это дело автомонтируется в /media/usb0-usb7. Ломаю голову, как же получить имя диска?
Нашел простой пример, но я так понимаю что он не даст мне имя по типу /dev/sda или /mount/usb
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
    fd_set fds;
        struct timeval tv;
        int ret;
        
        FD_ZERO(&fds);
        FD_SET(fd, &fds);
        tv.tv_sec = 0;
        tv.tv_usec = 0;
        
        ret = select(fd+1, &fds, NULL, NULL, &tv);
        
        /* Check if our file descriptor has received data. */
        if (ret > 0 && FD_ISSET(fd, &fds)) {
            printf("\nselect() says there should be data\n");
            
            /* Make the call to receive the device.
               select() ensured that this will not block. */
            dev = udev_monitor_receive_device(mon);
            if (dev) {
                printf("Got Device\n");
                printf("   Node: %s\n", udev_device_get_devnode(dev));
                printf("   Subsystem: %s\n", udev_device_get_subsystem(dev));
                printf("   Devtype: %s\n", udev_device_get_devtype(dev));
 
                printf("   Action: %s\n", udev_device_get_action(dev));
                udev_device_unref(dev);
            }
            else {
                printf("No Device from receive_device(). An error occured.\n");
            }
Для получения событий изменения я дергаю функцию udev_device_get_action(...)
В общем, запутался. Прошу помощи именно в теории, как правильно сделать и какой инструмент ОС задействовать.
ПС: Сделал так же вариант хардкода, когда имя внешнего накопителя константное, так как использую только 1 порт usb (/media/usb1), но вдруг с системой что станет и имя изменится...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
20.12.2018, 12:01
Ответы с готовыми решениями:

Определение буквы съемного диска(флэшки) по имени или серийному номеру (без WMIC). Простой способ
Интересовался данной темой и что-то в гугле не нашел (мож забанили). Сегодня осенило: Поиск по имени: set...

Получение имени панели
Всем привет. У меня есть список панелей List<Panel> Panel_My = new List<Panel>(); Добавление панелей происходит Panel_My.Add(new...

Получение имени пользователя пк по ip
Есть ли возможность узнать текущее имя пользователя пк по IP, например 178.1##.5.## - Дима?...

45
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
21.12.2018, 18:10
Студворк — интернет-сервис помощи студентам
Если сама libudev, то лучше не трогать (мало ли что сломается) верните poll/select
C
1
2
3
4
5
6
7
8
    struct pollfd pfd = (struct pollfd) {
        .fd = udev_monitor_get_fd(mon),
        .events = POLLIN,
    };
    while (1) {
        if (poll(&pfd, 1, -1) < 1)
            /* если errno != EINTR то все плохо. */
        /* Далее по тексту */
Цитата Сообщение от Jman Посмотреть сообщение
Подскажите еще такой момент
Вопрос в том, что делать если флэшка вставлена раньше чем запускается ваша программа?
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
21.12.2018, 22:09  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Если сама libudev,
Комментарий взят из обертки С# над Апи udev. Так что думаю автор это сам сделал. Так как я не нашел, что бы он работал через дескрипторы и использовал poll/select и тд...
Цитата Сообщение от prik Посмотреть сообщение
Вопрос в том, что делать если флэшка вставлена раньше чем запускается ваша программа?
Программа запускается всегда при старте ОС.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
21.12.2018, 22:32
Jman, просто расскажите, чего хочется получить в итоге.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 10:13  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Jman, просто расскажите, чего хочется получить в итоге.
Мне надо вставить флешку и скопировать с нее файлы, USB порт всего один ). Хотел типо так:
- Вставил флешку, опознал что она подключена
- Прочитал ее имя
- Если подключена и есть имя, копирую файлы

Отсюда вытекает следующее, что делать, если флешка уже была подключена до запуска программы.

Можно конечно железно сделать, она всегда распознается как /dev/sda. Но мало-ли что там ОСи взбредет в голову. Возьмет и переименует. Ось обновляться не будет и она не умеет это делать автоматически, так как это buildroot.

ПС - Ошибки, что я выше запостил, идут от NONBLOCK?

Добавлено через 1 час 2 минуты
Итак, заюзав блокирову, я перестал получать постоянные ошибки, прога выводит их только один раз, но я так и не пойму, почему летит ошибка
Numerical result out of range [ERANGE].
Когда я хочу получить devnode
udev_device_get_devnode
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
22.12.2018, 11:38
Цитата Сообщение от Jman Посмотреть сообщение
Мне надо вставить флешку и скопировать с нее файлы, USB порт всего один ). Хотел типо так:
- Вставил флешку, опознал что она подключена
- Прочитал ее имя
- Если подключена и есть имя, копирую файлы
На старте через udev_enumerate_scan_devices() с соответствующими фильтрами просканировать все подходящие устройства и если нашли подходящие сделать что нужно.
Цитата Сообщение от Jman Посмотреть сообщение
Итак, заюзав блокирову, я перестал получать постоянные ошибки, прога выводит их только один раз, но я так и не пойму, почему летит ошибка
Без понятия. Код никто кроме вас не видел. Пример по вашей ссылке с адаптированным фильтром и select()/poll() работает хорошо и никаких ошибок не дает.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 11:51  [ТС]
Жаль, что мы на разных "языках разговариваем" =)
Я могу привести код.
Цитата Сообщение от prik Посмотреть сообщение
Код никто кроме вас не видел
Это обертка над Udev написанная на C# Я использую ее.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 var udev = new Context(); 
            var monitor = new Monitor(udev);
            var handle = udev.Handle;
            Console.WriteLine("udev Action test");
 
            monitor.Blocking = true; // Врубаю блокировку
 
            monitor.EnableReceiving(); // Врубаю сканирование
 
            while (true) {
                try {
 
                    var a = monitor.TryReceiveDevice(); // Пробую получить устройство из монитора используя // udev_monitor_receive_device(IntPtr udev_monitor); в качестве аргумента ссылка.
                    if (a.IsInitialized) { // Проверяю, есть ли интанс объекта device
 
                        //if (a.DevNode.Contains("/dev/sda") || a.DevNode.Contains("/dev/sdb"))
                        Console.WriteLine(a.DevNode); //.Substring(0, 8));
                        Console.WriteLine(a.SysName);
                        Console.WriteLine(a.Action);
                    }
                 
                }
                catch (Exception e) {
                    Console.WriteLine(e.Message);
                }
            }
Метод TryRecieveDevice
C#
1
2
3
4
5
6
7
8
9
10
11
12
 public Device TryReceiveDevice()
        {
            var device = udev_monitor_receive_device(Handle);
            if (device == IntPtr.Zero) {
                var err = (Errno)Marshal.GetLastWin32Error();
                if (err == Errno.EWOULDBLOCK) {
                    return null;
                }
                throw new UnixIOException(err);
            }
            return new Device(device);
        }
Добавлено через 2 минуты
И вот вечный цикл меня просто бесит... Его конечно можно в отдельный поток засунуть и пусть там крутится. И как удев заметил устройство, кинуть ивент один раз.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
22.12.2018, 12:15
Jman, вряд ли я смогу вам помочь с этим, если решите переписать на С/С++ то вэлкам
Цитата Сообщение от Jman Посмотреть сообщение
monitor.Blocking = true; // Врубаю блокировку
Если вы после этого получаете EAGAIN, то оно или не работает, или где-то под капотом спрятан поллинг, т.е. кто-то где-то делает select/poll с нулевым таймаутом и возвращает этот EAGAIN. т.е до recvmsg() дело просто не доходит. Или эта строчка просто не работает и O_NONBLOCK нужно снимать как-то иначе.
На сколько я знаю, recvmsg() ERANGE сама не возвращает, разве только EMSGSIZE может. Если разберетесь с EAGAIN и ERANGE не уйдет, то можно попробовать через strace глянуть на какой ф-ции она возникает. Ну или как вариант ее возвращает библиотека/обертка.

Добавлено через 2 минуты
Цитата Сообщение от Jman Посмотреть сообщение
И вот вечный цикл меня просто бесит...
Если ваш monitor.Blocking = true; работает как надо (я думаю что нет), то код 99.99% времени спит внутри libudev
1
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 12:51  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
вряд ли я смогу вам помочь с этим, если решите переписать на С/С++ то вэлкам
Да вы мне и так сильно помогли! Так как я в Линукс не особо шарю, а на си кодирую только всякие АВР и СТМ32 и то для подделок.
Цитата Сообщение от prik Посмотреть сообщение
Если ваш monitor.Blocking = true; работает как надо (я думаю что нет), то код 99.99% времени спит внутри libudev
А вот это открытие для меня! Теперь я могу не заморачиваться над инструментами сканирования.

Буду ковыряться дальше, с ошибками. У меня там еще пару косяков есть, но думаю это уже мои.

Добавлено через 7 минут
Вот код блокинга -
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public enum OpenFlags
  {
    O_RDONLY = 0,
    O_WRONLY = 1,
    O_RDWR = 2,
    O_CREAT = 64, // 0x00000040
    O_EXCL = 128, // 0x00000080
    O_NOCTTY = 256, // 0x00000100
    O_TRUNC = 512, // 0x00000200
    O_APPEND = 1024, // 0x00000400
    O_NONBLOCK = 2048, // 0x00000800
    O_SYNC = 4096, // 0x00001000
    O_NOFOLLOW = 131072, // 0x00020000
    O_DIRECTORY = 65536, // 0x00010000
    O_DIRECT = 16384, // 0x00004000
    O_ASYNC = 8192, // 0x00002000
    O_LARGEFILE = 32768, // 0x00008000
  }
 
 OpenFlags getFlags()
        {
            var ret = Syscall.fcntl(Fd, FcntlCommand.F_GETFL);
            if (ret == -1) {
                throw new UnixIOException(Marshal.GetLastWin32Error());
            }
            return (OpenFlags)ret;
        }
Вот дергаю эту функцию блокировки (что бы ООПэшники не побили, метод).
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/// <summary>
        /// Gets or sets the file descriptor is blocking.
        /// </summary>
        public bool Blocking {
            get {
                var flags = getFlags();
                return !flags.HasFlag(OpenFlags.O_NONBLOCK); // Hash flag проверка на тип.
            }
            set {
                var flags = getFlags();
 
                if (value) {
                    flags &= ~OpenFlags.O_NONBLOCK;
                }
                else {
                    flags |= OpenFlags.O_NONBLOCK;
                }
 
                setFlags(flags);
            }
        }
И тут как раз возвращение из Геттера (это в С# называется свойство, оно типо переменной, только абстракция выше, но по сути функция) Я всегда получаю NONBLOCK, но я взвожу его в тру. И в установке флага блокировки используется fcntl а не привычный мне ioctl, почему интересно.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
22.12.2018, 12:54
Цитата Сообщение от Jman Посмотреть сообщение
, а на си кодирую только всякие АВР и СТМ32 и то для подделок.
Так если ваша программа не должна делать что-то кроме озвученного в этой теме, переписать на с/c++ имхо лучшей выбор чем тащить в систему чужеродную среду
Цитата Сообщение от Jman Посмотреть сообщение
А вот это открытие для меня!
Поставьте вывод ".\n" в этот цикл - много точек - не спит и жрет цпу.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 13:02  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Так если ваша программа не должна делать что-то кроме озвученного в этой теме, переписать на с/c++ имхо лучшей выбор чем тащить в систему чужеродную среду
Дело в том, что у меня модуль к основной проге, которая уже написана, ее не получится переписать. Можно конечно написать на Си и запускать этот модуль С#пом, либо завернуть все в .SO и просто дергать Сишные методы. Типо scan(), и слушаем пока событие не произошло.
Цитата Сообщение от prik Посмотреть сообщение
Поставьте вывод ".\n" в этот цикл - много точек - не спит и жрет цпу.
Т.е надо убирать любой вывод кроме системного....

Добавлено через 3 минуты
Итак, EAGAIN и прочее ушло, после того как установил блокировку и стал проверять инициализацию device. Теперь сообщения приходят. Но почему-то например вставил флешку, приходит несколько сообщений подряд : add, выдернул - несколько remove. Так ведь не должно быть?
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
22.12.2018, 13:18
Цитата Сообщение от Jman Посмотреть сообщение
И в установке флага блокировки используется fcntl а не привычный мне ioctl, почему интересно.
установка FIONBIO через ioctl давно считается устаревшим методом, лучше не использовать. Вообще, на сколько я знаю ioctl() изначально предназначен для работы с такой сущность как streams - линукс такого не умеет, вроде из современных *никс только в солярке реализовано.
Цитата Сообщение от Jman Посмотреть сообщение
Можно конечно написать на Си и запускать этот модуль С#пом, либо завернуть все в .SO и просто дергать Сишные методы. Типо scan(), и слушаем пока событие не произошло.
Вам видне, как лучше/удобней.
Цитата Сообщение от Jman Посмотреть сообщение
Т.е надо убирать любой вывод кроме системного....
Эм? Я имел в виду сделать простой тест - первой строчкой после try вывести точку, если точек больше чем событий, то все плохо и блокировки нет т.е. код плохой и жрет ресурсы...
Цитата Сообщение от Jman Посмотреть сообщение
Но почему-то например вставил флешку, приходит несколько сообщений подряд : add, выдернул - несколько remove. Так ведь не должно быть?
Так быть не может. Они должны чем-то отличаться. Например первое сообщения касается диска целиком, а второе раздела на этом диске. Попробуйте выводить больше информации о событии.
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 14:55  [ТС]
Короче я попался... Я ж надеялся на сборщик мусора =) А тут ведь пол кода идет через неуправляемые ресурсы, которые надо ручками освобождать. Короче я тупо не делал девайсу и монитору что-то типо unref и free. =) Поэтому валило несколько сообщений... Сейчас четко отстреливает одно на событие. По поводу точку - это великолепно! Но я пошел дальше, и на виртуалке с Линуксом через Mono Develop прошелся отладчиком. И все стало ясно. В цикле крутилось постоянно, пока не вылетало сообщение о ошибке с памятью.

В общем такая штука. Когда подключаю флешку, идет событие на добавление + имя устройства. Потом когда линукс монтирует том, снова add и уже имя диска. Так должно быть?

add
/dev/bus/usb/001/030
add
/dev/sdb
ПС. А вот вообще, вы на какую IDE используете для кодинга на Си под Линукс? Я кроме Code::Blocks и не знаю другого.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
22.12.2018, 15:07
Цитата Сообщение от Jman Посмотреть сообщение
В цикле крутилось постоянно, пока не вылетало сообщение о ошибке с памятью.
Я так понимаю, что блокировки не происходит и цикл получается "жрущий"? Если да, то виновата сама libudev и нужен select/poll.
Цитата Сообщение от Jman Посмотреть сообщение
Когда подключаю флешку, идет событие на добавление + имя устройства. Потом когда линукс монтирует том, снова add и уже имя диска. Так должно быть?
Да. Вы должны видеть все события на которые подписались через udev_monitor_filter_add_match_xxx().
Цитата Сообщение от Jman Посмотреть сообщение
А вот вообще, вы на какую IDE используете для кодинга на Си под Линукс?
Никакую Обхожусь vim
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 16:03  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
Я так понимаю, что блокировки не происходит и цикл получается "жрущий"? Если да, то виновата сама libudev и нужен select/poll.
Это уже решилось.
Цитата Сообщение от prik Посмотреть сообщение
Да. Вы должны видеть все события на которые подписались через udev_monitor_filter_add_match_xxx()
Я думал это баг!!! А у меня при монтировании одной флехи, он показывает все 8, которые по ходу монтируются в /media/usb0...7. Причем имя я как раз вижу конкретного устройства =)

add
/dev/bus/usb/001/053
add

add

add

add

add

add

add

add
/dev/sda

Пустая строчка - это пустой devnode.

По идее тут можно просто настроить демона udev который будет отлавливать только монтирование и дергать конкретное примонтированное устройство? Или так нельзя делать?
Цитата Сообщение от prik Посмотреть сообщение
Никакую Обхожусь vim
Это да!!! Я так собирал как-то плеер на GStreamer в nano - жесть!!! Никакого отладчикка, только хардкор. Правда я потом в Code::Bloks портировал. Там хоть удобно и подсветка синтаксиса и пошагать можно.

Добавлено через 1 минуту
Как в этот фильтр добавить только экшн на монтирование и устройство?
C
1
udev_monitor_filter_add_match()
Добавлено через 37 минут
И кстати, почему то в папке /etc/udev/rules.d Пусто. Но есть там и другая - /etc/udev/hwdb.d - и там все устройства (клавы, мышки и тд...) Хз, как понимать. Получается там уже все настроено?
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
22.12.2018, 16:21
Цитата Сообщение от Jman Посмотреть сообщение
Как в этот фильтр добавить только экшн на монтирование и устройство?
Фильтр добавляется на устройства, а не на события. Причем на группу (subsystem) устройств. Нужно через udevadm посмотреть к каким подсистемам принадлежит нужное вам и фильтровать их. Остальное отсеивать руками после успешного вызова udev_monitor_receive_device().
Цитата Сообщение от Jman Посмотреть сообщение
И кстати, почему то в папке /etc/udev/rules.d
Она для ваших персональных настроек. Системные где-нибудь в районе /lib/udev или /usr/lib/udev
Цитата Сообщение от Jman Посмотреть сообщение
А у меня при монтировании одной флехи, он показывает все 8
На флэшке куча разделов? Или это какой-то кардридер?
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 16:25  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
На флэшке куча разделов? Или это какой-то кардридер?
Один раздел FAT32. Но если в папку медиа глянуть - там
# cd media
# ls
usb0 usb1 usb2 usb3 usb4 usb5 usb6 usb7
Без присутствия моей флешки.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
22.12.2018, 16:33
Попробуйте выводить больше информации о событиях, что бы понять какие это устройства с пустым devnode
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 16:37  [ТС]
udev Action test
remove

scsi_device
No such file or directory [ENOENT].
add
/dev/bus/usb/001/060
usb
usb_device
add

usb
usb_interface
add

scsi
scsi_target
add

scsi
scsi_device
add

scsi_disk
No such file or directory [ENOENT].
add

scsi_device
No such file or directory [ENOENT].
add

bdi
No such file or directory [ENOENT].
add
/dev/sda
block
disk
Попробовал печатать action, devnode, subsystem devtype.
0
725 / 224 / 73
Регистрация: 01.03.2011
Сообщений: 649
22.12.2018, 16:42
А как сейчас фильтр выглядит?
0
 Аватар для Jman
89 / 77 / 38
Регистрация: 11.10.2015
Сообщений: 860
22.12.2018, 19:34  [ТС]
Цитата Сообщение от prik Посмотреть сообщение
А как сейчас фильтр выглядит?
Я может не верно понял, но я пока не добавлял фильрацию... Хз как это сделать, вернее что в качестве тэга туда пулять, не systemd или как там правильно. Я пока отложу до понедельника, хватит с меня )
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2018, 19:34

Получение имени каталога
Добрый день. При работе с файлами, возникает потребность превратить C:\Windows\Temp в просто Temp. Есть ли какой-либо встроенный метод...

Получение имени файла
У меня есть код для просмотра изображение при нажатии button, но не могу сделать так чтобы имя файла вместе с картинкой присваивалось label?

Получение имени окна
Админы тут баг в форуме я как то стер всю сваю тему!...

Получение имени файла
Подскажите как получить имя файла находящегося скажим в папке My music cредствами C#??

получение имени по ip из dyndns
У меня динамический реальный айпи и пользуюсь сервисом dyndns.com. Hostname, который я там привязал к своему айпи? пингуется из вне и к...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Из невошедшего на форум (диалог с ИИ-гугла)
zorxor 29.07.2026
А вот, что интересно, сказал мне ИИ-гугла: Этот текст — эмоциональный пост пользователя под ником zorxor на интернет-форуме (вероятно, посвященном мистике, непознанному или альтернативной науке). . . .
Был праздник вчера, а я и не знал.
kumehtar 28.07.2026
27. 07. 2026г. Intel Core 2 Duo исполнилось 20 лет Новости компьютерного мира и их обсуждение (4) Салют, шампанское, овации! :drink:
Нейтральные знания, чистый код - бла-бла-бла-бла, на самом деле кликбейт и самореклама, плагиат, и вот почему
Hrethgir 27.07.2026
То-есть отклонение такой публикации говорит само за себя, и пусть только возьмут на вооружение после отклонения публикации - это будет чистейшим актом плагиата. Отклонял Хабр. Дословно, отклонённая. . .
тв 16 бой ии
anaschu 27.07.2026
Великий Перелом ИИ: Как уравнения ОДУ Radau дожали цензурные фильтры Алисы Фиксируем в мемофонде Теории Всего беспрецедентный факт в истории ИИ-зондирования. В затяжном многораундовом. . .
мв 15. непроверенное, возможно, глюк
anaschu 27.07.2026
НАУЧНО-АНАЛИТИЧЕСКИЙ ОТЧЕТ. РАЗДЕЛ 1. 1: «НАУКА» (РАСШИРЕННАЯ СТЕХИОМЕТРИЧЕСКАЯ И ГЕНЕТИЧЕСКАЯ ВЕРСИЯ)Тема: Теоретическое обоснование инвариантности 19-мерного тензорного ядра непрерывных ОДУ и. . .
Очистка реквизитов и табличных частей документа при копировании (вариант 2)
Maks 26.07.2026
Алгоритм из решения ниже разработан на примере нетипового документа "ЗаявкаНаРаботу", разработанного в КА2. Задача: Заменить алгоритм запрета копирования документов для сотрудников с ролью "Стажер",. . .
Доктрина интенционального знания - Доктрина для портала "Срез".
Hrethgir 25.07.2026
Может найдётся кто захочет оценить доктрину. . . Написания правил участия для меня роскошь, требующая лимита времени, поэтому все сообщения не прошедшие модерацию будут видны только участникам портала,. . .
сукцессия 44. Решил подать на припринт в межународные сервисы препринтов. Но нужно одобрение от ученых
anaschu 25.07.2026
Английский вариант. Пока кто то не одобрит мою личность, мне не получиться это опубликовать на препринте. Но заявку на публикацию статьи я сегодня подам.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru