Некоторые особенности 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», что, во-первых, сильно раздувает объем хранимых данных, а во-вторых, просто неудобно при просмотре содержимого таблиц.
Читать далее

Проблемы с установкой npm-пакетов под Windows

В unix-мире все проще: обычно у вас в системе уже установлен компилятор gcc, поэтому даже если какие-то пакеты требуют компиляции — обычно все проходит гладко.

Windows — другое дело. Читать далее

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

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

Читать далее

Как создать символическую ссылку в Windows

Символические ссылки в мире Linux/Unix-систем — вещь обыденная и привычная, создаются они просто:

где destination.file — файл на который хотим сослаться, link.file — файл-ссылка. Причем, путь к destination.file может быть как абсолютным, так и относительно файла-ссылки. То есть по сути мы этот путь записываем в link.file.

В Windows, начиная с Висты, а значит и в Windows 7, 8 и т.д. появилась аналогичная возможность, ссылку можно создать в консоли следующей командой:

Заметьте, тут идет сначала файл-ссылка, а затем реальный файл. Есть еще одно странное отличие от Юникс-систем: если вам нужно создать ссылку на директорию, то нужно добавить параметр /D

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

Функции в 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 — это объекты, а любые объекты можно присваивать переменной, в случае функции это может выглядеть так:

Читать далее

Хостинг для бэкапов — 2

Я уже писал до этого статью о хранении бэкапов. С тех пор много воды утекло, и Selectel успел запустить новую услугу — Облачное хранилище. Подробности можно почитать по ссылке, вкратце: вы платите только за хранение файлов и за исходящий трафик. Чем больше объем файлов и чем чаще и больше их качают, тем больше вы платите.

Читать далее

Массовое изменение прав доступа на файлы и папки

Если у вас нет полного понимания по теме прав доступа в unix-системах, советую для начала ознакомиться с моей предыдущей статьей: «Права доступа в Linux/Unix для начинающих«.

Предположим, вы загрузили по FTP или перенесли с другого сервера большую папку с кучей файлов и вложенных папок. Если веб-сервер работает от имени «анонимного» системного пользователя, то возникнут проблемы с записью в эти папки и файлы из ваших скриптов. Решение простое: используя комбинацию unix-команд find и chmod, установить для папок права доступа 777, а для файлов — 666. Вот как это делается для папок (сначала командой cd переходим в нужную папку, в команде find мы задаем, что работаем с текущей папкой и всеми вложенными):

и для файлов:

Разберем различия в этих командах. После -type для папок стоит d («directory»), то есть ищем все директории, а для файлов — f («file»). Затем идет параметр -exec, после которого мы и ставим команду, которую нужно выполнить для каждого найденного файла (вместо имени — {}).

Права доступа в Linux/Unix для начинающих

У новичков в мире Linux/Unix возникает ощущение, что права доступа — это нечто вроде шаманства, всякие там 755, 644 и, самое страшное заклинание, — 666. Попробую коротко и предельно просто объяснить, что ничего сложного в этих цифрах нет.

Самое основное: у каждого файла есть пользователь-владелец и группа, к которой он «приписан». Ну и в системе есть еще другие пользователи. Первая цифра в этой триаде означает, какой уровень доступа у владельца, вторая — у группы, третья — у всех остальных пользователей, включая системных (о них ниже). Естественно, пользователь root — царь и бог в системе, поэтому права доступа его вообще не касаются. Он может делать с любыми файлами все что захочет.

Читать далее

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

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

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

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

Читать далее

Где дешевле всего регистрировать домены в зонах .com, .net, .org, .info, .biz — 2

Несколько месяцев назад я прояснял вопрос, где же дешевле всего регистрировать домены в самых популярных международных зонах. Тогда победителем оказался ValueHost — 295 рублей. С тех пор утекло много воды, и Валуй поднял цену в 2,5 раза — до 750 рублей. Теперь же, из рассмотренных мной площадок для регистрации домена самой выгодной оказался другой хостер — TimeWeb — 325 рублей, что не так уж и хуже, можно списать на инфляцию и рост курса доллара. :)

Хостинг для бэкапов — где их хранить?

(Не забудьте прочитать продолжение статьи — Хостинг для бэкапов – 2)

В последнее время среди веб-разработчиков становится все более популярной идея о том, что лучше пользоваться виртуальными (или даже реальными) серверами для своих интернет-проектов, нежели обычным виртуальным хостингом. Оно и понятно: так можно достичь большей гибкости в настройке программного обеспечения, а также (обычно) большей надежности. Да и хостерам это удобнее — нарезаешь сервер на куски и продаешь на вес, все остальное — дело клиента.

И тут вырисовывается проблема: кроме самого виртуального сервера нужно еще место, где хранить бекапы, резервные копии данных этого виртуального сервера. Причем, хорошо бы, чтобы они хранились удаленно, дабы в случае проблем у основного хостера можно было бы оперативно перенести проект в другое место.

Читать далее

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

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

Читать далее

Тонкости PHP

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

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

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