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 г.

Баннизмы

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

Бадабум: ЖЖ

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

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

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

31 дек. 2012 г.

Дополнительные смайлы в Skype

(smoking) или (ci) — курящий смайл
(bug) — жук
(poolparty) — вечеринка в бассейне
(bandit) — бандит
(drunk) — пьяный смайл
(headbang) — бьётся головой об стену
(mooning) — Демонстрация ягодиц
(rock) — рок
(finger) — показывает cредний палец
(toivo) — мальчик с собакой
(fubar) — тычет пальцем
(swear) — ругается матом
(flag:«2 буквы государства»), например флаг России — (flag:ru)
(skype) — значок скайпа.

27 дек. 2012 г.

Online антивирусы - проверка файлов

Иногда бывает нужно проверить файл на наличие заразы, а антивируса на машине не установлено. Помогают онлайн-сканеры файлов. Было бы логично, конечно, чтобы такие сканнеры были на сайтах известных антивирусов. Но не все из них предоставляют такую услугу. У Касперского, например, она была, но потом ее убрали.
Вот пара таких ресурсов, которыми я иногда пользуюсь:
http://onlinescan.avast.com/ Без рекламы. Органичение - 16МБ. Используется Avast Antivirus Engine. Поддерживается HTTPS-подключение.
http://www.viruschief.com/. Без рекламы. Ограничение на файл не декларируется. Используются несколько (5?) антивирусных движков. HTTPS не поддерживается.

25 дек. 2012 г.

MacOS: установка pkg-файлов из командной строки

Установка pkg-файла из клиандной строки:
 sudo installer -pkg filename.pkg -target /

27 нояб. 2012 г.

Падение XChat Azure на Mac OS X Lion (10.7)

После обновления XChat Azure до версии 1.13.0 он начал падать при старте на Lion 10.7. Добрался до описания XChat Azure в iTunes. Там выяснилось следующее:

 *** DO NOT UPDATE LION USERS *** Lion (10.7) users are experiancing crash from this update. Waiting for next release please (1.13.1) or try preview version on project download page (https://github.com/xchataqua/xchataqua/downloads). Sorry about inconvinience.

 То бишь, нужно дождаться аппрува фикса в AppStore (1-2 недели), или скачать пофикшенную версию с Github. Я выбрал второе :)

26 нояб. 2012 г.

SVN : branches and tags

Небольшая напоминалка по поводу использвоания таких фич SVN как branches и tags. Функция бранчей и тагов уже достаточно описана. В двух словах — это параллельный набор исходников (ну, или того, что хранится в SVN). С помощью branch обеспечивается безопасное внесение изменений без затрагивания основной (trunk) копии сорцов. После окончания внесения изменений, проверки и тестирования версии продукта в бранче производится его перенос в основную ветку - транк. Это может быть совмещение (merge), может быть замена транка бранчем... Зависит от политики и настроения. Назначение tag аналогично за исключением того, что после создания копии транка в тэге эта копия не предполагает изменения. Тэги еще называют метками (labels). Их делают для того, чтобы в репозитории хранился моментальный снимок сорцов на какой-то определенный момент времени. Например, для каждого релиза создается тэг, к которому можно откатиться в случае необходимости. В случае SVN и trunk, и branch, и tags - обычные директории, выполняющие свои специфические функции на уровне соглашения. Предполагается, что содержимое директории %PROJECT_REPO%/tags не изменяется - только создается новая поддиректория для каждого из тэгов. Директория %PROJECT_REPO%/branches используется для хранения бранчей. Но при этом ничто, кроме здравого смысла, не мешает пользователю назвать эти директории по-своему или вносить изменения в тэги. Как бы то ни было, напоминалка! Создание бранча/тэга в предположении, что проект лежит в ~/work/project/:
mkdir -p ~/work/project/tags/rc1
svn add ~/work/project/tags/rc1
svn ci -m "rc1 tag added" ~/work/project/tags/rc1

svn copy -m "Some comment" https://svn.server:port/svn/currentProject/trunk/ https://svn.server:port/svn/currentProject/tags/rc1/

svn up
Для создания бранча последовательность аналогична:
mkdir -p ~/work/project/branches/camelStyleInvolving
svn add ~/work/project/branches/camelStyleInvolving
svn ci -m "rc1 tag added" ~/work/project/branches/camelStyleInvolving

svn copy -m "Some comment" https://svn.server:port/svn/currentProject/trunk/ https://svn.server:port/svn/currentProject/branches/camelStyleInvolving/

