• Форвардинг ipv6 через openvpn?

    anton_slim
    @anton_slim
    web разработчик
    Я разобрался в чем проблема, у меня была ситуация аналогичная вашей.
    Сеть /48 выданная провайдером на мой сервер, была назначена интерфейсу на маршрутизаторе провайдера, то есть раздавать ip адреса дальше своего сервера я не мог.
    Правильно было сделать point-to-point сеть для стыка например /64, через которую смаршрутизировать /48 на ipv6 адрес моего сервера.

    То есть провайдер выдал мне ipv6 2A00:1C48:x:xxx::5/64, GW 2A00:1C48:x:xxx::1
    и смаршрутизировал подсеть 2A00:1C48:zzz::/48 на мой ip 2A00:1C48:x:xxx::5

    Теперь я могу нарезать сеть 2A00:1C48:zzz::/48 на любые куски и маршрутизировать куда надо.
    Все ip видят друг друга (в том числе за openvpn), благодаря net.ipv6.conf.all.forwarding=1

    Если ваш провайдер не сможет вам такое сделать, тогда придется сделать nat маскировку (так у меня и работало).

    ip6tables -t nat -A POSTROUTING -s "${SUBNET_PREFIX}/${TARGET_CIDR}" -o $INTERFACE -j MASQUERADE

    где $SUBNET_PREFIX/$TARGET_CIDR = ваша ipv6 сеть,
    $INTERFACE = eth0 (к примеру)

    в этом случае все ipv6 клиентов будут заменяться на ipv6 сервера, то есть все внутренние ipv6 замаскируются.
    Ответ написан
    Комментировать
  • Ошибка при запуске MariaDB после переноса datadir с HDD на SSD. В чём может быть дело?

    anton_slim
    @anton_slim
    web разработчик
    Примонтируй ssd в другую директорию НЕ /home, у mysql сервиса стоит защита на запуск в /home.
    Либо можно прибиндить директорию и не трогать конфиги:
    mount --bind /home/ssd/mysql /var/lib/mysql

    У меня была такая же проблема, яндекс выдал тему в stack overflow которая мне помогла
    Ответ написан
    1 комментарий
  • Где можно фрилансить без лишних затрат?

    anton_slim
    @anton_slim
    web разработчик
    Здравствуйте, всем PHP программистам предлагаю сотрудничество без всяких фриланс бирж с непонятными заказчиками, а простое и понятное сотрудничество. У меня полно заказчиков и полно задач на php, html, js, css разного вида сложности, от джуниоров до профи.
    Я сам являюсь преподавателем в школе программирования, и обучаю джуниоров для последующей стажировки на свои проекты. К сожалению из 200 студентов до конца доходят десятки, поэтому отбор жесткий и беру в свою команду я не всех.
    Гарантирую высокую оплату и колоссальный опыт тому, с кем мы сработаемся. Если интересно, обращайтесь.
    Ответ написан
    1 комментарий
  • Как сделать ссылки шаринга по окончанию видео?

    anton_slim
    @anton_slim
    web разработчик
    Для этого нужно подключать видео с помощью youtube JS API и ловить событие окончания просмотра, делается это следующим образом:
    <div id="player"></div>
    
    <script src="http://www.youtube.com/player_api"></script>
    function onYouTubePlayerAPIReady() {
        player = new YT.Player("player", {
            height: "450",
            width: "800",
            playerVars: {
                'start': 00,
                'end': 00,
                'theme': 'light',
                'rel': 0
            },
    
            videoId: "FH3hIggyJ-U",
            events: {
                onStateChange: onPlayerStateChange
            }
        })
    }
    function onPlayerStateChange(a) {
        if (a.data === 0) {
            videoEnded();
        }
    };
    
    
    function videoEnded() {
        // здесь пишем код функции по окончанию просмотра видео
    }


    в случае с указанным Ваши сайтом, окно показывается в слое .videoWindowContent в котором определены две кнопки шаринга:
    function videoEnded() {
        	if ($(window).width() < 728) {
        	    	$(".videoWindowContent").css("marginTop", $("#player").height() / 2 -  $(".videoWindowContent").height() / 2);
        	}
        	$(".videoWindowContent").stop().fadeIn(300)
        }
    Ответ написан
    Комментировать
  • Как изменить umask для пользователя www-data в debian 7?

    anton_slim
    @anton_slim
    web разработчик
    Только не в /etc/php-fpm.conf а в скрипт запуска /etc/init.d/php5-fpm

    upd: Нашел еще один способ указанный здесь stackoverflow.com/questions/35851049/how-to-set-um... для debian и сервиса php5-fpm:

    1. Отредактировать файл /etc/systemd/system/multi-user.target.wants/php5-fpm.service и добавить UMask=0002 в секцию [Service].
    2. Выполнить команду systemctl daemon-reload
    3. Выполнить команду systemctl restart php5-fpm.service

    Теперь файл сервиса выглядит так:
    [Unit]
    Description = The PHP FastCGI Process Manager
    After = network.target

    [Service]
    Type = notify
    PIDFile = /var/run/php5-fpm.pid
    ExecStartPre = /usr/lib/php5/php5-fpm-checkconf
    ExecStart = /usr/sbin/php5-fpm --nodaemonize --fpm-config /etc/php5/fpm/php-fpm.conf
    ExecReload = /bin/kill -USR2 $MAINPID
    ; Added to set umask for files created by PHP
    UMask = 0002

    [Install]
    WantedBy = multi-user.target

    P.S. но способ с /etc/default/php5-fpm мне нравится больше
    Ответ написан
    Комментировать
  • Как создать сервис вроде "callbackhunter"?

    anton_slim
    @anton_slim
    web разработчик
    Мы разработали похожий сервис за 3 недели, и еще 3 месяца допиливали и дебажили, еще 1.5 месяца ушло, чтобы найти свой сегмент рынка и начать предлагать свою услугу, разработку мы начали 8 марта и только сейчас в конце августа у нас пошли продажи, но немного по другой схеме, не такой как у всех.

    По сути здесь нужно разработать 4 главных модуля:
    1. Личный кабинет с регистрацией, статистикой звонков, настройкой и созданием виджета, онлайн оплатой. Мы это делали на PHP + MySQL
    2. backend часть сервиса звонков, как тут сказали asterisk или freeswitch. Здесь должен быть разработан робот, который будет получать запрос с сайта, где стоит виджет и по пришедшим данным организовывать звонок в соответствии с настройкой виджета и сайтом где он стоит, соединять с менеджером, проговаривать с какого сайта был звонок и далее с клиентом.
    После окончания звонка он должен записать в базу все данные: стоимость, запись звонка, время разговора, кто взял трубку, после разговора в личном кабинете эта инфа сразу же доступна
    3. Сам виджет, его отображение и javascript часть. Это отдельная тема и целая программа, потому как виджет интеллектуальный, то он не должен вскакивать когда попало, а только в нужный момент, мы его по сей день дорабатываем, потому что ищем идеальный вариант для звонка и автоматическим всплыванием.
    4. Лэндинг, который это все грамотно описывает и показывает как это работает. Так же нужно продумать тарифы, чтобы и вам в минус не уйти и клиенту было выгодно.

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

    anton_slim
    @anton_slim
    web разработчик
    Попробуйте воспользоваться вместо функции mail, напрямую на sendmail через сокеты :
    $headers="To: $to\nFrom: $from\nSubject: $subject\n$headers";
        $fp = fsockopen($server, 25, &$errno, &$errstr, 30);
        if (!$fp)
           die("Server $server. Connection failed: $errno, $errstr");
        fputs($fp,"HELO $server\n");
        fputs($fp,"MAIL FROM: $from\n");
        fputs($fp,"RCPT TO: $to\n");
        fputs($fp,"DATA\n");
        fputs($fp,$headers."\n");
        fputs($fp,$this->mime);
        fputs($fp,"\n.\nQUIT\n");
        while(!feof($fp))
          $resp.=fgets($fp,1024);
        fclose($fp);

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

    anton_slim
    @anton_slim
    web разработчик
    Приложения использующие соц. сети могут запрашивать token для доступа к вашей странице в любое время.
    Ответ написан
  • Как правильно получать данные из БД в стиле MVC?

    anton_slim
    @anton_slim
    web разработчик
    По мне, лучше использовать отдельные модели независимые ни от ActiveRedord ни от mysql и чего-либо другого.
    Это позволит внедрить свой определенный формат запроса к модели независимо от того какая БД используется.

    К примеру решил ты перейти на другую базу, например redis, тогда тебе придется переписывать все контроллеры.
    А так тебе достаточно будет переделать модель usersModel под новую БД и вуаля все будет работать.
    Твои контроллеры не должны знать как и откуда модель получает данные, но контроллеры должны знать четко в каком формате передавать в модель параметры.
    Ответ написан
    Комментировать
  • Проектирование веб-программы, правильно ли я сделал?

    anton_slim
    @anton_slim
    web разработчик
    В абстрактном классе обязательно должен быть объявлен хотя бы один абстрактный метод и возможно какие то общие методы для всех потомков (любой области видимости public, protected, private). У интерфейса могут быть объявлены только публичные методы.
    Соответственно судя из вашей логики абстрактного класса, вам нужно все методы сделать
    abstract public function без тела и сам класс объявить как abstract class AbstractTasksManager

    Соответственно ваш код примет примерно такой вид:
    <?php
    
    interface TasksManagerInterface 
    {
    	public function find(TaskInterface $task);
    	public function create(TaskInterface $task);
    	public function update(TaskInterface $task);
    	public function delete(TaskInterface $task);
    }
    
    interface TaskInterface 
    {
        public function find(TaskInterface $task);
        public function create(TaskInterface $task);
        public function update(TaskInterface $task);
        public function delete(TaskInterface $task);
    }
    
    
    abstract class AbstractTask implements TaskInterface
    {
        protected function _commonTask() {
            // какой то общий метод для всех потомков AbstractTask
        }
    
        abstract public function find(TaskInterface $task);
    
        abstract public function create(TaskInterface $task);
    
        abstract public function update(TaskInterface $task);
    
        abstract public function delete(TaskInterface $task);
    }
    
    abstract class AbstractTasksManager implements TasksManagerInterface
    {
        protected function _commonTasksManager() {
            // какой то общий код для всех потомков AbstractTasksManager
        }
    
        abstract public function find(TaskInterface $task);
    
        abstract public function create(TaskInterface $task);
    
        abstract public function update(TaskInterface $task);
    
        abstract public function delete(TaskInterface $task);
    }
    
    
    
    class Task extends AbstractTask implements TaskInterface
    {
        public function find(TaskInterface $task)
        {
            /** Внедрить метод find в TasksManager правильно?
             * Или он должен быть в отдельном классе?
             * Метод find использует скоупы Yii2
             */
    
            // можно вызывать
            $this->_commonTask();
        }
    
        public function create(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function update(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function delete(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    }
    
    class TasksManager extends AbstractTasksManager implements TasksManagerInterface
    {
        public function find(TaskInterface $task)
        {
            /** Внедрить метод find в TasksManager правильно?
             * Или он должен быть в отдельном классе?
             * Метод find использует скоупы Yii2
             */
    
            // можно вызывать
            $this->_commonTasksManager();
        }
    
        public function create(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function update(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    
        public function delete(TaskInterface $task)
        {
            /** Содержимое метода */
        }
    }
    $task = new Task();
    $taskManager = new TasksManager();
    Ответ написан
    3 комментария
  • Как далеким от программирования основателям найти ведущего разработчика в стартап?

    anton_slim
    @anton_slim
    web разработчик
    Как далеким от программирования основателям найти ведущего разработчика в стартап?

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