Огромные задержи и тормоза при разработке под iOS

И снова здравствуйте (c)

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

Если вы не разработчик то лучше не читайте, это опасно!

Читать «Огромные задержи и тормоза при разработке под iOS» далее

Objective C — язык для гомофилов!

Вроде бы Яббл обещает новый языг программирования и откажется от Object C.

Как же так? Это же такой классный и забористый языг! Вот смотрите на что я целый день сегодня потратит, как же я теперь буду жить без такого красивого и полезного кода? 🙂

Крутой код на Обжектив Це Плас Плас

CSS @font-face без указания имени файла

Если вы купили web тему со кастомным шрифтом в виде CSS @font-face, но этот фонт не поддерживает Cyrilic или как-то криво отображается на разных устройствах, то вместо покупки похожего шрифта, проще всего заменить левый font на что-то стандартное: Arial, Times New Roman, Impact и т.д.

Я около часа гуглил и читал спецификации стандартов CSS/HTML чтобы разобраться как же можно задать @font-face без загрузки файла. Оказывается есть возможность задавать параметр @font-face.src: не только как url() но и через директиву local() !

Вот реальный пример из WordPress темы Tank которую я купил для сайта Привет Танкистам, а потом оказалось что фонт geometric_slabserif_703 для русского языка тупо не существует 😦

@font-face {
    font-family: 'webfontregular';
    src: url('geometric_slabserif_703_bold_condensed_bt-webfont.eot');
    src: url('geometric_slabserif_703_bold_condensed_bt-webfont.eot?#iefix') format('embedded-opentype'),
         url('geometric_slabserif_703_bold_condensed_bt-webfont.woff') format('woff'),
         url('geometric_slabserif_703_bold_condensed_bt-webfont.ttf') format('truetype'),
         url('geometric_slabserif_703_bold_condensed_bt-webfont.svg#webfontregular') format('svg');
    font-weight: normal;
    font-style: normal;
}

А вот так я переопределил @font-face темы под виртуальным названием webfontregular на стандартный шрифт Arial:

@font-face {
    font-family: 'webfontregular';
    src: local('Arial');
    font-weight: normal;
    font-style: normal;
}

В общем @font-face src: local(‘Font Name’) рулит! А в стандартах описано слабо…

Что делать в жизни дальше?

За последний год в Ынтернет я:

  • Создавал сайты и лендинг-пейджи (много, бессмысленно и беспощадно)
  • Заводил сотни социальных аккаунтов во всевозможных соц.сетях, половину названий вы даже не знаете 🙂
  • Знакомил людей между собой и приглашал на всякие мероприятия и конференции. В общем SMM как сейчас говорят.
  • Создавал виртуальных персонажей в соц.сетях. Ну это реально для некоторых бизнес-процессов необходимо!
  • Много копался с клауд сервисами и делал разные бизнес решения на основе Google Apps, Dropbox и прочего.
  • Монтировал много видео и делал много фотографий. Хотя с фотками теперь легче, их Саша делает.
  • Занимался SEO и барыжил ссылками. Ну еще немножко программы продавал 🙂

За последний год в офлайне я:

  • Работал со стартаперами, инвесторами, менторами и прочим «шоу-бизнесом».
  • Посещал тематические конференции, ивенты и собеседования. Активно знакомил людей между собой.
  • Много снимал видео. Разного и всякого. Стал «миллионником» на YouTube, или это уже онлайн? 🙂
  • Вернулся к авиамоделизму и электронике. Хотя серьезных достижение пока нет.
  • Чинил кучу техники для друзей и знакомых. Немного паял новых устройств.
  • Так и не доделал ни мебель, ни «умный дом» 😦

За последний год я программировал на:

  • PHP (чистый, под WordPress и немного Drupal)
  • Delphi — под Windows и потуги под MacOS.
  • C# — пробовал освоить WinRT и Win Mobile.
  • С — под микроконтроллеры, но там мелочь.
  • HTML+CSS+JavaScript — ну это так вообще почти каждый день что-то. Скоро на HTML разговаривать буду.

К чему это я все? Во всем перечисленном я профессионал, но меня это все задолбало и надоело! Хочу чего-то нового, полезного и интересного. Желательно еще чтобы и деньги приносило 🙂

Какие будут идеи и предложения?

В WordPress пропал блок Links

Поднимал новый сайт на WordPress, уже почти все сделал и вдруг заметил что нет пункта «Links» в меню панели управления.

