23 дек. 2013 г.

iOS рзаработка: зачем тестировать приложения на таргет-устройствах?! Есть же симулятор!

Решил сохранить цитаты из App Distribution Guide:

If you have an iOS app, make sure you test it not only in iOS Simulator but on all the devices and releases that your app supports. Testing on more than one kind of device ensures that your app operates exactly as you thought it would, no matter which device it’s running on. 
и из раздела "Beta Testing Your iOS App" 
Important: Rigorously test your app on a variety of devices and iOS versions. Because different kinds of devices and iOS releases have different capabilities, it’s not sufficient to test your app on a device provisioned for development or the simulator. iOS Simulator doesn’t run all threads that run on devices, and launching apps on devices through Xcode disables some of the watchdog timers. At a minimum, test the app on all devices you support and have available. In addition, keep prior versions of iOS installed on devices for compatibility testing. If you don’t support certain devices or iOS versions, indicate this in the project target settings in Xcode, as described in “Setting Deployment Info.” 
, чтобы ссылаться на них в случае возникновения вопросов у заказчика/работодателя по поводу ненадобности хардварных тестовых устройств. 

15 дек. 2013 г.

Evernote: Добавление записей с помощью email.

Evernote добавили функцию добавления записей посредством отправки email на закрепленный за пользователем адрес. Настройка этого сервиса находится в настройках аккаунта в разделе Account Summary. Адрес вида  [username].7z126@m.evernote.com генерируется сервисом и может быть сгенерирован заново в случае необходимости. Например, если адрес где-то засветился и ина него стал валиться спам.
Сервис поддерживает маркировку отправленных сообщений с помощью тегов (если добавить #tagname в конце темы письма), а так же размещение в указанном блокноте (указать @notebookname там же). Кроме этого, можно установить в формате ! признак того, что запись является напоминалкой.
Если в конце темы письма добавить символ "+", то тело письма будет добавлено к самой свежей записи с такой же темой, как и само письмо.
Пример:
Fwd: Recipe for Bouillabaisse !2013/06/01 @Recipes #soup #fish #french

Удобная, кстати, фишка — напоминалки через email. Скорее всего есть уже полно таких инструментов, но еще один не помешает :)

Генератор ссылок на iTunes от авторов iTunes

Наткнулся на сервис Linkmaker на iTunes, в котором можно сгенерировать ссылку на нужное приложение для вставки в постах в простом текстовом виде, в виде большой или маленькой кнопок. Так как изображения кнопок линкуются от производителя, то в случае изменения их дизайна в блоге кнопки сменятся автоматически.
Там же есть еще несколько сервисов по созданию виджетов, RSS и прочих контентов. Но их я пока не изучал.

11 дек. 2013 г.

Напоминалка по орфографии. Расти, но Рос

Так, напоминалка как писать слова, связанные с ростом и растениями. А то все время забываю.
РАСТИ, но РОС...
Корень рас(т)- пишется в глаголах расти, растить, вырастать, наращать и т.п. и во всех образованных от них словах, например: растение, произрастание, ращение, сращение, возраст и т. п., а также в слове отрасль;
корень рос(т)- пишется в прошедшем времени и в причастиях прошедшего времени от расти, например: рос, росла, росло, росший, вырос, выросший и т. п., а также в словах заросль, поросль, водоросль, недоросль, росток и в образованных от них словах.

9 дек. 2013 г.

Напоминалка: Найти UDID своего iOS-устройства

Простая WEB-напоминалка как узнать UDID у iOS-девайса: http://leftbit.com/findudid/  Не часто нужно, но потому и нужна, что успеваешь забыть, где его искать :)

2 дек. 2013 г.

Tips: Размеры некоторых элементов экрана iPhone/iPad

CGRect rect;

