1 ноября 2011 г.

Перенос базы MySQL c одного сервера на другой

Пост немного оффтоп, да и в поисковике довольно быстро решение ищется, но сегодня решил опубликовать, что было "под рукой". Допустим к каждому серверу есть доступ к консоли.

На первом сервере делаем дамп базы
$ mysqldump -u[логин] -p[пароль] [базаданных] > mybase.sql

переписываем этот дамп на второй сервер, и делаем экспорт:
$ mysql -u[логин] -p[пароль] [базаданных] < mybase.sql

1 октября 2011 г.

UIGestureRecognizer перехват одиночного касания и двойного на одном UIView

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

В этом случае нужно запретить в UIGestureRecognizer одиночного тапа посылку события при двойном тапе. Делается просто методом - (void)requireGestureRecognizerToFail:(UIGestureRecognizer *)otherGestureRecognizer.

Пример:
        UIGestureRecognizer *doubleTapGestureRecognizer = [[UIGestureRecognizer alloc]
                                initWithTarget:self action:@selector(handleDoubleTap:)];
        doubleTapGestureRecognizer.numberOfTapsRequired = 2;
        [self addGestureRecognizer:doubleTapGestureRecognizer];

        UIGestureRecognizer *singleTapGestureRecognizer = [[UIGestureRecognizer alloc]
                                                              initWithTarget:self action:@selector(handleSingleTap:)];
        singleTapGestureRecognizer.numberOfTapsRequired = 1;
        [singleTapGestureRecognizer requireGestureRecognizerToFail:doubleTapGestureRecognizer];
        [self addGestureRecognizer:singleTapGestureRecognizer];

8 сентября 2011 г.

Отключение ARC в xCode 4.2

Нужно всего лишь в качестве компилятора в свойствах проекта выбрать "LLVM GCC 4.2" вместо установленного по умолчанию "Apple LLVM compiler 3.0".



PS: По совету твиттер пользователя @iLeNsTR можно обойтись флагами компилятора:

17 августа 2011 г.

Обработка файлов: групповая замена

Довольно часто поражаюсь, как все в консоли бывает просто реализовать. Вот сегодня мне понадобилось обработать довольно много html, и заменить в них символ "®" на его html-код "&amp#174;", внезапно консоль пришла на помощь):
$ (find . -name *html) | xargs sed -i "s/®/\&#174;/g"

14 июля 2011 г.

Конвертирование plist в бинарный формат (bplist) и обратно в текстовый

Да, мне кажется, что задача бессмысленна, так как методы чтения plist-ов ([NSDictionary dictionaryWithContentsOfFile:(NSString *)path]) одинаково хорошо понимают, что plist в бинарном формате, что в текстовом. Но все ж возникла задача отдать на редактирование plist третьей стороне для редактирования в текстовом редакторе, а для этого пришлось сконвертировать plist в текстовый формат. Итак, в терминале выполняем команду:
$ plutil -convert xml1 ./myBinaryPlist.plist 
и назад из текстового в бинарный:
$ plutil -convert binary1 ./myTextPlist.plist 

17 июня 2011 г.

Запрет лока экрана при запущенном приложении в iOS

[UIApplication sharedApplication].idleTimerDisabled = YES;

Рисование под статус баром в iOS

Полезно иногда просматривать официальную документацию.

В моем приложении, так-же как и в стандартном Photos необходимо убирать статус бар при тапе на экран, но так, что б вью на экране не "прыгало". Думал уже реализовывать кастомным вью и непосредственно добавлять его на UIWindow, но нашел замечательное свойство wantsFullScreenLayout у UIViewController, которое все проблеммы решило.

9 мая 2011 г.

Размытый текст в UILabel

Я не привык пользоваться Interface Builder в xCode. Все компоненты создаю динамически и для меня это вполне удобно. И вот недавно столкнулся с проблемой отображения текста в компоненте UILabel, а поскольку это "корневая" компонента входящая в такие компоненты как UIButton и UITableViewCell, то проблема оказалась серьезной.

