The OpenNET Project / Index page

[ новости /+++ | форум | wiki | теги | ]

Выпуск Psalm 3.12, статического анализатора для языка PHP. Альфа выпуск PHP 8.0

02.07.2020 12:02

Компания Vimeo опубликовала новый выпуск статического анализатора Psalm 3.12, позволяющего выявлять как очевидные, так и трудноуловимые ошибки в коде на языке PHP, а также автоматически исправлять некоторые виды ошибок. Система подходит для выявления проблем как в устаревшем коде, так и в коде, использующем современные возможности, появившиеся в новых ветках PHP. Код проекта написан на языке PHP и распространяется под лицензией MIT.

Psalm определяет большую часть проблем, связанных с некорректным использованием типов, а также разнообразные типичные ошибки. Например, поддерживается вывод предупреждений о смешивании в выражении переменных с разными типами, некорректных логических проверках (таких как "if ($a && $a) {}", "if ($a && !$a) {}" и "if ($a) {} elseif ($a) {}"), неполной инициализации свойств объекта. Анализатор выполняется в многопоточном режиме. Возможно выполнение инкрементальных проверок, при которых анализируются только файлы, изменившиеся с момента прошлой проверки.

Дополнительно предоставляются средства безопасного программирования, позволяющие использовать аннотации в формате Docblock ("/** @var Type */") для предоставления информации о типах переменных, возвращаемых значениях, параметрах функций, свойствах объектов. Также поддерживается определение шаблонов использования типов и применение выражений assert. Например:


   /** @var string|null */
   $a = foo();

   /** @var string $a */
   echo strpos($a, 'hello');

   /** @psalm-assert-if-true B $a */
   function isValidB(A $a) : bool {
       return $a instanceof B && $a->isValid();
   }

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

В новом выпуске Psalm реализована опция "--taint-analysis", позволяющая проследить связь между полученными от пользователя входными параметрами (например, $_GET['name']) и их использованием в местах, требующих экранирования символов (например, echo "<h1>$name</h1>"), в том числе через отслеживание цепочек промежуточных присвоений и вызовов функций. В качестве источников потенциально опасных данных рассматривается использование ассоциативных массивов $_GET, $_POST и $_COOKIE, но возможно и определение собственных источников. Из действий, требующих отслеживания экранирования, рассматриваются операции вывода, приводящие к формированию контента в формате HTML, добавлению HTTP-заголовков или выполнению SQL-запросов.

Проверка применяется при использовании таких функций, как echo, exec, include и header. При анализе необходимости экранирования учитываются типы данных, такие как текст, строки с SQL, HTML и Shell-кодом, строки с параметрами аутентификации. Предложенный режим позволяет выявлять уязвимости в коде, приводящие к межсайтовому скриптингу (XSS) или подстановке SQL-кода.

