Ответы пользователя по тегу JavaScript
  • PHP как передавать POST большие файлы быстро?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Что бы не упираться в ограничения:
    • разбивать файл на чанки равной длины
    • загружать чанки параллельно на несколько разных суб.доменов (st1.example.com, st2.example.com ... stN.example.com)
    • использовать http2 соединение
    • передавать файлы (и чанки в том числе) в бинарном виде


    Если количество входных точек меньше чем количество чанков то на некоторые адреса будет несколько отправлений, желательно не переустанавливать соединение, а держать хотя бы keep-alive, а ещё лучше разобраться как передать данные после текущей отправки в текущее соединение.

    Замерять скорость:
    • сети между серверами и клиентом
    • пропускную способность веб-сервера
    • общую нагрузку на сервер
    • io диска куда складываются данные


    Возможно есть проблема:
    • со скоростью работы диска, может быть он сбоит и потерял 80% своей скорости
    • с загрузкой канала между сервером и клиентом
    • слишком много запросов к веб-серверу и он просто блокируется постоянно
    • браузер перегружен плагинами или слишком много js кода который убивает отзывчивость


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

    Более подробно про отправку файла чанками:
    sendFile: function(file) {
                if (file.size > this.maxFileSize) {
                    this.alert('Файл слишком большой!');
                    return false;
                }
    
                var fd = new FormData();
                      fd.append("file", file);
    
                // Создаем запрос
                var xhr = new XMLHttpRequest();
                xhr.upload.addEventListener('progress', context({obj: this}, this.uploadProgress), false);
                xhr.onreadystatechange = context({obj: this, html: html}, obj.uploadFinish);
                xhr.open('POST', this.handler);
                xhr.send(fd);
            },


    Тут мы видим xhr.send(fd), теперь идём в один из примеров, например https://learn.javascript.ru/xhr-resume и видим вариант с отправкой части файла:
    var slice = file.slice(10, 100); // прочитать байты с 10-го по 99-й включительно
    xhr.send(slice); // ... и отправить эти байты в запросе.


    Если у вас получится сделать механизм многопоточной загрузки то можете контрибьютить в этот репозитарий: https://github.com/mantyr/js-drag-n-drop-file-uplo... так как он чуть более объектный чем классический dropzone
    Ответ написан
    2 комментария
  • Как отправить текст на почту?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Всё что до секции
    <?php
    нее выполняется в PHP, а значит у вас нет переменной outArray, тем более вы не можете написать так:
    $work=(outArray);
    .

    Сверху у вас javascript который выполняется в браузере, снизу у вас PHP который выполняется на сервере (до того как страница доберётся до браузера). Дальше сами.
    Ответ написан
    Комментировать
  • Как правильно грузить данные на клиент?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Разделите на три части:
    • первый экран - critical css, critical js, critical data - всё необходимое что бы показать первый экран в браузере максимально быстро
    • основной контент - то что в любом случае понадобится для второго экрана и вспомогательных элементов
    • всё остальное - рекламные баннеры, графики, аналитика и прочее


    Более подробно посмотрите здесь:


    Так же можно добавить 4 часть - это то что возможно понадобится потому что это горячие данные (например новости, список активности друзей и так далее)
    Ответ написан
    Комментировать
  • Как бы вы организовали кодогенерацию сайта?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Берите уже PHP, что уж там:)
    Ответ написан
  • Как распарсить JavaScript Object (не валидный JSON) в Golang?

    @mantyr Автор вопроса
    Пишу много Golang кода с удовольствием:)
    Я пока не сравнивал два эти варианта по производительности, но в будущих задачах предпочту использовать первый вариант.

    Вариант №1
    На stackoverflow посоветовали взглянуть на библиотеку https://godoc.org/launchpad.net/rjson#Unmarshal однако в ней не оказалось поддержки значений в одинарных ковычках.

    В результате сделал форк и добавил поддержку одинарных ковычек.
    package main
    
    import (
        "fmt"
        "github.com/mantyr/rjson"
    )
    
    func main() {
        data := []byte(`{
            middle : {
                src: "pictures/product/123.jpg",
                place : '#preview-img',                // Added support for JavaScript object parsing
                title: "title"
            }
        }`)
    
        var v struct {
            Middle struct {
                Src string
                Place string
                Title string
            }
        }
        err := rjson.Unmarshal(data, &v)
        fmt.Println(v)   // print {{pictures/product/123.jpg #preview-img title}}
        fmt.Println(err) // print <nil>
    }

    https://github.com/mantyr/rjson
    Оригинальный пакет от автора тут: https://github.com/rogpeppe/rjson

    Если у вас есть пожелания по дополнению rjson - напишите мне или предложите pool request.

    Вариант №2
    Можно запустить VM https://github.com/robertkrimen/otto и передав ей немного дополненный текст получить из неё нужное поле.
    package main
    
    import (
        "testing"
        "github.com/robertkrimen/otto"
    )
    
    func BenchmarkVMGet(b *testing.B) {
        vm := otto.New()
    
        b.ResetTimer()
        for i := 0; i < b.N; i++ {
            st := `
                {
                        middle : {
                        src: 'pictures/product/middle/14906_middle.jpg',
                        place : '#preview-img',
                        title: '343880-090-slantsy-nike-benassi-just-do-it'
                    }
                }
            `
    
            vm.Run(`
                obj = `+st+`
                src = obj.middle.src;
            `)
            src, err := vm.Get("src")    // <-----
            _ = src
            _ = err
        }
    }


    # go test -bench=".*" ottotest
    testing: warning: no tests to run
    PASS
    BenchmarkVMGet	   30000	     58103 ns/op
    ok  	ottotest	2.367s


    Однако есть минусы:
    • может прилететь произвольный кусок текста и выполнять его бездумно не правильно (вспомним eval в php)
    • достаточно медленно
    • используется очень большая библиотека - плохая зависимость


    Плюсы:
    • всё таки достаточно быстро
    • можно не останавливать VM, а пушить туда через Run, но если пушить бесконечно остаётся вопрос - умрёт однажды или не умрёт - без хорошего знания внутренностей библиотеки сказать этого заранее нельзя


    Я так же ищу другие варианты, чисто под задачу распарсить object и не выполнять лишних операций.
    Ответ написан
    Комментировать
  • Как зашифровать css?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Как вариант - делать OpenGL или Canvas сайт, js зашифровать.


    Раньше для таких целей использовали Adobe Flash и Java Applet, но сейчас эти технологии не выполняют таких функций:
    • Adobe Flash - отключают в браузерах, в некоторых его нет изначально
    • Java Applet - было столько дыр в безопасности что тоже скоро вымрет, требует отдельной установки java

    Есть ли смысл делать сайты на OpenGL/WebGL и/или на Canvas исключительно с точки зрения защиты css? Скорее нет, разве что для использования их сильных (графических) сторон, так как современные сайты на столько сложны что украсть там что-то и так не представляется возможным, а сделать скриншот и скопировать графику всё равно можно.
    Ответ написан
    Комментировать
  • Замена изображения при наведении?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Попробуйте более универсальный вариант. В этом случае даже если появится новый элемент набора с таким классом события распространятся и на него.

    <img class="image_hover" src="file.jpg" data-image-over="file.gif" data-image-out="file.jpg">
    
    <script>
    $(document).on("mouseover", "img.image_hover", function() {
        $(this).attr("src", $(this).data("imgOver"));
    });
    $(document).on("mouseout", "img.image_hover", function() {
        $(this).attr("src", $(this).data("imgOut"));
    });
    </script>
    Ответ написан
    Комментировать
  • С чего начать программирование?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Запишись на курсы в школе, там будет Borland/Turbo Pascal и много аглоритмов... ну или Си/Си++ и опять таки много алгоритмических задачек. Но если хочешь быть странным и продвинутым школьником - начни с golang.org и изучения английского.
    Ответ написан
  • Jquery plugin для работы с get параметрами урл?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Если не нашли то это отличный повод разобраться в том как делаются такие плагины, тем более что сам скрипт вы, вроде, уже для пару-тройке сайтов делали, ведь так?:)
    Ответ написан
  • Имеет ли смысл писать чат на meteor.js?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    "каждый раз делать запрос к бд, а ведь это реал-тайм" - не факт, так как meteor.js вроде надстройка над node.js, а он запускается в виде сервера и может хранить текущие данные прямо в памяти, а базу использовать только для сохранения на длительное хранение.

    Вы попробуйте, может понравится и сможете написать отличную статью о том через какие препятствия пришлось пройти что бы это всё сделать. Для продакшина node.js/meteor.js для real-time чата не советую из практических соображений, хотя и на них можно сделать нормальные решения.
    Ответ написан
    Комментировать
  • Javascript фреймворк для чата?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    jQuery, проще некуда.
    Ответ написан
  • Скрипт удаления картинок старше 2 дней с сервера это возможно на php?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Давайте попробуем разобраться.
    1. вам нужно научиться удалять конкретный файл по конкретному адресу
    2. вам нужно научиться получать список файлов конкретного каталога
    3. вам нужно научиться либо проверять конкретный адрес файла на дату создания файла и выбирать те что старше 2 дней либо научиться в пункте 2 получать список только тех файлов которые уже старше 2 дней
    4. вам нужно научиться запускать скрипт каждую неделю через cron

    Вот когда пройдётесь по этому списку, подтяните знания тогда всё и получится.
    Ответ написан
    1 комментарий
  • Как найти координатора проекта?

    @mantyr
    Пишу много Golang кода с удовольствием:)
    Сходите на концеренцию, начните писать свою маленькую игрушку, бесполезную, но на которой можно отточить понимание процессов. Всё появляется со временем. Либо полностью займитесь организацией, а не разработкой.
    Ответ написан
    Комментировать