JavaScript

Немножко юмора
const a = 0
const b = undefined
const c = 1 / 'a'
console.log(isNaN(a), a, typeof a)
console.log(isNaN(b), b, typeof b)
console.log(isNaN(c), c, typeof c)

Консоль:
false 0 "number"
true undefined "undefined"
true NaN "number"

То есть Not a Number имеет тип number! 🙈

И бонусом весёлое видео:

P.S. Не стоит воспринимать эту запись слишком серьёзно.

В преддверии iPhone 8

— Хорошо, что они это сделали, потому что технология в Xerox просто провалилась. Почему?
— Почему? Я много думал об этом и я многое потом понял об этом, поработав с Джоном Скалли. И теперь картина ясна. То же самое случилось и с Джоном Скалли. Джон пришел из PepsiCo. И они меняли свой продукт раз в 10 лет. Для них новый продукт это как бутылка нового размера. Так? И если вы менеджер по продукции, вы не меняете кардинально политику компании. Но кто повлиял на успех PepsiCo? Люди из отделов продаж и маркетинга! В итоге именно они получили повышение и стали управлять компанией. Может, с PepsiCo всё было хорошо, но то же самое может случиться с технологическими компаниями, которые становятся монополистами, как IBM или Xerox. Если бы вы были менеджерами по продукции в IBM или Xerox, вы бы выпускали всё новые копиры или компьютеры. В итоге люди, которые приносят успех компании, из отделов торговли и маркетинга, встают во главе компании, а менеджеры по продукции отстраняются от принятия важных решений. И компании забывают, что такое выпускать хорошую продукцию. Чутьё нужной продукции, талант, которые сделали их монополистами, загнивают благодаря тем, кто управляет компанией, которые не представляют концепцию хорошей продукции, в отличии от плохой. Они не понимают искусство хорошей идеи и воплощения её в хорошую продукцию и в глубине души они вовсе не хотят помочь потребителю. Это и случилось с Xerox.

Стив Джобс, «Потерянное интервью», 2012

Хакинтош за 50 тысяч рублей

С недавних пор я работаю за новым MacBook Pro 15″ c процессором Core i7 на 8 потоков – этому я несказанно рад. Но вот чему не рад – это моему домашнему Mac mini 11 года выпуска, в котором стоит старенький Core i5 c 4 потоками. Хоть я и сделал в минике Fusion Drive, добавив SSD на 120 гигабайт, а так же впихнув в него максимум оперативной памяти, доведя её объем до сопоставимых с новым ноутбуком 16 гигабайт, всё равно по главному качеству – производительности – домашний компьютер теперь отстает от рабочего в 3 раза! Этот контраст несколько печалит, так как такое разительное отличие в работе крайне заметно. Миник на фоне ноутбука стал казаться «тормозом», хотя раньше меня он более-менее устраивал.
В связи с этим решил посмотреть, что можно предпринять, чтобы изменить такое положение вещей, так как брать ноутбук с работы не вариант и домашний компьютер надо обновлять. В конце концов ему уже 6 лет!

Читать далее Хакинтош за 50 тысяч рублей

Режим «Картинка в картинке» в macOS Sierra

Забавный случай возник сегодня: у меня есть файл mp4 и установленная macOS Sierra, в которой есть крайне удобный режим просмотра «Картинка в картинке», но посмотреть с помощью плееров в таком режиме файл нельзя! Не умеет этого даже родной QuickTime. В VLC есть опция «Поверх всех окон», но она не поддерживает полноэкранные приложения и рабочие столы, а «картинка в картинке» – поддерживает. Например, видео с Youtube очень удобно смотреть параллельно с работой в других приложениях (например, лекции или трансляции).

И вот смотрел я на этот файл, смотрел, и подумал: «Раз он mp4, значит должен быть «родным» для системы… А закину-ка я его в Safari!». В Finder выбрал файл, нажал комбинацию CMD+Alt+C (скопировать абсолютный путь до файла) и вставил в адресную строку Safari — всё заработало!

Быстрая отправка сообщений в мессенджеры

Бывает, надо сделать кнопку «Поделиться» для определенного мессенджера. Самый быстрый способ — это url-схемы. Можно просто вызвать [[UIApplication sharedApplication] openURL:url];  для правильно сконфигурированной ссылки и установленный на телефоне мессенджер примет переданный текст для дальнейшей обработки.

Сейчас покажу, как это сделать для WhatsApp, Viber и Telegram. Читать далее Быстрая отправка сообщений в мессенджеры

Live Rendering и локализация

Есть в Xcode отличная возможность сразу в интерфейсе Interface Builder видеть итоговый результат отрисовки отличных от стандартных компонентов. Например, вы можете сделать свою кнопку с обводкой, добавив три свойства:

Значения этим свойствам можно буден назначить в панели инспектора при редактировании xib или storyboard, а при правильной реализации класса эти изменения тут же отобразятся на вашей кнопке. Подробнее прочитать можно тут, тут и в официальной документации.

Я же хочу поделиться результатом компиляции нескольких идей относительно локализации объектов, находящихся в xib или storyboard.

Читать далее Live Rendering и локализация

Ускоряем Xcode с помощью RAM disk

В операционной системе macOS есть возможность создать виртуальный диск, логический раздел, который будет находиться целиком в оперативной памяти. Иногда его удобно использовать, если вам требуется временное высокоскоростное хранилище для ваших файлов, с которыми вы работаете в данный момент. Например, в случае с Xcode это может быть место, где должны находиться файлы Derived Data.

Для начала запустите Терминал и из под sudo выполните команду:

Она создаст в оперативной памяти диск HFS+ размером в один гигабайт и примонтирует его. Теперь его можно указать как ‘/Volumes/ramdisk’ в настройках Xcode ➝ Preferences ➝ Locations ➝ Derived Data ➝ выбрать ‘Custom’ ➝ вписать ‘/Volumes/ramdisk’. Всё! Для большей уверенности можете переоткрыть проект или рабочее пространство вашего приложения. Вы заметите заметное ускорение работы с проектом, особенно при сборке и компиляции.

ВНИМАНИЕ: все данные будут удалены после размонтирования виртуального диска!!! Недопустимо хранить на нём важные данные и файлы!

Лично у меня при сборке проекта с обычными настройками (Fusion Drive 120GB SSD + 500GB HDD) на всё уходит 165 секунд, а при использовании RAM disk всего 72 секунды. Прирост скорости в 2,3 раза.

Изменение визуальных свойств существующих объектов через протокол UIAppearance

Уже довольно давно, начиная с iOS 5, у программистов появился удобный механизм стилизации внешнего вида компонентов интерфейсов – UIAppearance.

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

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

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

И всё работает замечательно, до того момента, когда в дело вступает один нюанс, описанный в документации:

NOTE
iOS applies appearance changes when a view enters a window, it doesn’t change the appearance of a view that’s already in a window. To change the appearance of a view that’s currently in a window, remove the view from the view hierarchy and then put it back.

Как это свойство влияет на подход к использованию данных методов?

Читать далее Изменение визуальных свойств существующих объектов через протокол UIAppearance