Александр Воробьев

Александр Воробьев
Рейтинг
69
Регистрация
03.02.2020
ArbNet #:
ЗЫ. Удачи в экспериментах!

Если возможно под Линукс бы

Sly32 #:
Я спрашивал про обычный батат, такого у нас не видел если стоят примерно одинаково, то это очень дорого. 
У нас 180руб/кг. Стоит попробовать? Как выбирать?
Sly32 #:
Кстати я поправил тесты, задеплоятся через полчаса, будет не лень попробуй - стало лучше?

Глянул на ПК. Да теперь норм - удерживается в области видимости. 

Визуал: в темной теме цвет текста вопроса так же темный - я постоянно вместо вопроса читал описание теста - т.к. оно выделяется.

Кстати,  заставь ЛЛМ проводить тест на контрастность. :)

Sly32 #:
Не вижу ничего плохого и избыточного в Бутстрапе - полностью закрывает все мои задачи

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

Sly32 #:
что ты имеешь ввиду под унифицированным дизайном?

Это не конкретно про твой сайт. А в принципе про сервисы связанные с обучением. Я к тому что здесь ненужно изгаляться и создавать некий уникальный дизайн ни как у всех

попробовал пройти тест (гостем).

Небольшие наблюдения:

1. Плашка о куках на ПК выглядит так будто бы там напрашивается flex-direction: column; (но это конечно вкуовщина)

2. Когда открывается очередной вопрос то прокрутка встает на описание тест - приходится каждый раз листать, чтобы видеть вопрос и варианты ответов - утомляет :)

3. Хорошо бы иметь вариант прохождения когда подсвечиваются вопросы которые проведены не правильно. Опционально. Т.е. если тест проходится по требованию преподавателя - без подсветки, если я сам решил пройти тест для себя - выбираю режим в соответствии с своей задаче


PS ИМХО про бутсрап (который, мне кажется, уже потерял лидерство в своем классе). Я конечно не СЕО, но как пользователь я бы хотел, чтоб на сайтах подобного класса был унифицированный дизайн. Потом самое место бутстрапу и аналогам (и уж точно им место в админках) ю. Хотя, если честно, мне они очень не нравятся в качестве фреймворков :)  - слишком много порой оверхеда. Но это уже все по задаче и по бюджету.

MrPi #:
Какие требования? Интересует комфортная работа. Сколько стоит ПК собрать под норм кодинг?
Присоединяюсь к вопросу. Как я понимаю "основные" критерии: характеристики видео карты и объем оперативки.
MrPi #:
Зачем на 9 ступене проверять? Я на 5 всегда прогоняю + юнит тестами покрываю

Мне кажется в "Общем случае" в идеале проект должен проходить уровень 10 без ошибок. Но не всегда этот идеал оправдан. и тут уже зависит от конкретики проекта. И, как правило, например проекты подобные фреймворкам (т.е. пользоваться ими будут другие разработчики в разных проектах с разными взглядами и подходами) - чуть ли не обязаны. (правда у меня фреймворк остановился на 6ом, а шаблонизатор на 8. (надо будет освежить память "почему" :) )

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

А так вот подобрал примерчик (в комментариях на каком уровне появляется ошибка)

/**
* @param array{connection:string,status?:string} $row
*/

function foo(array $row): void{
        // 1 На уровне 7: Offset 'status' might not exist on array{connection: string, status?: string}.
        $status = $row['status'] ;
        echo  "test";
}
class Example {  
    public function test(?string $value): void {
                // 2 На уровне 8: Parameter #1 $string of function strlen expects string, string|null given.
        echo strlen($value);
    }
}

/**
* @param array<string,mixed> $data
*/

function foo1(array $data): string {
    $name = $data['name'];
        // 3 На уровне 9:  Function foo1() should return string but returns mixed.
    return $name;
}

1. Согласись потенциально возможное место для бага. Особенно если метод будет длинный.

2. Тут тоже от ситуации. Причем если пользователи только мы (и писали этот код не давно) еще ни чего. а вот если пользователь другой или мы через 100 лет. вдруг если передать null и результат 0 - это будет некорректно для логики.

