• Windows совместимая dll собранная с помощью gcc, реально ли?

    @theg4sh
    Стоит попробовать добавить флаг `-shared` также в сборку объектов.
    Ответ написан
    Комментировать
  • Как распознавать пользователей при использовании модуля Nginx Push Stream Module?

    @theg4sh
    Можно аутентифицировать пользователя c помощью прокси:
    https://github.com/wandenberg/nginx-push-stream-mo...

    На вскидку: При авторизации достаточно записать ключ во время авторизации в memcache (или др. in-memory db) и обновлять его время жизни при получении long-pulling запроса от бэкэнд-прокси.
    Ответ написан
    Комментировать
  • Какая best practice защиты от записи в файл в несколько потоков?

    @theg4sh
    Проблему с проверкой занятости файла думаю лучше всего решать с помощью shm:
    php.net/manual/en/ref.sem.php
    Либо установкой брокировки на запись, используя:
    php.net/manual/en/function.flock.php

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

    В случае, если требуется "плотная" запись (имею ввиду, что есть требование писать сперва в первые доступные файлы), нужно будет использовать цикл поиска свободного от записи файла.
    Если плотная запись не требуется, то можно фиксировать имя последнего закрытого файла опять же в shm, минусом данной реализации будет неравномерное распределение данных.

    Имхо, в вашем случае будет достаточно flock(). Внутри, насколько понимаю, как раз используется shm для бокировок записи (прошу поправить меня если я ошибаюсь).

    Примерно так может выглядеть поиск первого доступного файла:
    for($i=0; $i<MAX_OFILES; ++$i) {
      $fp = fopen("file$i.log", "w");
      if ($fp && !flock($fp, LOCK_EX | LOCK_NB)) {
        fclose($fp);
        continue;
      }
      // write your actions here
      fclose($fp);
      break;
    }

    Пример ожидания доступности файла не сильно отличается от приведенного и есть по ссылке на доку к методу flock.
    з.ы. Давно не писал на пыхе, поэтому код может быть не валидным.
    Ответ написан
    Комментировать
  • Почему появляется ошибка при многочисленных кликах на Play в HTML5 Audio tag?

    @theg4sh
    Попробуйте такой вариант:
    // перед началом проигрывания создать пустой audio объект
    (function () {
      var audio = document.createElement('audio');
      audio.src = 'http://.../blank.mp3';
      audio.load();
      window.audio_blank = audio;
    })();
    window.audio_break = function () {
      // в данном случае условно считаем this элементом audio (поправить если не так)
      // По идее данная операция должна прерывать текущие загрузки контента
      this.pause()
      this.currentTime = 0;
      this.src = window.audio_blank.src;
    };
    // Далее в цикле пробегаемся по всем audio и ставим хуки
    var audios = document.getElementsByTagName('audio');
    for(var i=0; i<audios.length; i++)) {
      audios[i].addEventListener('pause', window.audio_break);
    }

    Теперь перед вызовом play в UI делаем pause на текущем треке.
    Соответственно при динамике добавляем хук на каждый вновь создаваемый объект audio.

    Так же можно вообще динамически создавать объект audio, чтобы при смене трека его(объект) деинициализировать (читай удалять).

    Так же если вы используете один audio тэг для проигрывания, то стоит попробовать предварительно делать
    function play(audio, src) {
    audio.pause();
    audio.currentTime = 0;
    audio.src = src;
    audio.play();
    }


    З.Ы. код не проверял, просто оформил в виде идеи
    Ответ написан
    1 комментарий
  • Как сделать граббер на php с использованием cURL с авторизацией?

    @theg4sh
    curl_setopt(($ch), CURLOPT_POSTFIELDS
    Скобки?

    Вы забыли поля _token и remember из формы.
    Ответ написан
  • Почему в С 0 != 0, а 0 == 0?

    @theg4sh
    #include <math.h>
    int j;
    for (j = 0; j < SIZE_J && ceil(TMP_data_0[j])!=0; j++) {
            height[j] = TMP_data_0[j];
            printf("j = %d\ncurrent = %f\n", j, height[j]);
    }
    *size = j;

    На будующее: выкладывайте полный листинг, а не кусок - какие тпиы переменных, как они заполняются, что вообще происходить с ними.
    Кстати, каким компилятором все билдилось?
    Ответ написан
    Комментировать
  • Легкой аналог PM2 для linux?

    @theg4sh
    Что насчет supervise из пакета daemontools?
    Ответ написан
    Комментировать
  • Чем может быть вызвано странное поведение PHP при замене параметров через Nginx?

    @theg4sh
    По факту получается, что вы передаете строку php-конфига через fastcgi_param PHP_ADMIN_VALUE.
    Следовательно нужно придерживаться его стандарта и вероятно поэтому все, что было после точки с запятой интерпретировалось как коментарий и "; pinba.enabled=0" отбрасывалось. Попробуйте ради эксперимента заменить ";\n " на "\n", полагаю должно сработать.

    К тому же, не будет ли лучше/удобней разбить установку php-параметров на два nginx-параметра?
    fastcgi_param PHP_ADMIN_VALUE "open_base_dir=/var/www"
    fastcgi_param PHP_ADMIN_VALUE "pinba.enabled=0"
    Ответ написан
  • Как реверсят протоколы клиент-серверных приложений?

    @theg4sh
    В дополнение к ответу Артем Воронов стоит еще добавить, что помимо данных в открытом виде, существет еще потоковое шифрование траффика. Самый распространенный пример - https, где данные представляются в зашифрованном виде. Так же существет куча "движков" для потокового симметричного шифрования траффика. В этом случае, неплохо быть или стать продвинутым математиком.
    Самый простой вариант для примера, запустить утилиту tcpdump на интерфейсе выхода в интернет для https:
    tcpdump -i eth0 'port 443' -X
    и в браузере открыть какой-нибудь https://goo.gl

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

    Для примера дизассемблируйте предварительно скомпилированную программу:
    int main(int argc, char** argv)
    {
      static int var = 0xcc00ffee;
      return 0;
    }


    К прочтению: https://www.reddit.com/r/ReverseEngineering/commen...
    Ответ написан
    Комментировать
  • Как в php скрипте определить, что его запустил Cron?

    @theg4sh
    Насколько знаю, при запуске "вручную" появляются переменные $_SERVER['argc'] и $_SERVER['argv'], также появляются другие переменные окружения пользователя.

    Следовательно:
    if (isset($_SERVER['argc']) && isset($_SERVER['argv'])) {
        define('SELFSERVICE', 1);
    }
    
    if (defined('SELFSERVICE')) {
        echo "I'm a service";
    } else {
        echo "I'm a web-dispatcher";
    }


    Ну или запускать скрипт через http-запрос
    curl "http://name.site/script.php?cron=1"
    Ответ написан
    Комментировать
  • Как ускорить работу стека построенного на массиве размером 100М элементов?

    @theg4sh
    Я задам несколько вопросов и было бы очень хорошо, чтобы вы ответили на них сами:
    - За каким идет заполнение массива при создании Stack? Нужно ли вообще инициализировать и деиницализировать элементы массива?
    - Почему 100000001, а не 100000000 (см. внимательно на условие i<count)? И почему явно используется число, а не директива препроцессора?
    - Вы уверены в том что в StackTest необходимо замерять каждый метод по отдельности?
    - Может будет достаточно одного вызова метода Inc для замера?

    B.R., t4g
    Ответ написан
  • Как блокировать пакет с определенным mss, wscale, win?

    @theg4sh
    Вы уверены, что это действительно SYN flood и после не приходят пакеты ACK c тех же IP-адресов?
    Выглядит, как обычное начало соединения. Могли бы вы дать более развернутый пример лога tcpdump, для примера, по одному IP?

    Немного по теме:
    https://en.wikipedia.org/wiki/SYN_flood
    https://www.cyberciti.biz/tips/howto-limit-linux-s...
    Ответ написан
  • Почему не импортируются пакеты поставлены через pip после обновления Fedora?

    @theg4sh
    Судя по трейсу, проблема не в установке telebot, а в отсутствии экспорта integer_types в compat из пакета requests.
    Попробуйте обновить модуль requests:
    sudo `which pip3.4` install requests
    По крайней мере, для python3.4 c версией пакета requests-2.12.3 из pip3.4 все в порядке:
    >>> import requests
    >>>

    Можно так же попробовать установить конкретную версию пакета:
    sudo `which pip3.4` install requests==2.12.3
    Ответ написан
    Комментировать
  • Как безопасно подменить таблицу операций сетевого интерфейса?

    @theg4sh
    Решайте проблемы по мере их поступления. К слову, установка семафора не гарантирует безопасность доступа при параллелизме, а лишь уменьшает практически до 0 вероятность появления коллизий.

    Насколько понял, ссылка на net_device_ops вообще меняется не часто, поэтому имхо достаточно будет:
    struct net_device dev;
    static struct net_device_ops overwrited_netdev_ops;
    ...
    dev->netdev_ops = &overwrited_netdev_ops;


    Но вот уже сами функции операций имеют свои семафоры, читать:
    https://www.kernel.org/doc/Documentation/networkin...

    В догонку, так же стоит почитать сам исходник rtnetlink.c
    для лучшего понимания процесса:
    lxr.free-electrons.com/source/net/core/rtnetlink.c
    Ответ написан
  • Как разлогинить всех пользователей?

    @theg4sh
    Можно организовать флаги на базе MemCached:
    Cоздав, например, флаг 'action_logout:15' со значением например '{"ip":"10.0.0.1","ts":1234567890}' в момент запроса от клиента c id=15 пробовать получить по ключу значение из MemCached,
    Если найдено, то проверить все необходимые условия и разлогинить только его, в примере, что "ip" клиента соответствует 10.0.0.1.
    Как вариант, дополнительно можно проверять 'action_logout:*' для всех попадающих под условие.
    Да массу чего можно придумать, на базе этого. Так же можно добавить текст причины окончания сессии, чтобы полностью не травмировать психику людей :)

    Средствами Yii опять же возможно разлогинить, если перевести данные сессий в MemCached, благо это делается парой строк в конфиге, и по необходимости чистить содержимое MemCache.
    Ответ написан
    Комментировать
  • Передача своих данных в HTTP-заголовках в ответ на Ajax-запрос - как?

    @theg4sh
    Вы может использовать все заголовки, которые описаны в RFC HTTP
    https://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html

    Так же для запроса с кастомным именем HTTP-запроса стоит взглянуть сюда:
    https://developer.mozilla.org/en-US/docs/Web/HTTP/...
    Да и в целом ознакомиться с
    https://developer.mozilla.org/ru/docs/Web/HTTP/%D0...

    Примеров полно при гуглении "ajax custom request".
    Ответ написан
    Комментировать
  • Python Парсинг через прокси не работает?

    @theg4sh
    Для начала сделайте лог исключений:
    except Exception as e:
      log_ex(e);
      valid_request = False;

    Быть может Вы что-то да не учли.

    Так же надо учесть, что прокси могут выдавать контент после 10s (так скорее всего и есть).
    Большинство из забугорных proxy могут выдавать контент и после 60s, так что для начала отсейте долгие из списка. Кроме того, контент может быть подменен самой proxy в случае неудачи.

    Попробуйте Tor наконец - ведь ваша цель сграббить контент сайта, который блокирует после n запросов в минуту?
    Ответ написан
  • Пароль не проверяется в базе данных.Как устранить проблему с авторизацией?

    @theg4sh
    Если есть возможность использовать меньше запросов - используйте ее.
    var_dump - так же хорош для начинающих, это как перочинный ножик который всегда и везде с вами, но не забывайте, что есть и другие способы отладки - xdebug, например.
    <?php
    if (isset ($_POST['done'])) {
        $login = $_POST["login"];
        $password = $_POST["password"];
        if(empty($login)) {
            exit ("Вы не ввели логин.");
        }
        if(empty($password)) {
            exit ("Вы не ввели пароль");
        }
        $mysqli = new mysqli ("localhost", "root", "", "ural_steel");
        $q = $mysqli -> prepare ("SELECT `password` FROM `registr` WHERE `login`=?");
        $q->bind_param('s', $login);
        $result = $q->execute();
        $row = $q->fetch();
        if ($row !== NULL) {
            if (crypt(md5($password)) == $row['password']) {
                exit ("Поздравляю, вы вошли!");
            } else {
                exit ("Пароль не верный!");
            }
        } else {
            exit("Такого логина не существует!");
        }
    
    }
    ?>
    Ответ написан
    Комментировать
  • Как восстановить проект из .git?

    @theg4sh
    Для начала загляните в корзину, может повезет и Вы восстановите все "одним кликом".

    Если не повезло, то только получится содержимое файлов восстановить используя:
    git fsck --lost-found --full

    Все файлы будут лежать в .git/lost-found/other/
    Единственное придется как-то восстановить дерево каталогов и имена файлов вручную, потому что ни одного дерева не восстановилось из git-объектов.
    Ответ написан
    6 комментариев
  • Получить изображение с ip камеры в режиме реального времени на php или js?

    @theg4sh
    В свое вермя делал обертку на php для стриминга на сайте с китайской ip-камеры с RTMP-авторизацией.
    К сожалению, кусок кода реализующий данную задачу утерян во времени.
    Пользовался curl и документацией RFC по протоколу RTMP.

    На мой взгляд, будет лучше и относительно проще реализовать с помощью модуля nginx https://habrahabr.ru/post/236359/ , тогда на стороне клиента достаточно будет сделать запрос для получения картинки через AJAX, да и использовать для стриминга через будет проще.
    Ответ написан
    Комментировать