Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.76/21: Рейтинг темы: голосов - 21, средняя оценка - 4.76
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826

Масштабирование системы при использовании паттерна Singleton

04.01.2017, 10:51. Показов 4523. Ответов 85
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день, как доказать или опровергнуть, что архитектура теряет гибкость и расширяемость при активном использовании паттерна Singleton.
1
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.01.2017, 10:51
Ответы с готовыми решениями:

Насчёт шаблонного паттерна SingleTon
Есть код паттерна template<class T> class Singleton { private: static T* ptr; protected: Singleton();

Необходима альтернатива при использовании Proxy паттерна
Здравствуйте, возникла проблема, которую я так и не придумал, как рационально решить. В общем, задача состояла в том, чтобы отследить...

Реализация паттерна Singleton
Добрый день. Необходимо реализовать класс Storage, объект которого будет единственным в программе. Для достижения данной цели было выбрано...

85
Любитель чаепитий
 Аватар для GbaLog-
3745 / 1801 / 566
Регистрация: 24.08.2014
Сообщений: 6,020
Записей в блоге: 1
04.01.2017, 11:44
А почему считается, что теряет? Есть же как минимум DeletableSingleton, а так же Singleton с определенной продолжительностью жизни, если речь идёт о статике. У Александреску всё об этом расписано.

Не по теме:

Жаль, что я ещё не дошёл, а то бы пояснил тут. :D

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.01.2017, 19:25
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
как доказать или опровергнуть, что архитектура теряет гибкость и расширяемость при активном использовании паттерна Singleton.
никак.
гибкость и расширяемость никак не зависит от факта использования паттернов.
3
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.01.2017, 20:22  [ТС]
hoggy, с разумного я мог объяснить:
1) что синглтон подразумевает, что имя класса от которого вызывается Foo::GetInstance тянется по всем файлам, и любые правки в header'e синглтона, в том числе его имени приведут к изменениям во многих файлах
2) так, что синглтон как правило это не полиморфные методы и использовать все прелести фразы "один интерфейс - множестве реализаций" для строки Foo::GetInstance().print(); - не особо уместно
3) ну и тот факт, что если вместо Printer::getInstance()->print(data); - мы решили перейти на SuperPuperPrinter - правки не ограничатся "в одном месте", а если правок больше чем в одном месте, то даже по Макконнеллу это называется "гавнокод"

Как я понимаю всё не верно, и я сравнивал зелёное с тёплым?

Добавлено через 4 минуты
И опять же таки - разве паттерн фабрика не делает систему гибкой к изменениям в той части системы, что покрывает данный паттерн?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.01.2017, 21:06
Лучший ответ Сообщение было отмечено rikimaru2013 как решение

Решение

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
1) что синглтон подразумевает, что имя класса от которого вызывается Foo::GetInstance тянется по всем файлам, и любые правки в header'e синглтона, в том числе его имени приведут к изменениям во многих файлах
это ортогонально самому паттерну.
ровно тоже самое можно сказать абсолютно про любой хедер.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
2) так, что синглтон как правило это не полиморфные методы и использовать все прелести фразы "один интерфейс - множестве реализаций" для строки Foo::GetInstance().print(); - не особо уместно
от задачи, от реализации зависит.
сингелтоны вполне себе дружат в полиморфизмом.
была бы потребность и желание.

например:

C++
1
2
3
4
5
6
7
8
9
10
11
12
void sample()
{
     // всякая фигня
 
    log.pushPrinter<customPrinter>();  //<--- локальная настройка глобального объекта
 
    log << "hello!";  //<--- используем кастомный принтер
 
    log.popPrinter(); //<--- глобальный объект в исходное состояние
 
     // всякая фигня
}
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
ну и тот факт, что если вместо Printer::getInstance()->print(data); - мы решили перейти на SuperPuperPrinter - правки не ограничатся "в одном месте", а если правок больше чем в одном месте, то даже по Макконнеллу это называется "гавнокод"
опять таки, все зависит от реализации.

C++
1
2
3
4
5
// где нибудь в мейне
Printer::getInstance().setMethod<SuperPuper>();
...
 
Printer::getInstance()->print(data); //<--- клиентский код без изменений
ну или вот, более реалистичный пример,
редирект std::cout в строку:

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
#pragma once
 
//------------------------------------------------------------------------------------------------------//
 
#ifndef _STRING_
    #error #include <string> first
#endif
 
#ifndef _IOSTREAM_
    #error #include <iostream> first
#endif
 
#ifndef _SSTREAM_
    #error #include <sstream> first
#endif
 
//------------------------------------------------------------------------------------------------------//
 
struct cout_redirectA
{
    ~cout_redirectA() { this->off(); }
 
    cout_redirectA(std::streambuf& new_buffer): m_old(){ this->on(new_buffer); }
    cout_redirectA(): m_old() { this->on(); }
 
    void off() 
    { 
        if(!m_old)
            return;
 
        assert(std::cout);
        std::cout.flush();
        std::cout.rdbuf(m_old); 
        m_old = nullptr;
        assert(std::cout);
        assert(!m_old);
    }
    
    void on() { this->on( *get().rdbuf() ); }
 
    void on(std::streambuf& new_buffer) 
    { 
        assert(std::cout);
        std::cout.flush();
        m_old = std::cout.rdbuf(&new_buffer); 
        assert(std::cout);
        assert(m_old);
    }
 
    static std::string captureA()
    {
        assert(std::cout);
        std::stringstream ss;
        ss << std::cout.rdbuf();
        std::cout.flush();
        assert(std::cout);
        return ss.str();
    }
private:
    std::stringstream& get()
    {
        static std::stringstream ss;
        return ss;
    }
    std::streambuf* m_old;
};
 
//------------------------------------------------------------------------------------------------------//
 
struct cout_redirectW
{
    ~cout_redirectW() { this->off(); }
 
    cout_redirectW(std::wstreambuf& new_buffer): m_old() { this->on(new_buffer); }
    cout_redirectW(): m_old() { this->on(); }
 
    void off() 
    { 
        if(!m_old)
            return;
 
        assert(std::wcout);
        std::wcout.rdbuf(m_old); 
        m_old = nullptr;
        assert(std::wcout);
        assert(!m_old);
    }
    
    void on() { this->on( *get().rdbuf() ); }
 
    void on(std::wstreambuf& new_buffer) 
    { 
        assert(std::wcout);
        std::wcout.flush();
        m_old = std::wcout.rdbuf(&new_buffer); 
        assert(std::wcout);
        assert(m_old);
    }
 
    static std::wstring captureW()
    {
        assert(std::wcout);
        std::wstringstream ss;
        ss << std::wcout.rdbuf();
        std::wcout.flush();
        assert(std::wcout);
        return ss.str();
    }
private:
    std::wstringstream& get()
    {
        static std::wstringstream ss;
        return ss;
    }
    std::wstreambuf* m_old;
};
 
//------------------------------------------------------------------------------------------------------//
 
struct cout_redirect: cout_redirectA, cout_redirectW
{
    cout_redirect()
        :cout_redirectA()
        ,cout_redirectW()
    {}
 
    cout_redirect(std::streambuf& new_buffer)
        :cout_redirectA(new_buffer)
        ,cout_redirectW()
    {}
 
    cout_redirect(std::wstreambuf& new_buffer)
        :cout_redirectA()
        ,cout_redirectW(new_buffer)
    {}
 
    operator std::string()const  { return cout_redirectA::captureA(); }
    operator std::wstring()const { return cout_redirectW::captureW(); }
    void off()
    {
        cout_redirectA::off();
        cout_redirectW::off();
    }
    void on() 
    {  
        cout_redirectA::on();
        cout_redirectW::on();
    }
    using::cout_redirectA::on;
    using::cout_redirectW::on;
};
 
//------------------------------------------------------------------------------------------------------//
 
 
TEST(CASENAME_, TNUM_(sample, 005))
{
    // --- stress-test
 
    cout_redirect redirect;
    std::wcout << L"ololo\ntrololo\n";
    std::wstring captured = redirect;
    redirect.off();
    
    std::wcout <<L"captured: '"<< captured << L"'\n";
    ASSERT_TRUE(captured == L"ololo\ntrololo\n");
 
    redirect.on();
    std::wcout << L"ololo\ntrololo\n";
    std::wstring wcaptured = redirect;
    redirect.off();
    
    std::wcout <<L"captured: '"<< wcaptured << L"'\n";
    ASSERT_TRUE(wcaptured == L"ololo\ntrololo\n");
 
    redirect.on();
    std::cout << "ololo\ntrololo\n";
    std::string captured2 = redirect;
    redirect.off();
    
    std::cout <<"captured: '"<< captured2 << "'\n";
    ASSERT_TRUE(captured2 == "ololo\ntrololo\n");
}
вообще сингелтон, как паттерн - это просто способ гарантировать,
что объект будет создан в единственном экземпляре.
собственно на этом всё.
а уж что там за механизм,
какой у него будет дизайн - это зависит от конкретной задачи.
как захотите, так и сделаете.
нужна гибкость - да пожалуйста.
никто как бы не мешает.

