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

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

Да, не натыкался раньше.
Пол года назад я этим тоже интересовался: linguistic-suffocation.org/lab/tile/
У моего алгоритма иногда бывают проблемы с последними несколькими строчками
У вас количество картинок в ряду разное, как и на G+, а у автора статьи, как я понял, это самое количество фиксировано. То есть ваш вариант как раз что надо, а у автора статьи задача изначально слишком упрощена.

Впрочем, так совпало, что я вчера вечером занимался тем же самым и накидал свой простенький алгоритм, который делает с разным количеством картинок в ряду при определенных границах по высоте. И уже щас чужие варианты брать не хочется :)
Количество картинок подбирается под ширину блока/высоту строки.
Еще одно: эстетически идеальное решение этой проблемы нам недоступно — это 2D bin packing problem (http://en.wikipedia.org/wiki/Bin_packing_problem). Хотя у нас проблема модифицированная — мы можем пропорционально менять размер, в отличии от задач загрузки контейнеров какой-нибудь баржи или кузова фуры.
Ну это, если честно, задачу меняет координально и ничего общего с изначальной, насколько я считаю, уже здесь нет
Кардинально, товарищи, кардинально.
Да, точно, постоянно забываю =)
Чего минусовать-то?

Хабр такой хабр, что тут еще добавить.
Может кто-то все же скажет, почему он со мной не согласен?
Физически проблема другая, а математически, на мой взгляд, она упрощается дополнительной степенью свободы — параметром масштаба для каждого прямоугольника. Может статься, что она неплохо решаема.
Я как раз таки и имел ввиду, что эта дополнительная степень свободы слишком сильно меняет суть задачи, т.е. как мне кажется идеи из исходной задачи здесь будут не очень полезны.
Круто, я так же думал. Вы тестировали на случайных наборах? Не возникает в конце не до конца заполненых рядов?
чуть ниже мой камент про глюк
а про последний ряд — не вижу проблем, оно так и должно быть… не до конца заполненное
не, у меня чуть иначе — появляются, бывает, глюкавые несколько последних рядов
вы пробовали? я пробовал оба
добиться эффекта гугл+ не вышло
Протестировал
Сервер долго думал (секунд 15)
Картинки показались, как и планировалось, выровненные
Еще вылезла ошибка — Warning: Division by zero in /home/squie198/public_html/imagemos.php on line 160

Лучше на javascript сделать это, пусть браузер сам думает, нечего сервер нагружать
Самое интересное, что на локалке все нормально, и деления на ноль не происходит. Сейчас перепроверю.
У меня уже 161, скрипт растет.
Пофиксил
что за мода выкладывать ошибку с полным путем? Неужели нельзя оставить только имя файла и строку с ошибкой. Вы для кого полный путь до файла показываете?
А почему нет собственно?
Ну если не выкладывать, автор может думать, что у него этой проблемы нет, хотя она есть. Так что как раз лучше выкладывать.
Можно просто намекнуть же, написав что-нибудь вроде «а еще у вас вместе с ошибкой виден полный путь к скрипту».
/var/www/test.php

Ломайте.
Вы статью прочли?
Там в статье, кстати, рассказано как добиться ошибки, но не то, что это может за собой повлечь.
such as using the load_file() (within a SQL Injection) query to view the page source, require the attacker to have the full path to the file they wish to view
А слона я и не заметил.
Да, прочёл, но к сути моего комментария это не относится. Как, впрочем, и все комментарии из данного дерева до 2го уровня включительно.

А суть такова: паранойя в ИТ это хорошо и замечательно, но когда предоставленных кем-либо данных явно недостаточно для осуществления взлома (скажем, если человек тестировал у себя на виртуалке) либо же они публично доступны (например, демо автора) — это уже перебор. В первом случае это не опасно, а во втором любой сможет получить нужные данные.

А об уязвимостях в работающих системах лучше репортить в личку, да.
А об уязвимостях в работающих системах лучше репортить в личку, да.


