• Стоит ли создавать константу для ключа массива?

    DevMan
    @DevMan
    имхо, не стоит.
    Ответ написан
    Комментировать
  • Как организовать хранение MySQL big data (30млн-50млн) и выборку по date range?

    Sanasol
    @Sanasol
    нельзя просто так взять и загуглить ошибку
    30-50 миллионов это не big data. И всё будет летать.

    Но вот сервер вовзращал разную частоту данных в зависимости от заданного промежутка времени, при срезе до недели, это 5 минут, при срезе до месяца - 1 час, как это организовать на сервере, для меня вопрос.

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

    timestamp должен быть быстрее и удобнее к тому же, особенно в выборках по датам.
    Ну и бонусом удобство работы в виде всяких date_sub() date_add() и т.д.
    Ответ написан
    Комментировать
  • С чего начать изучать spring + hibernate?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Java
    Седой и строгий
    С прочтения учебников Ottinger, Minter, Linwood - "Beginning Hibernate" и Craig Walls - "Spring in Action"
    Ответ написан
    5 комментариев
  • Как найти причину перегрузки MySQL?

    @neol
    Есть подозрение, что у вас заканчивается память и система уходит в swap. Неплохо бы посмотреть вывод free и ps avx --sort rss | tail в момент затупа.
    Ответ написан
    1 комментарий
  • Как можно скрыть информацию, чтобы было видно только часть информации?

    rockon404
    @rockon404
    Frontend Developer
    Не вздумайте передавать конфиденциальные данные на клиент. Их надо преобразовывать на стороне сервера.
    Ответ написан
    Комментировать
  • Расстояние от центра до самого отдаленного края города с помощью Яндекс Карты API?

    freeExec
    @freeExec
    Участник OpenStreetMap
    Никак, границы города не отдаются. Что такое центр - неизвестно.
    Ответ написан
    Комментировать
  • Как лучше сохранить данные?

    @res2001
    Developer, ex-admin
    Можно и в одном файле.

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

    При добавлении записи - добавляете в конец последнего блока (так же можно искать блок с необходимым количеством свободного места в конце), если места не хватает, добавляете новый блок.
    При удалении записи - выставляете флаг удаления.
    При изменении записи - существующую удаляете, новую добавляете.
    Почему нужно работать с большими блоками - так гораздо быстрее читать/писать - сразу целый блок, даже если вам нужна одна запись из него.
    Кроме базового функционала нужно предусмотреть операцию сжатия, которая бы физически удаляла удаленные записи.
    Для быстрого поиска нужен индексный файл. Индекс содержит в себе отсортированный список ID и адрес блока и смещение в блоке записи.

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

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

    В блоке можно предусмотреть заголовок блока, в который можно писать служебную информацию, например было бы полезно писать туда размер свободного места в конце блока.
    Может быть что-то еще.

    PS: не стоит изобретать велосипед, возьмите готовую СУБД.
    Ответ написан
    Комментировать
  • Как лучше сохранить данные?

    AlexMcArrow
    @AlexMcArrow
    Люблю РНР, да я такой!
    Исходя из задачи:
    Вы храните KEY - VALUE. Нам заренее не изветен ни KEY (тип и формат данных - строка или число) ни VALUE (его размер)
    1) так как запрос на "чтение\запись" будет идти по ключу - высчитываем хеш ключа (sha256), берем несколько "октет" (у меня они так в голове называются) от хеша и дописываем\создаем файл с таким именем (это будет наш индекс ключей)
    2) пишем VALUE в преобразованном формате (base64 или еще как) в файл данных в строку соотвествующую следующему индексу
    Получается следующий фарш:
    --------------
    Создание записи:
    Принмаем что БД пуста.
    KEY = test
    VALUE = datastring
    HASH = sha256(KEY) = 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    OCTET = HASH[1-6] = 9f86d0 (три пары)
    файл индекса = [OCTET].map (mapper)
    файл последовательности записи = [OCTET].pnt (pointer)
    файл данных = [OCTET].dat (data)
    Читаем:
    PNT (последовательный указатель - номер строки в файле данных) = read([OCTET].pnt)+1 = 1
    Пишем:
    [OCTET].map =>
    9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08 = [PNT]
    [OCTET].pnt = [PNT]
    [OCTET].dat[PNT] = VALUE (предварительно преобразовываем - base64 или иное) = Пишем в строку равную PNT в файл [OCTET].dat - это сразу дает и запись и обновление данных
    --------------
    Чтение записи:
    KEY = test
    HASH = sha256(KEY) = 9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08
    OCTET = HASH[1-6] = 9f86d0 (три пары)
    файл индекса = [OCTET].map (mapper)
    файл данных = [OCTET].dat (data)
    Читаем файл [OCTET].map и ищем HASH = получаем указатель строки в файле данных = PNT
    Читаем файл [OCTET].dat[PNT] (читаем строку PNT) = VALUE (преобразовываем в исходный формат)

    =============
    Думаю, если даже моя идея бред - то по крайней мере даст вам почву для размышления.

    PS\ как более оптимальный вариант - хранить каждый блок данных в отдельном файле с именем = хешу от ключа.
    Ответ написан
    2 комментария
  • Какой инструмент выбрать для поиска по картинкам?

    coderisimo
    @coderisimo
    Задачка, конечно сложная, интересная! Мне приходилось лишь читать текст с картинок не более))
    https://github.com/mauricesvay/php-facedetection

    а вот на PYTHON - https://github.com/ageitgey/face_recognition , там есть даже реал тайм поиск конкретных лиц.
    Ответ написан
    1 комментарий
  • Является ли такое использование вводимых данных безопасным?

    <input  type="text" name="firstname"  value="<?=($_POST['firstname']) ?? '';?>" required>

    $_POST['firstname']='"</input><script src="scripts.js"></script>'
    Ответ написан
    1 комментарий
  • Можно ли поставить сессию через POST?

    it_monk
    @it_monk
    Разработчик в oncloud.ru
    Вам нужно настроить курл на работу с кукисами:

    curl_setopt ($ch, CURLOPT_COOKIESESSION, TRUE);
    curl_setopt ($ch, CURLOPT_COOKIEFILE, "/tmp/my_php_script_cookie_1.txt");
    Ответ написан
    2 комментария
  • Как верстать такое?

    @Camaro67
    Помог? - жми "Отметить решением"
    Картинкой и верстайте, в чем проблема? Задаете блоку в качестве бэкграунда эту картинку, а поверх накладываете все остальное.
    Ответ написан
    Комментировать
  • Как узнать какая часть PHP кода нагружает CPU на сервере?

    @Codebaker
    Всё умею, всё могу!
    Типичные места с проблемами:
    - сессии, основанные доступе к файловой системе (по умолчанию);
    - неоптимальные обращения к БД;
    - длинные циклы (зачастую с обращениями к БД).

    Поищите такие места в вашем скрипте, и далее как советовал Yan-s : делаем замеры, вырезаем кусок, повторяем замеры.
    Ответ написан
    4 комментария
  • Как сделать правильно генерики?

    @Codebaker
    Всё умею, всё могу!
    Зачем вы заставляете клиентский код делать за вас всю работу?
    Зачем наружу торчит ArgsConverter conv(); у коллбэка?
    Попробуйте переписать свой execute вот в это:

    public Object execute(Object[] args) {
        ArgsConverter<?> convImpl = conv();
        return convImpl.conv(args);
    }
    Ответ написан
    1 комментарий
  • Блокировка DigitalOcean?

    @ynblpb_spb
    дятел php
    Тоже попал под блокировку в DO

    Выход простой
    Топаете в любого отечественного хостера, покупаете самую дешевую VDS с хорошим каналом и настраиваете reverse proxy на nginx приблизительно с таким конфигом:

    server {
            listen                  80;
            server_name             domain.ru;
            
            location / {
                    proxy_pass http://111.111.111.111:80;
                    proxy_connect_timeout                           60;
                    proxy_send_timeout                                      60;
                    proxy_read_timeout                                      60;
                    proxy_redirect                                          off;
                    proxy_buffer_size                                       4k;
                    proxy_buffers                                           4 32k;
                    proxy_busy_buffers_size                         64k;
                    proxy_temp_file_write_size                      10m;
                    proxy_set_header        Host                    $host;
                    proxy_set_header        X-Real-IP               $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    }

    где 111.111.111.111 это IP адрес вашего дроплета в DO

    и для https сайтов

    server {
            listen                  443;
            ssl                     on;
            server_name             domain.ru;
            ssl_certificate      /etc/nginx/ssl/domain.ru.crt;
            ssl_certificate_key  /etc/nginx/ssl/domain.ru.key;
            ssl_protocols SSLv3 TLSv1 TLSv1.1 TLSv1.2;
            ssl_ciphers  "RC4:HIGH:!aNULL:!MD5:!kEDH";
    
            location / {
                    proxy_pass https://111.111.111:443;
                    proxy_connect_timeout                           60;
                    proxy_send_timeout                                      60;
                    proxy_read_timeout                                      60;
                    proxy_redirect                                          off;
                    proxy_buffer_size                                       4k;
                    proxy_buffers                                           4 32k;
                    proxy_busy_buffers_size                         64k;
                    proxy_temp_file_write_size                      10m;
                    proxy_set_header        Host                    $host;
                    proxy_set_header        X-Real-IP               $remote_addr;
                    proxy_set_header        X-Forwarded-For $proxy_add_x_forwarded_for;
            }
    
    }


    такая вот у нас замечательная, страна, конечно...
    Ответ написан
    11 комментариев
  • Нормально ли вызывать private-методы с определенными аннотациями при помощи рефлексии?

    @lgorSL
    А почему бы не сделать, чтобы класс реализовывал два интерфейса? Ну или даже один - класс со всеми методами и интерфейс с "совсем публичными методами".

    interface A{ int getX(); }
    
    class B implements A {
       private int x;
       int getX(){return x;}
       void setX(int v){x = v;}
    }

    Наружу в явном виде класс B не отдавать, говорить, что это просто "какая-то реализация" интерфейса А. В ядре хранить его именно как объект класса B и вызывать что хочется.
    Ответ написан
    3 комментария
  • Как сделать чтоб в 'opportunities' был array?

    AK-VoronM
    @AK-VoronM
    "Мало-мало программист"
    Вероятно стоит переименовать переменную с массивом $opportunies в $opportunities

    Ну или присвоить $opportunies вместо $opportunities
    =))
    Ответ написан
    Комментировать
  • Разные IP адреса на одном сервере. Легко ли определить что сайты стоят на одном сервере?

    Jump
    @Jump
    Системный администратор со стажем.
    Нет.
    Пользователь не сможет определить что они стоят на одном сервере, даже если у них будет один IP адрес.
    Ответ написан
    3 комментария
  • Как обращаться к элементам массива?

    mashletov
    @mashletov
    Math.random()
    Дополню, что помимо полноценных классов, есть еще StdClass — пустой дефолтный класс из коробки, которому можно присваивать свойства.
    $o = new \StdClass;
    $o->prop1 = '123123';
    $o->prop2 = 'xxxxxx';

    Его можно преобразовать в массив:
    $o = (array)$o;
    echo $o['prop1'];


    Да и любой массив можно преобразовать в StdClass:
    $arr = ['test1' => 1, 'test2' => 2];
    $o = (object)$arr;
    echo $o->test1;
    Ответ написан
    Комментировать