Цитата Сообщение от rikimaru2013 Посмотреть сообщение
И опять же таки - разве паттерн фабрика не делает систему гибкой к изменениям в той части системы, что покрывает данный паттерн?
ну не совсем.
задача фабрики - инкапсулировать от клиентов
принцип инициализации объектов-конкретной-реализации.
и таким образом реализуется идеома "закрыт для изменений, открыт для расширений".
однако говорить о каких то изменениях не вполне уместно.
потому что с точки зрения клиентов ничего не изменилось.
2
2549 / 1208 / 358
Регистрация: 30.11.2013
Сообщений: 3,826
04.01.2017, 21:24  [ТС]
hoggy, да пожалуй, я вовсе забыл, что паттерны это уровень абстракции, и является лишь направлением в решении частой проблемы в программировании. Пользователь сам решает конкретную реализацию для его архитектуры.
0
04.01.2017, 21:36

Не по теме:

Цитата Сообщение от hoggy Посмотреть сообщение
TEST(CASENAME_, TNUM_(sample, 005))
А что это за макрос? Не буст ли?

0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
04.01.2017, 22:31
Цитата Сообщение от rikimaru2013 Посмотреть сообщение
я вовсе забыл, что паттерны это уровень абстракции, и является лишь направлением в решении частой проблемы в программировании. Пользователь сам решает конкретную реализацию для его архитектуры.
ага))
Цитата Сообщение от GbaLog- Посмотреть сообщение
А что это за макрос? Не буст ли?
Google Test
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
05.01.2017, 22:17
На самом деле это я спросил у rikimaru2013 и у gru74ik.
Я не хотел создавать тему. Я знаю о некотором их интересе к ООП, думал, что мой маленький барьер темы не стоит, но, оказалось, простой вопрос спровоцировал сомнения.

Вот они и решили, что всё-таки правильно темку создать.
У меня есть тема в разделе ООП Паттерны. Нужны небольшие пояснения.

====================
Что я могу сказать? Тут в большей части всё упирается в многопоточность, насколько я вижу. Кодов я этих приведённых понять сейчас не смогу, также я не особо могу понять зачем упираться в код, когда паттерн синглтон - это только-лишь вид задачи. Я представлял себе, что можно объяснить проблему недостатка синглтона на модели современных объектов мира. Так, я у Рикамару спрашивал, сможет ли он мне привести пример на модели светофор, где светофор - изначально синглтон.
Сможет ли кто-нибудь придумать такой пример на простом светофоре, где светофор описан синглтоном, но какие-то потребности (какие потребности?) и - облом, оказалось, что синглтон оказался помехой, пришлось переписывать систему.
Сначала был только один светофор, и ничто не предвещало беды.

Меня в последнее время трудно люди понимают, но, буду надеяться, что эту мысль сформулировал я достаточно ясно.
2
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
06.01.2017, 00:00
Лучший ответ Сообщение было отмечено gru74ik как решение

Решение

Цитата Сообщение от GbaLog- Посмотреть сообщение
если речь идёт о статике
В том то и дело, что статика это очень скользкая дорожка.

Цитата Сообщение от daslex Посмотреть сообщение
Сначала был только один светофор, и ничто не предвещало беды.
И когда случалась авария на этом перекрестке у этого светофора, "добрые дяди" писали в акте "на светофоре", но потом поставили еще один светофор, "добрые дяди" переписали всю историю аварий на "светофоре 1", и оставили управление светофорами одинаковое (т.е. переключаются они одновременно). // Т.е. появилось еще одно использование сингелтона, все нормально, для этого он и затевался.

Потом светофоров стало 10 и они всё еще переключаются одновременно, это жителям не понравилось, "добрые дяди" сказали, да будут дороги в нашем городе свободны и сделали кастомизацию для светофоров, по примеру hoggy, (т.е. сингелтон стал теперь у нас "недо шаблоном Состояние", но идеологически подходит).

Шли годы, город рос, светофоров стало слишком много и захотели жители сделать светофоры зависимыми друг от друга, ну там светофор для пешеходов который стоит в 50 метрах от перекрестка, который включают пешеходы руками, а последующий светофор не изменяет своё состояние и в результате на перекрестке никто не едет( на зеленом никого нет, а на красный ехать нини), тоска и боль одолевала жителей и тогда пришли они, самые настоящие костыли:
Вариант 1 : Объекты кастомизирующие светофоры сделать сингелтонами, ну пока такой перекресток 1, жить можно, если прошедшие годы в городе вас ничему не научили
Вариант 2 : Запаковать все эти кастомизации в сингелтон и построить в нём еще одно параллельное архитектурное дерево. // И иногда это даже хорошо выглядит, ведь нам не нужно в районах знать о светофорах ( предполагаемая структура : город->район->улица->перекресток) и мы можем не тянуть их через все сущности, хотя тут не все так гладко, инициализация уже будет не такой прозрачной, но это малость.
Вариант 3 : Выпилить сингелтон и создать светофоры там где они нужны и протянуть "ссылки" туда где они нужны.

Самая большая проблема сингелтонов : Нет ничего более постоянного чем временное - это невозможно понять, это нужно запомнить, либо потом будет(хорошо, хорошо, может случиться так) Будь проклят тот день когда я сел за баранку этого пылесоса

Всех с праздниками, сингелтонов маленьких всем побольше, а больших поменьше.
4
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2017, 00:04
daslex, я боюсь написать тривиальную глупость, но не настолько чтобы этого и не сделать.
Я немного сталкивался с этим паттерном и для себя решил, что он должен решать только те задачи, которые без него не получается решить простым способом. Он похож на статический член, если говорить о видимости класса и на глобальную переменную, если говорить о области видимости программы. Вот пример, - статический член, - корень дерева. Можно обойтись? Конечно. Но тогда корень надо включить в класс который будет использовать ноды и работать через этот класс. Или передавать в конструкторе каждого нода указатель на корень как параметр. Б-р-р. И так и так сложнее, чем сделать корень статическим членом. Но простота статического члена оборачивается невозможностью создать два и более дерева с разными корнями, то есть разных дерева.
О глобальных переменных вряд ли имеет смысл говорить. Если это константа, да ещё прикрытая пространством имён, то это удобно. Иначе и пространство имён засоряется и появляются переменные, которые неизвестно кто и когда изменяет.
А снглтон вполне подходит как соблазн организовать через него взаимодействие. Создать флаг "который будут менять те кому это надо" и наблюдать "те кому это интересно", например. Тут и ломается модульность, которая требует, чтобы сигналы шли от тех, кто их порождает к тем, кому они адресованы. Без глобальных переменных то есть.
Но соблазны, это не причина придавать анафеме. У каждого есть своя голова на плечах. Это главный сиглтон. Потому как две говорят, - неустойчивое количество. Обычно их нечётное число, как говорил один Горыныч.
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2017, 16:50
Цитата Сообщение от Nosey Посмотреть сообщение
Потом светофоров стало 10
тему не читал. но вам не нужен сингелтон
1
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
06.01.2017, 17:31
hoggy, кому не нужен: мне или Nosey?
Если что, это у него мой придуманный синглтон множится.

У меня есть просто светофор, который сначала моргает двумя фарами, потом тремя, потом он уже настраивается на контингент: пешеход или водитель, - водителю моргает фарами, пешеходам информативно что-то пишет. ПО светофора потихоньку расширяется. Напрашивается вывод, что система масштабируется.

Я как-то вообще склонен думать, что если что-то завязать на синглтон, то ничего хорошего не будет, он же один - жди очереди, а вот если наоборот, то ничего плохого случиться не должно. Мне представляется, что один синглтон может выступать в роли достаточно хорошего распределителя.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
06.01.2017, 17:34
rikimaru2013,
Проблема синглтона в том что в коде проявляется зависимость от конкретного типа
Так же это фактически глобальная переменная
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
06.01.2017, 18:17
Цитата Сообщение от daslex Посмотреть сообщение
кому не нужен: мне или Nosey?
ему.