Вот-вот. Во-первых дадите время на закрытие (и любой уже, возможно, не сможет получить данные), а во-вторых не станете упрощать жизнь потенциальному взломщику (хоть и попахивает security through obscurity).
>> Лучше на javascript сделать это, пусть браузер сам думает, нечего сервер нагружать
Да ладно вам, человек просто набросал алгоритм на коленке на том, на чем ему удобнее. Никто не предлагает использовать это в том виде в котором оно есть.
Масонри, как по мне, не справляется с основной задачей: плотно заполнить пространство. Да и расчитан он на текстовую информацию, которая не поддается масштабировке по понятным причинам. Хотя штука достойная, я согласен
не совсем то, я его пытался подкрутить для вывода фоток как гугел+, выходило, что легче написать отдельный скрипт
начал писать, потом случайно наткнулся на тот, что указал выше
есть там правда баг с последней фоткой в ряду, у себя пофиксил, но корявенько, как доведу до разумного вида — обязательно закину пул реквест
НЛО прилетело и опубликовало эту надпись здесь
1) Было интересно реализовать, как минимум.
2) Для простоты, не хотел усложнять код.
3) Вывел ключевой момент кода, в котором идет подсчет. По ссылке есть полное демо.
4) Не привык я к IDE, работаю в блокноте, по старинке.
НЛО прилетело и опубликовало эту надпись здесь
Я принимаю замечания, просто не все. Спасибо.
4) долго плакал… Милейший, вам памятник нужно воздвигнуть, и почетное звание: «Увидел Ад, и не устрашился».
Возможно. Туда-сюда меня с vim на gedit кидает.
> работаю в блокноте
Самое ужасное для меня при работе с блокнотом — было перебивание табуляции. Что-то поменял, и все: во имя красивого оформления перебивай n-строчный блок на один-два отступа вправо/влево. Не сильно замечал, но когда перешел на notepad++, как в раю оказался.
Уф. А сколько вас еще ждет открытий чудных…
Я вот тоже стирал ручками, но самое ужасное для меня, это то, что стираются руки до крови. Теперь использую стиральную машину:

image

Руки не стираются, но всеравно приходится следить за временем стирки, вынимать белье со стекающей водой, отжимать руками его. В общем надо то-то оптимизировать.
Нужно апгрейдить до современной стиралки. Засыпал порошок, нажал на кнопочку. Все само стирается, отжимается. Но все равно приходится гладить рубашки:( Надо подключать компонент «wife».
вы не програмист, вы сисадмин =)
гладить != стирать ;)
Это уже другая процедура, отдельная тема для оптимизации и автоматизации процесса.
4) а Вы, простите, стирает одежду ручками в тазике, как это делали наши деды с бабками? Попробуйте контрольный вам, и тот удобнее.
Простите, писал с андроида, он как обычно выдумывает предложение, имелось в виду,
Попробуйте консольный вим, и тот удобнее
  1. Посмотрите, как гугл картинки выглядят без скрипта, как в 00-х ) Даже корпорация добра не делает это на серверах, ибо не выгодно.
1. О посетителях без анлимов некоторые программеры забывают, а жаль — таких очень много
2. Это тестовый код, зачем здесь что либо выносить?
3. Код оформлен в виде кода, который нормальный программер вполне чегко прочитает — что еще надо?
4. И что что не определены переменные? Это ПЫХ, можно не заморачиваться с мелочами

Удачи в дальнейшем развиитии программирования — статус нуба — это поправимо ;)
Спасибо комментирующим) Заложил даже больше ради комментов, чем оригинального решения) Хотя автору тож спасибо)
НЛО прилетело и опубликовало эту надпись здесь
Разве float: left + fixed height не решит проблему или я что-то не понял?
Вы почти правы — намного проще и почти тот же результат. Только вот в мелочах (в данном случае — неровный правый край) и прячется качество. Согласитесь — выдача поиска картинок от Гугла была бы менее симпатичной в таком варианте.
display: inline;
text-align: justify;
Тогда маргины будут разные у картинок, тоже не красиво.
Сервер будет плакать кровавыми слезами от такого скрипта.
Собственно вот:
Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 20000 bytes) in /home/squie198/public_html/imagemos.php on line 88
Блин какая радость =) А вот автор мог бы предугадать это и сделать удаление картинок после ухода со страницы или обновления
Автор наверняка проводил эксперимент с сообществом — интересовался, чего ему там закачают. Либо уже все знал, и просто хотел создать/пополнить свою коллекцию пор… Котят!
для таких целей достаточно хотя бы положить пустой index.php дабы запретить сторонний листинг папки.
Тогда уж index.html, а то и просто .htaccess c deny for all.
PHP прогеру index.php =) как показывает практика они всегда делают на *.php то, что можно сделать и на обычном *.htnl.

Конечно же .htaccess правильнее, но я говорил о том, что проще в количестве потраченный секунд, на минимальную защиту. чистый сарказм не более.
Они — это я тоже :)
для таких целей предназначен htaccess
Специально не скрывал)
в общем — есть предложение!
В связи с наступлением НГ2012 — собрать медиа хабра коллекцию картинок.
Т.е. народ присылает картинки на некий ресурс символизируя позитив — остальные могут просматривать оную этот позитив приумножая. Коллекция не будет аналогом гугла так как выборка будет создаваться именно людьми а не поисковиком.
20 случайных выбраных кликов, ни одних сисек, я удивлен
Очевидно же, что с javascript это сделать лучше
честно говоря текст даже не читал, просматриваю камменты для пополнения базы jquery плагинов :)
Ну прям уж фантастически сложные формулы… Топик ни о чем.