Сначала не поверил своим глазам, потом полез отключать плагины, переустановил WordPress… Ничего не помогало. Полез гуглить… Оп-па! А с версии 3.5x «Links Manager» тупо исключен из WordPress. Фигасе!

По форумам народ негодует, некоторые начали даже какие-то свои плагины писать. Но все решается гораздо проще. Надо в файл functions.php текущей темы добавить вот такой код:


// Enable old-style Links Manager
add_filter('pre_option_link_manager_enabled', '__return_true');

Так что если у вас такая же ситуация — не паникуйте. Это не глюки, это авторы WordPress прикололись 🙂

WordPress, PHP и ошибки в HTML коде

Я не встречал еще ни одной темы для WordPress в которой стандартная форма поиска генерит корректный HTML код при втором ее добавлении на страницу, например в body для 404 ошибки.

Такой же проблемой страдают многие виджеты, которые корректно работают только с одной копией себя. И даже популярные скрипты и библиотеки PHP часто идут без «защиты от дурака».

Вся проблема в том, что горе-программисты жестко записывают id формы и элементов ввода прямо в HTML темплит! В результате при добавлении 2 и последующих копий, в пределах одной страницы появляются кучи элементов с одинаковыми айди!

Для WordPress приходиться каждый раз топать в редактор темы, и для файла Search Form (обычно «searchform.php») добавлять подобный код в начале:

<?php
 
global $some_variable;
if (isset($some_variable)) $some_variable += 1; else $some_variable = 0;   

$form_id = '';
if ($some_variable > 0) $form_id = $some_variable;

?>

Ну а потом фиксить HTML код самой формы, добавляя цифру порядкового номера формы в параметры id и name. Вот реальный пример с одного сайта:

<form role="search" method="get" id="searchform<?php echo $form_id ?>" class="searchform" action="<?php echo home_url( '/' ); ?>">
    <input type="text" value="" name="s<?php echo $form_id ?>" id="s<?php echo $form_id ?>" />
    <input type="submit" id="searchsubmit<?php echo $form_id ?>" value="<?php _e('Search','priimo'); ?>" />
</form>

Надеюсь что такой «фокус» будет полезен для продвинутых владельцев сайтов на WordPress.

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

Повбывавбы…

У Хромого Пола всё…

Любимый ресторан, в котором на протяжении последних 4 лет я бывал каждую среду, закрылся в связи с переездом на новое место…

Мы, как постоянные клиенты, пришли и в последний день работы ресторана У Хромого Пола по адресу Киев, ул. Суворова 4. Вот даже видео записали чтобы передать атмосферу (вообще-то грустную)

Не понятно пока куда переезжает ресторан, зная ситуацию в стране, он вообще может быть закрыт.

Но будем верить в лучшее, а пока по средам попробуем ходить к Голему

Электричество

Какая-то фигня в доме. За неделю уже 5 или 6 раз пропадает электричество!

Ни поработать, ни Олимпиаду посмотреть…

Как делать Google Chrome Extension

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

Прочитать http://code.google.com/chrome/extensions/docs.html конечно же полезно. Но дьявол таки в деталях. Вот моменты, которые неясны даже после прочтения доков, факов и рассматривания готовых примеров:

Chrome Extension — это набор .html, .js, .css файлов, главный из которых manifest.json. В манифесте описывается приложение, его тип, необходимые пермишены (например, загружать внешние скрипты), поведение и т.д. Все файлы можно держать в отельной папке, а можно «скомпилировать» в .crx файл (на самом деле ZIP архив).

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

Добавляются экстеншены в Chrome через menu->tools->extensions, либо кликом по ссылке/файлу с .crx расширением.

Для тестирования и отладки приложений локально, надо нажать галку Developers Mode вверху страницы этих самых Экстеншенов. После этого можно загружать не запакованные приложения (из папки), а так же создавать готовые .crx файлы для распространения самостоятельно.

Кнопка в тулбаре обычно находится сразу, а вот что бы запустить приложение типа аппликейшен — надо открыть новый таб и снизу перейти в Apps страничку. Вам смешно, а я минут 5 не мог найти, где же запускать свое приложение без тулбара 🙂

Background page — это не страница/скрипт которые отображаются в Chrome! Это невидимая страница, которая запускается в одном экземпляре и позволяет взаимодействовать со всеми частями (страницами, скриптами, стилями) экстеншена.