3. Ну тут тоже повод для багов. вот упрощенные примеры

/**
* @param array<string,mixed> $data
*/

function bar(array $data): string {
    $name = $data['name'];
    return $name;
}

// ============================================
// Данные пришли из JSON API
// ============================================
$jsonInput = '{"name": null, "email": "test@example.com"}';
$data = json_decode($jsonInput, true);

$userName = bar($data);
    
$query = "INSERT INTO users (name) VALUES ('" . $userName . "')";
// INSERT INTO users (name) VALUES ('')  


/**
* @param array<string,mixed> $row
*/

function getUserName(array $row): string {
    return $row['name'];  
}

$dbRow = ['name' => null, 'email' => 'user@example.com'];
$name = getUserName($dbRow);
$query = "SELECT * FROM users WHERE name = '{$name}'";
// Выполнится: WHERE name = '' — вернёт всех пользователей с пустым именем!

(только не придирайся к выбранному примеру с именем пользователя - суть не в таких деталях :).  

 ArbNet забыл важное добавить: в своем автозагрузчике (тот что перенесешь в bootstrap) убери выбрасывание ошибки при отсутствии класса
ArbNet #:
Давай, ради интереса, может другим пригодится.

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

Но в любом случае PHPStan поможет найти скрытые баги и сделать код надежнее, даже если структура проекта нестандартная.

Шаг 1. Необходимо установить PHPStan https://github.com/phpstan/phpstan

Тут два варианта

Вариант 1 Если очень не хочется composer:
Скачай готовый исполняемый файл phpstan.phar отсюда: https://github.com/phpstan/phpstan/releases

Вариант 2 Рекомендую этим воспользоваться.
1.1 Установить composer Инструкция тут https://getcomposer.org/download/
1.2 Ставим стан. php composer.phar require --dev phpstan/phpstan если композер поставишь в проект или если глобально composer require --dev phpstan/phpstan

Шаг 2. Создаем bootstrap.php он необходим т.к. у тебя своя автозагрузка. Просто скопируй свой run.php в нем оставь все функции, установку констант и регистрацию автозагрузчика. остальное (например установка обработчика ошибок) убирай. 
В общем убери всё, что выполняет действия прямо сейчас (кроме регистрации автозагрузчика). Иначе анализатор зависнет или упадет.

Шаг 3. Создаем конфиг в корне проекта файл phpstnan.neon

parameters:
    phpVersion: 80100
    bootstrapFiles:
        - bootstrap.php  # подключить существующий загрузчик
    level: 9  # начать с минимального уровня
    paths:
        - node/
        - skin/
        - mods/

Версию php установи какую тебе надо именно в том формате как в примере. (там 8.1)
bootstrap.php - файл который делали на втором шаге
level - от 0 до 9. По хорошему надо начинать с уровня 1 устранять все ошибки и повышать пошагово. На 9 уровне там пипец какие условия :). Возможно в твоем фреймворке 9ый не возможен.
paths - каталоги где могут быть исходники

Шаг 4 Запуск
Если выбрал первый путь php phpstan.phar analyse
Если выбрал второй путь php vendor/bin/phpstan analyse 

php phpstan.phar analyse /papth/to/file.php - так можно проверить только один файл

Конечно инструмент не скажет "вот это замени на это". Т.е. ошибку надо будет понять, проанализировать и исправить. Т.е. эта не халява отменяющая необходимость знаний. Этот инструмент только подсветит проблему.

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


Стан бдит за более строгой типизацией чем php. Т.е. если написать

/**
* @param list<int> Входящий параметр
* @result array<string,float> Результат
*/
function foo(array $props):array{
    ...
}

то стан будет проверять, что на вход передается НЕ ассоциативный массив содержащий только целые числа, а результат обрабатывается как ассоциативный массив где ключ - строка, а значение - флоаты. В случае массивов он, с определенного уровня, вообще будет требовать уточнения типа, т.е. без подобного phpdoc не пропустит.  ИМХО это все важно для проектов класса фреймворк (т.е. расcчитано, что будут пользоваться другие разработчики)
Всего: 1149