Могли бы хотя бы пару эвристик прикрутить для того, чтобы постараться найти такое разбиение по строкам, чтобы все уровни были одной ширины.

По коду было уже достачно замечаний выше, добавить особо нечего.
Собственно что мешает вам самому «прикрутить пару эвристик» и выложить сие на всеобщее обозрение? Или только говорить мастер?
Насколько я помню, в проектах я с подобной подзадачей не сталкивался, а писать только для того чтобы на хабр запостить не очень хочется. Да и к тому же не такая уж и интересная проблема: идеи и так всем понятны, а реализация может зависеть от того, как и где это применяется.
есть такая вещь замечательная — кроп
И именно для того, чтоб его избежать, и создан этот топик.
Warning: Division by zero in /home/squie198/public_html/imagemos.php on line 161
И этот топик в «лучшее за 24 часа». Я сам пхп-быдлокодер и обычно плюсую топики в блоге PHP почти их не читая. Но не настолько же, чтобы эхать тег img и вычислять его width и height, да ещё в style без ресайза собственно картинки через imagemagik или gd…

А представьте, чем будет рыдать сервер, если ему перед отрисовкой (ибо сортировка может менятся и заранее не выйдет) страницы еще и меджить картинка.
В чём она может меняться при использовании в качестве галереи? Загрузили новый файл в альбом, пересчитали, отресайзили, и лежит до следующей загрузки или очистки кэша.

Рандомный вывод или вывод результатов поиска — согласен, но тут уж, имхо, вообще на клиенте ресайзить надо. Рандом и поиск и так тяжелые операции, чтоб их чем-то ещё нагружать.
В Google Images они все-таки обрезаются. Как же иначе ранжировать их по значимости?
Гугл, видимо, при индексации их режет.
Пушистые нямки на главной!
Котики на Хабре!
Не понимаю, как вообще могла прийти в голову идея делать это на серверсайде. Ну и код конечно не ахти: лапшичка, да с зашитой логикой представления.

Автор хотел услышать идеи и доработки — я бы советовал хотя бы этот код переписать по-человечески, ну а в продакшене использовать клиент-сайд решения для этой задачи.
Я пользуюсь либой code.google.com/p/phpresizer/ тоже самописанная
Думаю автор сможет от туда много чего себе перенять или просто взять эту либу на вооружение.

1. Поддерживает кеширование откадрированных изображений,
2. работает с полупрозрачными GIF, PNG, JPG

2. Поддерживает движки:
GD (Graphics Draw) library
ImageMagick
GraphicsMagick

3. При кадрированиии можно управлять параметрами:
«width»=>170, // желаемая ширина аватарки
«height»=>210, // желаемая высота аватарки
«aspect»=>false, // сохранять ли пропорции исходного изображения
«crop»=>95, //часть центральной части которую следует увеличить (прозумировать центр)
«quality» => 75 // качество JPEG
«background» => «ff00ae» // цвет котором стоит залить свободные области при $aspect = true;
'zoomSmallImage'=>false, // стоит ли ресайзить маленикие изображния
'pngCompress' => 9 // степень компрессии для png
Есть одна тема для tumblr, там фиксированная ширина картинок, но разная высота, и все подгружается по мере прокрутки страницы. В результате, все очень просто реализовано и без обрезок (простое уменьшение до одинаковой ширины). Хотя, не позволяет избавится от «рваного» края, но делает его эстетически привлекательным просто используя низ, а не левую сторону.
Можно немножко усложнить вам задачу. Бывают фотки слишком растянутые в ширину или в высоту. На том же G+ такие фотки кропятся, чтобы фотка не выходила за определенные границы соотношений w/h и h/w. Представьте что кто-то загрузил фотку 1000x100, или наоборот 100x1000. Вот такие как раз предварительно кропятся до определенных границ (скажем, 400x100 и 100x400), а потом уже в дело входит тот самый алгоритм, про который статья.
php — это ж наше всё. Как то видел клас для прожига дисков. И напишут великие умы свою операционную систему на php, где вместо биоса будет подыматься апач, либо нгинкс. И придет недалекое светлое будущее, и все будут жить в мире и гармонии с окружающим миром. конец пророчества.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории