• Какую обёртку сделать для api?

    @3ton
    У нас когда-то была схожая проблема, но только обновлять приходилось с самописа на Yii1.
    Проект слишком большой, потому приняли решение то что добавляем новое или рефакторим - делаем на Yii1 и переносим по адресу https://project_url/y/....
    Но так как проект слишком большой и постоянно в работе, а перенести все на yii1 так и не вышло, то решили со временем начинать писать полностью отрефактореный бэк на Yii2 что к нашей радости смогли реализовать.

    Касательно фронта - изначально был самопис, но после выбрана была не нами CMS Typo3, а мы лишь организовывали написание расширений работающих сначала на WSDL(10 лет назад), а теперь используем RPC API.
    Как результат мы смогли отдать фронт на отработку сторонним командам, а сами занимаемся бэком. При этом на фронте не хранятся ни пользовательские пароли, ни личные данные в виде адресов, кредиток, счетов и т.д. и т.п.

    Использование CMS для фронта дало не мало плюсов, даже если у заказчика нет своей команды - он может из репозитория поставить уже имеющиеся расширения и получить нужный функционал.
    Ответ написан
    Комментировать
  • Yii2 правило для маршрута?

    @3ton
    Как указал iljaGolubev проще всего и наверно правильней если у вас лишь один такой урл.
    Если же их много, то вы скорей всего забудете некоторые либо устанете их тянуть в процессе разработки. Тогда проще после описания конфига описать цикл для блокируемых путей

    if(!defined('YII_DEBUG') || YII_DEBUG === false)
    {
        $disallowRoute = ['test','test/mode2','result2'];
        foreach($disallowRoute as $route)
        {
            $config['components']['urlManager']['rules'][$route] = 'error/404';
        }
    }
    Ответ написан
    Комментировать
  • Как правильно раздедить фронтенд и бекенд в монолитном проекте на php?

    @3ton
    В свое время мы столкнулись с такой же проблемой - разделить монолит на фронт и бэк отдельно.

    Пошли простым путем: выдали на бэке отдельно методы API для фронта, а с фронта работали с ними из CMS, в которой написали свои расширения и ими формировали функционал реализованный ранее лапшекодом.

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

    @3ton
    Попробуйте копнуть в эту сторону
    https://habr.com/ru/post/308652/
    Ответ написан
    Комментировать
  • Выучил синтаксис языка. как использовать его на практике?

    @3ton
    Каждый выбирает свой способ постичь дзен в выбранном языке. Но у большинства одно и то же направление. Мой подход не сильно отличается от остальных, но есть свои моменты.
    1. Во первых лучше всего вспомнить что вы раньше не имея навыков программирования желали сделать и поставить это своей целью. Описать все это где-то на электронном или бумажном носителе, так как если вам на данный момент кажется что все предельно ясно и вас ночью разбудить и вы все это наизусть произнесете, будьте уверены что после кучи часов искания как вам реализовать тот или иной момент вашей задачи вы будете помнить лишь очертания задачи, а тонкости уже не будут такими ясными и результат будет меняться...
    2. Вам явно не стоит пытаться реализовать что-то стандартное которое везде описывают, так как вы научитесь просто читать статьи и туториалы и копировать строки оттуда в свой код, вы извините, но человек существо ленивое и почти всегда выбирает путь наименьшего сопротивления.
    3. Даже реализовав проект вы получаете навыки постановки себе задач и их реализации, но вы все еще остаетесь начинающим программистом. дело в том что за свои почти 15 лет в РНР я не раз встречал работу РНР кода отличающуюся от ожиданий(и даже документации, либо же недокументированное поведение определенных комбинаций кода), а это уже - опыт...
    4. изучать фреймворки это клево и нужно, но пытаться сразу выделить себе какой-то фреймоврк и строить задачи на нем - не верно, вы научитесь лишь его функционалу, но понимание того как это делает за вас фреймворк - останется черным ящиком. а если вы посмотрите логи обновления версий фреймворка, то вы увидите сколько там происходит изменений и обновлений в логике, что уже означает - мало того что вы будете принимать на веру то что в черном ящике, так еще и от версии к версии это может совсем не так работать как вы приняли на веру в момент изучения...

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

    @3ton Автор вопроса
    Произвел оптимизацию кода и уменьшил кол-во записей в один и тот же документ.

    Теперь кол-во Thread'ов продолжает расти, но память держит себя в норме

    Правда случаются непонятки и код завершает Thread не давая отработать всему коду в call.on_end
    При этом стали появляться в логи adhearsion.log ошибки вида
    [2021-08-31 18:15:31.879] ERROR Adhearsion::OutboundCall: 2f4a0aa4-8582-4cde-819b-367aa24ad4b2@10.0.0.106: <Celluloid::Task::TerminatedError> task was terminated
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:32:in `terminate'
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:404:in `block in cleanup'
    --
    [2021-08-31 18:16:32.133] ERROR Adhearsion::Call: f10e279b-bf13-433f-b98f-b04b673e24fe@10.0.0.106: <Celluloid::Task::TerminatedError> task was terminated
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:32:in `terminate'
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:404:in `block in cleanup'
    --
    [2021-08-31 18:17:38.997] ERROR Adhearsion::Call: 688a99ec-3871-4a40-85d5-088949f4d4a5@10.0.0.106: <Celluloid::Task::TerminatedError> task was terminated
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:32:in `terminate'
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:404:in `block in cleanup'
    --
    [2021-08-31 18:18:58.485] ERROR Adhearsion::Call: b418acac-d3e9-41ff-85fc-6c6c54e577b7@10.0.0.106: <Celluloid::Task::TerminatedError> task was terminated
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:32:in `terminate'
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:404:in `block in cleanup'
    --
    [2021-08-31 18:20:57.680] ERROR Adhearsion::OutboundCall: 3b189dd2-4dc5-4680-8c4b-97a3ad71d18e@10.0.0.106: <Celluloid::Task::TerminatedError> task was terminated
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:32:in `terminate'
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:404:in `block in cleanup'
    --
    [2021-08-31 18:22:23.770] ERROR Adhearsion::OutboundCall: d4d7049e-8913-486e-8a16-e50edce4a4bd@10.0.0.106: <Celluloid::Task::TerminatedError> task was terminated
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:32:in `terminate'
    	/usr/local/rvm/gems/ruby-2.3.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:404:in `block in cleanup'
    Ответ написан
    Комментировать
  • Как гарантированно сохранить в MONGO объект с помощью ruby Mongoid::Document?

    @3ton Автор вопроса
    вот портянка изменений

    для надежности навесил трекинг на изменения объекта через include Mongoid::History::Trackable
    каждая сессия может иметь один и более объектов call - Это ноги самой сессии, в нормальной ситуации их 2 - один звонок на один номер, другой на второй и потом их соеденяет в сессию
    /* 1 createdAt:25.08.2021, 10:41:47*/
    {
    	"_id" : ObjectId("6125f43b25930e44e8f71eec"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f0a425930e44e8f71e75")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		
    	},
    	"modified" : {
    		"duration" : NumberInt(897)
    	},
    	"version" : NumberInt(5),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:41:47.374+03:00"),
    	"created_at" : ISODate("2021-08-25T10:41:47.374+03:00")
    },
    
    /* 2 createdAt:25.08.2021, 10:41:47*/
    {
    	"_id" : ObjectId("6125f43b25930e44e8f71eeb"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f0a425930e44e8f71e75")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		"status" : "CONFERENCE (-1)"
    	},
    	"modified" : {
    		"stop" : ISODate("2021-08-25T10:41:47.369+03:00"),
    		"status" : "OK (0)"
    	},
    	"version" : NumberInt(4),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:41:47.370+03:00"),
    	"created_at" : ISODate("2021-08-25T10:41:47.370+03:00")
    },
    
    /* 3 createdAt:25.08.2021, 10:41:47*/
    {
    	"_id" : ObjectId("6125f43b25930e44e8f71eea"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		}
    	],
    	"scope" : "session",
    	"original" : {
    		"status" : "EXECUTING"
    	},
    	"modified" : {
    		"status" : "EXECUTED"
    	},
    	"version" : NumberInt(7),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:41:47.357+03:00"),
    	"created_at" : ISODate("2021-08-25T10:41:47.357+03:00")
    },
    
    /* 4 createdAt:25.08.2021, 10:41:47*/
    {
    	"_id" : ObjectId("6125f43b25930e44e8f71ee9"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		}
    	],
    	"scope" : "session",
    	"original" : {
    		
    	},
    	"modified" : {
    		"duration" : NumberInt(920),
    		"billing_duration" : NumberInt(897),
    		"cost" : NumberInt(1659)
    	},
    	"version" : NumberInt(6),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:41:47.326+03:00"),
    	"created_at" : ISODate("2021-08-25T10:41:47.326+03:00")
    },
    
    /* 5 createdAt:25.08.2021, 10:41:47*/
    {
    	"_id" : ObjectId("6125f43b25930e44e8f71ee8"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		}
    	],
    	"scope" : "session",
    	"original" : {
    		
    	},
    	"modified" : {
    		"stop" : ISODate("2021-08-25T10:41:47.320+03:00")
    	},
    	"version" : NumberInt(5),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:41:47.321+03:00"),
    	"created_at" : ISODate("2021-08-25T10:41:47.321+03:00")
    },
    
    /* 6 createdAt:25.08.2021, 10:41:47*/
    {
    	"_id" : ObjectId("6125f43b25930e44e8f71ee7"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f09c25930e44e8f71e70")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		
    	},
    	"modified" : {
    		"duration" : NumberInt(920)
    	},
    	"version" : NumberInt(6),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:41:47.316+03:00"),
    	"created_at" : ISODate("2021-08-25T10:41:47.316+03:00")
    },
    
    /* 7 createdAt:25.08.2021, 10:41:47*/
    {
    	"_id" : ObjectId("6125f43b25930e44e8f71ee6"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f09c25930e44e8f71e70")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		"status" : "CONFERENCE (-1)"
    	},
    	"modified" : {
    		"status" : "OK (0)",
    		"stop" : ISODate("2021-08-25T10:41:47.313+03:00")
    	},
    	"version" : NumberInt(5),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:41:47.314+03:00"),
    	"created_at" : ISODate("2021-08-25T10:41:47.314+03:00")
    },
    
    /* 8 createdAt:25.08.2021, 10:26:51*/
    {
    	"_id" : ObjectId("6125f0bb25930e44e8f71e7a"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		}
    	],
    	"scope" : "session",
    	"original" : {
    		"status" : "WAITING"
    	},
    	"modified" : {
    		"status" : "EXECUTING"
    	},
    	"version" : NumberInt(4),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:26:51.267+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:51.267+03:00")
    },
    
    /* 9 createdAt:25.08.2021, 10:26:51*/
    {
    	"_id" : ObjectId("6125f0bb25930e44e8f71e79"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f09c25930e44e8f71e70")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		"status" : "OK (0)"
    	},
    	"modified" : {
    		"status" : "CONFERENCE (-1)"
    	},
    	"version" : NumberInt(4),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:26:51.217+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:51.217+03:00")
    },
    
    /* 10 createdAt:25.08.2021, 10:26:51*/
    {
    	"_id" : ObjectId("6125f0bb25930e44e8f71e78"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f0a425930e44e8f71e75")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		"status" : "{unknown}"
    	},
    	"modified" : {
    		"status" : "CONFERENCE (-1)",
    		"start" : ISODate("2021-08-25T10:26:51.213+03:00")
    	},
    	"version" : NumberInt(3),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:26:51.214+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:51.214+03:00")
    },
    
    /* 11 createdAt:25.08.2021, 10:26:28*/
    {
    	"_id" : ObjectId("6125f0a425930e44e8f71e76"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f0a425930e44e8f71e75")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		
    	},
    	"modified" : {
    		"callstart" : ISODate("2021-08-25T10:26:28.315+03:00")
    	},
    	"version" : NumberInt(2),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:26:28.316+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:28.316+03:00")
    },
    
    /* 12 createdAt:25.08.2021, 10:26:28*/
    {
    	"_id" : ObjectId("6125f0a425930e44e8f71e74"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f0a425930e44e8f71e75")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		
    	},
    	"modified" : {
    		"status" : "{unknown}"
    	},
    	"version" : NumberInt(1),
    	"action" : "create",
    	"updated_at" : ISODate("2021-08-25T10:26:28.312+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:28.312+03:00")
    },
    
    /* 13 createdAt:25.08.2021, 10:26:28*/
    {
    	"_id" : ObjectId("6125f0a425930e44e8f71e73"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f09c25930e44e8f71e70")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		"status" : "{unknown}"
    	},
    	"modified" : {
    		"status" : "OK (0)",
    		"start" : ISODate("2021-08-25T10:26:28.309+03:00")
    	},
    	"version" : NumberInt(3),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:26:28.310+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:28.310+03:00")
    },
    
    /* 14 createdAt:25.08.2021, 10:26:20*/
    {
    	"_id" : ObjectId("6125f09c25930e44e8f71e71"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f09c25930e44e8f71e70")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		
    	},
    	"modified" : {
    		"callstart" : ISODate("2021-08-25T10:26:20.288+03:00")
    	},
    	"version" : NumberInt(2),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:26:20.289+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:20.289+03:00")
    },
    
    /* 15 createdAt:25.08.2021, 10:26:20*/
    {
    	"_id" : ObjectId("6125f09c25930e44e8f71e6f"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		},
    		{
    			"name" : "calls",
    			"id" : ObjectId("6125f09c25930e44e8f71e70")
    		}
    	],
    	"scope" : "call",
    	"original" : {
    		
    	},
    	"modified" : {
    		"status" : "{unknown}"
    	},
    	"version" : NumberInt(1),
    	"action" : "create",
    	"updated_at" : ISODate("2021-08-25T10:26:20.286+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:20.286+03:00")
    },
    
    /* 16 createdAt:25.08.2021, 10:26:20*/
    {
    	"_id" : ObjectId("6125f09c25930e44e8f71e6e"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		}
    	],
    	"scope" : "session",
    	"original" : {
    		
    	},
    	"modified" : {
    		"start" : ISODate("2021-08-25T10:26:20.281+03:00")
    	},
    	"version" : NumberInt(3),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:26:20.282+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:20.282+03:00")
    },
    
    /* 17 createdAt:25.08.2021, 10:26:20*/
    {
    	"_id" : ObjectId("6125f09c25930e44e8f71e6c"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		}
    	],
    	"scope" : "session",
    	"original" : {
    		"status" : "CONFIRMED"
    	},
    	"modified" : {
    		"status" : "WAITING"
    	},
    	"version" : NumberInt(2),
    	"action" : "update",
    	"updated_at" : ISODate("2021-08-25T10:26:20.272+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:20.272+03:00")
    },
    
    /* 18 createdAt:25.08.2021, 10:26:16*/
    {
    	"_id" : ObjectId("6125f09825930e44e8f71e6a"),
    	"association_chain" : [
    		{
    			"name" : "Session",
    			"id" : ObjectId("6125f09825930e44e8f71e69")
    		}
    	],
    	"scope" : "session",
    	"original" : {
    		
    	},
    	"modified" : {
    		"status" : "CONFIRMED",
    		"billing_type" : "b",
    		"uid" : NumberInt(6252265)
    	},
    	"version" : NumberInt(1),
    	"action" : "create",
    	"updated_at" : ISODate("2021-08-25T10:26:16.523+03:00"),
    	"created_at" : ISODate("2021-08-25T10:26:16.523+03:00")
    }

    Ответ написан
    Комментировать
  • Как работать с кошельком пользователя?

    @3ton
    В вашей схеме не совсем понятно в какой момент бронируется задание и есть ли такое понятие.

    Ежели у вас нет бронирование задания, то это нормально что задание могут взять выполнять сразу несколько человек, и следовательно вы должны определить - либо оплачивать надо всем, либо тому кто первый выполнил.

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

    @3ton
    а как быть если файлы не просто архивы, а исполняемые или скрипты???

    какова потенциальная опасность загрузки таковых на сервер?
    Ответ написан
    Комментировать
  • На чём и как проще всего автоматизировать создание бэкапов KVM-машин?

    @3ton
    В свое время(лет 5-6 назад) тоже задавался таким вопросом, решено было сделать на LVM. Теперь все просто решается клоном LVM и даже не выключаю виртуалки. У меня другой к Вам вопрос, а сколько у вас ядер? Если не ошибаюсь рекомендации к ядрам - не меньше чем кол-во виртуалок+хостовая.
    Ответ написан
    Комментировать
  • Какие есть системы управления производством?

    @3ton
    Такие продукты видел лишь для "серьезных компаний", при чем на одной видел как внедряли продукт за лям евро, основная часть стоимости впрочем приходилась именно на внедрение.

    Не для всех такой вариант подойдет, для небольшой компании в текущий момент создаем с нуля свой ERP продукт конкретно под их процессы и структуру. Думается для многих компаний такой подход будет куда выгоднее и удобнее.
    Ответ написан
    2 комментария
  • Как принять данные с interkassa на Yii2?

    @3ton
    $model->load(Yii::$app->request->post())
    Тут вроде все доступно
    В метод модели load() передаются POST данные Yii::$app->request->post()
    У вас POST данные не приходят или в чем собственно проблема???
    Ответ написан
  • Где наши сайты?

    @3ton
    Полагаю Вам проще будет пойти таким путем
    Домен -> IP -> расположение

    Домен Вы знаете, IP можно узнать командой
    nslookup vash-site.ru
    где vash-site.ru - имя вашего домена
    а определить местоположение и владельца IP можно на сайте
    leader.ru/secure
    вбив IP в окошке Whois

    хотя только что проверил - там вполне достаточно и по домену определить все это исключив из пути IP
    Ответ написан
    1 комментарий
  • В чем сложность создания мессенджера?

    @3ton
    Думается что основная проблема именно в разработке архитектуры мессенджера.

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

    А в остальном все просто ;)

    PS: на счет мобильных игр проще - если она локальная, а если речь о многопользовательской(не браузерной), то там тоже не все так просто, а порой и гораздо сложнее(зависит от жанра игры)
    Ответ написан
    3 комментария
  • Как вывести дни на круговом календаре в html canvas?

    @3ton
    А вы попытайтесь для начала на листочке бумаги уместить 90 линий по окружности в прямой угол.
    Думаю из-за того что либо окружность будет очень большого радиуса, либо линии будут сливаться в одну сплошную окружность, у вас отпадет эта идея.
    Ответ написан
  • Yii2. Как динамически добавть в форму поле?

    @3ton
    ну как минимум Вам нужно будет это делать на фронте яваскриптом, а после сабмита массив добавочных полей валидировать и обрабатывать самим, не думаю что есть встроенные(из коробки) решения для этого, хотя стоит побегать и посмотреть из сторонних библиотек, тот же Kartik не плохо работает в этом направлении, возможно сможете применить одно из доступных подобных решений
    demos.krajee.com/builder-details/tabular-form
    Ответ написан
    Комментировать
  • Как корректно организовать защиту sip-сервера?

    @3ton
    Я думаю правильнее было бы для начала определить какие методы взлома применяются для SIP.

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

    @3ton
    Перегревание в основном происходит от вычислительной нагрузки на процессор, и в зависимости от процессора такая температура может быть нормальной.

    Если же эта температура указана в режиме покоя, тогда следует сравнить TDP процессора с используемым радиатором.

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

    @3ton
    Сайт "на любителя".

    Если пробежаться по топикам с красивыми сайтами, то такой дизайн там присутствует и не раз, а на счет "на любителя" - это чисто мое восприятие. Например мне не нравится много фотографий в качестве фона, для меня приемлемо векторная графика и монотонные заливки, либо ставшими популярными в последнее время заливки патернами иконок на подобии таких https://creativemarket.com/creativestall/95746-6-S...
    Ответ написан
    3 комментария
  • Какой гипервизор выбрать для Windows Server?

    @3ton
    Уже 4-й год использую KVM(неттоп на i5) на которой крутится WS2003

    Все норм, но когда становится более 5 пользователей в терминале 1С, случаются подтормаживания, но полагаю это проблема 1С
    Ответ написан
    1 комментарий