svn up
Для переключения локальной копии репозитория в нужный бранч/тэг нужно выполнить следующую команду в директории, соответствующей основной ветке (в данном случае это ~/work/project/):
cd ~/work/project/trunk
svn switch https://svn.server:port/svn/currentProject/branches/camelStyleInvolving/ ./
указание текущей директории "./" можно опустить, но лучше ее указывать явно, чтобы избежать неприятных промахов. При этом в локальную копию транка помещаются файлы из бранча. То есть, для среды разработки пути и расположение файлов не изменяется. Меняется только их содержимое. Ну, и чтобы вспомнить в какой ветке сейчас находится локальная версия репозитория, можно использовать команду svn info:
svn info
Эти действия предполагают работу в консоли bash. Подобные действия можно производить и в консоли Windows-окружения. Для графического интерфейса действия зависят от используемого SVN-клиента.

25 нояб. 2012 г.

ВКонтакте таки добавили поддержку HTTPS/SSL

Наконец-то ВКонтакте реализовали поддержку HTTPS. В настройках учетки можно поставить птицу использовать SLL-соединение все время. Давно пора было это сделать.

22 нояб. 2012 г.

Пуск/остановка Jenkins под Mac OS X

Две команды для старта и остановки демона Jenkins (continuous integration tool) под Mac OS X. Запуск Jenkins:
sudo launchctl load /Library/LaunchDaemons/org.jenkins-ci.plist
Остановка Jenkins:
sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

1 нояб. 2012 г.

Отключение автозапуска CameraWindow.app в Mac OS

После установки софта, идущего с зеркалками Canon, при подключении к компу iOS-устройств (iPhone, iPad) стало выскакивать такое окошко
Анноит. Окно открывается приложением Canon CameraWindow. Первая мысль - снести приложение. Но немного терпения, и оказалось, что приложение прописано в штатном iPhoto в качестве обработчика подключения внешней камеры (или устройства, содержащего оную). Приложение сносить не стал. Просто отключил его в свойствах iPhoto.

developer.apple.com на обслуживании

Перестал у меня открываться http://developer.apple.com - основной портал разработчика на сайте Apple. Сообщает "We'll back soon". Начали уже возникать мысли о теракте и отключении Украины от интернета. С зарубежного хостинга открывается нормально. А из Украины - никак.
Оказалось все просто и пОшло. Почистил кэш и куки броузера и поротал стал открываться. Загадка, однако.

29 окт. 2012 г.

Objective-C. Макрос-оболочка к NSLog

Последнее время использую такой макрос, оборачивающий штатный NSLog в Objective-C:
#ifndef DLog
#ifdef DEBUG
#define DLog(_format_, ...) NSLog([NSString stringWithFormat:@"%s: %@", __PRETTY_FUNCTION__, (_format_)], ## __VA_ARGS__)
#else
#define DLog(_format_, ...)
#endif
#endif
Он автоматом добавляет к строке лога имя функции и номер строки в исходнике. Ну и заодно можно отключить логи одним андефайном. Заменить, например #ifdef DEBUG на #ifdef DEBUG1

UPD 2015-01-07:
Макрос постепенно перерос вот в такое:

#ifdef DEBUG
#define DLog( s, ... ) NSLog( @"%@%s:(%d)> %@", [[self class] description], __PRETTY_FUNCTION__ , __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#define DAssert(A, B, ...) NSAssert(A, B, ##__VA_ARGS__);
#define DLogv( var ) NSLog( @"%@%s:(%d)> "# var "=%@", [[self class] description], __PRETTY_FUNCTION__ , __LINE__, var ] )
#elif DEBUG_PROD
#define DLog( s, ... ) NSLog( @"%@%s:(%d)> %@", [[self class] description], __PRETTY_FUNCTION__ , __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#define DLogv( var ) NSLog( @"%@%s:(%d)> "# var "=%@", [[self class] description], __PRETTY_FUNCTION__ , __LINE__, var ] )
#define DAssert(A, B, ...) NSAssert(A, B, ##__VA_ARGS__);
#else
#define DLog( s, ... )
#define DAssert(...)
#define DLogv(...)
#endif
Интересно отметить: наткнулся в сети на вопрос почему именно _DLog_, а не, скажем, ALog, MLog?.. Оказывается, что в используемых на данный момент в Xcode фреймворках нет классов, начинающихся с DL. Потому это относительно безопасный префикс для избежания перекрытия классов.

18 окт. 2012 г.

Пробуемся в скорочтении

