Blog

  • XCode – создание шаблонного кода

    Чтобы создать шаблон или заготовку кода, в который потом планируется что-то дописать и создать аналогичный метод или написать похожий код, можно использовать тот же прием, который использует сам Apple в XCode, когда создает для нас подсказки. А именно, нужно заключать изменяемую часть кода в символы <# и #>. Например:

    NSURL *storeURL = <#The URL of a persistent store#>;
    

    Это также используется в документации Apple и XCode:
    https://developer.apple.com

  • Поиск строки в файлах в Mac OS X

    Часто требуется найти не файлы по названию, а строки в файлах или файлы, содержащие какую-то строку или регулярное выражение. Чтобы найти какую-либо строку во всех файлах в данном каталоге или рекурсивно по всем каталогам, нужно использовать команду grep.

    grep — утилита командной строки, которая находит строки, отвечающие заданному регулярному выражению, и выводит их, если вывод не отменён специальным ключом. Название представляет собой акроним английской фразы «search globally for lines matching the regular expression, and print them» — «искать везде строки, соответствующие регулярному выражению, и выводить их».

    Например:

    grep -l 123abc *.html
    

    Эта команда выведет все названия файлов, содержащих “123abc” и имеющих расширение “html”.

    Полное описание команды можно получить используя команду:

    grep --help
    

    Пример поиска строки во всех вложенных файлах в данной папке (без рекурсии по вложенным папкам):

     
    ~/Desktop/Thesis: $ grep "topic" *
    

    Данная команда выведет все строки во всех вложенных папках, которые содержат слово “topic”

    Пример поиска строки в файле:

    grep 'Matthew' 1.txt
    

    Эта команда выведет все строки в файле 1.txt, содержащие слово ‘Matthew’.

    Пример поиска строки во всех файлах рекурсивно по всем вложенным папкам:

    grep -lr "text to find" *
    

    Здесь звездочка означает любой файл. -l выводит список файлов вместо строк, -r – рекурсия. Можно ставить как одинарные, так и двойные кавычки. Названия файлов тоже могут быть в кавычках, если содержат пробелы.

    Пример простого поиска с регулярным выражением:

    grep '^.*Contr.*$' 1.txt
    

    Данная команда выведет все строки из файла 1.txt, которые содержат сочетание(не обязательно слово) “Contr”. Каретка^ означает начало, доллар$ – конец. Точка(.) – любой символ, кроме новой строки, звездочка(*) – повторение предыдущего символа любое число раз.

    Пример сложного поиска с регулярным выражением:

    grep -ir ']*(face="sans-serif"|size="12")' *.htm *.html
    

    Здесь -i означает то, что grep будет case-insensitive. Все, что находится в одинарных кавычках – регулярное выражение, которое мы ищем. Команда ищет все htm и html файлы рекурсивно по всем папкам.

    Если нужно сохранить результат поиска (список файлов) в файл, нужно дописать следующее:

    ... *.htm *.html >font_files.txt
    

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

    vi 'grep -ir ']*(face="sans-serif"|size="12")' *.htm *.html'
    

    Источник информации для данной статьи:
    http://hints.macworld.com/article.php?story=20001105214242629

    Справочник по регулярным выражениям

  • Краткий коспект книги “Путь программиста”

    Прочитал недавно эту книгу. Авторы – Александр Никитин и Дмитрий Ляпин. Решил записать несколько тезисов своими словами, чтобы не забыть ее содержание. В целом же книга учит тому, как расти программистам в профессиональном плане. Книга дает рекоммендации для программистов с разным опытом и т.д. Я же пишу то, что извлек лично для себя.

    1. Практика написания кода важнее, чем чтение книг о программировании и чем посещение курсов, прослушивание лекций в вузе и т.п.
    2. Для того, чтобы достичь успеха, нужно определиться с целями, понять чего ты хочешь, а затем составить план для развития.
    3. Нужно развиваться гармонично. То есть иметь хобби различные, заниматься спортом и т.д.
    4. Нужно описывать грабли, на которые наступаешь, чтобы не повторять ошибок.
    5. Совершенствоваться в написании качественного кода.
    6. Быть на гребне волны (знать о современных технологиях и веяниях).
    7. Читать блоги разных гуру в своей сфере.
    8. Поддерживать физическое и эмоциональное состояние. Так как оно влияет на продуктивность.
    9. Готовиться к собеседованиям и правильно себя вести на них.
    10. Правильно отдыхать.
    11. Прочитать следующие книги: Искусство программирования, ООП анализ и проектирование (Гради Буч), Совершенный код (Стив Макконнел), Как создаются программные системы (Чапел, Брукс), Приемы ООП проектирования (Э.Гамма и др.), Как пасти котов.
  • Почему GitHub так важен для iOS разработчиков

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

    Повторное использование кода существенно ускоряет разработку. Вообще, ООП (объектно-ориентированное программирование) изначально создавалось с такой идеей, чтобы разработчики могли так же, как инженеры, создавать программы из готовых блоков, либо, по крайней мере, создавать блоки, которые были бы reusable, то есть повторно используемыми. Это одна из причин, почему просмотр Open Source проектов важен. Он позволяет увеличить собственную библиотеку повторно используемых компонентов и ускорить процесс разработки не только за счет нативных фреймворков и собственного кода, но и за счет плодов программистов со всего мира. Кроме того, за тот же срок можно сделать более интересный и качественный продукт, если использовать готовый код. А чем ты профессиональнее и чем быстрее и качественнее ты создаешь продукты, тем больше и твоя компенсация.

    В тесте Yandex’а для iOS-разработчиков есть вопрос – есть ли у Вас GitHub аккаунт. Я некоторое время не мог понять, почему он так важен и обязателен.

    Кроме этого, моему прозрению предшествовали многочисленные собеседования, которые я проходил. На одном из них у меня спросили, использую ли я Three20 – бесплатную Open Source библиотеку от создателя приложения для Facebook. Потом, спустя 4 месяца, я ее скачал с GitHub и изучил. Также я скачал и стал применять библиотеку MBProgressHUD, которая позволяет показывать волчок, а сам долгий процесс запускать в параллельном потоке. Также я только по необходимости скачивал оттуда MailCore.

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

    В GitHub выкладывают очень много Open Source проектов, в том числе и на Objective-C (там их целых 2 процента и этот язык там на 10 месте по популярности). Многие проекты представляют огромную ценность, так как в них реализованы интересные фичи, приемы, контролы и т.д.

    Например, я скачал с GitHub 4 проекта, которые были популярны сегодня. Первый позволяет отображать PDF c кучей контролов и читать его с удобством (Reader), второй – показывает различные View как Pop up с разной анимацией (MJPopupViewController), третий позволяет легко записывать видео из приложения (cam), четвертый представляет из себя по сути горизонтальный Table View (FantasyView).

    В GitHub есть разделы по разным языкам и кроме этого, есть сортировка по количеству бранчей и закачек. Также, в GitHub можно посмотреть самые популярные по просмотрам проекты за день, неделю, месяц и все время. А еще – самые популярные по бранчам.

    Я решил теперь для себя, что буду просмотривать раздел, связанный с Objective C, регулярно, даже без необходимости, просто чтобы увидеть, что делают другие и как делают. Ну и по возможности выложу что-нибудь свое. Пока из существенного я выложил только свою программу на C# для заполнения Excel данными из википедии (ExcelFiller).

    По аналогии, буду также просматривать Open Source раздел Google, Apple и других компаний. Все, что я здесь написал, относится не только к GitHub и не только к Objective C. Просто с них я начал.

    Еще, хотелось бы добавить, для разработчика iOS важны OpenSource проекты не только на Objective C, но и на C++/C. Например, я как-то использовал ZXing и ZBar для распознования штрих-кодов.

    Напоследок несколько ссылок для быстрого доступа:
    Раздел GitHub на Objective C
    Топовые GitHub проекты под iOS
    Мой собственный аккаунт на GitHub
    Google Open Source
    Sample Code для разработчиков Apple
    Проекты на SourceForge под iOS, наиболее популярные

  • MailCore CTCoreAttachment example

    To add attachments in MailCore add this ONLY after setBody/setHTMLBody:

    <br />
        // Set Attachments<br />
    NSString *filePrefix = [[NSBundle mainBundle] bundlePath];<br />
    NSString *path = [NSString stringWithFormat:@”%@/%@”,filePrefix,@”TestData/DSC_6201.jpg”];<br />
    NSLog(@”path:%@”, path);</p>
    <p>CTCoreAttachment *attach = [[CTCoreAttachment alloc] initWithContentsOfFile:path];<br />
    if ([attach data]==nil) {<br />
        NSLog(@”Error: attachment data is nil”);<br />
    }<br />
    [myMessage addAttachment:attach];<br />
    

    Here, you should add TestData folder with image to your project as a folder reference.

  • TWTweetComposeViewController doesn’t display initial tweet

    TWTweetComposeViewController doesn’t display tweets, that are too long. You can take a substring of a tweet by cutting down to 140 symbols:

    [tweetView setInitialText:[self.textToExport substringToIndex:140]];
    NSLog(@"tweetView.initialText:%@", [self.textToExport \
     substringToIndex:140]);
    
  • Apple’s Twitter framework example

    This is an example, how to integrate Twitter framework of Apple to your app.

    Firstly, add Twitter (Twitter.framework) and MobileCoreServices frameworks to your app.

    Then add header files to your source file:

    </p>
    <pre>#import <Twitter/TWTweetComposeViewController.h>
    #import <MobileCoreServices/MobileCoreServices.h></pre>
    <p>

    Then add this method or similar:

    <br />
    – (void)sendToTwitter {<br />
    useDelegate<br />
    if ([appDelegate iOSVersion5]) {<br />
    [self showErrorAlert:@”Отправка в Twitter доступна только в iOS 5 и выше.”];<br />
    return;<br />
    }</p>
    <p>tweetView = [[TWTweetComposeViewController alloc] init];</p>
    <p>TWTweetComposeViewControllerCompletionHandler<br />
    completionHandler =<br />
    ^(TWTweetComposeViewControllerResult result) {<br />
    switch (result)<br />
    {<br />
    case TWTweetComposeViewControllerResultCancelled: {<br />
    NSLog(@”Twitter Result: canceled”);<br />
    [self showErrorAlert:@”Отправка в Twitter отменена.”];<br />
    break;<br />
    }<br />
    case TWTweetComposeViewControllerResultDone: {<br />
    NSLog(@”Twitter Result: sent”);<br />
    [self showErrorAlert:@”Отправка в Twitter выполнена.”];<br />
    break;<br />
    }<br />
    default: {<br />
    NSLog(@”Twitter Result: default”);<br />
    [self showErrorAlert:@”Отправка в Twitter не выполнена.”];<br />
    break;<br />
    }<br />
    }<br />
    [self dismissModalViewControllerAnimated:YES];<br />
    };<br />
    [tweetView setCompletionHandler:completionHandler];</p>
    <p>[tweetView setInitialText:self.textToExport];<br />
    [self presentModalViewController:tweetView animated:YES];<br />
    }<br />
    

    Here, firstly iOS version is checked, because it will work only in iOS 5 or later. Then, I create TWTweetComposeViewController instance, it’s block completion handler, set text to export to Twitter and then present controller as a modal controller.

  • How to check iOS version programmatically

    To check the iOS version you can use the following method:

    - (BOOL)iOSVersion5 {
        NSLog(@"System Version is %@", \
    [[UIDevice currentDevice] systemVersion]);
        NSString *ver = [[UIDevice currentDevice] systemVersion];
        float ver_float = [ver floatValue];
        if (ver_float < 5.0) {
            return NO;
        }
        else {
            return YES;
        }
    }
    
  • Deleting from Core Data

    Deleting objects from Core Data should not be recognized as deleting rows from SQLite table. It is like deleting objects from Object Graph. This is an example of deleting all rows for the current file number. I retrieve all NSManagedObject objects and delete them in cycle.

    <br />
    + (BOOL)deleteScrollPositionsForFileNumber:(NSInteger)fileNumber {<br />
        BOOL success;<br />
        useDelegate<br />
        NSManagedObjectContext *context = appDelegate.managedObjectContext;<br />
        if (context == nil) {<br />
            NSLog(@”Error: No context”);<br />
            success = NO;<br />
            return success;<br />
        }</p>
    <p>    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];<br />
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@”fileNumber == %d”, fileNumber];<br />
        NSEntityDescription *entity = [NSEntityDescription entityForName:@”ScrollPosition” inManagedObjectContext:context];<br />
        [fetchRequest setEntity:entity];<br />
        [fetchRequest setPredicate:predicate];</p>
    <p>    NSError *error = nil;<br />
        NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];<br />
        NSLog(@”Number of deleted objects: %d”, [fetchedObjects count]);<br />
        for (NSManagedObject *object in fetchedObjects) {<br />
            [context deleteObject:object];<br />
        }<br />
        success = YES;<br />
        return success;<br />
    }<br />
    
  • Change MBProgressHUD color

    To change the background color of MBProgressHUD comment this line and add this in MBProgressHUD.m in drawRect method:

        //CGContextSetGrayFillColor(context, 0.0f, self.opacity);
        CGFloat fillColor[4]    = {0.0,0.0,1.0,1.0};
        CGContextSetFillColor(context, fillColor);
    

    This code changes HUD color to blue.