• Как реализовать данную функцию?

    sergiks
    @sergiks Куратор тега PHP
    ♬♬
    function num($amount) {
      return max( 100 * floor($amount / 100), 100);
    }


    проверка
    for($i = 0; $i < 500; $i += rand(0,90)) {
    	printf("%3d -> %3d\n", $i, num($i));
    }

    Результат:
    0 -> 100
      2 -> 100
     57 -> 100
    105 -> 100
    118 -> 100
    166 -> 100
    249 -> 200
    254 -> 200
    295 -> 200
    307 -> 300
    315 -> 300
    349 -> 300
    403 -> 400
    437 -> 400
    480 -> 400
    488 -> 400
    Ответ написан
    Комментировать
  • Удаления ключа шифрования?

    saboteur_kiev
    @saboteur_kiev Куратор тега Linux
    software engineer
    Видимо следует немного почитать про криптологию, чтобы понять что такое ключ шифрования, и почему его нельзя удалить.

    Почитайте для начала https://ru.wikipedia.org/wiki/%D0%A1%D0%B8%D0%BC%D...
    Ответ написан
    Комментировать
  • Переписать Javascript на PHP?

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    кажется, что так:
    function byteArray2hexStr(array $byteArray): string { // <- вот так именовать функции не стоит, кстати.
        return implode('', array_map('bin2hex', $byteArray));
    }
    Ответ написан
    Комментировать
  • Как обратиться к protected методу другого класса?

    Denormalization
    @Denormalization
    Если не хочется лезть в чужой код и менять его, и уж тем более заниматься интимными вещами через Reflection, то правильнее всего будет создать свой класс отнаследованный от нужного, и в своем классе добавить public метод который будет вызывать protected предка.

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

    AngReload
    @AngReload
    Кратко о себе
    Есть CSS правила для печати, можно попробовать добавить такой код для печатаемой страницы:
    @page {
      size: 3in 3in;
      margin: 0;
    }
    @media print {
      html, body {
        width: 3in;
        height: 3in;
      }
    }

    https://developer.mozilla.org/en-US/docs/Web/CSS/@...
    Ответ написан
    1 комментарий
  • Почему не работает мой класс?

    index0h
    @index0h
    PHP, Golang. https://github.com/index0h
    $this-session
    ничего не смещает?
    Ответ написан
    Комментировать
  • Как сделать ID для объектов?

    @nubus4000
    Можно использовать такой говнокод. Смысл - создавать класс на лету, если у него нет поля id или его нельзя нормально сравнить по equals и hashcode. Код надо подкрутить, он может не сработать. Писал на лету так сказать.

    import java.lang.reflect.*;
    import java.util.*;
    import java.util.concurrent.atomic.*;
    
    public class SimpleStorage {
    
        private Map<Integer, Object> objects = new HashMap<>();
        private AtomicInteger idGenerator = new AtomicInteger(0);
        private ClassMaker classMaker = new ClassMaker(0, null, null);
    
        private static final String[] EQUALS_NOT_SUPPORTED = {}; //указать имя классов, которые не поддерживают equals и hasCode
    
        public Integer getId(Object obj) {
            Object finalObj = obj;
            boolean isEqualsNotSupported = Arrays.stream(EQUALS_NOT_SUPPORTED)
                    .anyMatch(typeName -> finalObj.getClass().getCanonicalName().equalsIgnoreCase(typeName));
    
            if (isEqualsNotSupported) {
                final Integer id = getIdFromField(obj);
                return objects.entrySet()
                        .stream()
                        .filter(entry -> id.equals(entry.getValue()))
                        .map(Map.Entry::getKey)
                        .findFirst().get();
            }
    
            Object finalObj1 = obj;
            return objects.entrySet()
                    .stream()
                    .filter(entry -> finalObj1.equals(entry.getValue()))
                    .map(Map.Entry::getKey)
                    .findFirst().get();
        }
    
        public void add(Object obj) {
            Integer newId = idGenerator.incrementAndGet();
            obj = classMaker.createClassWithId(newId);
            objects.put(newId, obj);
        }
    
        public Object get(Integer id) {
            return objects.get(id);
        }
    
        private Integer getIdFromField(Object obj) {
            try {
                Field field = obj.getClass().getField(ClassMaker.FIELD_ID);
                field.setAccessible(true);
                return (Integer) field.get(obj);
            } catch (NoSuchFieldException | IllegalAccessException e) {
                return null;
            }
        }
    
    }


    import java.io.*;
    import java.net.*;
    import java.util.*;
    import javax.tools.*;
    
    public class ClassMaker {
    
        public static final String FIELD_ID = "id";
    
        private Integer id = 0;
        private String className;
        private String sourceCode;
        private File sourceFile;
    
        public ClassMaker(Integer id, String className, String sourceCode) {
            this.id = id;
            this.className = className;
            this.sourceCode = sourceCode;
        }
    
        public Object createClassWithId(Integer id) {
            if (id != null)
                this.id = id;
    
            sourceCode = createSimpleString(id);
            Object obj = null;
            try (FileWriter writer = new FileWriter(createTmpFile())) {
                writer.write(sourceCode);
                compileClass();
                className = sourceFile.getName().split("\\.")[0];
                URLClassLoader classLoader = URLClassLoader.newInstance(new URL[]{sourceFile.getParentFile().toURI().toURL()});
                Class<?> newClass = classLoader.loadClass(className);
                obj = newClass.newInstance();
            } catch (IOException e) {
                throw new RuntimeException(e);
            } catch (ClassNotFoundException | IllegalAccessException | InstantiationException e) {
                e.printStackTrace();
            }
            return obj;
        }
    
        private void compileClass() throws IOException {
            JavaCompiler compiler = ToolProvider.getSystemJavaCompiler();
            StandardJavaFileManager fileManager = compiler.getStandardFileManager(null, null, null);
            File parentDirectory = sourceFile.getParentFile();
            fileManager.setLocation(StandardLocation.CLASS_OUTPUT, Collections.singletonList(parentDirectory));
            Iterable<? extends JavaFileObject> compilationUnits = fileManager.getJavaFileObjectsFromFiles(Collections.singletonList(sourceFile));
            compiler.getTask(null, fileManager, null, null, null, compilationUnits).call();
            fileManager.close();
        }
    
        private File createTmpFile() throws IOException {
            File sourceFile = File.createTempFile(className, ".java");
            sourceFile.deleteOnExit();
            this.sourceFile = sourceFile;
            return sourceFile;
        }
    
        private String createSimpleString(Integer id) {
            StringBuilder classBuilder = new StringBuilder();
            classBuilder.append("public class ")
                    .append(className)
                    .append(" {")
                    .append("private Integer id = ")
                    .append(id)
                    .append(";")
                    .append("    public void setId(Integer id) {\n")
                    .append("        this.id = id;\n").append("    }\n")
                    .append("\n").append("    public Integer getId() {\n")
                    .append("        return id;\n")
                    .append("    }").append("    @Override\n")
                    .append("    public boolean equals(Object o) {\n")
                    .append("        if (this == o) return true;\n")
                    .append("        if (o == null || getClass() != o.getClass()) return false;\n")
                    .append("\n")
                    .append(className)
                    .append(" that = ")
                    .append("(").append(className).append(")").append(" o;")
                    .append("\n")
                    .append("        return id != null ? id.equals(that.id) : that.id == null;\n")
                    .append("    }\n").append("\n").append("    @Override\n")
                    .append("    public int hashCode() {\n")
                    .append("        return id != null ? id.hashCode() : 0;\n")
                    .append("    }\n")
                    .append("}");
            return classBuilder.toString();
        }
    }


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

    EugeneP2
    @EugeneP2
    Java Dev
    Подобные вещи делаются с помощью AspectJ

    Вот пример как перехватывать сеттеры всех классов в указаном пакете demo-aspectj

    класс
    package ua.evhen.aspectj.demo.domain;
    
    public class BankAccount {
    
        private String pan;
        private String panSate;
        private String exDate;
        private String panName;
        private long clientId;
    
    // getters and setter
    }


    аспект, который будет перехватывать вызовы методов set*
    package ua.evhen.aspectj.demo.aspect;
    
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
    
    @Aspect
    public class BankAccountAspect {
        @Before("execution(void ua.evhen.aspectj.demo.domain.*.set*(..)) && args(val)")
        public void setMethod(Object val, JoinPoint jp) {
            System.out.printf("%s := '%s'%n ", jp.getSignature().toShortString(), val);
        }
    }
    Ответ написан
    9 комментариев
  • Почему загруженное на сайт изображение имеет размер больший, чем у исходника?

    mustang_shelby
    @mustang_shelby
    i like (*_metallica_*)
    наверно он его конвентирует в такой размер просто
    Ответ написан
    Комментировать
  • Как реализовать паттерн модуль на PHP?

    @AndreuChel
    Программист .NET
    «Модуль» — это популярная реализация паттерна, инкапсулирующего приватную информацию, состояние и структуру, используя замыкания. Это хорошее решение для того, чтобы скрыть внутреннюю логику от посторонних глаз и производить всю тяжелую работу исключительно через интерфейс, который вы определите для использования в других частях вашего приложения.
    Этот паттерн применим только в языках, типа JavaScript, т.к. там нет настоящей приватности и в отличии от некоторых традиционных языков, он не имеет модификаторов доступа.

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

    SerafimArts
    @SerafimArts
    Senior Notepad Reader
    Это называется интерфейсы и автолоадинг.
    Ответ написан
    Комментировать
  • Защита админ-панели на сайте php?

    slo_nik
    @slo_nik Куратор тега PHP
    Добрый день.
    В БД в таблице users есть столбец status хочу что бы доступ к разделу админов имели только юзеры с статусом 3,4,5 но не совсем понимаю как это реализовать.

    Если не понимаете, то не надо изобретать велосипед.
    Возьмите какой-либо framework, там всё это реализовано. Изучите как это работает, а уж после этого приступайте к реализации собственного решения.
    Начните с framework-ов YII2 или Laravel. Так же параллельно можете изучать этот материал.
    Ответ написан
    Комментировать
  • Как использовать максимум процессора для выполнения многопоточной задачи?

    Простой ресурсов сам по себе - не проблема, а счастье. Проблемой является простой ресурсов при заметной деградации сервиса.
    Но в тестовом режиме, загружая систему примерно на 100 000 запросов с 2000 потоков (через tomact: ab -n 1000000 -c 3000 ") проц всё ещё остаётся загружен всего на 36%.

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

    xmoonlight
    @xmoonlight
    https://sitecoder.blogspot.com
    Почитайте как сделать правильно REST API (для POST и не только).
    • HASH - подпись с применением функций хеширования и формул конкатенации данных запроса.
    • RANDOM - случайная строка символов или число для создания уникального запроса
    • TIMESTAMP - контроль давности запроса на стороне сервера.

    Кратко: нужно три дополнительных параметра (кроме параметров запроса к API): HASH, RANDOM, TIMESTAMP.
    HASH - формируем по TOKEN'у (его мы получаем заранее от сервера) на основе всех данных, передаваемых при запросе к API: API-параметры, RANDOM и TIMESTAMP.
    Проверяем подпись при получении запроса и сравниваем с HASH: если подпись равна HASH - исполняем запрос.
     

    UPD: про домен (доп.вариант проверки):
    Входные данные, которым мы хотим доверять:
    1. Доменное имя клиента API: домен_ожидаемый
    2. TXT-запись домена клиента API: TXT_запись_ожидаемая

    Имеющиеся данные (при получении запроса к API от клиента):
    3. IP клиента API: IP(1)

    При инициализации новой сессии (перед формировании нового токена), можно делать 3-4 DNS-запроса к любому публичному DNS-серверу (перед непосредственной генерацией токена!):
    1. reverse_lookup (IP(1) клиента API в имя домена(1)) => узнали домен(1).
    2. lookup (домен(1) в IP(2) по A-записи) => узнали IP(2)
    3. снова reverse_lookup (IP(2) в имя домена(2)).
    4. По желанию: можно проверить наличие нужных TXT-записей (и любых других) и сравнить с ожидаемыми (т.н., "статический публичный токен").

    После получения всех данных, проверяем:
    Домен_ожидаемый===домен(1) && IP(1)===IP(2) && домен(1)===домен(2) && TXT_запись_ожидаемая===TXT_запись_полученная

    Если выражение истинно, то выписываем токен на обратившийся клиентский IP для предоставления доступа этому клиенту для начала работы с нашим API.
    Ответ написан
  • Как обезопасить сервер при получении POST?

    Adamos
    @Adamos
    Обычное дело - добавляете подпись: sha256(собранные в строку данные + известный обеим сторонам ключ). И проверяете ее, отбрасывая прочие запросы.
    У меня, например, хостер (Таймвеб) своими роботами регулярно щупает мои скрипты, к которым происходят внешние обращения. От платежных систем, например. При том, что ссылок на них нигде нет. То ли ботов ищут, то ли еще что. Естественно, такие запросы обрабатывать - себе дороже.
    Ответ написан
    7 комментариев
  • Что будет за попытку взлома вк?

    delphinpro
    @delphinpro
    frontend developer
    даже звучит смешно))


    Ну вот с судьёй и посмеётесь вместе
    Ответ написан
    Комментировать
  • Какие Android API стоит включать в приложение? Стоит ли включать все?

    samodum
    @samodum
    Какой вопрос - такой и ответ
    Не совсем понятно, при чём здесь список API.
    Нужно просто указать minSdkVersion. Принято, что minSdkVersion должна быть хотя бы 17. Та же Android Studio на этапе создания проекта показывает количество поддерживаемых устройств в процентах, либо берите это с официального сайта https://developer.android.com/about/dashboards/
    Далее, вы должны исследовать, какие фичи андроида из более новых версий вам понадобятся (кастомизация уведомлений, например, которые в более ранних версиях не поддерживаются), а также учтите, что некоторые подключаемые библиотеки потребуют определённые версии Android Sdk.
    Взвесив все "за" и "против" выставляете свой minSdkVersion и наслаждаетесь потом отзывами юзеров в духе "А на моём андроиде 4.2 это не работает", "у меня сони, андроид 6.0 и прога вылетает..."
    То, что заводится на одном 4.4 не всегда будет работать на другом точно таком же андроиде, но от другого производителя. Разные производители делают свои глючные оболочки...
    Ответ написан
    Комментировать
  • Существует ли идентификатор выполнения скрипта php?

    saboteur_kiev
    @saboteur_kiev
    software engineer
    Стандартный способ - не просто указать что "скрипт работает", а сохранить идентификатор процесса этого скрипта.
    Таким образом, вы сможете не только увидеть аттрибут, что "скрипт работает", а считать PID и проверить - есть ли такой процесс в памяти, и является ли он именно вашим php скриптом.
    Ответ написан
    3 комментария
  • Как проверить, что знаешь на базовом уровне JavaScript?

    mindtester
    @mindtester
    http://iczin.su/hexagram_48
    нет ценности просто знать язык, без опыта применения

    простой пример - 1С (визуал бейсик, да еще и на русском... фу-фу-фу)... но при наличии понимания областей применения (бухгалтерия/товароведение/логистика, реже другие) люди [внезапно] имеют постоянную, и хорошо оплачиваемую работу
    Ответ написан
    2 комментария
  • Нужно ли платить налог с пожертвований?

    usdglander
    @usdglander
    Yipee-ki-yay
    Пожертвования, вроде не облагаются налогом. Иначе казна бы неплохо пополнялась от РПЦ.
    Ответ написан
    1 комментарий