// Get screen dimensions
rect = [[UIScreen mainScreenbounds];
NSLog(@"Bounds: %@", NSStringFromCGRect(rect));

// Get application frame dimensions (basically screen - status bar)
rect = [[UIScreen mainScreenapplicationFrame];
NSLog(@"App Frame: %@"NSStringFromCGRect(rect));

// Get status bar frame dimensions
rect = [[UIApplication sharedApplicationstatusBarFrame];
NSLog(@"Statusbar frame: %@"NSStringFromCGRect(rect));

16 нояб. 2013 г.

iTunes Connect will be temporarily unavailable from Saturday, December 21, to Friday, December 27, 2013.

Apple предусмотрительно предупреждает о зимних каникулах iTunes Connect (система управления размещением приложений в Apple Appstore). С 21 по 27 декабря iTunes Connect будет закрыт. А это значит, что все, что до нового года должно попасть в аппстор должно быть засабмичено самое позднее 7 декабря (учитывая двухнедельное ревью приложения). А если еще, не дай Бог, есть поводы опасаться реджекта, то и того раньше, чтобы успеть пофиксить. В общем, очередная srachka.

15 нояб. 2013 г.

11 нояб. 2013 г.

SVN: работа с файлами, содержащими "@" в имени

Не первый раз сталкиваюсь с тем, что при работе из командной строки SVN игнорирует правую часть имени файла после символа @. Решается это добавлением после имени файла еще одной собаки @, чтобы SVN знала, что символ @ в имени файла — не последний символ. Например вот так:
svn add somefile@2x.png@

10 нояб. 2013 г.

Однострочники: Макрос получения локализированных строк

Простой Objective-C-макрос для получения строковых ресурсов в зависимости от дефолтной локали
#define LOC(__key__) [[NSBundle mainBundle] localizedStringForKey:(__key__) value:nil table:nil] 

7 нояб. 2013 г.

6 нояб. 2013 г.

"Attention Booster" aka "Разгон внимания": Тренируем память и внимание

Выложил в AppStore свое приложение "Разгон внимания". Приложение сделано по мотивам прохождения курсов скорочтения в клубе "Сапи" по методике Смотрицких. После этих курсов стал заметен прогресс в чтении, внимании и скорости восприятия информации. Чтобы держать себя в форме и не таскать при себе дополнительных папочек, было решено написать генератор четырех основных упражнений, которые в том или ином виде входят во все методики скорочтения: 3 вида таблиц и кольца Ландольта. К тому же, в программе эти упражнения все время генерируются заново, и глаз уже не сможет выучить расположение символов при долгом использовании одной и той же таблицы. Поскольку размер таблицы довольно критичен, то приложение разработано для iPad.
Буквенные таблицы Шульте —
тренировка бокового зрения
Кольца Ландольта — тренировка
концентрации внимания
В текущей версии, как упоминалось, программа предоставляет 4 вида упражнений: числовые, буквенные и смешанные таблицы Шульте, а так же таблицу колец Ландольта (C-charts). В первых трех упражнениях необходимо фиксируя взгляд на центре таблицы искать боковым зрением последовательно буквы и числа. Это упражнение развивает сосредоточенность взгляда и боковое зрение, что является непременным условием выхватывания большей части читаемой строки, чем 1-2 слова.

Таблица колец Ландольта позволяет тренировать сосредоточенность внимания при сканировании текста. В этом упражнении нужно искать кольца определенного направления, игнорируя другие кольца. Этот прием позволяет при быстром сканировании большого объема текста выхватывать знакомые слова и таким образом понимать суть текста.
Приложение имеет две локализации — русскую и английскую. К тому же оно бесплатно.

Скачивайте, пользуйтесь на здоровье.


5 нояб. 2013 г.

Bzzzer - скромный напоминатель

Выложил в Аппстор свою программу под названием Bzzzer. Функционал программы прост. После нажатия кнопки Start Bzzzer воспроизводит выбранный звук с выбранной же периодичностью. Периодичность предоставлена набором из 5, 10, 15 или 30 минут.
Однако смысл программы гораздо глубже, чем может показаться! Когда человек занимается каким-то увлекательным, а возможно совсем не увлекательным и рутинным, делом (листание какого-нибудь агрегатора фан-контента, чтение, рисование, программирование), легко забыть про течение времени. Но вместе с тем, не всегда есть возможность или желание отвлекаться, чтобы посмотреть на часы, вспомнить когда ты последний раз засекал время, сколько прошло с тех пор... Bzzzer ненавязчиво напоминает, что прошло пять минут. Или тридцать. И не отвлекаясь от работы ты отмечаешь, что с момента пуска Bzzzer прошло около 2 часов. Надо бы встать, размяться, подышать воздухом.
Таким образом Bzzzer скромно напоминает, что время уходит, что нужно подсуетиться и успеть больше.
Сам я Базззера пользую уже около 3 лет. Всегда очень помогает держать себя в рамках времени и при этом не просыпаться :)

Так что, welcome, как говорится.


28 сент. 2013 г.

Vim: обрамление выделенного текста другим текстом

Простой регексп для размещения в начале и конце выделенного текста определенных токенов (token1, token2):
:'<,'>s/\%V\(.*\)\%V/token1\1token2)/

24 сент. 2013 г.

Mac OS: Штатная цветовая пипетка (Color picker)

Понадобилось узнать составляющие цвета в окошке программы. Оказалось, что в Mac OS есть штатная утилита DigitalColor Meter. Имеет все, что нужно для периодического определения цвета: разнообразные цветовые модели (RGB, CMYK, etc), отображение в десятичном и хекс форматах, копирование в текста и битмапе. Интересная фишка - кастомный размер пипетки. Если пипетка больше, чем 1 пиксел, выводится усредненный цвет.
Вообще, приятно удивило наличие в стандартном наборе системных утилит шахмат и графопостроителя.

21 сент. 2013 г.

iOS 6.1 standard fonts list

Стндартный набор шрифтов из iOS 6.1

AcademyEngravedLetPlain,
AmericanTypewriter,
AmericanTypewriter-Bold,
AmericanTypewriter-Condensed,
AmericanTypewriter-CondensedBold,
AmericanTypewriter-CondensedLight,
AmericanTypewriter-Light,
AppleColorEmoji,
AppleSDGothicNeo-Bold,
AppleSDGothicNeo-Medium,
Arial-BoldItalicMT,
Arial-BoldMT,
Arial-ItalicMT,
ArialHebrew,
ArialHebrew-Bold,
ArialMT,
ArialRoundedMTBold,
Avenir-Black,
Avenir-BlackOblique,
Avenir-Book,
Avenir-BookOblique,
Avenir-Heavy,
Avenir-HeavyOblique,
Avenir-Light,
Avenir-LightOblique,
Avenir-Medium,
Avenir-MediumOblique,
Avenir-Oblique,
Avenir-Roman,
AvenirNext-Bold,
AvenirNext-BoldItalic,
AvenirNext-DemiBold,
AvenirNext-DemiBoldItalic,
AvenirNext-Heavy,
AvenirNext-HeavyItalic,
AvenirNext-Italic,
AvenirNext-Medium,
AvenirNext-MediumItalic,
AvenirNext-Regular,
AvenirNext-UltraLight,
AvenirNext-UltraLightItalic,
AvenirNextCondensed-Bold,
AvenirNextCondensed-BoldItalic,
AvenirNextCondensed-DemiBold,
AvenirNextCondensed-DemiBoldItalic,
AvenirNextCondensed-Heavy,
AvenirNextCondensed-HeavyItalic,
AvenirNextCondensed-Italic,
AvenirNextCondensed-Medium,
AvenirNextCondensed-MediumItalic,
AvenirNextCondensed-Regular,
AvenirNextCondensed-UltraLight,
AvenirNextCondensed-UltraLightItalic,
BanglaSangamMN,
BanglaSangamMN-Bold,
Baskerville,
Baskerville-Bold,
Baskerville-BoldItalic,
Baskerville-Italic,
Baskerville-SemiBold,
Baskerville-SemiBoldItalic,
BodoniOrnamentsITCTT,
BodoniSvtyTwoITCTT-Bold,
BodoniSvtyTwoITCTT-Book,
BodoniSvtyTwoITCTT-BookIta,
BodoniSvtyTwoOSITCTT-Bold,
BodoniSvtyTwoOSITCTT-Book,
BodoniSvtyTwoOSITCTT-BookIt,
BodoniSvtyTwoSCITCTT-Book
BradleyHandITCTT-Bold,
ChalkboardSE-Bold,
ChalkboardSE-Light,
ChalkboardSE-Regular,
Chalkduster,
Cochin,
Cochin-Bold,
Cochin-BoldItalic,
Cochin-Italic,
Copperplate,
Copperplate-Bold,
Copperplate-Light,
Courier,
Courier-Bold,
Courier-BoldOblique,
Courier-Oblique,
CourierNewPS-BoldItalicMT,
CourierNewPS-BoldMT,
CourierNewPS-ItalicMT,
CourierNewPSMT,
DevanagariSangamMN,
DevanagariSangamMN-Bold,
Didot,
Didot-Bold,
Didot-Italic,
EuphemiaUCAS,
EuphemiaUCAS-Bold,
EuphemiaUCAS-Italic,
Futura-CondensedExtraBold,
Futura-CondensedMedium,
Futura-Medium,
Futura-MediumItalic,
GeezaPro,
GeezaPro-Bold,
Georgia,
Georgia-Bold,
Georgia-BoldItalic,
Georgia-Italic,
GillSans,
GillSans-Bold,
GillSans-BoldItalic,
GillSans-Italic,
GillSans-Light,
GillSans-LightItalic,
GujaratiSangamMN,
GujaratiSangamMN-Bold,
GurmukhiMN,
GurmukhiMN-Bold,
Helvetica,
Helvetica-Bold,
Helvetica-BoldOblique,
Helvetica-Light,
Helvetica-LightOblique,
Helvetica-Oblique,
HelveticaNeue,
HelveticaNeue-Bold,
HelveticaNeue-BoldItalic,
HelveticaNeue-CondensedBlack,
HelveticaNeue-CondensedBold,
HelveticaNeue-Italic,
HelveticaNeue-Light,
HelveticaNeue-LightItalic,
HelveticaNeue-Medium,
HelveticaNeue-UltraLight,
HelveticaNeue-UltraLightItalic,
HiraKakuProN-W3,
HiraKakuProN-W6,
HiraMinProN-W3,
HiraMinProN-W6,
HoeflerText-Black,
HoeflerText-BlackItalic,
HoeflerText-Italic,
HoeflerText-Regular,
Kailasa,
Kailasa-Bold,
KannadaSangamMN,
KannadaSangamMN-Bold,
MalayalamSangamMN,
MalayalamSangamMN-Bold,
Marion-Bold,
Marion-Italic,
Marion-Regular,
MarkerFelt-Thin,
MarkerFelt-Wide,
Noteworthy-Bold,
Noteworthy-Light,
Optima-Bold,
Optima-BoldItalic,
Optima-ExtraBlack,
Optima-Italic,
Optima-Regular,
OriyaSangamMN,
OriyaSangamMN-Bold,
Palatino-Bold,
Palatino-BoldItalic,
Palatino-Italic,
Palatino-Roman,
Papyrus,
Papyrus-Condensed,
PartyLetPlain,
STHeitiSC-Light,
STHeitiSC-Medium,
STHeitiTC-Light,
STHeitiTC-Medium,
SinhalaSangamMN,
SinhalaSangamMN-Bold,
SnellRoundhand,
SnellRoundhand-Black,
SnellRoundhand-Bold,
Symbol,
TamilSangamMN,
TamilSangamMN-Bold,
TeluguSangamMN,
TeluguSangamMN-Bold,
Thonburi,
Thonburi-Bold,
TimesNewRomanPS-BoldItalicMT,
TimesNewRomanPS-BoldMT,
TimesNewRomanPS-ItalicMT,
TimesNewRomanPSMT,
Trebuchet-BoldItalic,
TrebuchetMS,
TrebuchetMS-Bold,
TrebuchetMS-Italic,
Verdana,
Verdana-Bold,
Verdana-BoldItalic,
Verdana-Italic,
ZapfDingbatsITC,
Zapfino

8 июл. 2013 г.

A-la Win95 ;)


