Как стать автором
Обновить

Комментарии 31

Позволю себе чуть-чуть обнаглеть — в общей шумихе и суматохе во время раздачи инвайтов на Google.Wave мне так ничего не досталось. Если вдруг у кого-нибудь завалялся не нужный, я бы с радостью принял бы оный в дар :) Спасибо.
НЛО прилетело и опубликовало эту надпись здесь
Я понимаю Вашу иронию и понимаю за что мне поставили минусы. Дело в том, что как разработчику очень хочется глянуть на новые технологии, ан нет — никак. Что ж, раз никак — то никак.
Если бы я мог, я бы дал вам инвайт и заплюсовал бы комментарий так, чтобы на него обратили внимание инвайт-имущие. Но увы :(

P.S. действительно, как-то некрасиво и несправедливо поступила масса.
Я думаю, это не была ирония, а наоборот — попытка сдержать массы минусующих.
Господа, это, так сказать, не очень красиво заминусовывать комментарий, написанный автором статьи ;)
Спасибо за статью, у меня в голове наконец стало проясняться, почему же все так плохо с RAR.
я было как-то от нечего делать написал функции для РНР для архивации файла в многотомный архив, простым сохранением без сжатия, за-то без использования любых сторонних библиотек или расширений. единственно что плохо так то что CRC32 пришлось вычислять отдельной функцией так как встроеная в РНР не вычисляла CRC32 по частям.
Если тема интересует могу найти свои исходники и выложить.
думаю что будет полезно посмотреть исходники
34/64 платформа как-то влияет на определение CRC32?
Хм… Хм?.. Хм! Какой Вы молодец, я даже не сразу же сообразил, что используя store вполне себе можно «заархивировать» данные в rar. Надо будет поразвлекаться на досуге.
Интересует, если вам нетрудно — поищите пожалуйста.
К сожалению в результате поиска исходников не обнаружено, единственно нашел текстовик с описанием формата.
Так и не понял чем вложенная функция лучше, чем всё это в класс обернуть :)
Сколько лет пхпую, так и не видел такой вот конструкции
if ($attr & 0x01)
но это нюансы стиля написания конечно. Програмку завтра проверю, если так хорошо работатет, то респект и уважуха. Останется только допилять архивацию и дезархивацию :)
Огоспаде, сударь, Вы читали статью? RAR закрытый формат, ни один сторонний продукт не может заархивировать в rar без dll-ки с сайта rarlabs.com. В статье же рассказывается о способе получения списка заархивированных файлов из rar-архива без сторонних dll, что вполне по силам PHP или любому другому продукту — исходные коды unrar открыты.

Что до ($a & 0x01) — это проверка заданного бита. Скорее всего Вы мало работали с бинарно представленными данными, отсюда и «не видел конструкции».
Кроме «store-сжатие», естественно, как отмечалось выше.
Ну и к вопросу о вложенных процедурах — зачем плодить классы, где они не нужны?
Конечно незачем, но только здесь они — нужны. И вообще везде где всплывает этот аргумент, классы — нужны. Объектно-ориентированная методология это не кунг-фу, который нужно использовать только в случае крайней необходимости, это штатная замена методологии процедурного программирования.
З.Ы. Насчет вложенных процедур — afaik в PHP их нет, и любая функция объявленная внутри другой функции — все равно таки окажется в глобальной области видимости. А возможность объявлять функции внутри функций дана для того чтобы объявлять функции например по условию, иже:
function define_sinus($wrong = false) {
  if($wrong) {
    function sinus($angle) {
      return cos($angle);
    }
  } else {
    function sinus($ange) {
      return sin($angle);
    }
  }
}
Так, специально проверил на echo temp_getBytes("abcd", 1, 2);, вызванной снаружи скрипта — ответ PHP 5.3 однозначен: Fatal error: Call to undefined function temp_getBytes().

Что-то нажало мне Enter. Продолжаю. :)

Что до использования классов в данном конкретном случае. Я абсолютно не против использования классов, но здесь функция получения нескольких байтов из строки с учётом little-endian и функция сортировки дерева по ключам абсолютно не к месту в глобальном пространстве имён, но расширять из-за них две самодостаточные функции из модуля до класса, совершенно не нужно. Использование классов — не панацея, а как вы правильно заметили, другое кунг-фу. Здесь я посчитал это кунг-фу избыточным. Кроме того, в конечном итоге, это не важно — функционал модуля выдержан, пользуйтесь на здоровье :)
Это я нажал вам Enter :P
Насчет самодостаточности — да, функции самодостаточны, выполняют то что нужно, и не выполняют того что не нужно, однако-же будь это класс, например использующий типовое решение «итератор», так как по-сути функция им и является, иже бежит по файлу вычленяя из него содержащуюся в нем информацию — его можно было-бы в последствии расширить, например недостающим функционалом распаковки, поиском определенного файла и т.д. и т.п., в случае-же процедуры — чтобы это сделать — нужно лезть потными ручками в этот самый рабочий, самодостаточный функционал, который после этого не суть что останется рабочим и самодостаточным :)
З.Ы. Ну и это конечно ни в коем случае не обвинения, за функционал спасибо, было интересно посмотреть на принцип его работы, вы молодец, однако не могу удержаться от холивара когда говорят что классы «здесь не нужны», если использовать ООП-методологию — они имхо везде нужны.
> если использовать ООП-методологию — они имхо везде нужны.
уж не удержусь: и даже в программе Hello World!? ;-)
public class HelloWorld {
  public static void main(String[] args) {
    System.out.println("Hello, world!");
  }
}
Helloworld на Java, пока от него вроде никто не умер. От продолжения ответа удержусь — не вижу смысл метать бисер.
/me обреченно возводит руки к небесам.
Ну так правильно :) Чтобы вызвать функцию снаружи скрипта — ее нужно объявить, а объявляется она внутри другой функции, приведу простой пример:
function outer() {
	function inner() {
		echo "tratata";
	}
}