Около года назад я прошел курс скорочтения в центре развития Тетра в Одессе. Не скажу, чтобы я начал читать по тысяче слов в минуту, но скорость переваривания печатного текста возросла заметно. Беглый пробег по тексту с выхватыванием основных тезисов выполняется легко. Быстрее стал режим быстрого чтения, когда я читаю все слова, но не задумываюсь о них в момент прочтения. После просмотра слов (бычно это 1-2 средних абзаца) возникает картина, описанная в этих абзацах. Формальная скорость чтения выросла вдвое. После меня этот курс прошли мои сын и жена.

И вот теперь мы с супругой решили открыть свой семейный клуб, в котором тоже будем преподавать этот и другие курсы сходной тематики. Но уже в Киеве. Название придумали "Семейный клуб "САПИ"". Сайт озаглавили соответсвующе :) - www.sapi.com.ua.

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

Супруга кроме всего прочего увлекается методикой РейКи. Не то, чтобы философия, но своеобразный способ смотреть на мир и на себя в этом мире. Очень полезная штука для того, кто хочет разобраться в себе, как-то систематизировать свои отношения со вселенной и соседним подъездом.

Так что, будете у нас в Киеве - милости просим :) Угостим киевским тортом.

12 окт. 2012 г.

Онлайн ковертер RGB-CMYK

Понадобилось конвертировать растровую картинку из RGB в CMYK. Это нужно для типографской печати. На маке ничего для этого установленного нет. Нашелся онлайн конвертер. С выбором кучи профилей. Онлайн - в массы! :)

11 окт. 2012 г.

Однострочники: Быстрое криптование файлов в *x-системах


Напоминалка. Быстрое (рас)криптование файла из командной строки в системах, с установленным пакетом OpenSSL (практически все *x-системы).
#криптование
openssl enc -in <input_file_name> -out <output_file_name> -blowfish

#раскриптование
openssl enc -d -in <input_file_name> -out <output_file_name> -blowfish 
Для Mac OS, в частности Yosemite:
#криптование
openssl <cyphername, i.e. bf> -in <input_file_name> -out <output_file_name>

#раскриптование
openssl <cyphername, i.e. bf> -d -in <input_file_name> -out <output_file_name>

2 окт. 2012 г.

Free-lance.ru закручивает гайки

Сегодня пришла новость с free-lance.ru о том, что начиная со 2 октября сего года вся работа на ресурсе ведется только посредством инструмента СБР (безопасная сделка). В связи с этим любой обмен контактными данными на сайте запрещен.

Это очередная гайка, которой сервис ограничивает свободу своих пользователей. До этого были 3 бесплатных ответа на проект в месяц. До этого - еще что-то. Будет ли кто-то использовать после таких драконовских мер этот сервис - не знаю. Но одним пользователем у них стало меньше. Это точно.

Безопасная сделка совершенно неудобна для независимого разработчика, принося единственную выгоду (достаточно сомнительную) в том, что сервис гарантирует арбитраж между заказчиком и работником балдой. При этом от той же суммы сделки на руки разработчик получит процентов на 60 меньше - налог на то, налог на сё, комиссия сервиса... Да при этом еще и нужно зняться бумажной волокитой с оформлениями/регистрациями в России. Даже если фрилансер сидит в Молдове где-нибудь.

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

22 сент. 2012 г.

Чистка ноута Compaq nx6125

Мой старый ноут Compaq nx6125 служит мне уже лет 5. А вообще отроду ему уж 7-й год. Служит долго, исправно. Очередное подтверждение того, что технику Хьюллеты делать умеют. Описывать его смысла нет. Во-первых, он уже староват, и навряд ли кто-то будет себе такой покупать. Во-вторых, это ноут бизнес-класса (по состоянию на 2005 год), поэтому обзоров и описаний - до утра. Хотя бы на том же IXBT. Мой ноут сейчас стоит на кухне. Подруга пользует его. Сериалы, веб и т.д. С недавних пор он начал очень сильно тормозить. Борьба с софтварными настройками к заметным улучшениям не привела. Решил его разобрать и пропылесосить. Ибо шуметь он с самого включения стал аки паровоз, и греться, аки Везувий. Вдохновился этим роликом, вооружился отверткой-шестигранником, простым мелким крестом (для крышки отсека жесткого диска) и плоской (чтобы поддеть кожухи шарниров экрана). Отвинтил, открыл, пропылесосил, собрал, включил. Сначала даже ушам не поверил - так тихо стал работать :). И скорость работы сразу вернулась к эталонной. На операцию ушло около 20 минут. Еще один спасенный друг (сколько на нем работы сделано - страшно вспомнить!). Сентиментален я как-то к полезной технике.

