Задать вопрос
  • Как скопировать строку из файла на удалённом сервере?

    valerium
    @valerium
    Изобретая велосипед
    ssh remote.server.ru "grep needle /path/to/file"
    Как-то так. Выведет то, что найдёт grep. Соответственно, grep можно заменить на tail, head, sed или любую другую команду. Если манипуляция какая-то шибко сложная (потребуется много разных кавычек), то можно использовать heredoc, передать скрипт на стандартный ввод ssh.

    ssh remote.server.ru <<CODE
    awk -F';' '/pattern/ {print $3}' /path/to/file
    CODE


    Но это при условии, что скрипт будет запускаться ручками, то есть Вы сами введёте пароль от учётки на удалённом сервере или пароль от ключа. Если нужно делать это автоматически, то лучше на стороне удалённого сервера написать скрипт, который эту строку будет по какому-нибудь HTTP отдавать.
    Ответ написан
    3 комментария
  • Почему возникает ошибка при использовании функции mail?

    valerium
    @valerium
    Изобретая велосипед
    Директива sendmail_path принимает путь к исполняемому файлы, а Вы, похоже, указали только путь до папки, где лежит исполняемый файл.
    Ответ написан
  • PHP. поиск по слову?

    valerium
    @valerium
    Изобретая велосипед
    А почему бы не использовать регулярные выражения?

    Я так понял, нужна функция, которой передаются пять параметров, один из которых не обязателен. Тогда можно оформить так.

    function my_compare($haystack, $needle, $begin, $end, $middle = false) {
        // Используем "ленивую" особенность проверки условий в PHP
        $begin && $regexp[] = "$needle.+";
        $end && $regexp[] = ".+$needle";
        $middle && $regexp[] = ".+$needle.+";
    
        $result = array();
        foreach $regexp as $pattern {
            $result = array_merge($result, preg_grep($pattern, $haystack));
        }
    
        return $result;
    }


    В деле не проверял, может содержать синтаксические ошибки. Но мысль, надеюсь, передал.
    Ответ написан
    Комментировать
  • Что можно сделать с ноутбуком?

    valerium
    @valerium
    Изобретая велосипед
    Во-первых, у Вас SSD, а не HDD. Что Вы имели ввиду под проверкой на битые кластеры? Если это был тест на успешное чтение, то для SSD он не показателен, так как с чтением у него нет проблем, но со временем некоторые блоки становятся недоступными на запись. Кроме того, у некоторых (или у всех, не уверен) SSD наблюдается потеря скорости по мере наполнения.

    Во-вторых, замена процессора в ноутбуке - рисковая затея, так как нагрев. Система охлаждения может не справиться с теплоотдачей нового процессора. Более того, 2 ядра по 2130 МГц - это не так уж и мало, даже по современным меркам. С точки зрения апгрейда оперативная память будят куда перспективнее.

    Ну и в-третьих, оперативная память. Именно её добавление может помочь с тормозами. 2 гига для современного десктопа - ничто, тем более, что Вы занимаетесь графикой и версткой. Ставьте настолько много, насколько позволяет мат. плата и финансы. При этом рекомендую не просто добавить один модуль, а поставить два одинаковых (вдруг материнская плата поддерживает двухканальный режим?). Так ОС будет меньше использовать подкачку, соответственно, уменьшатся лаги.
    Ответ написан
    4 комментария
  • Как генерировать архив на хостинге, по запросу пользователя?

    valerium
    @valerium
    Изобретая велосипед
    Сжимать прямо в PHP приемлемо только если файлов немного и они небольшого размера. Большие файлы не успеют сжаться за стандартные 30 секунд, которые Apache отводит на исполнение скриптов. Так что если хотите масштабируемое решение, посмотрите в сторону сжатия в фоне.

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

    Так же грамотным решением было бы использование специализированного менеджера очередей, вроде RabbitMQ.

    P. S. Позиционировать себя как разработчика сайтов и не знать про стандартный модуль PHP - это интересно :-)
    Ответ написан
    Комментировать
  • Как установить права на папку для доступа из Apache?

    valerium
    @valerium
    Изобретая велосипед
    Судя по сообщению об ошибке, изменить права на папку не удалось.

    Учитывая, что в пути к папке указано sdcard, то это карта памяти и она отформатирована в FAT. FAT не поддерживает прав доступа, поэтому ОС считает (обычно), что карта и все файлы на ней принадлежат суперпользователю, права доступа выставлены по маске 022 (755 для папок и 644 для файлов).

    Нужно либо менять параметры монтирования карты памяти (кажется, это где-то в fstab указывается, уже не помню), либо переформатировать карту в ext[234] или любую другую файловую систему, которую поддерживает твоё ядро и которая поддерживает права доступа к файлам.
    Ответ написан
    Комментировать
  • Ruby или Python или может Java?

    valerium
    @valerium
    Изобретая велосипед
    В качестве imho могу посоветовать Python. Перешёл на него тоже с PHP, буквально за неделю уже уверенно пишу хитрые скрипты. Стандартная библиотека мощна, есть куча библиотек для самых разных задач, в том числе для написания гуёв, наверняка и для Unity есть. Плюс меня приятно удивили возможности «голого» языка. Списки, словари, множества и срезы решают огромное количество задач.

    Но это всё предвзято, я просто до сих пор под впечатлением от мощи пайтона :-)

    P. S. Правда, меня очень огорчила невозможность присваивания в сравнении. То есть if (result = some_function()) !== False не сработает :-(
    Ответ написан
    4 комментария
  • Как правильно ввести склад и финансы (бизнес-логика)?

    valerium
    @valerium
    Изобретая велосипед
    Насколько знаю, обычно интернет-магазины хранят баланс клиента в виде поля в таблице с данными клиентов. При пополнении баланса или при покупке это поле перезаписывается. И я не вижу причин от этой практики отказываться.

    У Вас стоит задача (насколько я понял) видеть баланс нескольких пользователей в реальном времени (запрашивать его раз в несколько секунд). Мне сложно представить более быстрый метод, чем считывание переменной из оперативной памяти (таблица БД в опер. памяти или Memcached). Хорошо настроенная СУБД может с сопоставимой скоростью извлечь эти данные и с жёсткого диска.

    Учитывая запланированную оптимизацию под большие нагрузки, я бы предложил соорудить очередь заказов. Первый пришёл — первый ушёл. Взяли из очереди заказ, переписали переменную с балансом пользователя, взяли следующий заказ. Таким образом подстреливаем двух зайцев: 1) имеем быстрый доступ к балансу пользователя, 2) точно знаем нагрузку на систему (время ожидания в очереди) и заранее добавляем новых исполнителей.

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

    valerium
    @valerium
    Изобретая велосипед
    Странно, что никто не посоветовал duplicity. На удалённом сервере хранится набор зашифрованных архивов указанного размера (по умолчанию, кажется, 250 Мбайт) с именами-хэшами. На локальном компьютере хранится «база данных» соответствия файлов и архивов. Одной командой все указанные папки сжимаются, нарезаются, шифруются и отправляютя на сервер. Второй командой с сервера скачивается указанный файл (или все файлы).

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

    valerium
    @valerium
    Изобретая велосипед
    Вообще да, сделано дико криво. Сначала скрипт забирает файл с сервера, потом обрабатывает его на своей стороне, потом весь же файл передаёт обратно. Не проще ли «точечно» обработать файл на стороне сервера? Есть же волшебная утилита sed!

    $connect = ssh2_connect('localhost', '22');
    ssh2_auth_password($connect, ssh_login, ssh_password);
    $stream = ssh2_exec($connect,"sed -i.back 's/* * * * * /home/jitter.sh; /usr/bin/flock -xn /tmp/$path_script.lock -c \'/usr/bin/php -q /var/www/deone/data/www/vk-manager.ru/script/grabber/$path_script >/dev/null 2>&1\'//' /var/spool/cron/crontabs/deone");
    ssh2_exec($connect, '/etc/init.d/cron restart');


    То есть потоковый редактор sed (волшебная вещь! очень советую изучить) удаляет одну строку в файле, при этом (на всякий случай) создаёт резервную копию исходного файла с суффиксом .back.

    Кстати, судя по всему, подключение идёт к рутовой записи по паролю, это совершенно несекурно. Представляете, кто-то украдёт Ваш скрипт? Заморочтесь и настройте sudo и авторизацию по ключу.

    И да, надеюсь, localhost — это просто замена для конфиденциальности?
    Ответ написан
    Комментировать
  • Как сделать нагревательный элемент из стекла?

    valerium
    @valerium
    Изобретая велосипед
    Можно плясать немного в другом направлении. Ведь дело не в том, что стекло вообще не проводит ток, а в том, что ток оно проводит чертовски плохо. Накопанное в интернетах удельное сопротивление стекла составляет 1011 Ом⋅м. Таким образом, параллелепипед из стекла размером 1×1×5 см (небольшая такая палочка) будет иметь сопротивление 5⋅1013 Ом. Очевидно, что число огромное. Для сравнения, такая же палочка из меди имеет сопротивление ≈ 8,75⋅10−6 Ом — на 19 порядков меньше. Но проведём расчёты дальше, нас ведь интересует нагревательный элемент.

    В проводнике с сопротивлением 5⋅1013 Ом ток в 1 ампер можно получить при напряжении 5⋅1013 В. 50 триллионов вольт! Но ток в 1 ампер в таком проводнике даст нам аж 50 триллионов Ватт (на постоянном токе). Это слишком много, нам вполне хватит 1000 Ватт, как в бытовом чайнике. Для нагревателя такой мощности нам достаточно всего лишь около 223,6⋅106 В.

    С одной стороны, 223 миллиона Вольт выглядят не таким уж фантастическим числом. Согласно Википедии, напряжение при ударе молнии достигает величин того же порядка, а то и больше. С другой же стороны, сопротивление воздуха и стоящего рядом со стеклянным чайником человека может оказаться меньше, и тогда ток пойдёт по пути наименьшего сопротивления. Боюсь, это окажется слишком высокой платой за чашечку ароматного чаю :-)
    Ответ написан
    Комментировать
  • Как узнать, из чего состоит время ожидания ответа от сервера?

    valerium
    @valerium Автор вопроса
    Изобретая велосипед
    Сам спросил, сам ответил… Лажанул я :-)

    Суть в том, что я не там ставил microtime(). Для архивации я использовал ZipArchive, и измерял время, которое требуется для ZipArchive::addFile(), но не учёл ZipArchive::close(). А ведь именно в момент закрытия происходит запись в файл.
    Ответ написан
    Комментировать
  • Как сделать генерацию случайных символов?

    valerium
    @valerium
    Изобретая велосипед
    Если эти 17 случайных символов не участвуют в криптографии, то почему бы не взять хэш от текущих даты-времени, и откусить от него 17 символов?

    function getSymbols() {
        return strtolower(substr(hash('gost', date('r')), 0, 17));
    }

    Если получать эти символы нужно чаще, чем раз в секунду, то придётся использовать класс DateTime, т. к. функция date() не работает с миллисекундами.
    Ответ написан
    3 комментария
  • Как узнать, что поступил JSON запрос на PHP?

    valerium
    @valerium
    Изобретая велосипед
    @dpr дал неплохой совет, но если так уж хочется скрыть кухню от пользователя, то почему бы не воспользоваться встроенными в протокол HTTP возможностями?

    На стороне клиента
    xmlhttp.setRequestHeader('Accept', 'application/json');


    На стороне сервера
    if ($_SERVER['HTTP_ACCEPT'] == 'application/json') {
        // тут генерируем JSON
    } else {
        // тут генерируем HTML
    }


    Использование HTTP-заголовка Accept предпочтительнее, чем HTTP_X_REQUESTED_WITH, потому что
    1. вы точно знаете, что передали заголовок ручками, а не полагаетесь на разработчиков браузера,
    2. используете более старую и устоявшюся (но не устаревшую) возможность, встроенную в протокол,
    3. оставляете себе задел на использование других представлений, например, XML, CVS, Plain text и т. д.
    Ответ написан
    2 комментария