Возможность писать асинхронный код через 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-систем — вещь обыденная и привычная, создаются они просто:
1 |
ln -s destination.file link.file |
где destination.file — файл на который хотим сослаться, link.file — файл-ссылка. Причем, путь к destination.file может быть как абсолютным, так и относительно файла-ссылки. То есть по сути мы этот путь записываем в link.file.
В Windows, начиная с Висты, а значит и в Windows 7, 8 и т.д. появилась аналогичная возможность, ссылку можно создать в консоли следующей командой:
1 |
mklink link.file destination.file |
Заметьте, тут идет сначала файл-ссылка, а затем реальный файл. Есть еще одно странное отличие от Юникс-систем: если вам нужно создать ссылку на директорию, то нужно добавить параметр /D
1 |
mklink /D link_dir destination_dir |
О других возможностях этой команды можно узнать, запустив ее без параметров, просто mklink. Не забудьте, что вам может не хватить полномочий для выполнения этой команды, поэтому лучше запустить консоль с правами администратора.
Функции в javascript. Оглавление
Наконец-то дописал цикл уроков (всего их 4), которые, я надеюсь, смогут помочь начинающим javascript-программистам или имеющим опыт программирования на других языках быстро освоиться в тонкостях и «красивостях» языка javascript. Старался писать максимально лаконично, больше пояснять примерами, нежели словами, будем надеяться, доступность изложения от этого не пострадала. Итак, собственно, оглавление:
Ну и в качестве бонус-трека — старая статья «Сортировка полей объектов в JavaScript (проблема в Chrome и Opera)«, можете почитать, вдруг пригодится.
Функции в javascript. Урок 4. Прототипы
Оглавление цикла уроков по функциям в javascript.
Как я уже оговорился в предыдущем уроке, вновь создаваемый объект не совсем пустой, у него есть, например, поле __proto__ (доступное явно не во всех браузерах), которое содержит ссылку на прототип этого объекта. Прототип — это тоже некий объект, который приходит на помощь, когда у нашего объекта нет полей и методов, нужных нашей программе. По сути, через прототипы в javascript реализуется механизм наследования. Как же задать прототип? Очень просто — через свойство prototype функции-конструктора:
1 2 3 4 5 6 7 8 9 10 |
function Constructor () {} Consructor.prototype = { test: function () { alert("Test"); } }; var obj1 = new Constructor(); var obj2 = new Constructor(); obj1.test(); // выведет "Test" obj2.test(); // тоже выведет "Test" |
Функции в javascript. Урок 3. Конструкторы
Оглавление цикла уроков по функциям в javascript.
В предыдущем уроке мы разобрали, на что же ссылается this внутри функций. В этом уроке мы продолжим данную тему, но сначала поговорим об объектах.
Как известно, javascript является объектно-ориентированным языком, однако, в отличие от многих других языков, в нем нет никаких классов вообще. Как же создать объект? Первый способ — задать объект с помощью литерала. Причем, мы можем задавать имена полей с помощью любых символов:
1 2 3 4 5 6 7 8 9 |
var obj = { text: "Test", "It's a method!": function () { alert(this.text); } }; alert(obj.text); // тут ничего сложного obj["It's a method!"](); // так можно вызвать метод obj.It's a method!(); // так недопустимо, синтаксическая ошибка |
Функции в javascript. Урок 2. Ключевое слово this
Оглавление цикла уроков по функциям в javascript.
Как я уже писал в предыдущем уроке: функции в javascript — это объекты, такие же, как, скажем, массивы. Их можно присваивать переменным или полям других объектов, можно у них создавать поля и задавать любое их содержимое (someFunc.field = «value»), можно передавать в качестве параметров при вызове других функций. Да, отличие функций от других объектов — их можно вызывать, передавая какие-то параметры. Но есть также небольшое отличие от других популярных языков программирования: в javascript функции не просто вызываются, а явно или неявно применяются к неким объектам.
Формально вызов функции выглядит следующим образом:
1 |
someFunc.apply(someObj, [param1, param2, ...]); |
или, что то же самое, но параметры передаются не массивом, а через запятую:
1 |
someFunc.call(someObj, param1, param2, ...); |
Функции в javascript. Урок 1. Основы
Оглавление цикла уроков по функциям в javascript.
Правильное понимание механизма работы функций в javascript — одно из самых важных качеств, необходимых опытным программистам на этом языке.
Варианты объявления функции
Обычно начинающие javascript-программисты пишут определение функции таким образом:
1 |
function someFunc () { ... } |
Но функции в Javascript — это объекты, а любые объекты можно присваивать переменной, в случае функции это может выглядеть так:
1 |
var someFunc = function () { ... }; |
Хостинг для бэкапов — 2
Я уже писал до этого статью о хранении бэкапов. С тех пор много воды утекло, и Selectel успел запустить новую услугу — Облачное хранилище. Подробности можно почитать по ссылке, вкратце: вы платите только за хранение файлов и за исходящий трафик. Чем больше объем файлов и чем чаще и больше их качают, тем больше вы платите.
Массовое изменение прав доступа на файлы и папки
Если у вас нет полного понимания по теме прав доступа в unix-системах, советую для начала ознакомиться с моей предыдущей статьей: «Права доступа в Linux/Unix для начинающих«.
Предположим, вы загрузили по FTP или перенесли с другого сервера большую папку с кучей файлов и вложенных папок. Если веб-сервер работает от имени «анонимного» системного пользователя, то возникнут проблемы с записью в эти папки и файлы из ваших скриптов. Решение простое: используя комбинацию unix-команд find и chmod, установить для папок права доступа 777, а для файлов — 666. Вот как это делается для папок (сначала командой cd переходим в нужную папку, в команде find мы задаем, что работаем с текущей папкой и всеми вложенными):
1 |
find ./ -type d -exec chmod 777 {} \; |
и для файлов:
1 |
find ./ -type f -exec chmod 666 {} \; |
Разберем различия в этих командах. После -type для папок стоит d («directory»), то есть ищем все директории, а для файлов — f («file»). Затем идет параметр -exec, после которого мы и ставим команду, которую нужно выполнить для каждого найденного файла (вместо имени — {}).
Права доступа в Linux/Unix для начинающих
У новичков в мире Linux/Unix возникает ощущение, что права доступа — это нечто вроде шаманства, всякие там 755, 644 и, самое страшное заклинание, — 666. Попробую коротко и предельно просто объяснить, что ничего сложного в этих цифрах нет.
Самое основное: у каждого файла есть пользователь-владелец и группа, к которой он «приписан». Ну и в системе есть еще другие пользователи. Первая цифра в этой триаде означает, какой уровень доступа у владельца, вторая — у группы, третья — у всех остальных пользователей, включая системных (о них ниже). Естественно, пользователь root — царь и бог в системе, поэтому права доступа его вообще не касаются. Он может делать с любыми файлами все что захочет.
Сортировка полей объектов в JavaScript (проблема в Chrome и Opera)
Часто объекты в JavaScript используются в качестве заменителей ассоциативных массивов в других языках, таких, как PHP. Например, мы можем передать с сервера в браузер список автомобильных марок в виде пар ключ-значение, где ключами являются id марок в нашей базе, а значениями — названия марок. Скажем, «ассоциативный массив» (он же объект) будет выглядеть так:
1 |
var list = {3: "Audi", 2: "BMW", 1: "Chevrolet"}; |
Теперь выведем содержимое списка с помощью перебора по методу for-in:
1 2 3 |
for (var i in list) { alert(list[i]); } |
И тут проявляются различи между браузерами. Firefox и IE выведут в алфавитном порядке, как мы и задали. А вот Chrome и Opera отсортируют поля объекта в порядке возрастания ключа и выведут в данном случае в обратном порядке. Как же быть?
Где дешевле всего регистрировать домены в зонах .com, .net, .org, .info, .biz — 2
Несколько месяцев назад я прояснял вопрос, где же дешевле всего регистрировать домены в самых популярных международных зонах. Тогда победителем оказался ValueHost — 295 рублей. С тех пор утекло много воды, и Валуй поднял цену в 2,5 раза — до 750 рублей. Теперь же, из рассмотренных мной площадок для регистрации домена самой выгодной оказался другой хостер — TimeWeb — 325 рублей, что не так уж и хуже, можно списать на инфляцию и рост курса доллара. :)
Функции в Javascript
Статья была слегка исправлена и серьезно дополнена и теперь доступна по новому адресу: Функции в javascript. Урок 1. Основы
Хостинг для бэкапов — где их хранить?
(Не забудьте прочитать продолжение статьи — Хостинг для бэкапов – 2)
В последнее время среди веб-разработчиков становится все более популярной идея о том, что лучше пользоваться виртуальными (или даже реальными) серверами для своих интернет-проектов, нежели обычным виртуальным хостингом. Оно и понятно: так можно достичь большей гибкости в настройке программного обеспечения, а также (обычно) большей надежности. Да и хостерам это удобнее — нарезаешь сервер на куски и продаешь на вес, все остальное — дело клиента.
И тут вырисовывается проблема: кроме самого виртуального сервера нужно еще место, где хранить бекапы, резервные копии данных этого виртуального сервера. Причем, хорошо бы, чтобы они хранились удаленно, дабы в случае проблем у основного хостера можно было бы оперативно перенести проект в другое место.
Где дешевле всего регистрировать домены в зонах .com, .net, .org, .info, .biz?
Времена меняются, меняются и цены, написал новый пост о том, где дешевле всего регистрировать домен.
Сессии PHP и «Помнить меня»
Как-то раз, давно уже, зашел у нас на Хабре спор с одним местным юзером о том, как реализовывать функционал «Помнить меня». Он до хрипоты доказывал, что это нужно делать посредством просто длинных php-сессий. Мои аргументы о том, что сессии потому и называются сессиями (наверно, правильный перевод session — это все же «сеанс»), что они должны быть краткосрочными, не действовали. Оппонент говорил: раз можно сделать длительность сессий хоть несколько лет, то этим и надо пользоваться.
Тонкости PHP
Для затравки напишу-ка про парочку особенностей PHP, которые мало кто (в основном из начинающих) знает.
1. Наверное, многие сталкивались с такой проблемой, что в скриптах не хочет работать редирект. Вместо этого, интерпретатор PHP упорно выдает сообщение об ошибке. Это происходит потому, что где-то в вашем скрипте уже произошел вывод контента. Значит, посылать заголовки оператором header() становится бессмысленно. Собственно, PHP на это и указывает в своих сообщениях. Часто такая вещь происходит, когда в конце одного из подключаемых php-скриптов остаются пробелы или пустая строка, заметить которые иногда бывает проблематично. А остаются они после завершающей скрипт конструкции «?>». Интерпретатор получает знак «Все, php закончился, дальше идет прямой вывод в браузер». Ну и выводит. Как этого избежать? Очень просто: не ставить в конце скрипта «?>», интерпретатор на это не ругается, так даже правильнее.
2. Начиная с версии 5.2.1, в PHP изменился алгоритм формирования псевдослучайных последовательностей чисел с помощью функции mt_rand(). В документации это найти сложно, а вот я столкнулся с этим сам, когда при переходе с четвертой версии на свежую пятую оказалось, что скрипт, генерирующий случайные числа на основе задаваемого начального значения (с помощью функции mt_srand(), которую начиная с версии 4.2.0 вызывать необязательно, но она бывает нужна, если вам нужно формировать одни и те же последовательности), стал выдавать совершенно другие числа. Будьте бдительны. :)
Поехали!
Ну, начнем. Пока буду разбираться, что тут да как