16 сент. 2012 г.

Простой скрипт резервного копирования. Upd.

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


#!/bin/sh
BKPDIR=`date +"%Y-%m-%d"`
BKPPREFIX=`date +"%Y-%m-%d_%H-%M-%S_"`
targetdir="$HOME/backups/$BKPDIR"
echo "making $targetdir"
mkdir -p $targetdir

if [[ "" != "$1"  ]]; then
        if [ -d "$1" ]; then
                zip -r "$targetdir/$BKPPREFIX`basename $1`.bkp.zip" "$1"
        else
                echo "copy $1 to $targetdir/$BKPPREFIX`basename $1`.bkp"
                cp $1 $targetdir/$BKPPREFIX`basename $1`.bkp
        fi
else
        echo "Usage: bkp <[file]|[dir]>"
fi
P.S.: Учел замечания ZEN. Thanks ZEN :)
P.P.S: Выложил скрипт на GITHub. https://github.com/rettpop/bkp

10 сент. 2012 г.

Mac OS. Калькулятор внутри Spotlight

Недавно открыл для себя калькулятор, встроенный в Spotlight в Mac OS. Просто вводим математическое выражение и получаем автоматически обновляемый ответ. Очень удобно.
Понятно, что спотлайт навряд ли сам считает выражения, а скорее всего вызывает штатный (или какой другой) системный калькулятор. Но делается это учень красиво и юзабельно. Поддерживаются в том числе программистские функции типа <<  и ^.

9 сент. 2012 г.

"64 ПРАВИЛА ИСКУССТВА КНИГИ"

    Давно у меня лежит распечатка, озаглавленная "64 ПРАВИЛА ИСКУССТВА КНИГИ". В интернете утверждается, что это выдержка из одноименной книги Пауля Реннера (Paul Renner). Но в его библиографии я не нашел книги с таким названием. Есть книга "Книгопечатание как искусство" 1925 года и "Искусство книгопечатания" 1932 года (хотя возможно, что это одна и та же книга в разных изданиях).
    Как бы то ни было, в свое время эта подборка из 64 правил помогла мне понять многие моменты в правилах оформления печатных изданий. Правила эти применимы не только к книгам, но и к любым печатным изданиям. А во многих аспектах и к электронным изданиям. Физиология-то зрения остается одинаковой в независимости от источника изображения. Как и все в дизйне, эти правила не заметны обывателем - потребителем продукции дизайнеров. Делается-то все в конечном счете именно для потребителя. Точнее, для его бумажника, но это к делу не относится. Так вот эти правила не замечаются обывателем, пока они соблюдаются. Как только одно или несколько этих правил нарушаются, читатель тут же начинает чувствовать дискомфорт. Недостаточно выделено начало абзаца, используются много гарнитур, не акцентирован вес материала на развороте... Читатель может и не понимать, что его не устраивает в читаемых страницах. Но он точно уделит такому развороту меньше внимания, чем оформленному с соблюдением этих правил.
    Поэтому документ стоит внимательного изучения. И, кстати, не только участниками производства печатной прессы. Но и тем самым потребителем. Чем больше он будет понимать что именно ему (не)нравится в рассматриваемом издании, тем более он будет требовательным в выборе. А это значит, что производители будут конкурировать не только в толщине издания за счет толстой бумаги и узкой полосы набора, но и в качестве верстки и дизайна макета издания.

    Текст этот есть во многих местах в сети. Но я захотел выложить его так же и у себя в блоге. Расшарил его в гуглодоках.

2 сент. 2012 г.

Gimp 2.8.2 released

Свершилось! Релизная версия графического редактора Gimp (2.8.2) была выпущена в свет. Свершилось это немногим ранее - 28 августа. Но статус новости еще не упущен, имхо.
Главная фишка, как для меня, - нативность приложения для Mac OS. До сих пор приложение запускалось в окружении X11, что привносило некоторые глюки, как то: невозможность переключать раскладку клавиатуры (оставалась та, которая была включена при старте приложения), активация окон приложения производилась двойным кликом мыши. Были еще баги, но эти раздражали больше всего. Интерфейс приложения остался по умолчанию многооконным. Как по мне - это удобно и настраиваемо. Скачать Gimp можно на сайте разработчиков www.gimp.ogr.
В особом представлении, думаю, программа не нуждается. Коротко - один из самых старых бесплатных опенсорсных графических растровых редакторов. По функционалу до Adobe Photoshop (с которым его, естественно, всегда сравнивают) он не дотягивает. Примерно как обычный седан не дотягивает до функционала болида Formula 1. Более 90% задач, которые возникают в повседневной работе IT crowd, покрываются им с лихвой. Остальные 10% - те задачи, решение которых стоит денег, потраченных на покупку мостодонта от Adobe.

