Работа с датами в iOS

Работа с датами в iOS для новичков вызывает затруднения из-за своей нетривиальной реализации. В этом посте несколько готовых рецептов для работы с датами в приложениях iPhone.

Для манипуляции с датами используется три класса: хранение дат — NSDate, манипуляция с датами — класс NSCalendar, хранение компонент даты — класс NSDateComponents.

Получение года, месяца и числа

// Создаем календарь
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// Задаем компоненты, которые мы хотим извлечь из даты
NSUInteger unitFlag = NSMonthCalendarUnit | NSYearCalendarUnit | NSDayCalendarUnit;
// Получаем компоненты даты
NSDateComponents *components = [cal components:unitFlag fromDate:[datePicker date]];
// Получаем значения года, месяца и числа
txtYear.text = [NSString stringWithFormat:@"%i", [components year]];
txtMonth.text = [NSString stringWithFormat:@"%i", [components month]];
txtDay.text = [NSString stringWithFormat:@"%i", [components day]];
// Освобождаем ресурсы
[cal release];

Установка года, месяца и числа

// Создаем календарь и компоненты даты
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
// Задаем значение года, месяца и числа
[components setYear:2011];
[components setMonth:12];
[components setDay:31];
// Устанавливаем новые компоненты даты (формируем новую даты)
NSDate *date = [cal dateFromComponents:components];
// Освобождаем ресурсы
[components release];
[cal release];

Вычисление новой даты

// Создаем календарь и компоненты
NSCalendar *cal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
NSDateComponents *components = [[NSDateComponents alloc] init];
// Задаем значения компонентов, которые мы хотим прибавить к текущей дате
// Если задать отрицательное значение, то оно будет вычитаться из текущей даты
[components setYear:1];
[components setMonth:2];
[components setDay:3];
// Вычисляем новую дату, прибавляя к текущей дате 1 год, 2 месяца и 3 дня
NSDate *today = [[NSDate alloc] init];
NSDate *newDate = [cal dateByAddingComponents:components toDate:today options:0];
[today release];
// Освобождаем ресурсы
[components release];
[cal release];

Поиск и отображение списка файлов в ShareFile

Небольшой пример того, как отобразить список вложенных папок и файлов папки или результата поиска.

Для получения списка вложенных папок и файлов какой-то папки используется метод folder_list класса ShareFileConnection и метод search для поиска, с частичным совпадением или полным. » Читать...

Беззнаковые типы в Java

Есть ли безннаковые типа в Java? Такой вопрос поставила передо мной работа над одним из проектов, который активно работает с данными на уровне битов.

К сожалениею, а может и к счастью, ответ на него — Нет! В Java нет беззнаковых типов данных. Но не все так плохо, беззнаковые типы можно заменить знаковыми, выбирая для хранения тип на порядок больше, чем требуется. Например, если вам необходимо хранить значение типа byte, то вы храните его в переменной типа short, и так далее.

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

P.S. Что касается работы с битами в Java, то все обстоит точно так же, как и в других языках — битовые операции на месте, плюс добавлены еще парочка.

Загрузка файла в ShareFile

Наша команда ведет разработку и поддержку проекта ShareFile API PHP, который позволяет использовать функции файл-сервиса ShareFile посредством их REST API. В данном посте я бы хотел показать простой пример использования функционала проекта для загрузки файла в корневой каталог. » Читать...

Построение простого индекса по файлу CSV

Хочу поделиться несложным рецептом построения простого древовидного индекса по файлу CSV на базе хэшей Perl. Perl очень шустро управляется с хэшами любого размера, а такой древовидный индекс может быть полезен, например, при поиске дублирующихся строк в файле CSV, базе данных и т.д., всего лишь за один проход по записям. » Читать…

Засыпание и завершение потока в Java

Как известно, правильно спроектированные потоки в многопоточном приложении большую часть времени проводят в ожидании. Но «усыпление» потока и проверка признака его завершения в Java имеет некоторые тонкости. » Читать…

Проблемы с сессиями в CodeIgniter

Работая над задачей аутентификации пользователей, столкнулся в CodeIgniter с тем, что сессия сбрасывалась сразу же на форме логина. Хочу уточнить, что все было нормально, когда использовались стандартные сессии CodeIgniter, которые хранятся в cookies, а при переходе на хранимые в БД сессии, стала возникать такая ситуация.

Решение, суть причина, оказалось достаточно простым.

В функции авторизации первым делом происходило удаление сессии вызовом метода $this->session->sess_destroy(), что приводило к удалении сессии, но новая сессия не создавалась. Удаление всей сессии заменил на удаление/очистку переменных сессии, в результате все заработало отлично.

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

Раскраска ячеек таблицы DataGridView в .NET

Раскраска ячеек/строк в DataGridView в .NET достаточно нетривиальная задача, так как порядок следования записей в наборе данных и в строк в таблице могут не совпадать, например, пользователь отсортировал таблицу по какому-то полю. При решении этой задачи убил достаточно много времени и здесь хочу показать, как корректно раскрашивать ячейки/строки.

» Читать...

Смена часового пояса в Linux

Готовый рецепт смены часового пояса в Linux/Unix. Подробности в комментариях.

# Удаляем старый часовой пояс
# Можно также сделать его резервную копию
rm -rf /etc/localtime
# Создаем символическую ссылку на нужный часовой пояс
ln -s /usr/share/zoneinfo/US/Pacific /etc/localtime
# Синхронизируем аппаратные часы
hwclock --systohc

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

Расширение раздела в Centos/RedHat (и клонах)

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

Команды действительны для Centos 5.x/RedHat.

- узнаем имена логических разделов;
lvdisplay
 
- расширяем раздел /home на 92Gb;
lvextend -L+92Gb /dev/vg00/lv_home
 
- подготавливаем файловую систему на этом разделе;
resize2fs /dev/vg00/lv_home

Всего две команды позволяют расширить Ваш диск без потери данных и перезагрузки. Для любознательных — Growing Logical Volumes.
Ах да, узнать размер доступного для распределения объема — vgdisplay (Free PE / Size).