Nostalgi? Nope. Just picture :)

26 июн. 2013 г.

Mac OS: Afloat — повышение функциональности окон


Утилита Afloat устанавливается, как системное расширение в MacOS X и добавляет несколько функций для управления окнами приложений. Несколько пунктов меню добавляется в меню Window Cocoa-приложений. Я этот плагинчик ставлю, в основном, из-за двух функций: перетаскивание окна за любое место (по нажатию Cmd+Ctrl) и изменение размера окна (та же комбинация + драг правой клавишей мыши). В дополнение есть функция Always On Top, регулировка прозрачности окна и еще несколько других. Единственное ограничение — поддерживаются только Cocoa-приложения.
Программа бесплатна и удобна. Рекомендую :)

25 мая 2013 г.

Шпаргалка по разработке Objective-C приложений

Вольный... Нет. Очень вольный перевод статьи Стюарта Холла "iOS Development Tips I Would Want If I Was Starting Out Today" (Шпаргалка по iOS разработке, которую я хотел бы иметь, если бы начинал разрабатывать сегодня).

Программирование под iOS становится легче с каждым релизом Xcode. И каждая новая фича увеличивает количество вариантов выбора. 
В мои годы (запах плесени) было гораздо тяжелее! Это так. Но сейчас предъявляют все более высокие требования к качеству. Планка качества постоянно растет. И это хорошо.
И доведись мне начинать свое знакомство с iOS-разработкой сегодня, я бы сильно хотел, чтобы мне кто-то дал почитать этот текст. Надеюсь он кому-то поможет.

Используйте ARC!

ARC — это замечательно. Эта фича избавляет нас от тонны геморроя в работе с памятью, с которыми приходилось сталкиваться ранее. Однако ARC не исключает необходимости понимания того, как работает память, и как держать ее в сухости и чистоте без включенной опции ARC. Я, как олдфаг от плюсов боролся с ARC какое-то время. Но даже многие популярные библиотеки переходят на использование ARC. Не борись. Это внутри тебя. Расслабься и получай удовольствие.

Тулим блоки где только можно

Блоки похожи на ARC. По крайней мере в том, что блоки — это тоже замечательно. Используя блок ты пишешь меньше кода, и он значительно лучше, чем раньше. Меньше кода == меньше багов. Вот тут - классное введение к использованию блоков (ахтунг - тут и далее много нерусских букв - прим. переводчика). 
NSNotifications и _delegate/@protocol все еще на коне. Но сначала подумайте о блоках, а потом уже — про Акима

Опасносте детектед! Retain Cycles в Блоках

Тут тема разжована. Кратко: retain cycles, это когда два объекта (будь-то блок, таймер или вездесущий self) ретейнят друг друга и не могут со спокойной душой отойти в мир иной и устраивают утечку памяти. С блоками такое легко подхватить.

Потоки? Не, не слышал. Пользуй GCD

