Удаление/замена стандартного Apache2 в MacOS X

Люди, которые сталкивались с этой проблемой поймут всю соль. При установке MacOS X вместе с WebServer устанавливается Apache2, который раскидан по всей системе и прописан в автозагрузке. Управлять им не то что не удобно, а даже сложно. Поэтому многие устанавливают отдельный Apache2, например, из MacPorts. Но после установки возникает проблема конфликта двух инстанций Apache2.

Поиск в Интернете не дает ничего особо толкового в вопросе «Удаление Apache2 в MacOSX», и многие ответы предлагают смириться с этим. Но выход все же есть. Он не идеален, но работает «на ура» уже достаточно долгое время. Стандартная инстанция Apache2 размещает свои исполняемые файлы в /usr/sbin, в то время как MacPorts в /opt/local/apache2/bin, и решение кроется в том, чтобы заменить в /usr/sbin основные исполняемые файлы ссылками на MacPorts.

Данный shell-скрипт сохраняет старые версии файлов и заменяет основные файлы apachectl, apxs, httpd ссылками. После его выполнения необходимо перезагрузить компьютер. Если после перезагрузки все еще отображается не та страница, что Вы ожидаете, обновите ее, так как браузер мог его закешировать.

#!/bin/sh
 
# Заменяем apachectl
sudo mv /usr/sbin/apachectl /usr/sbin/apachectl-save
sudo ln -Ffs /opt/local/apache2/bin/apachectl /usr/sbin/apachectl
 
# Заменяем httpd
sudo mv /usr/sbin/httpd /usr/sbin/httpd-save
sudo ln -Ffs /opt/local/apache2/bin/httpd /usr/sbin/httpd
 
# Заменяем apxs
sudo mv /usr/sbin/apxs /usr/sbin/apxs-save
sudo ln -Ffs /opt/local/apache2/bin/apxs /usr/sbin/apxs

При установке некоторые пакетов обновления MacOS X иногда восстанавливает стандартные файлы в папке /usr/sbin, в этом случае необходимо выполнить скрипт еще раз.

Чтение и запись сжатых файлов в Perl

Возможно, данная тема не самой первой свежести, но на ее примере можно увидеть одно из преимуществ Perl при обработке данных.

Задача проста — читаем данные их одного сжатого файла, «обрабатываем», пишем в результирующий сжатый файл. Задача нетривиальная, но Perl и модули CPAN решают ее самым тривиальным способом. В этом примере мы будем работать с файлами gzip.

Для распаковки и упаковки данных в формате gzip используем модули IO::Compress::Gzip и IO::Uncompress::Gunzip, которые также предоставляют чтение и запись файлов gzip через IO:Handle, что на практике означает то, что можно работать со сжатыми файлами, как с самыми обычными файлами.

Алгоритм получается примерно следующим:

use IO::Compress::Gzip;
use IO::Uncompress::Gunzip;
 
// Открываем файл-источник
my $in_filename = 'input.gz';
my $in = new IO::Uncompress::Gunzip($in_filename);
 
// Открываем файл-приемник с перезаписью существующего файла и максимальной степенью сжатия
my $out_filename = 'output.gz';
my $out = new IO::Compress::Gzip($out_filename, Append => 0, -Level => 9);
 
// Основной обработки данных
while (my $line = <$in>) {
  // Обрабатываем $line
  ...
  // Записываем данные в результирующий файл
  print $out $line;
}
 
// Закрываем файлы
$out->close();
$in->close();

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

Работа с датами в 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 достаточно нетривиальная задача, так как порядок следования записей в наборе данных и в строк в таблице могут не совпадать, например, пользователь отсортировал таблицу по какому-то полю. При решении этой задачи убил достаточно много времени и здесь хочу показать, как корректно раскрашивать ячейки/строки.

» Читать...