Итак, на скриншоте ниже отображены UILabel с одним шрифтом и одним и тем-же размером.



Вторая метка выглядит размытой. Вот код, которым я создавал эти UILabel.
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    
 CGRect screenRect = [[UIScreen mainScreen] applicationFrame];
    
    UILabel *normal = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 30.0, screenRect.size.width, 50.0)];
    normal.text = @"Test label1";
    normal.textAlignment = UITextAlignmentCenter;
    normal.font = [UIFont systemFontOfSize:16.0];
    normal.backgroundColor = [UIColor clearColor];
    [self.window addSubview:normal];
    [normal release];
    
    
    UILabel *fuzzy = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 60.55, screenRect.size.width, 50.0)];
    fuzzy.text = @"Test label2";
    fuzzy.textAlignment = UITextAlignmentCenter;
    fuzzy.font = [UIFont systemFontOfSize:16.0];
    fuzzy.backgroundColor = [UIColor clearColor];
    [self.window addSubview:fuzzy];
    [fuzzy release];
    
    
    [self.window makeKeyAndVisible];
    return YES;
}
Решилось все просто, оказывается UILabel не дружит с нецелыми координатами (60.5 - в CGRectMake(0.0, 60.5, screenRect.size.width, 50.0))

3 мая 2011 г.

Отключение подтверждения закрытия вкладок Safari

Сегодня окончательно достало вплывающее окно подтверждения закрытия вкладки в Сафари при заполненной форме на странице (поиск гугла, гугл переводчик). На просторах рунета быстро нашлось решение - "Отключение подтверждения закрытия вкладок Safari", за что автору спасибо.

Продублирую здесь код, так как страницы имеют свойство умирать.
$ /usr/bin/defaults write com.apple.Safari DebugConfirmTossingUnsubmittedFormText -boolean No
За более подробным описанием смотрите первоисточник.

1 мая 2011 г.

Удаление ярыка "Macintosh HD" с рабочего стола в MacOS

Удаляется просто, пост для того, что б в интернетах долго не искать.

В настройках Finder снимаем галочку с "Show these items on desctop"->"Hard disks":

23 апреля 2011 г.

Куки в iOS (UIWebView)

Для каждого приложения в iOS существует свое хранилище http-cookies. Класс, который отвечает за куки - NSHTTPCookieStorage. Класс имеет простой интерфейс доступа к кукам, например прочитать все куки можно так:
for (NSHTTPCookie *cookie in [[NSHTTPCookieStorage sharedHTTPCookieStorage] cookies])
{
NSLog(@"%@", cookie);
}
Так-же есть методы утановки куков (- setCookie:), и чтения для конкретного урла (– cookiesForURL:)

19 апреля 2011 г.

Скрытие статус бара в iOS

Статус бар - верхняя панелька в iOS со значком оператора, часами и зарядом батареи.

Программно можно скрыть статус бар так:
[[UIApplication sharedApplication] setStatusBarHidden:YES];
Можно так-же отредактировав Info.plist приложения, добавив ключ UIStatusBarHidden

8 апреля 2011 г.

4 апреля 2011 г.

xcodebuild сборка приложения в консоли

Давно не писал в блог, времени катастрофически не хватало, впредь обещаю исправится.)

А для начала небольшой пост, о том, как можно сделать билд приложения в консоли.
Утилита xcodebuild из комплекта xCode SDK именно для этого. Хотя наверняка даже наоборот xcode IDE - графическая обертка над xcodebuild. Я

xcodebuild работает с проектом в текущей папке. Рассмотрим несколько основных параметров утилиты.
Запускается так:
$ xcodebuild [-project <projectname>] [-activetarget] [-alltargets] [-target<targetname>]... [-parallelizeTargets] [-activeconfiguration] [-configuration<configurationname>] [-sdk <sdkfullpath>|<sdkname>] [-xcconfig <filepath>][<buildsetting>=<value>]... [<buildaction>]...
из испольуемых мной параметров:

-target - задает имя таргета, который собирать в приложении
-configuration - задает конфигурацию, которую собирать
-sdk - и SDK который использовать при сборке
-list - показывает список таргетов и конфигураций для проектов в текущей папке
-showsdks - показывает доступные SDK

более детально можно узнать из мануалов:
$ man xcodebuild
В качестве "бонуса" приведу пример баш скрипта, который собирает приложение с конфигурацией "Distribution" и создает *.ipa файл. Подразумевается, что конфигурация "Distribution" настроена на подписку приложения сертификатом Ad-Hoc. Скрипт не проверяет ошибки вывода комманд, да и написался он быстрее чем этот пост:
#!/bin/sh
cd ~/work/my_project/trunk/my_project
rm -fr ./build
xcodebuild -target my_project -configuration Distribution -sdk iphoneos4.3
rm -fr ../tmp
mkdir ../tmp
mkdir ../tmp/Payload
cp -r ./build/Distribution-iphoneos/my_project.app ../tmp/Payload/
cp ./Resources/icon\@2x.png ../tmp/iTunesArtwork
cd ../tmp/
zip -r7 my_project.zip ./iTunesArtwork ./Payload
mv ./my_project.zip ../my_project.ipa
cd ..
rm -fr ./tmp

cp ./my_project.ipa ~/Desktop

23 февраля 2011 г.

Ошибка xCode Command .../copystrings failed with exit code 1

При сборке билда iPhone приложения xCode сегодня выдал ошибку:
Command /Developer/Library/Xcode/Plug-ins/CoreBuildTasks.xcplugin
/Contents/Resources/copystrings failed with exitcode 1
Решилась довольно просто, в фале "Localizable.strings" забыл в конце строки проставить ";"

24 января 2011 г.

Скрипт конвертирования видео для iPhone/iPod/iPad в Linux

Основано на моих предыдущих записях:
- "Установка ffmpeg и x264"
- "Конвертирование видео для iPhone/iPod Touch/ iPad с несколькими звуковыми дорожками и субтитрами"

Скрипт писался для личного использования, тестировался исключительно на системе Ubuntu Linux 9.10, 10.04 и 10.10. Но не вижу проблем с запуском на других *nix системах. Писалось для конвертирования серилов с поддержкой нескольких звуковых дорожек и субтитров.

Подготовка

Установка ffmpeg с поддержкой кодека x264

- Удаляем пакеты x264, libx264-dev, и ffmpeg если они были установлены:

  1. $  sudo apt-get purge ffmpeg x264 libx264-dev


- Если включено автообновление пакетов в системе, запрещаем обновлять пакет ffmpeg:
Если файл "/etc/apt/apt.conf.d/50unattended-upgrades" существует то прописываем в секцию "Package-Blacklist" пакет ffmpeg, если файла нет, создаем его:

  1. $ sudo echo -e "Unattended-Upgrade::Package-Blacklist {\n \"ffmpeg\";\n};" > /etc/apt/apt.conf.d/50unattended-upgrades


- Получаем зависимые пакеты необходимые для установки ffmpeg и x264:

  1. $ sudo apt-get update
  2. $ sudo apt-get install build-essential subversion git-core checkinstall yasm texi2html libfaac-dev libfaad-dev libmp3lame-dev libtheora-dev


- Устанавливаем x264 из исходников

  1. $ mkdir ~/src; cd ~/src
  2. $ git clone git://git.videolan.org/x264.git
  3. $ cd ./x264/
  4. $ ./configure
  5. $ make
  6. $ sudo checkinstall --fstrans=no --install=yes --pkgname=x264 --pkgversion "1:0.svn`date +%Y%m%d`-0.0ubuntu1" --default