"Был у дева головняк. Он решил заюзать thread. Головняк теперь двояк."
GCD облегчает нам жизнь. Он — наш друг. Только не забудьте вернуться в главный поток, если делаете что-то с UI.
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^(void) {
    // Your code
    dispatch_async(dispatch_get_main_queue(), ^(void) {
        // Now you can interact with the UI
    });
});
Хорошее объяснение GCD можно найти хере

Singletons / Shared Objects

В продолжение о GCD. Он помогает забыть про ручное выпиливание синглтона:
    + (MyClass *)sharedClass {
static MyClass *_shared = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
    _shared = [[MyClass alloc] init];
});   
return _shared;
}
Все! Боле ничего не нужно. А зацените, сколько весит NSDateFormatter и его создание при каждом обращении! Хороший повод засунуть его в синглтон.

Story Boards — только для быстрых прототипов

ИМХО, со Story Boards больше геморроя, чем пользы. Но это мое мнение. Многие любят их. Решите сами.

XIBы — только для базовых набросков

У Interface Builder столько "низзя", что проще собрать нужную вьюшку в рантайме. К тому же, мержинг двух версий XIB-файла — тот еще трюк, который обычно никто и не делает. Гораздо проще смержить два сорца.
Можно что-то набросать базовое. Но ровнять все равно лучше в коде.

Держите свой проект упорядоченным

Я подзавязал с Ruby on Rails. Но организация проекта мне понравилась. Я так организую свои проекты в Xcode:
Xcode structure
Чистота — залог здоровья!

Присмотритесь к Open Source

Существует множество бесплатных опенсорсных библиотек и компонент. Github забит выдающимися сорцами, который можно просто кинуть в свой проект и пользовать их. Кроме того есть Cocoa Controls. Там тоже полно вкусняшек.
Некоторые либы я включаю почти в каждый свой проект:
Если вы гуглите какой-то модуль, он скорее всего уже тут есть. Ну, по крайней мере что-то похожее.

Управление зависимостями проекта

Чтобы управляться с набором либ, подключенных к проекту, рекомендую пользовать CocoaPods. Этот инструмент делает amazing job. Прямо как Ruby's gems.
Или можете просто использовать отдельные модули.

Попробуйте полюбить Stack Overflow

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

Элегантная деградация

Зачастую хочется использовать свежие фичи новых версий iOS. Но девайсы со старой версией iOS все еще в ходу, и фишки типа  Tweet Sheets в iOS 5, SKStoreProductViewController & UIActivityViewController в iOS 6 приходится поддерживать и для более взрослых версий.
В этом нам поможет не Бахметьев, а проверка существования класса в рантайме:
if (NSClassFromString(@"SKStoreProductViewController")) {
// Класс существует, значит мы в iOS 6+
    SKStoreProductViewController *storeController = [[SKStoreProductViewController alloc] init];
….
}
else {
    // Нет такого класса - значит мы на старом корыте
}

Кастомные шрифты

В прежних версиях iOS (lj 3.2) это была жопа. Поэтому все использовали штатную Helvetica. Но теперь все стало шикарно!
Тутe — краткое описание. Если непонятно как называется шрифт, загляните в Font Book и посмотрите PostScript-имя шрифта.

Локализация должна начинаться до проекта

Локализация реализуется с помощью Xcode очень просто. Особенно, если не использовать xib-файлы. Но легкость локализации проекта в самом начале пропорциональна сложности локализации уже существующего проекта.
Это — замечательный пример локализации приложения под iPhone.

Отслеживайте краши

Креш-логи — это тяжко. Но в помощь нам — сервисы, которые их собирают и приобразуют в читабельный вид. Два стандарта дефакто на сегодня — HockeyApp и TestFlight

Analyze

Инструмент Product -> Analyze должен стать вашим другом. Статические анализаторы — мощное орудие в борьбе с Хейзенбергом.

Instruments

Product -> Profile билдит приложение и запускает Instruments. Instruments — коллекция инструментов (внезапно) проверки вашего приложения. Во-первых стоит взглянуть на "Time Profiler", который покажет сколько процессорного времени занимает ваше приложение. Если ваша табличка скроллится как растекшееся масло, скорее всего она потреблят слишком много процессорного времени.
Instruments

Отслеживайте обзоры

<без ложной скромности>Баги были, есть и будут. Никуда от них не деться. И в отзывах они будут упомянуты. И будут вести они к плохим обзорам. В том числе от юзверей из стран, про которые вы даже не слышали. Не игнорируйте их. Обрабатывайте и получайте их с помощью AppBot. </без ложной скромности>
Уверен, что забыл кучу полезных советов. Да и не все мои советы будут приняты единогласно. Но буде единая заблудшая душа спасена сим постом, буду считать свою миссию выполненной.

14 апр. 2013 г.

Фантомные обновления в iTunes

Столкнулся с ситуацией, когда iTunes не моем маке показывает, что имеются несколько обновлений купленных приложений. Однако при входе в в раздел скачивания обновлений Apple Store количество обновлений равно нулю или минус то, что показывается iTunes. Какое-то время я не обращал внимания на это различие в показаниях. Но недавно число фантомов увеличилось до 4. Решил разобраться.
Выяснилось вот что. На Новый Год я подарил подруге iPod. Инициализировал я его со своего компа. И ставил несколько программ. Потом ее iPod я отвязал от своей учетки и прописал на нем ее данные. Дальнейшая синхронизация ведется с ее компа. Свой комп я так же деавторизовал от ее учетки. Но эти несколько программок остались в локальном хранилище iTunes. И поэтому программа при проверке наличия обновлений учитывала и эти программы, а Apple Store мне показывал только те, которые куплены на мою учетку.
При очередной синхронизации своего iPhone мне iTunes показала примерно такое окошко:
Это меня и навело на догадку о происхождении фантомов. Открыл список приложений в iTunes, отыскал указанные программки и удалил их оттуда. Фантомы пропали.
В форумах Apple (https://discussions.apple.com/) периодически возникают темы про Phantom updates. Но там четкого ответа я не увидел. А он тут лежит. :)

Эра односложных доменов закончилась! Ура, товарищи!

Эра односложных доменных веб-имен, похоже, завершилась. Сейчас практически нереально найти свободный домен, состоящий из одного осмысленного, то бишь существующего в каком-то словаре, слова. Даже в более или менее развитых доменных зонах а-ля com.ua, ru. Не говоря уже про зоны com/net/org. В лучшем случае получится придумать какое-то новое слово, состоящее не из семи подряд согласных и легко запоминающееся. Что-то типа iosism. Но это будет одно из исключений поговорки про все новое и хорошо забытое старое. Все что было старое, скорее всего уже есть в root DNS скрижалях.

Про исчерпание четырехбуквенных com-доменов уже давно известно. Так что тут тоже облом. Минимум 5 букв. Имеется в виду не 4-буквенные осмысленные слова. А все возможные варианты расположения букв вообще.

Самый реальный вариант _создать_ красивый домен - использовать словосочитания из двух-трех слов. Лучше двух. Но что интересно, добавление артикля the к слову в большинстве случаев не делает домен двусложным по доступности:) Скорее всего некий киберсквоттер уже постарался на эту тему.

Ежели поразмыслить далее, то можно предположить, что региональные зоны будут получать все большую популярность. IT-crowd вообще очень неохотно пользуются товаром киберсквоттеров. Поэтому домен скорее будет приобритаться в зоне типа .bel за $10 в год, нежели его com-овский тезка у спекулянта в 200 раз дороже. Тем паче, что львиная доля всех зарегистрированных доменов сейчас смотрят на заглушки-каталоги, что не добавляет им рейтинг у поисковиков. 

Ну и появление дополнительных тематических зон должно иметь место быть. А-ля .game, .movie, etc. Вообще, удивляюсь, почему для голливудских фильмов до сих пор не завели отдельную зону. Такой жЫрррный рынок. Там не по 10 у.е. в год можно брать абоноплату. Ежели отхапать себе такую зону, то можно будет в пенсионный фонд ничего не оплачивать, а уехать куда-то жить в шикарный отель в Симферополе :)

Кстати, локализированные зоны типа .рф - один из признаков этого вектора движения. Выглядит оно конечно коряво, как по мне. Примерно такая же припарка к DNS как и кириллическая раскладка к IBM-стандартной клавиатуре. Но технология есть, она будет развиваться и отлаживаться, ибо рынок сбыта есть. И он практически пуст на предмет предложения, так как это фактически монополия. Тут двум игрокам будет тесновато. Поэтому кто первый встал, того и tapku.

К чему весь этот текст? Просто для систематизации своих мыслей на эту тему. Ну и, опять-таки, опять нет повода не выпить! Поднимем стаканы за начало эры двусложных доменов, господа! :)

28 мар. 2013 г.

Не будите спящего программиста

Таки решил утащить к себе замечательный пост Alexthunder-а "Не будите программиста!". Пост 2009 года, а актуален до сих пор. Да и далее будет актуален. Вот, собственно, он.


  • Jan. 21st, 2009 at 8:57 AM
Вот в отпуске побывал впервые в жизни... а некоторые так за всю жизнь ни разу там и не бывают как я подозреваю.
Не знаю полезно это или нет - отвлечься вот так от работы на почти целый месяц. Я пока не понял какой это возъимеет эффект на производительность труда. Зато во время отпуска я понял кое что о чём много раньше думал и никак не мог осознать.
Меня всегда мучал вопрос - как объяснить людям никогда не занимавшимся такого рода трудом, каким занимаюсь я то что вот происходит у меня и у таких как я в голове когда мы работаем. Как НЕ программисту представить себе работу программиста и понять наконец чего же происходит и как вообще с этим быть.
И вот я кажется понял. Наверное именно благодаря тому что почти на целый месяц выключился из этого процесса, но помнил что скоро придётся вернуться у нему опять.
Ну вобщем хватит предъистории. Как работает программист.
Работа программиста - это СОН.
Звучит нелепо, правда?
Если вы хотите представить что именно делает программист во время работы, то легче всего это представить именно так. Он спит!
Продукт труда программиста это продукт сна - химера. Сновидение записанное специальным языком и переданное электронному устройству для того чтобы продолжаться там когда программист уже проснулся или просто сменил один сон на другой.
Это вы думаете что программист взял задачу, написал программу и задача решилась. Всё не так.
Если взять к примеру задачу нахождения пути выхода из лабиринта. Программист в решении этой задачи не перст который ведёт воображаемую маленькую заблудившуюся девочку незнакомой тропой к выходу. Он и не эта девочка тоже. И не стены лабиринта. Он не выход который надо найти. Он всё это вместе разом.
Для решения задачи программисту приходится стать в своём сознании и лабиринтом, и искомым выходом, и заблудившейся девочкой, и тем перстом что ведёт её куда-то, и теми камушками которые она разбрасывает по дороге чтобы узнавать уже пройденные места. Всё это СНИТСЯ программисту во время работы.
Я не фигурально выражаюсь. Это БУКВАЛЬНО снится. Программист при решении задачи виртуально живёт в создаваемом мире химер, похожих каким-то образом на условия решаемой задачи.
Внешне наблюдение за работающим программистом это тоже самое что наблюдение за спящим человеком. Вы вот сразу засыпаете когда решаете отойти ко сну?
Большинство людей процесс засыпания воспринимают как определённый ритуал. У кого-то он довольно короткий, а у кого-то довольно сложный и длинный. У кого что. Кому-то надо непременно почитать перед сном, кто-то не засыпает если тридцать приседаний не выполнит перед тем как лечь. Так или иначе отход ко сну у каждого происходит по своему и это не просто ЧИК - и заснул. Хотя бывает у некоторых и так.
Вот тоже самое и в работе программиста. Процесс начала работы это тоже самое. Программист не может просто сесть и начать работать точно также как вот вы не можете сказать себе "СПИ УЖЕ СКОРЕЙ!" и отключиться. И общего какого-то способа тоже нет, как нет его в ритуале засыпания.
Кто-то вот считает баранов, которые будучи вызваны к жизни этим вот самым процессом счёта вынуждены потом как-то дальше жить у нас здесь в Новой Зеландии. А кто-то фантазирует. Кто-то следит за своим дыханием, а кто-то просто прилепит чаю с ромашкой и готов.
Это ведь ещё и меняется со временем. Сегодня вот вы легли спать и всё - уже сладкие грёзы. А завтра ворочаетесь час, два, три и ну никак. Тоже самое и в работе программиста. буквально тоже самое.

Ну и что делать всвязи с этим?

Ну скажем так. Если вы НЕ программист и вы каким-то образом заинтересованы впрямую или косвено в том чтобы он производил-таки продукт своего труда, то вам надлежит понять вот это всё хоть в какой-то более-менее мере.
Вот представьте что от вашего сна зависит ваша жизнь, жизнь выших детей и вообще всё. Представьте что от того как вы спите зависит будут-ли ваши дети учиться в университете или пойдут улицы мести. Представьте что от того насколько красивы, успешны, живучи и полны ваши сновидения зависит жизнь пассажиров в самолётах и качество обслуживания в супермаркетах, а главное от этого зависит содержимое вашего кармана в день зарплаты.
Представили?
Вот это именно так выглядит для нас - программистов. БУКВАЛЬНО ТАК.
Это вам со стороны кажется что вы просто подошли и спросили который час.
А давайте я вас подойду и спрошу в три часа ночи который час?
Чего страшного-то? Ну и что такого что вы только что заснули?
Я просто спрошу, вы ответите и спите дальше. Чего такого-то?
Так легче понять я думаю будет. На таком примере.
Вот вы представляйте что от вашего сна зависит ВСЁ! Всё при всё. Вот от того как вы сегодня поспите зависит будет завтра чего дома жрать или нет. Зависит будет ваша дочть замужем или нет. Вырастет ваш сын неудачником или добьётся чего-то в жизни. Всё это зависит от того как продуктивно вы сегодня поспите.
Представили?
И вот вы собираетесь начать этот сон. Этот вот самый сон от которого ВСЁ зависит и вы это отчётливо осознаёте.
Скажите вот теперь. Как насчёт спать и одновременно немножко, краем глаза разговаривать, чуть чуть помогать сыну решать арифметику, немножко подглядывать в телевизор и чуть чуть так совсем немного съездить в магазин? Не на долго...