25 июл. 2012 г.

Bash, echo "1\n2" игнорирует "\n"

Столкнулся с тем, что Bash-скрипт не хочет преобразовывать символ "\n" в символ перевода строки. Команда
rettpop@host$ echo "Line1\nLine2"
Line1\nLine2

так и выводится. Оказалось, что в заголовке скрипта исполнителем прописан имеено Bash:
#!/bin/bash

Заменил эту строку на
 #!/bin/sh
 и все стало на свои места.
rettpop@host$ echo "Line1\nLine2"
Line1 Line2

Вообще, рекомендуется в шелл-скриптах *x-систем указывать исполнителем именно /bin/sh, т.к. это в основном символическая ссылка на оболочку по-умолчанию. Пруф-линк не приведу, но мои предпочтения подтверждались в старинных манускриптах по Юниксу.

17 июл. 2012 г.

Mac OS: встроенный словарь

Открыл для себя встроенный в Mac OS словарь. Словари - вообще очень полезное изобретение человечества. А встроенные в оконный менеджер - вообще архиполезная вещь. В условиях изучения инородного языка с постоянным чтением статей на нем я предпочитаю пользовать толкователь. Только в крайних случаях пользую перевод слов. Сабж в этом очень помогает.

Открывать словарь можно как отдельное приложение Dictionary, а можно использовать его всплывающую по Cmd-Ctrl-D ипостась. Слово для обработки будет выбрано под курсором мыши.

Словарь позволяет настраивать себя, добавлять и отключать словари. По умолчанию используются 3 словаря: Новый оксфордский толковый словарь, Оксфордский американский тезаурус и словарь от Википедии. Но есть варианты добавления словарей.

3 июл. 2012 г.

Программистский боян

Сказка старая, но от этого не менее актуальная (взято на просторах ФИДО):

Русский, Китайцы, Канадец и индус 

Любой русский программист, после пары минут чтения кода, обязательно вскочит и произнесет, обращаясь к себе: переписать это все нафиг. Потом в нем шевельнется сомнение в том, сколько времени это займет, и остаток дня русский программист потратит на то, что будет доказывать самому себе, что это только кажется, что переписать это много работы. А если взяться и посидеть немного, то все получится. Зато код будет красивый и правильный. Hа следующее утро русский программист свеж, доволен собой и без единой запинки докладывает начальству, что переписать этот кусок займет один день, не больше. Да, не больше. Hу, в крайнем случае, два, если учесть все риски. В итоге начальство даст ему неделю и через полгода процесс будет успешно завершен. До той поры, пока этот код не увидит другой русский программист. 

А в это время, в соседних четырех кубиках, будет ни на секунду не утихать работа китайских программистов, непостижимым образом умудряющихся прийти раньше русского программиста, уйти позже, и при этом сделать примерно втрое меньше. Эта четверка давно не пишет ничего нового, а только поддерживает код, написанный в свое время индусом, и дважды переписанный двумя разными русскими. В этом коде не просто живут баги. Здесь их гнездо. Это гнездо постоянно воспроизводит себя при помощи любимой китайской технологии реиспользования кода - copy/paste. Отсюда баги расползаются в разные стороны посредством статических переменных и переменных, переданных по ссылке (ведь, китайский программист не может смириться с неудобствами вызванными тем, что он не может изменить значение внешнего параметра). Вспоминая об этих переменных и ссылках, русский программист, как правило, на время теряет дар английской речи, и переходит к какой-то помеси русского и китайского. Он давно мечтает переписать весь кусок, над которым работают китайцы, но у него нет времени. Он уже переписывает два больших куска, и доказал начальству необходимость переписать третий. Кроме того, русский программист боится обидеть китайцев. Они могут решить, что он пытается вытеснить их с работы. К слову сказать, напрасно боится, поскольку китайцы уже так решили. 

Hа китайцах висят серьезные баги, о которых знает начальство и постоянно их торопит. Китайцы уважают начальство и потому перевешивают баги друг на друга очень торопливо. Они знают, что все попытки починить приведут к появлению новых багов, еще худших. И в этом они правы. Разобраться в том, в каком порядке меняются статические переменные, и как приобретают свои значения, способен только один человек на фирме - индус. Hо он пребывает в медитации. Поэтому, когда всю четверку уволят во время сокращения... А кого еще увольнять? Русский - еще не переписал свой кусок, а индус - главная ценность фирмы - он редко обращает внимание на проект, но когда обращает, все понимают, что так как он, архитектуру никто не знает. Так вот, когда китайцев увольняют, у их кода возможны две основные судьбы. Первая - он попадет к русским, и его перепишут. Вторая - он попадет к местному, канадскому программисту. 