- Устанавливаем ffmpeg с поддержкой кодека x264:

  1. $ cd ~/src
  2. $ svn checkout svn://svn.ffmpeg.org/ffmpeg/trunk ffmpeg
  3. $ cd ffmpeg/
  4. $ ./configure --enable-gpl --enable-nonfree --enable-pthreads --enable-libfaac --enable-libmp3lame --enable-libtheora --enable-libx264
  5. $ make
  6. $ sudo checkinstall --fstrans=no --install=yes --pkgname=ffmpeg --pkgversion "3:0.svn`date +%Y%m%d`-12ubuntu3" --default


- устанавливаем необходимые утилиты кодирования

  1. $ sudo apt-get install mkvtoolnix gpac atomicparsley mencoder


mkvtoolnix - для работы с mkv файлами, gpac - библиотека для работы с mpeg4, atomicparsley - утилита для прописывания тэгов видео, mencoder - сейчас не используется, в будущем будет использоваться для кодирования mkv segmented linked видео.

Скачиваем скрипт кодирования

  1. $ cd
  2. $ git clone git://github.com/derand/video2iDevice.git


Краткое описание файлов:
2iDevice.py - собственно сам скрипт конвертирования
subConverter.py - модуль конвертирования субтитров, можно использовать как скрипт конверта сабов в ttxt формат
mpeg4fixer.py - модуль исправления выходного видео (замена графического Dumpster)
mpeg4Viewer.py - скрипт показывает структуру mpeg4 файла

Настройка завершена, теперь использование.

  1. $ ~/video2iDevice/2iDevice.py <опции> <видео файлы> <опции>


Имя параметраТипОписание
-th[int]кол-во потоков, которые будет использовать ffmpeg для кодирования
-lang[str]языки потоков (трехбуквенные имена) в выходном файле разделенные ":", например: "jpn:jpn:rus:eng:rus"
-streams[str] использовать дорожки в файле (номера дорожек разделенные ":" первая дорожка имеет индекс 0, например "0:3:1"), по умолчанию кодируются все дорожки из видео-файла
-format[str]выходной формат. Может быть "mp4", "m4v" - по умолчанию
-TRACK_REGEX[srt]регулярное выражение для выделения номера эпизода из имени файла.
-track[int]номер эпизода (серии)
-tracks[int]кол-во эпизодов (серий)
-stream[int]указывает номер используемого потока для добавленных потоков аудио или субтитров (см -afile, -sfile)
-title[str]прописывает имена потоков для добавленных потоков аудио или субтитров (см -afile, -sfile)
-b[int]битрейд видео (640 по умолчанию)
-refs[int]кол-во ref-frames (2 по умолчанию)
-vq[int]разрешение выходного видео (класс). 1 - 480x*, 2 - *x320, 3 - максимальный из первых двух (по умолчанию)
-s[int]x[int]выходное разрешение, имеет более высокий приоритет над параметром -vq
-fdПрописать продолжительность видео равную продолжительности видео-дорожки
-ar[int]частота аудио (по умолчанию 48000)
-ab[int]битрейд аудио (по умолчанию 128k)
-afile[str]добавление дорожки аудио из внешнего файла. Путь задается от папки с исходным видео. В строке могут встречаться подстроки которые заменяются: "[NAME]" - заменяется на имя файла, "[2EID]" - на номер эпизода (серии). После этого параметра может идти параметр -title и -stream
-sfile[str]добавление дорожки субтитров из внешнего файла. Формат такой-же как и в параметре -afile.
-stik[str]Задать тип видео. Может бить 'Movie' - фильм, 'Music Video' - клип, 'TV Show' - ТВ шоу ... (подробнее: AtomicParsley --stik-list)
-TVShowName[str]Задать название сериала/фильма
-TVSeasonNum[str]Задать сезон (для сериалов)
-description[str]Задать описание (максимально 255 символов)
-year[str]Установить год
-artwork[str]Установить изображение обложки. Полный путь к файлу изображения.


Несколько примеров использования можете найти в инструкции на rutracker