Никакого JavaScript в HTML! Будут работать только подключаемые файлы, это типа защита от инжекшена скриптов. Файлы .js надо класть рядом с .html и просто подключать srs=»abc.js». Это важный момент, а он описан мелким текстом в дебрях документации…

Стандартный .crx файл это ZIP архив, но для паблишинга в Chrome Web Store .crx не подойдет 🙂 Google требует заливать именно .zip файл со всеми файлами приложения. Более того в manifest.json не должно быть комментариев и лишних строк! Иначе при публикации буду непонятные ошибки типа: «An error occurred. Your error has been reported to Google.» 🙂 Так же для публичного экстеншена не должно быть пункта «update_url» в манифесте (офигенная логика!)

Если будете хостить .crx файл на своем сайте, то обязательно пропишите MIME для .crx файлов. Иначе хром будет скачивать приложение, а на установке ругаться. Для апача в .htaccess файле надо прописать:
AddType application/x-chrome-extension .crx

Для автоматического апедейта приложения надо заполнить «update_url» поле в манифесте. По URL должен открываться udate.xml файл, в котором надо не забыть прописать верный appid=’xxxxxyyyyyzzzz’. ID найти не так уже и просто 🙂 Надо установить .crx в Chrome, зайти на страницу приложений, и включить Developers mode. Тогда в списке приложений так же появятся и их ID (случайно нашел!)

Если дойдете до паблишина в Chrome Web Store, то будьте готовы заплатить 5 баксов (разово) за открытие аккаунта.

Developers Dashbord глючная и не совсем понятная штука, так что готовьтесь внимательно читать мелкий тест и следить за ошибками. Особенно бесит, что опубликованное в Tester Account приложение нельзя скопировать в публичный доступ. Приходится вводить все описания и загружать медиа файлы по новой…

Для добавления Экстеншена в Chrome Web Store потребуется иконка размером 128×128, но при этом картинка должна влезть в размер 96х96! Исключение для «круглых иконок», там рабочее поле посередине и 112×112 пикселей. Короче очередная шизиловка от Google 🙂

Так же для Chrome Web Store понадобится скриншот (640×400 или 1280×800) и как минимум один промо материал (440×280).

После паблишинга Экстеншена не спешите всем сообщать новость о том, какой вы крутой. Скорее всего приложение опубликуется в тестовый аккаунт и будет работать только у пары-тройки ваших друзей (там есть списочек). Проверьте работоспособность ссылок на разных компьютерах и под разными операционными системами (Win, Mac, nix) ну а уже потом рассылайте новость о своей «поделке» 🙂

Ну вроде все. Будут и другие грабли, но на самом деле все не так уж страшно. Желаю успехов в написании приложений для Google Chrome!

P.S. Моим первым экстеншеном было вот это: Bad Pixel Test for Google Chrome

Секс с отправкой почты через SMTP.GMAIL.COM

Если вдруг захотите слать почту через SMTP.GMAIL.COM, из почтового клиента или из своей программы, запомните следующие важные моменты:

Все адреса, в том числе СС, BCC и т.д. должны предаваться обернутыми в , и неважно указано имя или нет! То есть, работать будут только такие адреса:

Баба Катя

Любые другие варианты будут приводить ошибкам типа «RCPT first», «Syntax error» или вообще что-то не вменяемое типа «Error 555»

В любой момент Gmail может решить, что вы рассылает слишком много писем через SMTP. И тут уже почтовый клиент не поможет! Надо будет ручками открывать браузер, легироваться в Gmail аккаунт и потом топать по вот такой ссылке: https://accounts.google.com/DisplayUnlockCaptchaV2 и нажимать там кнопочку «Continue». Но и такая фигня поможать всего минут на 10, у Google реально паранойя 😦

Ну и информация для программистов:

Для SMTP.GMAIL.COM по 587 порту требует Explicit SSL и команды «STARTTLS» сразу после соединения.

SMTP.GMAIL.COM по 465 порту работает как Implicit SSL, немного медленнее, и по-моему чаще приводит к срабатыванию защиты от mass mail.

Если вы программите на Delphi и используете библиотеку Indy. Особенно комбинацию Delphi7 + Indy9 то я вам соболезную 🙂 Я 2 дня убил на то, чтобы подобрать рабочие версии нестандартных OpenSSL библиотек для корректной работы с SMTP.GMAIL.COM

Так же будьте внимательны с TidMessage.Recepients — это коллекция объектов и в случаи появления там элемента с пустым email или кривым name — начнется секс с «RCPT first», «Syntax error»

Отака хуйня малята © Дид Панас