О, канадский программист это особый тип. Он, ни на минуту не задумываясь, как рыцарь без страха и упрека, бросится фиксить самый свирепый баг китайского кода. Этот Баг живет там уже три года, и китайцы уже четырежды (каждый по разу) сообщали начальству, что он пофиксен. Hо Баг каждый раз возвращался, как Бетмен в свой Готхем. Итак, канадский программист, воспитанный на героической патетике американского футбола - бросаться в бой головой вперед, сделает то, чего китайцы не рисковали делать в течении трех долгих лет. Он, при помощи дебагера, отследит место, где статическая переменная приняла значение -1 вместо правильного 0, и решительным движением заведет рядом вторую переменную с правильным значением. Баг погибнет в неравной схватке с героем. Hо победа будет достигнута тяжелой ценой. Работать перестанет все, включая только что переписанный русским программистом код. Это повергнет русского программиста в задумчивость на целых два дня, после чего он сделает, в общем-то, предсказуемый вывод о том, что дизайн с самого начала был неправильным, и все надо переписать. Hа это нам нужна неделя. Да, неделя, не больше. Канадский программист смело бросится налаживать все, и станет еще хуже, хотя казалось бы... Эта суета выведет из медитации индуса, который придумает и вовсе гениальное решение - отбранчить код. Согласно его плану, мы теперь будем поддерживать две версии одного и того же кода - одну работающую, но с Багом, другую без Бага, но не работающую. Русский программист, услышав об этом плане, сломает линейку об стол и обзовет жену дурой, но на митинге возразить не решится. 

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

29 июн. 2012 г.

Tips and tricks in Xcode.

    Дорвался до видео с WWDC 2012. Видео бесплатны, в хорошем качестве, с субтитрами. Но и без субтитров все понятно - язык технический. Первое из-за чего проспал на работу - сессия по советам работы с Xcode (про Delphi и Visual Studio умолчали). Выступали три инженера. Лиц на видео не показывали, поэтому выдержана ли была политкорректность - не знаю. Но два голоса были мужские и один, кажется, женский. Описывались три схемы работы с IDE: однооконная, с несколькими закладками и многооконная. Хинты, показанные на сессии удобны для всех схем работы. Главный тезис, звучавший сквозь всю сессию, - хоткеи, хоткеи и еще раз автоматизация!
    ИтаГ, какие хоткеи я вынес для себя из просмотра видео:

  • Cmd+Shift+{ напару с Cmd+Shift+} - переключение между закладками приложения (я и раньше эти хоткеи пользовал, но пришлись к столу)
  • Ctrl-Cmd-E - позволяет редактировать идентификатор, на котором установлен текстовый курсор, одновременно со всеми его упоминания в его области видимости (функция, цикл, блок...).
  • Cmd-J - открывает декоративное окошко выбора панели IDE, в которое нужно поместить фокус ввода. В принципе, есть комбинация Cmd-Opt-., которая переключает циклично этот фокус по панелям окна, но про нее почему-то скромно умолчали
  • Мышинный Opt-Click или клавиатурный Cmd-Ctrl-Shift-/ - отобразить всплывающую подсказку по объекту клика. Причем не просто тип, а довольно объемный талмуд 
  • Cmd-Option-[ - переместить текущую строку текста вниз 
  • Cmd-Option-] - переместить текущую строку текста вверх (этих двух я сам нашел - иногда полезно) 
  • Cmd-Shift-O - удобная фича (почти мега-) быстрый поиск идентификатора сквозняком по проекту во всплывающем окошке. После выбора подходящей строки Return открывает соответствующий файл в текущем окне редактора, Opt-Return открывает декоративное окошко, в котором можно выбрать куда поместить файл, Opt-Shift-Return открывает файл во второстепенном редакторе (вертикальное окно рядом с основным).
  • Cmd-Opt-Return - открывает файл объявления идентификатора над текстовом курсором во второстепенном редакторе
  • Cmd-Return - закрывает окно второстепенного редактора.
  • Cmd+Opt+Click (Cmd-Ctrl-Opt-J) - открывает объявление идентификатора в главном редакторе
  • Cmd+Opt+2Click - открывает объявление идентификатора в новом окне. Вообще, двойной клик в Xcode в основном приводит к открытию нового окна
  • Cmd-T - дублирует текущую закладку в новую со всеми текущими настройками
  • Cmd-E - поместить выделенный текст в поле поиска (и в окне редактора, и в окне навигатора проекта). При этом выделенный текст уже считается результатом поиска и можно использовать следующую комбинацию:
  • Cmd-G - перемещаться между результатами поиска в текущем окне
  • Opt-Return в форме поиска в окне редактора - замена в выделенном тексте
  • Двойной клик по скобке выделяет содержимое всего блока внотри пары скобок 
  • Комментарии, предваренные текстом TODO: и FIXME: работают так же, как #pragma mark, то бишь отображаются в списке методов вверху окна редактора
  • При открытом списке этих самых методов можно вводить текст, который будет фильтровать список.