Как спится, сладко?

Вот теперь подумайте что происходит с программистом к которому раза два-три в час подходят и просят чего-то подсказать, чего-то помочь там вот и тут, чего-то просят его где-то заполнить, отметить и ещё о чём-то не забыть.
Вы бы так смогли КАЖДЫЙ ДЕНЬ?
Ну то есть каждый день вот вы ложитесь спать ЗНАЯ что от вашего сна зависит всё при всё при всё и даже больше. И вот в процессе вашего сна происходит вот это всё - напоминания, запоминания, помогания, звонки, разговоры посторонние под ухом и всё такое. И так каждую ночь. Как вам такая жизнь?
Хотите?
Приходите работать программистом в нашу контору. Получите в полной мере!
Хотя не всё так трагично. Конечно есть люди которые способны кимарить просто постоянно. Водители такие бывают что чуть-ли не на каждом сфетофоре способны чуток вздремнуть. Ну вы знаете - им чуть бибикнуть приходится чтобы вернуть к жизни. Наверняка вы знакомы с такой ситуацией.
Ну так вот и программисты тоже такие бывают. Они всегда находятся в состоянии близком ко сну. Чуть не мешает никто - сразу "брык" и в сон. Не глубоко, только на чуть чуть. Особо серьёзных никаких химер не успеешь понагрезить, но чуть-чуть немножко слабо-туманных вполне успеешь. Вот в такой сон.
Именно так и производится большая часть программного продукта. Она производится людьми которые либо вообще не понимают что они делают, либо теми кто в силу каких-то причин просто не может погрузиться в сон достаточно глубоко. Соответственные и результаты.
Ну потому что отвлекают постоянно. Потому что БУДЯТ же бля постоянно! Потому что люди не понимают что ты же спишь и что их ебучая менеджерская "организационная" активность она на самом деле только мешает работать. Большинство людей НЕ программистов этого не понимают.
Я надеюсь что осознав аналогию работы программиста со сном может быть люди лучше поймут как надо обходиться с программистами и откуда вообще берутся хорошие программы. Поймут наконец что вот этот ебучий ЖЖ - это то что пишу и читаю ПЕРЕД СНОМ. Вот также как вы. Вы не можете спать пока не начитаетесь или пока телевизор не насмотритесь. Не можете ведь?
Вот и я не могу я работать пока неначитаюсь, ненахожусь в туалет, неначищусь зубы, ненапишусь в жевом журнальчеге, ненавотэтовсёнаделаюсь. И если мне не дать закончить это до конца, до состояния наступления глубокого сна, если вмешаться в этот ритуал, то его придётся потом начинать практически заново. Точно также как вам придётся снова считать баранов если вас разбудить когда вы только что заснули.
Хотите хороших программ?
Хотите чтобы ваш муж-программист был успешен и заработал все деньги?
Хотите чтобы ваши подчинённые программисты наконец-то сделали всё как надо?
Тогда вот вам простой рецепт:

НЕ БУДИТЕ СЛИШКОМ ЧАСТО ПРОГРАММИСТА!

27 мар. 2013 г.

Badaboom: Stackoverflow.com

Хотя нужно сказать, что поднялись оперативненько.

17 мар. 2013 г.

Objective-C: однострочник для логгирования CGRect

Периодически приходится выводить в лог размер и положение какого-то контрола. Может даже двух. А то и вовсе трех. Сваял вот такой макрос для более удобного логгирования. Кстати, подумалось, что из-за используемого #x этот макрос сложно реализовать в виде функции. Обработка передаваемого параметра как строки, насколько я знаю, фишка именно препроцессора C/C++ сотоварищи.

#define LOGRect(x) NSLog(@"Logging Rect %s: %@", (#x), NSStringFromCGRect(x))

21 янв. 2013 г.

Небольшая шутка в Apple-документации

В обычно сухой и строгой документации от Apple написано: "Они могут содержать любые объекты, и эти объекты могут быль любого типа. Объект NSArray может содержать, например, кошек, собак, вомбатов и их комбинации."

14 янв. 2013 г.

Пара алиасов для SVN

Пара алиасов для более удобного использования svn:
#вывод всех изменений, кроме не контролируемых
alias svnm='svn stat | egrep -v "^(\? )"'
#варианты для апдейта ;)
alias svnup='svn up'
alias svnupcheg='svnup'
alias svnupchik='svnup'
Добавить в файл ~/.bashrc или ~/.profile (в Mac OS) и пользовать по надобности

4 янв. 2013 г.

Баннизмы

Не то, чтобы злободневно, но прикольно.

Бадабум: ЖЖ

У Экслера в ЖЖ предложили переименовать ЖЖ в ПДЖ - полудхлый журнал. Жаль, наверное.

Бадабум: Одноклассники

У Одноклассников случился казус. Не открываются.