outer();
inner();

Выведет «tratata», а вот
function outer() {
	function inner() {
		echo "tratata";
	}
}

inner();

Выведет критическую ошибку, потому что пока outer не вызвана — inner не существует, однако когда outer будет вызвана — inner будет существовать в глобальном пространстве имен.
Уговорили. Буду знать на будущее. Тогда стоит добавить if (!function_exists()). Спасибо, век живи — век учись.
С бинарными данными действительно мало работал. Собсно сейчас работаю в команде, где очень чёткое структурирование кода идёт, очень всё стандартизировано вплоть до «эта скобочка сюда, эта сюда», поэтому глаз и целпяется за такие вот конструкции.

В общем, прошу извинить, глаза после рабочего дня уж замылены :)
С каждым дистрибутивом RAR'а (по крайней мере WinRAR) идёт описание формата RAR архивов. Не пойму, какой вообще смысл уповать на чьи-то древнейшие разработки, которые не умеют читать архивы RAR 3.x (между прочим, введённый в обращение уже ой как давно), если можно совсем чуть-чуть покопавшись написать собственную «читалку»?
Читать же бинарники средствами самого PHP, IMHO, моветон. :)
Читать же бинарники средствами самого PHP, IMHO, моветон. :)


И что в этом плохого? Какая разница чем их читать? Можете, конечно, написать консольную программу хоть на С, и вызывать ее из PHP, однако смысл?
Эх, Сударь-Сударь. Знали бы какие проблемы возникают во время разработки — хочу чтобы я загрузил rar-архив (указал на rar на сервере), а оно оттуда весь текст достало? Не знакомая ситуация? Тогда представьте, что у вас не выделенный хостинг, а какой-то проплаченный «у дяди», и всё встанет на свои места.

Ну а к документации, ссылку на которую Вы дали. Ха-ха, Сударь! Она отличается от той английской тем, что она русская и что добавлены новые флаги, что были введены с 3.х версиями. Попробуйте с помощью неё разархивировать данные. Попробуйте-попробуйте.
Не знакомая ситуация? Тогда представьте, что у вас не выделенный хостинг, а какой-то проплаченный «у дяди», и всё встанет на свои места.

Можно конечно всю жизнь героически бороться с ограничениями российских shared-хостингов за $3-4, которые на начальных тарифах могут даже PHP+MySQL не предоставлять, а можно один раз подойти к вопросу выбора посерьёзней и остановиться на одном наиболее вменяемом, не имеющего ограничений ни на запуск внешних программ (например, чтобы парсить вывод unrar), ни на подключение произвольных PHP extensions.
Помню, когда мне требовалось оперировать RAR архивами на Linux shared-хостинге, я обычно заливал туда консольную версию RAR и пользовался ей через PHP/CGI web-shell.

Ну а к документации, ссылку на которую Вы дали. Ха-ха, Сударь! Она отличается от той английской тем, что она русская и что добавлены новые флаги, что были введены с 3.х версиями.

Я не заострял внимание на содержании указанного документа (к дистрибутиву архиватора по любому прилагается наиболее актуальная версия), хотел лишь отметить, что описание файлового формата RAR-архивов вполне себе общедоступно и располагает к написанию собственных парсеров, а не допиливания каких-то сомнительных сторонних решений.
В данном случае речь идёт абсолютно не о Российских и СНГшных хостинг-провайдерах. Я живу в Праге, общаюсь с пражанами, где у них сервера мне в конечном итоге всё равно — ставятся задачи, я их решаю в поставленных рамках.

Повторюсь, что данная спецификация рассказывает лишь о блочной структуре rar-файла. Прочитав файловый блок, нужно его потом ещё и разархивировать. Если вы знаете, где можно найти неисходный код, а принцип разархивации, то я тоже хочу эту ссылку — сильно-сильно. И скажу Вам за неё спасибо, нет — так о чём разговор-то опять.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Изменить настройки темы

Истории