Пара хоткеев от меня - странно, что их не упомянули на сессии:

  • Cmd-Ctrl-D - отобразить словарную карточку слова над текстовым курсором. Имена сущностей должны соответствовать их назначению и писаться орфографически правильно. Фишка эта общекокошная, но и в Xcode ее игнорировать не стоит.
  • Cmd-Ctrl-Down - открыть counterpart (связанный с текущим файл - заголовок или имплементацию)
  • Cmd-Shift-J - отбразить текущий файл в Project Navigator.


    На другом видео рассказывали про навороченность работы Xcode с системами контроля версий - SVN и Git. Работа с репозиториями находится в соответствующем разделе Organizer. Commit, Add и проче команды находятся в меню File/Source Control. Режимы просмотра логов, конфликтов и merging-а переключаются в правом верхнем наборе пиктограмок. Внизу навигатора проекта имеется пиктограммка с хинтом "Show only files with source-control status". Она заставляет навигатор показывать только те файлы, которые каким-то образом отмечены в рабочей версии - A, M, C и т.д. Инструменты для работы с контролем версий довольно стандартны и ничего нового про них рассказать не получится. Но сделаны они с умом. Таймлайн для SVN я первый раз увидел тут. До сих пор видел его только в перфорсе.

    Очень понравился трик, не относящийся, однако, напрямую к Xcode. Это вариант использования Automator. Xcode, как любое Cocoa-приложение работает с ним, как с родным. Точнее, он с Xcode. Записал видюшку с примером.




28 июн. 2012 г.

Менеджер буфера обмена для Mac OS

Недавно нашел и начал успешную эксплуатацию на маке бесплатной программки ClipMenu. Функционал примерно соответствует упоминавшейся ранее утилите для MS Windows Clip Cache. Есть средства автоматизации, отображение списка сохраненных блоков в виде меню с подменюшками, настройка горячих клавиш для отображения меню, кастомизация действий по сохранению, запоминанию и прочим нужным событиям. В общем, программа достаточно удобна и настраиваема. Учитывая функционал и бесплатность - рекомендую.

Кадр из фильма "My Cousin Vinny"

Пересматривал на днях один из своих любимых фильмов "Мой кузен Винни". Обратил внимание на номер автомобиля этого самого Винни. Возникла мысль, что и здесь без русских не обошлось :)

22 июн. 2012 г.

Команды vimdiff

Логичным продолжением поста о связке svn diff с vimdiff стало использование автором самого vimdiff :) Так как vimdiff - это просто алиас для запуска vim в режиме сверки (ключ -d), то и команды работают все те же, что и в обычном режиме vim. Но несколько есть дополнительных (схема именования команд соответствует общей схеме, принятой в vim):


  • ctrl+w ctrl+w - switch windows (переключениями между окнами/буферами)
  • do - diff obtain (принять вариант текущего блока отличий из соседнего окна)
  • dp - diff put (перенести вариант блока отличий из текущего окна в соседнее)
  • [c - previous difference (перейти к предыдущему блоку отличий)
  • ]c - next difference (перейти к следующему блоку отличий)
  • :diffu[pdate] - diff update (произвести повторное сравнение файлов - если вдруг в ходе сложных изменений вывод отличий пополз)
  • zo - open ZAfolded text (развернуть блок текста)
  • zc - close ZAfolded text (свернуть блок текста)


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

17 июн. 2012 г.

SVN + Apache + Nginx. Ошибка коммита изображений