Цитата Сообщение от daslex Посмотреть сообщение
Я как-то вообще склонен думать, что если что-то завязать на синглтон, то ничего хорошего не будет, он же один - жди очереди, а вот если наоборот, то ничего плохого случиться не должно.
и вам.

Добавлено через 51 секунду
Цитата Сообщение от sys_beginner Посмотреть сообщение
Проблема синглтона в том что в коде проявляется зависимость от конкретного типа
это зависит от реализации.
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
06.01.2017, 18:47
То, что я склонен как-то думать - это не значит, что я в чём-то определён.
То, что я склонен так думать - это следствие развития темы.
0
901 / 478 / 93
Регистрация: 10.06.2014
Сообщений: 2,700
06.01.2017, 19:04
Цитата Сообщение от hoggy Посмотреть сообщение
это зависит от реализации.
конкретный_тип::getInstance() это всегда зависимость от конкретного типа
другое дело если реализовать обертку которая один раз создает объект а при последующих вызовах его возвращает
но это уже не совсем синглтон

Добавлено через 5 минут
ещё есть вариант где то внутри фабрики конкретного типа вызывать синглтон и передавать его создаваемому объекту
если вызывать его в клиентском коде то зависимость достаточно существенная
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
06.01.2017, 19:33
Цитата Сообщение от hoggy Посмотреть сообщение
тему не читал. но вам не нужен сингелтон
Читал, но да, вам не нужен сингелтон. особенно не нужен если понятие "Вам" включает работу >10 человек.
hoggy, Если вы намекаете на ваш "редирект std::cout в строку", то ну что, отличный хеллоу ворд, чё

Цитата Сообщение от daslex Посмотреть сообщение
У меня есть просто светофор, который сначала моргает двумя фарами, потом тремя, потом он уже настраивается на контингент: пешеход или водитель, - водителю моргает фарами, пешеходам информативно что-то пишет. ПО светофора потихоньку расширяется. Напрашивается вывод, что система масштабируется.
Конечно, если сущность не надо множить, то сингелтон для этого и придуман, быть одним, и его потенциальная высокая внутренняя сложность при усиленном масштабировании никак не зависит от того сингелтон это или нет. При усиленном масштабировании затрагивающем интерфейс сингелтона, может измениться идеология использования этого интерфейса, что потребует некоторых усилий от других разработчиков для его понимания.
Но это всё пальцем по воде, если сингелтон будет один, но гарантировать в случае разработки живого проекта его единственность - никто не может.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
06.01.2017, 22:23
Цитата Сообщение от daslex Посмотреть сообщение
Я как-то вообще склонен думать, что если что-то завязать на синглтон, то ничего хорошего не будет, он же один - жди очереди,
А если главной проблемой оказывается не перекрытая возможность создать второй экземпляр? А такой объект как std::cout разве навевает грусть? Как по мне, - забавный зверёк. И на своём месте.
Правда это глобальный объект, но похоже ведь?
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
07.01.2017, 00:02
Странно звучит слово "придуман". Он как бы всегда существовал и однажды начал быть нужным.
Я с cout не понимаю. Будьте добры, внесите немного конкретики.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.01.2017, 00:02
Помогаю со студенческими работами здесь

Может ли потребоваться применение механизма событий при использовании паттерна MVVM?
Паттерн MVVM провозглашён как базовый паттерн для приложений WPF. В паттерне MVVM используется механизм команд. То есть, если...

Настройка системы при использовании SSD
Здравствуйте. Хотелось бы знать, нужно ли настраивать систему при использовании SSD.

Постоянно прохожу проверку CAPTCHA при использовании поисковой системы
Доброго времени суток. Проблема следующая: при поиске в гугле или яндексе эти поисковые системы постоянно запрашивают пройти проверку...

Collections: singleton/singletonList/singletonMap. Что значит слово singleton?
Заметил, что в классе Collections (утилитный класс) имеются методы для оборачивания элемента в set/list/map Все эти методы содержат в...

Установка "лимита" на значение решения системы ОДУ при использовании решателя ode45
Добрый день. Есть такая задачка: при решении системы дифференциальных уравнений, пусть одно из решений имеет величину, условно говоря, с 1...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru