Архив рубрики: Программирование

Некоторые особенности async / await

Возможность писать асинхронный код через async / await, которая появилась в Javascript начиная с версии ES2017, безусловно упрощает процесс разработки и понимания написанного другими кода. Давайте рассмотрим одну неочивидную особенность поведения такой программы. Читать далее

Шпаргалка по операторам сравнения и преобразованию типов в JS

Тема сравнения значений и тесно переплетенная с ней тема приведения типов относятся к самой фундаментальной области знаний для программистов на Javascript, без этих знаний будет легко допустить ошибки, и в каких-то моментах поведение программы может показаться нелогичным. Эта тема — такой же фундамент, как и тема функций и ООП в JS, о которых я уже писал цикл статей (кстати, надо бы сесть и обновить их, привести к текущим реалиям языка). Итак, постараюсь изложить максимально коротко, насколько это позволяют важность темы и подводные камни языка. Читать далее

«Странности» с типами в PHP

Как известно, язык PHP славится своими «подводными камнями», когда дело касается типизации переменных.

Рассмотрим задачу, когда, казалось бы, очевидное и простое решение вдруг не работает, и очень важно внимательно читать документацию.
Читать далее

Doctrine: добавляем тип tinyint

В предыдущей заметке я рассказал, как переопределить поведение для типа json_array в Doctrine. Сейчас расскажу, как добавить поддержку однобайтового типа tinyint.
Читать далее

Doctrine: тип json_array, русские буквы и JSON_UNESCAPED_UNICODE

В Doctrine есть удобный тип поля для хранения сложных структур дынных (массивов, в том числе ассоциативных и вложенных) — json_array. Но у него имеется один серьезный, на мой взгляд, недостаток: при работе, например, с русским языком происходит кодирование многобайтных символов, и строка «Привет» превращается в «\u041f\u0440\u0438\u0432\u0435\u0442», что, во-первых, сильно раздувает объем хранимых данных, а во-вторых, просто неудобно при просмотре содержимого таблиц.
Читать далее

ImageMagick: как правильно сжать фотографии, загружаемые на сервер

Однажды я заметил, что фотографии, загружаемые пользователями на одном нашем сайте, уж слишком много весят. Точнее, слишком тяжелыми делались фотки-миниатюры, которые были по размерам меньше 100 пикселей по каждой из сторон, но могли при этом иметь размер и в 100 килобайт. Еще обратил внимание, что одни фотографии такие огромные, а другие весят, как им и положено, 2-3 килобайта.

Читать далее

Функции в javascript. Оглавление

Наконец-то дописал цикл уроков (всего их 4), которые, я надеюсь, смогут помочь начинающим javascript-программистам или имеющим опыт программирования на других языках быстро освоиться в тонкостях и «красивостях» языка javascript. Старался писать максимально лаконично, больше пояснять примерами, нежели словами, будем надеяться, доступность изложения от этого не пострадала. Итак, собственно, оглавление:

Ну и в качестве бонус-трека — старая статья «Сортировка полей объектов в JavaScript (проблема в Chrome и Opera)«, можете почитать, вдруг пригодится.

Функции в javascript. Урок 4. Прототипы

Оглавление цикла уроков по функциям в javascript.

Как я уже оговорился в предыдущем уроке, вновь создаваемый объект не совсем пустой, у него есть, например, поле __proto__ (доступное явно не во всех браузерах), которое содержит ссылку на прототип этого объекта. Прототип — это тоже некий объект, который приходит на помощь, когда у нашего объекта нет полей и методов, нужных нашей программе. По сути, через прототипы в javascript реализуется механизм наследования. Как же задать прототип? Очень просто — через свойство prototype функции-конструктора:

Читать далее

Функции в javascript. Урок 3. Конструкторы

Оглавление цикла уроков по функциям в javascript.

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

Как известно, javascript является объектно-ориентированным языком, однако, в отличие от многих других языков, в нем нет никаких классов вообще. Как же создать объект? Первый способ — задать объект с помощью литерала. Причем, мы можем задавать имена полей с помощью любых символов:

Читать далее

Функции в javascript. Урок 2. Ключевое слово this

Оглавление цикла уроков по функциям в javascript.

Как я уже писал в предыдущем уроке: функции в javascript — это объекты, такие же, как, скажем, массивы. Их можно присваивать переменным или полям других объектов, можно у них создавать поля и задавать любое их содержимое (someFunc.field = «value»), можно передавать в качестве параметров при вызове других функций. Да, отличие функций от других объектов — их можно вызывать, передавая какие-то параметры. Но есть также небольшое отличие от других популярных языков программирования: в javascript функции не просто вызываются, а явно или неявно применяются к неким объектам.

Формально вызов функции выглядит следующим образом:

или, что то же самое, но параметры передаются не массивом, а через запятую:

Читать далее

Функции в javascript. Урок 1. Основы

Оглавление цикла уроков по функциям в javascript.

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

Варианты объявления функции

Обычно начинающие javascript-программисты пишут определение функции таким образом:

Но функции в Javascript — это объекты, а любые объекты можно присваивать переменной, в случае функции это может выглядеть так:

Читать далее

Сортировка полей объектов в JavaScript (проблема в Chrome и Opera)

Часто объекты в JavaScript используются в качестве заменителей ассоциативных массивов в других языках, таких, как PHP. Например, мы можем передать с сервера в браузер список автомобильных марок в виде пар ключ-значение, где ключами являются id марок в нашей базе, а значениями — названия марок. Скажем, «ассоциативный массив» (он же объект) будет выглядеть так:

Теперь выведем содержимое списка с помощью перебора по методу for-in:

И тут проявляются различи между браузерами. Firefox и IE выведут в алфавитном порядке, как мы и задали. А вот Chrome и Opera отсортируют поля объекта в порядке возрастания ключа и выведут в данном случае в обратном порядке. Как же быть?

Читать далее

Сессии PHP и «Помнить меня»

Как-то раз, давно уже, зашел у нас на Хабре спор с одним местным юзером о том, как реализовывать функционал «Помнить меня». Он до хрипоты доказывал, что это нужно делать посредством просто длинных php-сессий. Мои аргументы о том, что сессии потому и называются сессиями (наверно, правильный перевод session — это все же «сеанс»), что они должны быть краткосрочными, не действовали. Оппонент говорил: раз можно сделать длительность сессий хоть несколько лет, то этим и надо пользоваться.

Читать далее

Тонкости PHP

Для затравки напишу-ка про парочку особенностей PHP, которые мало кто (в основном из начинающих) знает.

1. Наверное, многие сталкивались с такой проблемой, что в скриптах не хочет работать редирект. Вместо этого, интерпретатор PHP упорно выдает сообщение об ошибке. Это происходит потому, что где-то в вашем скрипте уже произошел вывод контента. Значит, посылать заголовки оператором header() становится бессмысленно. Собственно, PHP на это и указывает в своих сообщениях. Часто такая вещь происходит, когда в конце одного из подключаемых php-скриптов остаются пробелы или пустая строка, заметить которые иногда бывает проблематично. А остаются они после завершающей скрипт конструкции «?>». Интерпретатор получает знак «Все, php закончился, дальше идет прямой вывод в браузер». Ну и выводит. Как этого избежать? Очень просто: не ставить в конце скрипта «?>», интерпретатор на это не ругается, так даже правильнее.

2. Начиная с версии 5.2.1, в PHP изменился  алгоритм формирования псевдослучайных последовательностей чисел с помощью функции mt_rand(). В документации это найти сложно, а вот я столкнулся с этим сам, когда при переходе с четвертой версии на свежую пятую оказалось, что скрипт, генерирующий случайные числа на основе задаваемого начального значения (с помощью функции mt_srand(), которую начиная с версии 4.2.0 вызывать необязательно, но она бывает нужна, если вам нужно формировать одни и те же последовательности), стал выдавать совершенно другие числа. Будьте бдительны. :)