После переезда на новый хостинг столкнулся с тем, что SVN не хочет коммитить файлы изображений (jpg, png, etc). Выдает примерно такие ошибки:
Adding  (bin)  icon57x57.jpg
svn: Commit failed (details follow):
svn: Server sent unexpected return value (405 Not Allowed) in response to PROPFIND request for '/svn/!svn/wrk/6ec81701-d224-4232-851b-23f6d87b9e06/Bzzzer2/icon57x57.jpg'
svn: Server sent unexpected return value (405 Not Allowed) in response to PROPFIND request for '/svn/Bzzzer2/icon57x57.jpg'
Оказалось, что на сервере установлен Nginx, который и мешает загрузке картинок на сервер. Остальные файлы он игнорирует, ибо они не относятся к вебу - проекты Objective-C и C++. Для исправления этого положения нужно внести директорию репозитория в список игнорируемых Nginx-ом путей. Делается это в разделе
location ~* ^/(awstats/|webmail/|phpmyadmin/|server-status/|backups/|svn/) {^M
                        proxy_pass http://80.91.191.246:8080;^M
                        proxy_redirect http://sapisoft.com:8080/ /;^M
                        proxy_set_header Host $host;^M
                        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;^M
                        proxy_set_header X-Real-IP $remote_addr;^M
                }^M
соответствующего файла конфигурации соответствующего хоста, например /etc/nginx/vhosts/yourhost.com.cfg

Кодоперлы.

И такое бывает %)
function TRePolSng.Event_On(ticks: cardinal): boolean;
begin
...
  // ACHTUNG!!! не сломайте моск =)
  FNRZ_EKVIVAL := ( not Power )and( Power );
...
end;

8 июн. 2012 г.

Простая шифровка коротких чисел

Что обычный сознательный анонимус делает, когда у него появляется кредитка с 4-х символьным пин-кодом? Запоминает код. Что он делает, когда появляется вторая кредитка? Пытается запомнить код и не спутать его с предыдущим. А когда пятая кредитка? И 2 сим-карты с пинкодами. Записывает! Имхо, это нормально. В жизни много вещей, которые нужно запомнить. И с десяток-другой вариаций чисел запомнить можно. Но не сразу, а после нескольких раз использования. А ежели забудешь через час? Лучше все-таки записать.

Но записанное может попасть другому анонимусу на глаза. Блокнот останется на столе, потеряется, смартфон с записями украдут, файло с компа стырят... Полно вариантов распространения этих записей. Есть решение - использовать сервисы или программки для хранения паролей и, в том числе, ПИН-кодов. Программки ровно так же подвержены пропаже с кражей/потерей гаджета. Онлайн-сервисы находятся в сети под пристальным надзором гипотетических взломщиков. То бишь, шансов на публикацию записей тоже немало.

Есть вариант чуть-чуть облегчить напряжение в своей нервной системе. Записывать коды там, где хочется (желательно, конечно, подальше от чужих глаз и рук), но используя при этом хотя бы примитивную схему шифроввания записей. Хорошо, ежели схема придумана самим владельцем записей. Но и готовые варианты подойдут.

Один из вариантов

Записывать случайный набор цифр любой длины. В этом наборе с определенной периодичностью записывать цифры сохраняемого кода. Например, имеем пинкод 1111.

Случайным образом формируем последовательность цифр:
3654388932
Каждая 2-я цифра будет соответствовать каждой следующей цифре пинкода:
3151318132
В этом случае нужно запомнить только 1 число - периодичность цифр пинкода.

Чуть более сложный вариант

К предыдущему варианту добавляем запомненную позицию, с которой начинаются цифры пинкода.

Например, случайным образом формируем последовательность цифр - чем длинее, тем лучше:
6781324590

С позиции 3 каждая 2-я цифра будет соответствовать каждой следующей цифре пинкода:
6781314191

Сложность шифровки можно наращивать. Например, использовать многострочный шифр:
запоминаем те же цифры 3 и 2, которые означают, что в строке 3 следующего массива на 2-й позиции будет указана позиция, начиная с которой в следующей строке каждая третья цифра будет соответствовать каждой следующей цифре пинкода
315657862154614
115648769321475
245467987321332 - 3-я строка, содержащая в позиции 2 номер символа в следующей строке, начиная с которой каждая третья цифра соответствует цифре пинкода
15449176154125145

Приведенные методы довольно ограничены в применении и не являются вселенски-устойчивыми к дешифровке. Однако для хранения пин-кодов они вполне подойдут. Вариант брутфорса не подойдет, ибо обычно на третьей-четвертой попытке объект взлома заблокируется. И для хранения в голове двух цифр и алгоритма расшифровки не нужно ни IQ > 50, ни специального программно-аппаратного обеспечения. А при определенном уровне овладения алгоритмом его можно использовать и для записи паролей.