Рубрика «извращения»

Продолжение цикла о Zip-архивах и PHP. Предыдущие статьи: Часть 1, Часть 2, Часть 3

Доброго времени суток, дорогие читатели.
На этот раз я хотел бы представить, наверное, заключительную часть цикла о Zip-архивах и PHP.

В этой статье я покажу как прочесть уже существующий архив и для примера мы возьмем photos.zip из прошлой статьи. Чтоб не повторять все процедуры воспользуемся готовым — https://github.com/userqq/images/raw/master/photos.zip.

А теперь давайте на минутку отвлечемся и вспомним, из чего состоит наш архив: сначала идет набор данных упакованных файлов, где каждый упакованный файл предварён структурой Local File Header (LFH), после всех данных у нас идет набор структур Central Directory File Header (CDFH) — это такое оглавление по нашему архиву, в котором перечислены все элементы и позиции их смещения относительно начала файла. А завершает архив End Of Central Directory Record (EOCD) — тут указана позиция начала структур CDFH, их количество и общая длина в байтах. Поэтому архив следует читать с конца, чтоб сначала найти EOCD, потом прочесть структуры CDFH и таким образом получить список файлов в архиве.

FYI: А некоторые форматы, например JPEG, читаются с начала. Поэтому мы можем склеить картинку с архивом, даже банально через cat image.jpeg archive.zip > imagearchive.jpeg, не потеряв функционала. Браузеры и приложения для просмотра картинок будут без каких-либо проблем показывать нам картинку. В то время как любое приложение для чтения zip-архивов, будь то 7z или unzip, сможет преспокойно работать с файлом как с архивом. Например, вот — https://github.com/userqq/images/blob/master/jpegarchive.jpg (Осторожно, эта штука весит около 20мб, поэтому не советую открывать с телефонов или если вам дорог трафик). Таким образом, если вы знаете хостинг картинок, на котором изображения не перекодируются и не обрезаются, вы можете заливать туда не только картинки:) Хотя, мне кажется, сейчас таких уже не найти.
Читать полностью »

Продолжение статьи Как выглядит zip-архив и что мы с этим можем сделать.

Предисловие

Доброго времени суток.
И снова в эфире у нас нетрадиционное программирование на PHP.

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

Читать полностью »

Доброго времени суток, уважаемый Хабр!

За последние пол года кривая дорожка моих пет-проектов завела меня в такие дебри, откуда до сих пор выбраться не представляется возможным. И начиналось то все безобидно — сайт с картинками, но чувство перфекционизма, погоня за халявой, а так же некоторые особенности моего склада ума превратили эту, как изначально планировалось, маленькую прогулку, в настоящее длинное путешествие. Ну и ладно, как говорил один довольно картавый революционер: «Учиться, учиться и еще раз учиться», а мне, волей-неволей, приходится этому напутствию следовать.

Ой, что-то мы отвлеклись от основной темы. Не буду больше вас утомлять пространными речами, а перейду к делу.
Читать полностью »

Сайт The Daily WTF уже 14 лет собирает курьёзные, дикие и/или печальные истории из мира ИТ. Я перевёл несколько рассказов, показавшихся мне интересными. Все имена и названия компаний изменены.

На работу за 3 000 миль

Правдивая история из личного опыта нашего автора Snoofle. [Оригинал]

Много десятков лет назад оборонный подрядчик DefCon Inc работал на армию США и пытался получить новый контракт на создание какого-то приложения, применяемого в бою. Компания хотела продемонстрировать в своём предложении, что у неё хватит персонала для выполнения этого проекта. Поэтому она наняла более тысячи разнообразных программистов, руководителей проектов, менеджеров и так далее. Военные, изучавшие различные коммерческие предложения, увидели кучу новых сотрудников, абсолютно незнакомых с необходимыми процессами, процедурами и требованиями, поэтому передали контракт другой фирме. Подрядчик, со своей стороны, уволил всю эту тысячу человек.

Спустя несколько месяцев возник ещё один подобный контракт. Компания снова наняла тысячу человек, чтобы показать, что у неё есть персонал. Ещё через несколько месяцев контракт снова был передан другому подрядчику, и компания снова уволила всю тысячу.

Любопытные извращения из мира ИТ - 1

Читать полностью »

Когда я читал книгу «Паттерны разработки игр», написанную замечательным человеком по имени Bob Nystrom (я не пишу его имя по-русски, поскольку не имею ни малейшего понятия, как это произносится), в одной из глав мне на глаза попалась небольшая ода языку Smalltalk как праотцу всех современных объектно-ориентированных языков, намного опередившему своё время. Поскольку я по жизни испытываю необоримую приязнь ко всяким винтажным языкам, естественно, я полез про него гуглить. И разумеется, вместо того, чтобы вынести из этого опыта что-то полезное, я научился плохому.

Пятничный JS: как вдохновиться Smalltalk'ом и попасть в ад - 1

Читать полностью »

В документации PHPUnit есть небольшой раздел посвященный источникам данных (data provider), которые позволяют скормить тесту большой объем данных, а чуть ниже есть даже пример источника данных для CSV файла.
Читать полностью »

imageСколько я не мучил поисковик, а решения этого вопроса так и не нашлось. Конечно, всегда можно использовать JS и это нормально, но иногда заказчик душа просит изысков.
Читать полностью »

  • A long time ago, in a galaxy far, far away....

На дворе был далёкий, 2006-й год. Моим «боевым» компьютером на тот момент был проверенный временем AthlonXP 1700+. Имел он на борту 1 Gb памяти типа DDR400, IDE HDD аж на 250 Gb и видеокарту ATI (тогда ещё) Radeon 9800Pro, до которой уже добрались мои шаловливые ручки.

«Ключевой» момент в охлаждении процессора - 1

На тот момент это была средненькая игровая машинка, звёзд с неба не хватала, NFS Underground 2 бегал на ней вполне шустро. Но хотелось, как и всегда, приобщиться к высоким технологиям.
Читать полностью »

Предлагается разработать безопасную альтернативу встроенного макроса __COUNTER__. Первое вхождение макроса заменяется на 0, второе на 1, и так далее. Значение __COUNTER__ подставляется на этапе препроцессирования, следовательно его можно использовать в контексте constant expression.

К сожалению, макрос __COUNTER__ опасно использовать в заголовочных файлах — при другом порядке включения заголовочных файлов подставленные значения счетчика поменяются. Это может привести к ситуации, когда например в foo.cpp значение константы AWESOME равно 42, в то время как в bar.cpp AWESOME≡33. Это нарушение принципа one definition rule, что есть страшный криминал во вселенной C++.

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

По мотивам этого вопроса на Stack Overflow.
Читать полностью »

Приветствую! %username, ты наверняка слышал про такой язык как tcl и его графический тулкит tk. Язык отличается особой гибкостью (на мой скромный взгляд). Пока нет много времени написать об «облачной» разработке, решил написать мини-статью/мини-урок про одну из возможностей замечательного языка tcl — словарях ( причем, их я не могу вспомнить по книге «Практическое программирование на Tcl/TK», быть может просто читал старую версию). Наиболее полное описание данного типа данных, %username, ты можешь найти по ссылкe.
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js