Дополнительно можно отметить начало альфа-тестирования новой ветки PHP 8.0. Релиз намечен на 26 ноября. В новой ветке ожидаются такие новшества, как:

  • Включение JIT-компилятора, применение которого позволит повысить производительность.
  • Поддержка именованных аргументов функций, позволяющих передававать в функцию значения в привязке к именам, т.е. можно передавать аргументы в произвольном порядке и определять необязательные аргументы. Например, "array_fill(start_index: 0, num: 100, value: 50)".
  • При вызове методов разрешено применение оператора "?", который позволяет инициировать вызов только, если метод присутствует, что позволяет избежать лишних проверок на возврат значения "null". Например, "$dateAsString = $booking->getStartDate()?->asDateTimeString()";
  • Поддержка union-типов, определяющих коллекции из двух и более типов (например "public function foo(Foo|Bar $input): int|float;").
  • Поддержка атрибутов (аннотаций), позволяющих привязать метаданные (например, сведения о типах) к классам без использования синтаксиса Docblock.
  • Сокращённый синтаксис определения классов, позволяющий объединить определение конструктора и свойств.
  • Новый тип возвращаемых значений - static.
  • Новый тип - mixed, который может применяться для определения приёма функцией параметров с разными типами.
  • Выражение throw для обработки исключений.
  • WeakMap для создания объектов, которыми можно пожертвовать при сборке мусора (например, для хранения необязательных кэшей).
  • Возможность использования выражения "::class" для объектов (аналог вызова get_class()).
  • Возможность определения в блоке catch исключений, не привязанных к переменным.
  • Возможность оставления символа запятой после последнего элемента в списке параметров функции.
  • Новый интерфейс Stringable для идентификации любых строковых типов или данных, которых можно преобразовать в строку (для которых доступен метод__toString()).
  • Новая функция str_contains(), упрощённый аналог strpos для определения вхождения подстроки, а также функции str_starts_with() и str_ends_with() для проверки совпадений в начале и конце строки.
  • Добавлена функция fdiv(), выполняющая операцию деления без вывода ошибки в случае деления на ноль.
  • Изменена логика соединения строк. Например, выражение 'echo "sum: " . $a + $b' ранее интерпретировалось как 'echo ("sum: " . $a) + $b', а в PHP 8 будет обработано как 'echo "sum: " . ($a + $b)'.
  • Ужесточена проверка арифметических и битовых операций, например, выражения "[] % [42]" и "$object + 4" будут приводить к ошибке.
  • Реализован стабильный алгоритм сортировки, в котором при разных запусках сохраняется порядок следования одинаковых значений.


  1. Главная ссылка к новости (https://psalm.dev/articles/det...)
  2. OpenNews: Выпуск Snuffleupagus 0.5.1, модуля для блокирования уязвимостей в PHP-приложениях
  3. OpenNews: Релиз языка программирования PHP 7.4
  4. OpenNews: Уязвимость php-fpm, позволяющая удалённо выполнить код на сервере
  5. OpenNews: Разработчики PHP предложили P++, диалект со строгой типизацией
  6. OpenNews: Выпуск виртуальной машины HHVM 4.0 с прекращением поддержки PHP
Лицензия: CC-BY
Тип: Программы
Короткая ссылка: https://opennet.ru/53257-php
Ключевые слова: php, debug
При перепечатке указание ссылки на opennet.ru обязательно
Обсуждение (65) Ajax | 1 уровень | Линейный | +/- | Раскрыть всё | RSS
  • 1.1, Повидло19 (?), 12:13, 02/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    > В качестве выходных ворот, требующих отслеживания экранирования, проверяются операции, приводящие к выводу в формате HTML, добавлению HTTP-заголовков или формированию SQL-запросов.

    Чо?

     
     
  • 2.48, a.n.o.n.i.m (?), 08:40, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Псалмы распевать - не мешки ворочать.
     

  • 1.2, BlackRot (ok), 12:17, 02/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +9 +/
    Исправлены ошибки
    Повышена производительность
     
     
  • 2.19, jfdbngh (?), 13:49, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –4 +/
    Исправлены ошибки (и добавлены новые)
    Повышена производительности (при условии использования более производительного железа)
     
     
  • 3.29, Аноним (29), 19:17, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    > Исправлены ошибки (и добавлены новые)
    > Повышена производительности (при условии использования более производительного железа)

    А у кого не так?

     
     
  • 4.52, Аноним (52), 13:48, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    У минусаторов не так, вестимо.
     

  • 1.3, MPEG LA (ok), 12:17, 02/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –12 +/
    >if ($a && !$a) {}

    жесть. зачем вообще $ в имени переменной?

     
     
  • 2.4, cancelled (?), 12:21, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Когда разрабатывали язык - забыли учесть твое мнение, исправят в php 9.0, за одно сломают нафиг всю обратную совместимость.
     
     
  • 3.16, тоже Аноним (ok), 13:29, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Обратную совместимость, превращающую variable в 'variable', стоит сломать вместе с руками тех, кто на нее полагается.
     
     
  • 4.37, Аноним (37), 00:04, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Именно это и собираются сделать:

    $ php -r '$a = a;'
    PHP Warning:  Use of undefined constant a - assumed 'a' (this will throw an Error in a future version of PHP) in Command line code on line 1

     
     
  • 5.38, тоже Аноним (ok), 00:16, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    > PHP Warning:  Use of undefined constant a - assumed 'a' (this will throw an Error in a future version of PHP) in Command line code on line 1

    /opt/php5.3/bin/php -r 'error_reporting(E_ALL); $a = a;'
    PHP Notice:  Use of undefined constant a - assumed 'a' in Command line code on line 1

    Собственно, в 7.2 добавили только предупреждение о будущей ошибке. За столько-то лет и версий.

     
     
  • 6.42, Аноним (42), 02:10, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Те, кто пишет нормальный код, заворачивают все ошибки (да, даже Notice) в исключения, а Notice там был даже в 5.0.

    А тонны древнего кода времен php3 до сих пор работают, и чтобы там все переписать, нужно время. Повторять историю  python3, на который не могли перейти годами (да и сейчас еще не все перешли), желания у них нет, и это совершенно понятно.

     
  • 2.5, Работа за еду на PHP (?), 12:23, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Ради денег на еду
     
  • 2.6, Dragomeat (?), 12:28, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Так а что не так то? Это часть дизайна языка, как и "::" для доступа к статическим методам и константам класса, "->" для доступа к обычным методам и полям, "." для конкатенации и т.д
     
  • 2.9, Ilya Indigo (ok), 12:39, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    А Вас не смутило наличие lint в динамическом языке, написанной на нём же?
     
     
  • 3.26, funny.falcon (?), 18:43, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    А какая разница, на чём lint писать? Лишь бы автору удобно было.
    Семейство ML языков (SML, Ocaml, Haskel) является потомком ML, первая реализация которого была написана на LISP. LISP, как известно, динамически типизируемый язык.
    Вопрос же не в языке (если не считать экзотику), а в опыте и криворукости того, кто на нём пишет.
     
     
  • 4.28, Ilya Indigo (ok), 19:14, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –9 +/
    > А какая разница, на чём lint писать? Лишь бы автору удобно было.

    1 Динамическому скриптовому языку заточенному под WEB-приложения lint нужен как козе баян!
    2 Писать на PHP что-то кроме WEB-приложений - глупость и невежество!

     
  • 2.12, Аноним (12), 12:52, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +5 +/
    Sigil (в данном случае $) очень полезен тем, что даёт возможность отличать переменные от остальных слов, создаёт им отдельное пространство имён. Не приходисят извращаться с именами переменных, которые, внезапно, по смыслу совпадают с какими-либо keywords.
     
     
  • 3.31, Вы забыли заполнить поле Name (?), 23:19, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > которые, внезапно, по смыслу совпадают с какими-либо keywords

    Не выдумывайте. Как часто это происходит? Не надо вводить много ключевых слов в язык. На вскидку приходит какой-нибудь class и function и как часто они нужны в прикладном коде? Ну коль так уж нужны добавьте _ в конец или начало.

     
  • 2.14, Аноним (14), 13:09, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Страшное наследие из Perl, который разрабатывали напрочь упоротые лингвисты.
     
  • 2.23, Anonim (??), 14:43, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +2 +/
    Там jQuery в ядре.
     
  • 2.27, Ilya Indigo (ok), 19:09, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    >>if ($a && !$a) {}
    > жесть. зачем вообще $ в имени переменной?

    Наследие из прошлого, которое отличало переменные от констант, которое не хотят убирать из-за обратной совместимости.

     
     
  • 3.33, Аноним (37), 23:52, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Его не получится убрать.
    Сейчас можно одновременно иметь класс или функцию foo и переменную foo.
    Как отличать, если убрать доллар?
     
     
  • 4.40, Ilya Indigo (ok), 01:30, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Его не получится убрать.
    > Сейчас можно одновременно иметь класс или функцию foo и переменную foo.
    > Как отличать, если убрать доллар?

    А ещё можно одновременно иметь константу foo.
    Как сабж отличает константу foo от ф-ии или класса?

     
     
  • 5.43, Аноним (42), 02:15, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Никак не отличает, будет конфликт имен. Но так было с самого начала, потому проблемы и нет.

    С константами и классами на самом деле проблема не то чтобы и проблема - классы называют CamelCase-ом, константы UPPER_CASE-ом, а переменные обычно начинаются с lowercase. Тут конфликты вылезут только у тех, кто игнорирует PSR.

    А вот с функциями (и языковыми конструкциями, выглядящими как функции) конфликты вылезут моментально: достаточно одной count, переменная $count найдется в примерно каждой сколь-либо объемной программе.

     
     
  • 6.55, Аноним (55), 15:35, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Там хитрость ещё в том, что в php вполне возможны такие конструкции как $variable($args), вызов функции/метода по колбеку в $variable. Язык слабо типизирован, и функциональный вид переменной заранее не объявляется. Поэтому если $ убрать, различия между функциями и переменными сотрутся, и будет вообще бардак.
     
     
  • 7.65, Аноним (65), 21:56, 07/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    В том же JS это никому не мешает. Если в переменной лежит не функция, будет ошибка вызова. Тем более, в PHP есть неймспейсы.
     
  • 6.58, Ilya Indigo (ok), 16:32, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/


    <?php
    const foo = 'Константа';
    function foo()
    {
    return 'Функция';
    }
    abstract class foo
    {
    public const bar = 'Свойство';
    public static function bar()
    {
    return 'Метод';
    }
    }
    ?><p><?=foo?></p>
    <p><?=foo()?></p>
    <p><?=foo::bar?></p>
    <p><?=foo::bar()?></p>



    Константа

    Функция

    Свойство

    Метод

    Никаких ошибок и предупреждений!
    PHP прекрасно отличает константу от ф-ии и класса не путая их.
    Точно также он смог бы от них отличать переменные без $.

    > А вот с функциями (и языковыми конструкциями, выглядящими как функции) конфликты вылезут моментально:

    Зарезервированные слова не доступные для переменных никто не отменял.
    В с++ я переменную int long или string тоже назвать не могу... но там есть типы...
    $ как я понимаю, играет ещё роль ключевого слова, аля var или let.

     
     
  • 7.67, Аноним (37), 12:43, 08/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Конечно. Это потому что нельзя сделать

    const foo = 'strlen';
    $s = 'foo';
    echo foo($s);

    или

    const foo = '\stdClass';
    $o = new foo();
    var_dump($o);

    А с переменными так можно:

    $foo = 'strlen';
    $s = 'foo';
    echo foo($s);

    или

    const foo = '\stdClass';
    $o = new $foo();
    var_dump($o);


    Если убрать $, то вся эта динамика (из которой примерно целиком состоит тот же вордпресс, например), поломается.

     
     
  • 8.68, Аноним (37), 12:44, 08/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    в последнем должно быть foo stdClass конечно... текст свёрнут, показать
     
  • 2.59, SubGun (??), 08:32, 04/07/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Чтобы не превращать язык в помойку, вроде питона.
     
  • 2.61, Murz (ok), 18:23, 05/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Да, действительно что за дискриминация? Наверно пендостан проплатил, срочно заменить на ₽!
     
  • 2.66, Аноним (66), 10:51, 08/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    потому что PHP изначально создавался как шаблонизатор и переменные можно было выводить внутри строк.
    почувствуйте, что называется, разницу.

    print "hello $some_var";

    и

    print "hello some_var";

    но все уже забыли это и пишут шаблонизаторы на шаблонизаторе, чтобы использовать шаблонизаторы пока работает шаблонизатор.

     

  • 1.7, A.Stahl (ok), 12:32, 02/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Psalm 3.12 от Шталя:

    Да изыдет пусть непотребство неявно типизированное
    Ибо явным должно быть то, что важно
    И кто делает иначе, тот не прав и осуждаем должен быть
    Also sprach Stahl

     
  • 1.8, Ilya Indigo (ok), 12:37, 02/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –4 +/
    > Включение JIT-компилятора, применение которого позволит повысить производительность...

    ... абсолютно не типичных задач для web-программирования, например рендеринг видео.
    Производительность типичных задач будет неизменна, и потребление оперативы, как при всяком JIT возрастёт.

    P.S. Короче теперь неосиляторы С++ смогут писать скр... программы не только на питоне и руби, но и на пыхе...

    Хотя если честно, в таких проектах, как youtube-dl где все простои возникают при ожидании сети и загрузки, а сама задача сводится к вызову сторонних утилит, скачиванию и парсингу, bash/perl/python/ruby/php более лучшее решение чем C/C++.

     
     
  • 2.10, Аноним (10), 12:41, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    вы́растет
     
     
  • 3.11, Ilya Indigo (ok), 12:47, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > вы́растет

    У фф плохой спелчекер :-(

     
  • 2.13, Аноним (12), 12:56, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    А что, скорость только для рендеренга видео нужна? Вообще, высокая скорость работы никогда не мешает, а в качестве примера могу привести комбинаторные алгоритмы, которые порой требуются в бизнесс-логике. На моих тестах, производительность между интерпретатором и тем же алгоритмом, сделанным на Си -- в 200 раз.
     
  • 2.34, Аноним (37), 23:53, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Нет. С современным кодом, использующим strict_types=1, прирост производительности заметен невооруженным глазом.
     
  • 2.56, Аноним (55), 15:36, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Проснитесь, PHP уже давно вышел за рамки Web.
     

  • 1.15, Аноним (15), 13:24, 02/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    какие версии PHP он хоть понимает?
     
     
  • 2.17, Gemorroj (ok), 13:40, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –3 +/
    https://github.com/vimeo/psalm/blob/master/docs/running_psalm/installation.md
     
     
  • 3.21, Аноним (15), 14:08, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Я дико извиняюсь, но не могли бы вы ткнуть пальцем где на этой ссылке написан ответ на МОЙ вопрос?
     
     
  • 4.22, Gemorroj (ok), 14:29, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –6 +/
    2 строчка "Psalm Requires PHP >= 7.1". На русский переводить, надеюсь, не нужно?
     
     
  • 5.24, Аноним (15), 14:48, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • +3 +/
    Это я так понимаю версия PHP необходимая для запуска этого анализатора. Но я спрашивал не об этом.
    Я спрашивал не о том на какой версии php работает этот анализатор, а какие версии php он понимает... какие версии он умеет анализировать...

    Вы же понимаете что "Requires PHP" это совмем не тоже самое что "understands PHP" если вам на английском проще...

     
  • 2.36, Аноним (37), 00:01, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Оно работает на nikic/PHP-Parser [1].

    Соответствено, поддерживает те версии, которые поддерживает этот парсер:

    > This is a PHP 5.2 to PHP 7.4 parser written in PHP. Its purpose is to simplify static code analysis and manipulation.

    [1] https://github.com/nikic/php-parser

     

  • 1.18, Аноним (18), 13:44, 02/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +/
    Статический анализатор и статистический анализатор -- это не одно и тоже.
    В теле статьи описан статический анализатор, есличо
     
  • 1.30, онанимуз (?), 22:38, 02/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • +1 +/
    > Включение JIT-компилятора, применение которого позволит повысить производительность.

    и тогда пых станет быстрее педона не только в синтетических тестах, но и в реальных задачах. нужно, годно, ждём!

     
  • 1.32, Вы забыли заполнить поле Name (?), 23:21, 02/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Что только не делают, лишь бы не писать на нормальном языке.
     
     
  • 2.35, Аноним (37), 23:57, 02/07/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Надо заметить, что оно уже стало похоже на нормальный язык. Все оставшиеся кривости обусловлены обратной совместимостью.

    Другое дело, что никто в здравом уме сейчас не будет выбирать PHP для нового проекта - разве что есть наработки с похожего проекта, которые доработать напильником на порядок быстрее, чем писать что-то новое

     
     
  • 3.39, Аноним (39), 00:58, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    PHP 7 не умеет юникод в строки
     
     
  • 4.44, Аноним (42), 02:19, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    Смотря что такое "не умеет".
    mb_ функции есть, модификатор /u у регулярок есть.
    Пхпшная строка - это, по сути, byte[]. Нативный тип было бы иметь неплохо, но на практике никаких особенных неудобств нет. Можно написать класс UnicodeString и обернуть все в него, но так никто не делает, потому что привыкли уже.
     
  • 2.47, с (?), 07:24, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Напиши нормальный
     
     
  • 3.53, Вы забыли заполнить поле Name (?), 15:13, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Напиши нормальный

    Научись воспринимать критику или возвращайся в дедсад

     
     
  • 4.62, с (?), 02:22, 06/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    > Научись воспринимать критику или возвращайся в дедсад

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

     
     
  • 5.63, Вы забыли заполнить поле Name (?), 10:15, 06/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    >> Научись воспринимать критику или возвращайся в дедсад
    > да с удовольствием бы вернулся, но походу место уже занято тобой, впрочем
    > уровень критики соответсвует скорее спецпансионату для альтернативно одаренных

    Cтрелки не переводи. Вместо кукареканья а-ля добейся, учись предлагать.

     
     
  • 6.64, с (?), 13:43, 07/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    > Научись воспринимать критику или возвращайся в дедсад
    > Cтрелки не переводи. Вместо кукареканья а-ля добейся, учись предлагать.

    Сам сказал, сам ответил. Чудный скунс, почти как человек

     
     
  • 7.69, Вы забыли заполнить поле Name (?), 12:41, 30/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    >> Научись воспринимать критику или возвращайся в дедсад
    >> Cтрелки не переводи. Вместо кукареканья а-ля добейся, учись предлагать.
    > Сам сказал, сам ответил. Чудный скунс, почти как человек

    По себе не судят.

     
  • 2.49, Me (??), 08:43, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Внезапно, для нормальных языков тоже есть статические анализаторы. И они действительно помогают.
     

  • 1.41, Ноним (?), 01:38, 03/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –2 +/
    PHP все еще жив? Разве нода не убила его?
     
     
  • 2.46, с (?), 07:22, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –1 +/
    Кто?.. А, эта та жирнота, а она еще не сдохла?
     
  • 2.50, Аноним (50), 09:58, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • +1 +/
    Её похоронили рядом с руби.
     
     
  • 3.57, Аноним (55), 15:38, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    И засыпали обломками от хруста.
     
  • 2.54, Вы забыли заполнить поле Name (?), 15:14, 03/07/2020 [^] [^^] [^^^] [ответить]  
  • –2 +/
    > PHP все еще жив? Разве нода не убила его?

    А куда девать кучу быдлокодеров на пыхе? Только расстрелять, но не те времена к сожалению.

     
  • 2.60, SubGun (??), 08:37, 04/07/2020 [^] [^^] [^^^] [ответить]  
  • +/
    Пытается, но нода - та еще помойка. Она сдохнет быстрее, чем php. Появятся правда аналоги, уж больно всем js нравится.
     

  • 1.51, Аноним (51), 10:09, 03/07/2020 [ответить] [﹢﹢﹢] [ · · · ]  
  • –1 +/
    Ненужон
     

     Добавить комментарий
    Имя:
    E-Mail:
    Текст:



    Спонсоры:
    Inferno Solutions
    Hosting by Hoster.ru
    Хостинг:

    Закладки на сайте
    Проследить за страницей
    Created 1996-2020 by Maxim Chirkov
    Добавить, Поддержать, Вебмастеру