• Для чего нужен singleton?

    @MarkusD
    все время мелю чепуху :)
    В буквальном смысле синглтон призван упростить владение, инициализацию, контроль времени жизни и доступ к элементам глобального состояния программы. Эта фраза является самой важной. А важнее всего - правильно понять ее.

    Подход многократно обличался антипаттерном за то, что "глобальное состояние программы - это зло", не смотря на то, что глобальное состояние продолжает оставаться в программе даже после удаления всех синглтонов из проекта.
    Я видел проекты с более чем 50 синглтонами и очень тяжелыми проблемами их связи между собой. В синглтоны без разбора и по незнанке вытаскивали буквально все. Это яркий пример антиподхода применения абсолютно любого паттерна.
    Важно понимать что никакой элемент проектирования не является антипаттерном, он приводит к проблемам только при неумелом использовании.

    Приложение состоящее ровно из одной UI формы будет иметь глобальное состояние в виде этой формы вне зависимости от того, будет ли эта форма оформлена как синглтон или нет. Просто, если нет, то этой формой приходится управлять иными путями, не всегда более удобными чем синглтон.

    В качестве альтернативы синглтонам пропагандируются два других подхода: Registry / Service locator и Dependency injection.
    К слову, все альтернативы столь же активно и все так же незаслуженно обзываются антипаттернами. :)

    Теперь к примерам.
    - DirectX. Для работы с графикой тебе необходимо по одной инстанции интерфейсов IDirect3D и IDirect3DDevice. Эти две инстанции декларируют глобальное состояние программы. Инстанции всех буферов, текстур, шейдеров и поверхностей создаются с использованием этих инстанций. Разумным будет предоставить доступ к инстанциям DirectX через подход синглтона.
    - OpenGL старых добрых версий. Процедурный интерфейс OpenGL как бы намекает на отсутствие необходимости в глобальном состоянии. Но не тут то было. Для работы с OpenGL необходимо не просто создать контекст, но еще и помнить поток, в котором этот контекст связан с поверхностью вывода. В многопоточной среде контекстов может быть несколько для параллельной загрузки ресурсов. В этом случае помнить надо уже два потока и два контекста (минимум). Само собой, в синглтоне это глобальное состояние смотрится удобнее.
    - Sockets. Не важно какие. Когда твое приложение представляет собой MMO проект и у тебя гора подсистем, постоянно и обособленно общающихся с сервером, сетевое подключение разумно оформить в виде синглтона.
    - Assets/Resources - они бывают разные, кешируемые и нет, доступные из сети, с жесткого диска, из подсистемы пререндеринга. Опять же, я несколько раз видел боль и страдания от неоднородного контроля ресурсов без соответствующей подсистемы. А сама подсистема управления ресурсами всегда централизована и лучше всего реализуется именно на синглтоне.

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

    EvilsInterrupt
    @EvilsInterrupt
    System programming, Reversing Engineering, C++
    Есть такая поговорка "Скажи мне кто твои друзья и я скажу кто ты". Если хотите чему-то научиться и координально поменять свою жизнь и самого себя, то настоятельно советую поместить себя именно в то окружение, где по большей части те люди на которых Вы бы хоть немного но хотели быть похожими и у которых можно многому научиться.

    Это мой собственный опыт.

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

    Все это дало мне то, что неявным образом у меня сформировалось мышление, привычки, действия, ритуалы и др. таким образом, что аж диву даешься "И это я?". К примеру от математиков прям железобетонно вбилось в голову фраза "Необходимо и достаточно", т.е. есть задача значит надо сделать настолько мало насколько это возможно, но при этом чтобы задача была решена!

    Рекомендую Вам прежде всего надо спросить себя "А что именно хочу?" и "Какие у меня мечты?". Ежедневно спрашивать себя "Какие задачи должен сегодня сделать чтобы хоть на чуть чуть приблизиться к моим мечтам?".
    Ответ написан
    6 комментариев
  • Как установить один IP адрес на два виртуальных сервера?

    Bessome
    @Bessome
    Администратор Linux, Windows. 1С программист
    делаем машину с сервисом nginx, с белым IP; nginx в режиме прокси. В nginx конфиге прописываем где какой сайт лежит, привожу пример своего конфига:
    root@ppserver:/etc/nginx# cat nginx.conf
    user www-data;
    worker_processes  4;
    
    error_log  /var/log/nginx/error.log;
    pid        /var/run/nginx.pid;
    
    events {
        worker_connections  1024;
    }
    
    http {
        include       /etc/nginx/mime.types;
        default_type  application/octet-stream;
        proxy_cache_path /var/lib/nginx/proxy levels=1:2 keys_zone=proxy_cache:64m max_size=128m inactive=3d;
        reset_timedout_connection on;
        client_header_timeout 15;
        client_body_timeout 15;
        send_timeout 5;
        keepalive_timeout        30 15;
        limit_conn_zone  $binary_remote_addr  zone=perip:5m;
        limit_conn perip 50;
        connection_pool_size 256;
        client_header_buffer_size 1k;
        large_client_header_buffers 4 2k;
        request_pool_size 4k;
        types_hash_max_size 2048;
        server_names_hash_bucket_size  64;
        access_log  /var/log/nginx/access.log;
        sendfile        on;
        tcp_nopush     on;
        tcp_nodelay        on;
        gzip              on;
        gzip_proxied      expired no-cache no-store private auth;
        gzip_buffers      16 8k;
        gzip_comp_level   5;
        gzip_http_version 1.0;
        gzip_min_length   0;
        gzip_vary         on;
        server_tokens off;
        output_buffers 1 32k;
        postpone_output 1460;
        ignore_invalid_headers on;
        client_max_body_size 64m;
        include /etc/nginx/conf.d/*.conf;
        include /etc/nginx/sites-enabled/*;
    }
    
    root@ppserver:/etc/nginx/sites-enabled# cat default
    server {
            listen   *:80; ## listen for ipv4; this line is default and implied
            return 301 https://$host$request_uri;
    }
    
    server {
    
        listen 443;
        server_name blabla.ru;
    
        ssl_certificate           /etc/nginx/cert.crt;
        ssl_certificate_key       /etc/nginx/cert.key;
    
        ssl on;
        ssl_session_cache  builtin:1000  shared:SSL:10m;
        ssl_protocols  TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!eNULL:!EXPORT:!CAMELLIA:!DES:!MD5:!PSK:!RC4;
        ssl_prefer_server_ciphers on;
    
        access_log /var/log/nginx/access.log;
    
            proxy_buffering on;
            limit_conn perip 32;
    
        location / {
            proxy_pass http://192.168.20.5/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 120;
            proxy_send_timeout 120;
            proxy_read_timeout 180;
        }
    
        location /pve {
            proxy_pass https://192.168.20.100:8006/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 120;
            proxy_send_timeout 120;
            proxy_read_timeout 180;
        }
    
        location /cam32 {
            proxy_pass http://10.1.1.239/;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $remote_addr;
            proxy_connect_timeout 120;
            proxy_send_timeout 120;
            proxy_read_timeout 180;
        }
    }


    два файла -
    1. конфиг nginx.conf
    2. конфиг default, расположенный /etc/nginx/sites-enabled

    в конфиге (2) прописаны несколько различных серверов подсети, которые по различным ссылкам показывает nginx. Работает только по https, так как мне нужен защищенный траффик. Можно модифицировать для http, убрав строчку "return 301 https://$host$request_uri;" и назначив порт не 443, а 80. Так же надо удалить все, что связано с ssl из конфига.

    Не трогаем две машины с внутренними IP.
    Ответ написан
    3 комментария
  • Как лечится кризис начинающего программиста?

    DmitryITWorksMakarov
    @DmitryITWorksMakarov
    Начинай писать какой-нибудь проект. Я в свое время, когда учился программировать (правда по другой книге: "С# для профессионалов" какая-то из редакций), тоже заскучал.....начал писать проекты (например, решение системы линейных уравнений с произвольным порядком, что-то с нейронными сетями еще делал, с СОМ-портом что-то)....появилась какая-то уверенность в своих силах.....появились вопросы....искал в "интернетах", возвращался к книжке....в итоге язык освоил, а книжку использую как справочник.
    Ответ написан
    Комментировать
  • Как лечится кризис начинающего программиста?

    Fesor
    @Fesor
    Full-stack developer (Symfony, Angular)
    Доктор, что со мной?

    Волчанка

    или неправильно рассматриваю обучение в целом

    из того что вы расписали у вас в целом и нет этого процесса обучения. Теория это хорошо, но без практики вы не сможете усваивать полученные знания. Так что больше практики.
    Ответ написан
    4 комментария
  • Как найти стабильную удалённую работу Web разработчику? Реально ли?

    codingal
    @codingal
    Front end и не только
    Найти постоянную удаленку можно.
    Но есть моменты, которые стоит учесть.
    Во-первых, это зависит от вашей локации, если вы из крупного города, то будьте готовы "подвинуться" в зп.
    Во-вторых, будьте готовы принять на себя более широкий спектр обязанностей - надо будет при необходимости и сервер настроить или иконку найти/нарисовать.
    В-третьих, выше степень ответственности - поставили эстимейт - надо успевать, это в офисе видно, что вы целый день работали, но по каким-то причинам не успели, а на удаленке условия будут пожестче, т.к. основной критерий оценки вашей работы - выполнение задач в срок.
    Ответ написан
    3 комментария
  • Java junior developer кратчайший путь с нуля до реальной работы?

    gadfi
    @gadfi
    https://gamega.org
    почему именно java ? да зп на уровне но вход явно выше чем в других областях.
    Верстка вход вполне реален за 1-2 месяца
    php не на много больше чтоб до джуна дорасти
    если все же хочется java то лучше android вход ниже чем в java ee

    ссылки Как написать простое приложение на Android?
    Ответ написан
    7 комментариев
  • Как прeодолеть зону комфорта, стать фрилансером не обанкротившись?

    @Ramallah
    Мужик, не повторяй моих ошибок )
    Фриланс это не такая шара как может показаться.
    Ответ написан
    Комментировать
  • Что изучать вместо JAVA?

    fenric
    @fenric
    Попробуйте поработать таксистом, вдруг понравится?
    Ответ написан
    Комментировать