Поиск
29 ноября 2010 г.
Обработка видео "Кодеки" хитрости
Самая главная среди них — весьма заметные тормоза при просмотре даже на достаточно современных системах, не говоря уж о ноутбуках. Но дело тут не столько в мощности нынешних компьютеров — уж её-то хватает с избытком, сколько в правильной конфигурации установленных в системе декодеров.
На сегодня наибольшее распространение получили несколько форматов HDTV-фильмов:
* MPEG2;
* контейнер MKV с видео, закодированным в формате H.264;
* контейнер MP4 с видео, закодированным в формате H.264;
* контейнер AVI с видео, закодированным в формате XviD.
Встречаются ещё WMV- и MOV-файлы, но это в основном трейлеры и небольшие документальные ролики, кино на FTP-серверах городских локалок в этом формате — редкость. Впрочем, даже если вам попадётся полноценный фильм в одном из этих форматов, то большого выбора при их просмотре всё равно не будет — для WMV используется только «родной» декодер от Microsoft, а для MOV — либо QuickTime, либо Alternative QuickTime из состава K-Lite Mega Codec Pack. C более же популярными форматами вариантов больше.
Дело в том, что в системе может быть установлено несколько сплиттеров (компонентов, предназначенных для выделения видео, звука и субтитров из общего контейнера) и декодеров для одного и того же типа видеофайла. Попробуйте, например, в программе GSpot, входящей в состав K-Lite Mega Codeс Pack, открыть один из HDTV-фильмов и нажать кнопку 1 в разделе Proposed Codec Solutions and Test — увидите, что возможных способов декодирования несколько. В принципе, удаляя лишние декодеры или меняя их приоритет (merit в GSpot) можно выяснить, какой из вариантов менее всего грузит процессор. Но занятие это довольно нудное. Поэтому, дабы не заморачиваться самим, попробуйте воспользоваться нашими рекомендациями, которые довольно близки к оптимальным.
Выбор декодеров
Итак, для комфортного просмотра MPEG2 очень неплохо подходит сочетание Gabest MPEG Splitter и Gabest MPEG Decoder из K-Lite Mega Codeс Pack. Попробуйте открыть и отрендерить в программе GraphEdit (опять же из K-Lite Mega Codeс Pack) HDTV-фильм, сделанный в этом формате. Если программа покажет, что используются другие декодеры, удалите K-Lite Mega Codeс Pack и установите его заново, выбрав на этот раз Gabest MPEG Splitter и Gabest MPEG Decoder. Если они всё равно не будут использоваться, то откройте GSpot и попробуйте в меню этой программы System → List Codecs and other Filters повысить Merit (Set Filter Merit в контекстном меню) для Gabest MPEG Splitter и Gabest MPEG Decoder и одновременно понизить его для тех декодеров, которые используются в настоящий момент. После того, как вы это сделаете, все плееры, которые используют системные настройки, станут работать с Gabest MPEG Splitter и Gabest MPEG Decoder. Плееры типа WinDVD и PowerDVD всегда работают с собственными декодерами, а потому их эта настройка не затронет.
Для фильмов, использующих кодек H.264, нужны уже другие компоненты. Практика показывает, что наименьшую «тормознутость» обеспечивает сочетание Haali Media Splitter и CoreAVC H264 Video Decoder Pro. Первый входит в состав все того же K-Lite Mega Codeс Pack и понимает самые разные типы контейнеров, а второй компонент хоть и платный, но его легко найти в интернете. Аналогичным образом установите их в своей системе, следуя инструкциям разработчика и проконтролируйте их работу, открыв соответствующий по формату видеофайл в GraphEdit. Заметно возросшее после такой операции быстродействие на mkv-файлах вас порадует.
И, наконец, XviD-фильмы. Здесь есть смысл попробовать два варианта. Во-первых, обычный декодер DivX. Главное, в настройках декодера укажите два параметра: Support Decoding of Generiс MPEG-4 Video и Automatic Deblocking. Первый позволяет проигрывать XviD, а второй значительно снижает общую тормознутость декодера. Второй вариант, к которому можно прибегнуть, если не устроит производительность декодера DivX — переход на FFDshow, популярный универсальный декодер, имеющий весьма богатые настройки, что при некотором старании позволяет получить оптимальный баланс производительность/качество. Лично я использую только оригинальный DivX и особых проблем не наблюдаю. Так что экспериментировать с FFDshow есть смысл, только если вы действительно не удовлетворены скоростью воспроизведения XviD-видео.
Выбор плеера
Второй важный шаг для достижения максимальной производительности системы — выбор правильного проигрывателя, многие сегодняшние плееры достаточно хорошо оптимизированы и позволяют смотреть HDTV. Теперь же, когда вы ещё и установили наиболее быстродействующие декодеры, ситуация должна серьёзно улучшиться. Но попробуйте, например, сравнить качество воспроизведения Windows Media Player и The Core Media Player (www.corecoded.com) — разница будет видна невооружённым взглядом. Последний плеер особенно хорош именно для работы с HDTV. Тормозов не будет!
Но The Core Media Player недостаточно. Дело в том, что The Core Media Player использует системные сплиттеры и декодеры, а есть плеер, в который они уже встроены и при этом он имеет превосходные параметры производительности — VLC Media Player. HD-видео — вещь капризная, и в том случае, если The Core Media Player или другой полюбившийся вам плеер откажется нормально работать, выручить может VLC. Скажу, например, что при использовании этого плеера вполне можно провернуть такой трюк. Если звуковая дорожка идёт отдельным файлом, то вполне реально открыть её ещё в одном плеере, например, в Winamp, да ещё и обработать процессором DFX. В результате видео будет крутиться в VLC, а звук будет идти из Winamp — и без тормозов! Кстати, для декодирования AC3-звука отлично подходит AC3Filter — не забудьте его отметить при установке K-Lite Mega Codec Pack.
Проблемы хранения
С просмотром разобрались, но есть ещё одно большое неудобство — фильмы высокого разрешения, как правило, имеют и приличный объём, выходящий за рамки стандартной DVD-болванки. Как их хранить? На винчестере? Покупать дорогие двухслойные болванки? Если оба эти варианта вас не очень прельщают, то есть способы скидывать большие HDTV-файлы на обычные болванки, предварительно разрезав их на два куска. Главное, чтобы разрезание это происходило без рекомпрессии и потери качества. В данном случае проще всего обстоит дело с MKV-контейнерами. С помощью пакета MKVtoolnix (www.bunkus.org/videotools/mkvtoolnix) любой MKV-файл можно превратить в два, заданного размера. Просто запускайте mkvmerge GUI (в пакет входит две утилиты, вторая — mkvinfo), добавляйте нужный MKV-файл, в разделе Global отмечайте Enable Splitting (удобно заранее выяснить, на какой минуте и секунде по сюжету удобнее всего сделать разрез) и жмите Start Muxing. Причём, если отметить опцию Link Files, то плеер даже не заметит, что у вас два файла, а не один. Если они будут при просмотре скопированы в одну папку, то переход от первого ко второму будет автоматическим.
Хуже обстоят дела с AVI-файлами. Имеется неплохая утилита для разрезки DivX- файлов без перекодирования — Boilsoft AVI-MPEG-RM-WMV Splitter (www.boilsoft.com), но для её работы с XviD-файлами придётся устанавливать этот, довольно глючный кодек — при наличии только DivX программа работать отказывается. Скорее всего, не сработает она и для H.264. Но если уж попался большой файл в формате AVI, MPEG, RM или WMV, то начать стоит именно с этой программы, поскольку среди аналогичных разрезалок это едва ли не единственная, умеющая работать без перекодирования. Не сработала — пробуйте разбить файл в бесплатном редакторе VirtualDub — подробнейших инструкций про работе с ним в интернете навалом. Но вообще говоря, всё тот же MKVtoolnix вполне неплохо разрезает файлы и других форматов — просто в результате вы получите не два, скажем, MPEG-файла, а два MKV — изменится тип контейнера. Недостаток такого подхода, пожалуй, только один — бытовой плеер может не понять MKV. Впрочем, пока слишком мало стационарных проигрывателей, способных воспринимать HD-видео вообще, а для ПК формат контейнера роли не играет.
Ещё раз о плеерах
Видеоплеер — странная вещь. Лично у меня их установлено штук десять. Если среди любого другого класса программ практически всегда можно выбрать лучшую или наиболее подходящую для вас лично, то с видеоплеерами такой номер почему-то не проходит. Дефрагментаторов, например, тоже много, но никому не придёт в голову ставить одновременно Diskeeper и, скажем, Perfect Disk. Видеоплеер же часто выбирается в зависимости от типа файла. MOV смотрим через «родной» для него Quick Time, Real Video — через Real Player, обычный DivX — через удобный BSplayer или, если хочется эффекта, подобного Trimension — через Crystal Player, для DVD запускаем крутой WinDVD. Если нет времени ждать загрузки «тяжелого» плеера, используем VideoLAN, а если файл повреждён, пытаемся его открыть во всеядном Classic Media Player или даже в AVI Preview, если это вообще лишь кусок файла. И, наконец, HDTV смотрим в Core Media Player. Плюс имеем на диске нагрузку в виде редко используемого Windows Media Player и Winamp, который видео тоже понимает. Такие вот чудеса.
Проблемы с предпросмотром
Если в результате экспериментов с кодеками у вас начнет регулярно «вываливаться» Проводник при наведении курсора мыши на видеофайл, знайте, виноват механизм предпросмотра видеофайлов, благодаря которому в левой части окна Проводника выводится первый (а потому — совершенно бесполезный, так как обычно это всего лишь черное поле) кадр фильма, а также отображается основная информация о видео. В этом случае сделайте следующее. Удалите K-Lite Mega Codec Pack, перезагрузите ПК и снова установите этот набор кодеков, выбрав следующие его компоненты (подразумеваем, что у вас отдельно установлены Quick Time и Real Player):
* Players
o Media Player Classic (показывает порой то, что другие не могут)
* DirectShow video filters
o On2 VP6
o On2 VP7
o MPEG1/MPEG2/DVD — Gabest
* VFW Video Codecs
o x264
o On2 VP6
o On2 VP7
o Indeo (все версии)
o Intel I263
o Huffyuv
o I420
o YV12
* DirectShow audio filters
o MP3
o AC3/DTS/LPCM (DVD audio)
o MP1/MP2 — AC3Filter
o Vorbis
o AAC
o MusePack
o Monkey´s Audio
o WavPack
o FLAC
o Voxware Metasound
* ACM Audio Codecs
o MP3 (Fraunhofer)
o MP3 (LAME)
o AC3
o Vorbis
o Divx ;) Audio
* DirectShow source filters
o AVI Splitter — Microsoft
o MP4 Splitter — Haali
o Ogg Splitter — Haali
o FLV Splitter
o MPEG TS Splitter
o MPEG PS Splitter — Haali
o AAC Parser
* DirectShow subtitle filter
o DirectVobSub 2.37
* Audio encoding tools
o LAME CLI and DLL
o LameDropXPd MP3 Encoder
o OggDropXPd Ogg Vorbis Encoder
* Tools
o GSpot Codec Information Appliance
o Graph Edit
* Compatibility
o Detect broken codecs
o Detect broken Direct Show filters
Возможно, это и не идеальный вариант компоновки K-Lite Mega Codec Pack, но я его всегда использую и пока каких-либо проблем, связанных с выбором именно этих компонентов, не заметил.
После переустановки K-Lite Mega Codec Pack и перезагрузки ПК переустановите свежий DivX (не лишней будет ещё и переустановка Windows Media Player и DirectX), после чего снова попробуйте навести курсор на тот файл, который приводил к сбою explorer.exe. Если сбой повторяется, откройте этот видеофайл в GraphEdit и посмотрите, какие сплиттеры и декодеры используются. Если, например, вместо ожидаемого DivX Decoder Filter вы увидите что-то иное (тот же XviD), или вместо MPEG Layer-3 Decoder будет что-то вроде InterVideo Audio Decoder, то откройте GSpot, выберите System → List Codecs and other filters, найдите нужный декодер и, выбрав в контекстном меню команду Set Filter Merit, повысьте ему приоритет. Аналогичным образом приоритет нужно понизить нежелательному или сбойному декодеру. После этого всё должно заработать нормально.
Если же и это не поможет, то с помощью любого приличного твикера просто отключите предпросмотр видеофайлов в окне Проводника. Вручную это можно сделать, выполнив команду regsvr32 /u shmedia.dll.
Трошин Сергей
stnvidnoye@mail.ru
stnvidnoye.da.ru
28 ноября 2010 г.
регистрация dll в windows 7
Windows 7: как зарегистрировать файлы *.dll?
Сообщения об ошибках могут быть разные (это зависит в основном от того, на каком языке написана программа), например: «Component 'MSCOMM32.OCX' not correctly registered: file is missing or invalid», или «Приложению не удалось запуститься, поскольку MSVBVM50.DLL не был найден. Повторная установка приложения может исправить эту проблему», или «Runtime DLL/OCX File error». При этом может появиться окно Помощника по совместимости программ с сообщением Эта программа требует отсутствующий компонент Windows.
***
Способы решения проблемы
Если возникают ошибки, связанные с файлами *.dll, необходимо:
1. Переустановить программу.
2. Если переустановка программы не помогает, нужно проверить наличие в системе требуемых файлов.
Файлы *.dll, как правило, должны быть расположены в системной папке \Windows\System32 (реже – в каталоге конкретной программы). Если файлы присутствуют, нужно зарегистрировать их.
Если требуемых файлов нет, найдите их в Интернете, скачайте и скопируйте в папку \Windows\System32 и в каталог программы. Теперь нужно зарегистрировать их.
***
Как зарегистрировать файлы *.dll
Регистрация файлов *.dll производится с помощью сервера регистрации regsvr32.exe (дисковый адрес которого – \Windows\System32).
Рассмотрим способы регистрации:
1. Нажмите кнопку Пуск;
– в текстовое поле Найти программы и файлы введите regsvr32 имя_файла –> Enter .
2. Нажмите кнопку Пуск;
– в текстовое поле Найти программы и файлы введите cmd;
– в появившемся перечне (под заголовком Программы) нажмите правой кнопкой мыши cmd.exe;
– из контекстного меню выберите Запуск от имени администратора;
– введите пароль, если появится соответствующий запрос;
– в открывшемся окне Интерпретатора команд Windows после приглашения системы введите regsvr32 имя_файл, нажмите Enter.
3. Если вы пользуетесь файловым менеджером Total Commander, то можно выполнить регистрацию файлов *.dll с помощью командной строки Total Commander.
Если регистрация файлов *.dll прошла успешно, появится окно RegSvr32 с соответствующим сообщением, например: «Успешное выполнение DllRegisterServer в C:\WINDOWS\system32\msvbvm50.dll»:
Windows 7: как зарегистрировать файлы *.dll?
Примечания
1. При регистрации файлов *.dll происходит их запись в Реестр Windows. При этом в ветке [HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\SharedDLLs] создается соответствующий параметр REG_DWORD со значением 1.
2. Использование команды regsvr32:
regsvr32 [/u] [/s] [/n] [/i[:строка_команд]] DLL-файл
/u – отменяет регистрацию DLL;
/s – «тихий» режим – окна сообщений не отображаются;
/i – вызывает DllInstall, передавая параметром необязательную строку_команд, при использовании с ключом /u вызывает DLLUnInstall;
/n – не вызывает DllRegisterServer; это может использоваться с ключом /i.
Валерий Сидоров
23 ноября 2010 г.
Векторный шрифт против пиксельного
22 ноября 2010 г.
ПАРУС-4.хх ошибка № 17 в программе DBFMAN.Invalid database
Правильная ссылка:
http://forum.parus.ru/index.php?mode=thread⊂=154508
во всех ссылках нужно заменить "thread⊂" на "thread&sub"
Проблема решается путем настройки памяти в свойствах ярлыка *.PIF
Входим в свойства ярлыка
Выбираем закладку Память
Далее:
Convertional - Auto or 640
Protect - галка
EMS - None
XMS - максимум в меню
Uses HMA - галка
19 ноября 2010 г.
Серверы на базе FreeBSD
Система чрезвычайно стабильна. По данным компании Netcraft изучавшей сайты с самым продолжительным календарным временем беспрерывной работы, из 50 первых в ее списке сайтов 47 функционируют под управлением FreeBSD.
Почему мы рекомендуют использовать FreeBSD:
- Не нужна доплата за лицензию
- Контроль расходов (трафика) Интернет
- Система не подвержена действию вирусов
- Обеспечивает полную защиту Вашей сети
- Простота удаленного администрирования
- Специализация под конкретные задачи Вашей сети
- Низкая стоимость
Основные функции:
-Шлюз сети Интернет. Позволяет быстро и просто получить доступ в Интернет и совместно использовать его несколькими пользователями.
-Защищает сеть организации, соединенную с Интернет от несанкционированного доступа внешних пользователей, всевозможных хакерских атак.
-Proxy server. Вы сможете знать кто, когда и что качает из сети Интернет. А веб интерфейс позволяет сделать это легко и удобно даже находясь вне сети.
-Файл сервер. Предназначен для хранения файлов в сети с возможностью разграничения прав доступа для каждого пользователя.
-Почтовый сервер. Проблемы с почтой, вызванные такими сбоями почтового сервера как закончившийся срок лицензии, вирусы, неправильная настройка теперь в прошлом.
-Web server. Вы можете разместить сайт вашей компании прямо на вашем сервере.
-VPN server. На основе VPN соединения можно построить защищенный туннель для безопасного соединения в локальную сеть двух или более удаленных офисов.
-Print server. позволяет использовать ресурсы одного принтера несколькими пользователями, либо ограничивать доступ для некоторых пользователей.
15 ноября 2010 г.
MongoDB или как разлюбить SQL
Введение
Коллеги, при разработке приложений, мы каждый день сталкиваемся с потребностью в гибком хранении информации (обновлении, поиске по ней, и т.д.). Класс продуктов, которые решают этот круг задач, как все мы знаем — Базы данных. Но что это такое в нашем понимании? У многих «база данных» твердо ассоциируется с MySQL, таблицами и SQL-запросами. И это устраивает до определенного момента. Действительно, реляционные базы данных дают массу преимуществ в работе: поскольку данные имеют сильную связанность, не нужно контролировать целостность базы данных. Используя простой под-запрос можно выбрать количество комментариев к каждому посту в блоге. Используя JOIN нетрудно делать сложные связанные выборки и получать данные сразу о нескольких сущностях.
Масштабировали, масштабировали, да не вымасштабировали
Однако, когда вдруг понимаешь, что одного сервера перестает хватать, и хочется раскидать базу на несколько физических машин, то первое что предлагается — master-slave репликация, при которой запись идёт на одну машину, а чтение — с нескольких. Но при достаточно большом количестве изменений в скором времени master только и будет делать что раздавать логи, и придётся прибегнуть к изощренной настройке, чтобы каждый узел имел один шефствующий сервер (master) и мог иметь несколько подчиненных серверов (slave). Данная схема весьма сложна в реализации и содержит single point of failure (т.е. при выходе из строя одного сервера, все его подчиненные стремительно превращаются в динозавров). Опять же, все эти ухищрения позволят увеличить лишь количество чтений. А если для внесения изменений в состояние базы данных не хватает мощности одного сервера, то приходится распределять нагрузку, храня разные таблицы на разных серверах. Но тогда потеряется связанность. Или приходится разбивать таблицу на несколько частей, храня их в разных местах, согласно заданному закону (например по ID), однако это унесет в могилу прелести JOIN. Чем дальше мы пытаемся масштабировать реляционные базы данных, тем большим удобством мы за это платим. Например, при использовании master-master, мы заплатим auto increment'ами.
Спасут ли нас MemcacheDB и Redis?
Подобные key-value решения существуют довольно давно. На мой взгляд, MemcacheDB это поделка, паразитирующая на добром имени замечательного продукта: данные там абсолютно не связаны между собой, мы можем лишь проводить операции над значением зная ключ. Я потратил уйму времени на написание инструментария, позволяющего выгодно работать с key-value БД вроде MemcacheDB, и это даже работает, однако пришел к тому что простые насущные задачи решаются настолько криво, что невольно думаешь в сторону реляционки: например, нету даже элементарной реализации времени жизни объекта (TTL), т.е. нельзя взять и удалить сессии старше месяца. Это не доставляет.
Авторы Redis пошли чуть дальше в своих извращенных фантазиях и сделали атомарные списки и set'ы в ключах, однако не сильно продвинулись в облегчении жизни программисту.
Более того, всё еще приходится вручную обслуживать кеш ключей, т.е. сохранять нужные ключи в Memcached и брать их из него, что создает уйму проблем с синхронизацией. При этом также отсутствует атомарность операций: возникает гонка между получением объекта и записью в кеш, CAS демотивирует нас своей производительностью.
Что делать если хотим каталог товаров по типу Яндекс.Маркета?
Допустим, мы хотим сделать каталог, в котором осуществляется поиск по таким параметрам как цена, рейтинг, кратность зума у фотоаппарата и количество передач у велосипеда. Допустим, мы используем реляционную базу данных типа MySQL. Что мы должны сделать? Мы должны либо создать таблицу goods, в которой будет как кратность зума, так и количество передач для велосипеда, и к примеру, показатель гибкости щетины зубной щетки (в этом случае мы упремся в лимит полей для таблицы, или потеряем на дисковом пространстве, скорости, и удобстве), либо мы должны завести табличку вида good_id, key, value и делать страшные JOIN'ы для выборки и поиска, не заикаясь о масштабировании.
Еще можно натравить на это дело Sphinx или что-нибудь похлеще, однако это скорее всего будет выглядеть как забивание гвоздей ноутбуком.
У реляционок налицо серьезная родовая травма.
MongoDB говорите?
MongoDB — резкая как понос объектно-документарная база данных. Идеологически это некий симбиоз между привычной реляционной БД и key-value хранилищем, и на мой взгляд, весьма удачный. С одной стороны, она позволяет делать очень быстрые операции над объектом, зная его идентификатор, а с другой, предоставляет мощнейший инструмент для сложных взаимодействий.
Коллекция — именованное множество объектов, при этом один объект принадлежит лишь одной коллекции.
Объект — совокупность свойств, включая уникальный идентификатор _id.
Свойство — совокупность названия и соответствующего ему типа и значения.
Типы свойств — строка, целое число, число с плавающей точкой, массив, объект, бинарная строка, байт, символ, дата, boolean, null.
Поддерживаются операции выборки (count, group, MapReduce...), вставки, изменения и удаления. Связей между объектами нет, объекты могут лишь хранить другие объекты в свойствах. Поддерживаются как уникальные, так и композитные индексы. Индексы можно накладывать на свойства вложенных объектов.
Поддерживается репликация (даже подразумевается), реализован fail-over.
Реализован MapReduce и шардинг.
Поскольку объекты могут иметь произвольный набор свойств, для каталога достаточно создать коллекцию goods и складывать туда объекты. При этом поиск будет вестись по индексам.
Резкость MongoDB ярко выражена на insert'ах, они происходят ну очень быстро. Кстати, приятно что формат хранения и формат передачи объектов по сети один и тот же, так что для выборки какого-то объекта надо всего лишь найти его позицию по индексу и вернуть клиенту кусок файла определенной длины — никакой абстракции над storage engine.
В качестве уникального идентификатора используется не auto-increment'ное поле, а 12-байтное уникальное число, генерируемое на клиенте. Таким образом, во-первых нет проблемы с синхронизацией реплик, т.е. можно независимо делать вставки на две разные машины, и конфликта не возникнет. Во-вторых, не будет ерунды с переполнением целого числа, ну и после пересоздания базы данных, поисковики не будут адресовать на новые статьи по старым ссылкам.
MongoDB + Memcached? Покруче чем Бонни и Клайд!
С базой данных более-менее разобрались, теперь подумаем как нам всё это дело кешировать, ведь нам же хочется отдавать горячие пирожки со скоростью Memcached!
Во-первых, кеширование самих объектов. Как многие успели догадаться, или узнать из опыта — в большинстве случаев операция выборки объекта по ID является самой частой. Например, выборка объекта пользователя, выборки этого поста из базы Хабрахабра (аминь), и т. д.
Как мы уже выяснили выше, перекладывать сей труд на приложение неразумно, т.к. мы должны были бы нагородить огород распределенных блокировок. Пойдем другим путем, напишем асинхронное приложение, которое подключится к MongoDB и, прикинувшись slave'ом, будет получать лог изменений, и сбрасывать изменения в Memcached (если объект содержит ключ в свойстве _key). Поскольку приложение асинхронно, это будет происходить быстро, однако гонки возникать не будет. Написать несложно, моя реализация тут. Более того, я еще присобачил туда отправку изменений серверу событий, так что мне стоит только изменить объект откуда угодно (да хоть из консоли), как он тут же будет передан всем подписанным на него клиентам.
Кеширование запросов и девалидация кеша должна работать несколько иначе. Существует несколько подходов:
* Кешировать на определенное время. Если запрос один и тот же или их не так много, то можно обновлять кеш не чаще раза в секунду — это уже значительно снизит нагрузку.
* Удалять кеш по требованию приложения. Подход довольно муторный, но имеющий право на жизнь.
* Использовать сервис блокировок для того, чтобы не делать одну работу два раза. Однозначно — это добро.
Минусы с которыми придется столкнуться.
* MongoDB — продукт довольно молодой, и в нем встречаются баги (бывает Segmentation fault, core dumped), появляются новые фичи, и т.д. Я использую его в продакшене, но с осторожностью. Однако, несомненным плюсом является высокий темп разработки (проект пишут не только волонтеры, но и компания людей на полной занятости), так что вы вполне можете рассчитывать на быстрый багфикс, помощь в решении ваших проблем и реализацию ваших идей (если конечно они хорошие). Также доступна коммерческая поддержка.
* Накладные расходы на хранение названий свойств.
* По-умолчанию максимальный размер объекта — 4 мегабайта.
* На 32-битных машинах, максимальный размер одной базы данных — 2 гигабайта.
Finita la comedia!
Страничка проекта — MongoDB.
Найденный бенчмарк MongoDB vs MySQL.
Эта статья рискует положить начало циклу о MongoDB. В следующий раз я поподробнее расскажу о шардинге, MapReduce, и приведу живой пример.
Друзья, спасибо за внимание! Буду рад конструктивным комментариям.
Опубликовано продолжение! MongoDB — варим хороший кофе
Andrea Mosaic — мозаика быстро и лаконично
Сегодня хочется рассказать о том, как создать такие картинки.
Не видите ничего особенного? Можете сделать так своими руками? Загляните под кат.
Картинка кликабельна. (Трафик, осторожно!)
Upd: Заменил картинку на более важную сегодня.
Итак, представляю вашему вниманию программу Andrea Mosaic (ссылки в конце).
Столкнулся я с ней ещё давно, когда надо было сделать подарок подруге. Кстати, первый раз идею увидел в альбоме James Blunt
Думаю, классно ребята сделали.
Сначала идея мне показалась проста: много мелких картинок, и одна большая с прозрачностью.
Ну, взял фотошоп, взял большую фотографию подруги, достал кучу её и совместных со мной фоток и начал ваять. Сразу скажу, товарищи, это ужас. Во-первых, все картинки разные по размеру, и подгонка их всех под квадраты не сказалась на них хорошо.
Во-вторых, качество и освещённость у всех фоток разные и в итоге получилось такое, что я сразу удалил и начал вглядываться в мой прототип, то есть обложку певца.
И вот, я разглядел, что оказывается, там нет его фотки с прозрачностью. А это просто много его фотографий, четко и кропотливо разложенных по цветам, с изменёнными оттенками, гаммой, яркостью и контрастностью. Меня это поразило, т.к. я не мог поверить в то, что это сделано руками человека. Ну, мы люди русские и поиск нам не чужд. Через некоторое время я наткнулся на Andrea Mosaic в сети. К сожалению, той фотографии у меня не сохранилось, да и в целях конфиденциальности я не стал бы её выкладывать.
Но, хочу вам показать последнюю вещь, которую сделал — это подарок к 3-хлетию музыкального портала, логотип, состоящий из альбомов.
Кликабельно.
Но хватит примеров, имея на своём компьютере хотя бы несколько фоток — вы сами уже можете сделать такие вещи.
Покажу вам лучше интерфейс программы. Он, к счастью, и к моему удивлению — наипростейший.
Больше скриншотов
Перетаскиваете(или выбираете справа вверху) файл на рабочее поле. Выставляете режимы, то бишь: размер, размер каждого кусочка, их количество, что можно делать с кусками (поворачивать, отражать, изменять яркость или контраст и.т.п), жмете Select Tiles — выбираете кучу фоток (программа сама отберёт самые подходящие по цвету) жмете Create Mosaic, ждёте в зависимости от количества фотографий и размера вашего образца, но в среднем это от 2-х до 10 минут. (согласитесь, не так много для такой скрупулёзной работы)
И в итоге получаете красивое изображение.
Ещё один пример:
Сайт разработчика: Вот он
Там же можно и скачать программу.
Kuuuzya, 27 января в 23:41
комментарии (44)
*
Fade, 28 января в 00:08
Вот оно как!
Удобно
* НЛО прилетело и опубликовало эту надпись здесь
*
Kuuuzya, 28 января в 00:14
Прошу прощения, забыл про трафик. сжал. Спасибо, что сказали. Кстати, до 36 кб )
* НЛО прилетело и опубликовало эту надпись здесь
*
Kuuuzya, 28 января в 00:24
ладно. топик всё равно в слив. читайте комент ниже
* НЛО прилетело и опубликовало эту надпись здесь
*
Kuuuzya, 28 января в 01:08
Лучше дайте ей больше картинок.
*
infi, 28 января в 00:13
Первая картинка актуальная.
*
1vanu4, 28 января в 00:20
Но уже пробегала на Хабре;)
*
Kuuuzya, 28 января в 00:27
пробегала. надеюсь, автор простит.
*
1vanu4, 28 января в 02:42
Думаю он человек добрый, и обезательно простит)
*
Kuuuzya, 28 января в 02:52
ну на всякий случай — заменил на iPad
*
grayhex, 28 января в 00:21
ОН ЖДАЛ
*
tyr, 28 января в 00:21
извините конечно, но помимо того, что такими картинками «восторгаются» уже лет пять, поиск по фразе «how to make photo mosaic» выдаёт огромное количество рецептов — эти псевдо-мозайки выглядят невероятно безвкусно и пошло.
и классно видеть фразу «сделал подарок», когда всё что вы сделали — это скормили программе одно изображение и подождали 2-10 минут.
*
Kuuuzya, 28 января в 00:24
ок. топик в слив. спасибо за линч.
*
XPilot, 28 января в 01:09
>>«и классно видеть фразу «сделал подарок», когда всё что вы сделали — это скормили программе одно изображение и подождали 2-10 минут.»
Ну, на самом деле, чтобы программа «питалась» и выплюнула качественную мозаику нужно несколько тысяч фоток (по крайней мере, мне в metapixel не хватило тех 3k фотографий, которые были, чтобы не было повторяющихся промежутков) и если специально для этого делать фотографии, то почему нет — это будет действительно «сделать подарок».
*
tyr, 28 января в 11:15
если бы автор сделал что-нибудь подобное, то это бы по крайней мере заслуживало уважения. например отщёлкать 6-8к фото на музыкальную тематику, что очень не просто, и потом из них сделать лого — ну выглядело бы всё так же пошло конечно, но по крайней мере в это был бы вложен какой-то труд
но он же так не сделал :)
я уже предвосхищаю следующую тему автора — «Акварель быстро и лаконично: скормив Фотошопу фоту вашей подружки и применив artistic > watercolor мы получим красивую акварель без всякой возни!!11» — по сути-то то же самое, что по уровню усилий, что по качеству на выходе.
ну, судя по минусам моя идея не очень популярна и применение хоть каких-либо усилий не поощряется :)
*
elmortem, 28 января в 15:04
Автор настолько героичен, что сначала хотел всё сделать вручную в Photoshop. Так что хватит тут нудеть.
*
Igas, 28 января в 00:24
Незнаю, мьюзик портал совсем не так, там некоторые подсвечены некоторые нет — отсюда эффект а не изза того что ими правильно выложено название.
*
Kuuuzya, 28 января в 00:27
ну это потому что цветовая гамма маленькая… поэтому указал ей, чтоб он с картинками че хотел то и делал… до 90% свет убирала где-то
*
CAJAX, 28 января в 00:31
Когда-то давно на Дельфи писал подобную программу.
Рад, что есть фриварная и доделанная программа.
*
Tolsi, 28 января в 00:37
а я верил в сказку :(
* НЛО прилетело и опубликовало эту надпись здесь
*
Kalpazan, 28 января в 00:43
Я попробовал. Классно получается. Спасибо автору, подкинул игрушку на ночь :)
*
Boomburum, 28 января в 00:44
как правило после таких постов появляются посты «еще 1 шальная идея для капчи» )
*
cherenkevich, 28 января в 00:47
Давно ей пробовал пользоваться, только не разобрался, как сделать сэмлы квадратными. Там в пресетах нет таких настроек. Подскажете?
*
Kuuuzya, 28 января в 01:00
так там размер tiles выберите просто… и сетку квадратную увидите. экспериментируйте
*
cherenkevich, 28 января в 01:04
Я не вижу там этого параметра. Где он clip2net.com/page/m0/3645769?
*
Kuuuzya, 28 января в 01:08
упс. да, прошу прощения… она только делает пропорциональные самой картинке. иначе не впишутся… и половинки получатся
*
cherenkevich, 28 января в 01:14
Неа, не катит все равно clip2net.com/page/m0/3645912 ))))
*
LaCTuK, 28 января в 01:07
Наглядный пример:
Игромир, стенд Gamer.ru
*
LaCTuK, 28 января в 01:14
упс
www.gamer.ru/system/attached_images/images/000/095/743/original/100_1079.JPG
извините:)
www.gamer.ru/system/attached_images/images/000/094/314/normal/IMG_0282.JPG
www.gamer.ru/system/attached_images/images/000/094/843/normal/_DSC0067.JPG
*
andrew_b, 28 января в 01:10
Помню был где-то сервис, который делал то же самое, но из порнокартинок. Никто не помнит?
* НЛО прилетело и опубликовало эту надпись здесь
*
BmW, 28 января в 07:25
www.adultmosaic.com/ Он?
*
volk113, 28 января в 04:36
помню как то писал такой сервис for fun, составлял изображение из картинок найденых по цвету группы пикселей через сервис поиска картинок, правда не помню на него ссылку. и не надо много картинок искать
*
TUKA, 28 января в 07:22
идею для подарка утащил к себе в нору…
*
Innuendo108, 28 января в 08:58
Первая картинка не интересна — она как раз не полноценная мозайка (С таблеткой которая).
Если вглядется, то видишь, что есть много по идее одинаковых фотографий (кусочков), но отображаемых по-разному (то светлее, то темнее)… Это должно быть осуществимо с разными фотографиями. Тогда вообще можно загрузить 1 фотографию, и её изменить сто тыщ раз (там hue saturation менять, что там ещё меняют — я не знаю точно) и т.д.
На этом изображение белые ободки нарисованы сверху (конечно вы можете сказать что не нарисованы, но ведь там можно найти фотографию макбука «чистую», а можно с белой полосой (которая и будет ободком таблетки).
*
eevdokimov, 28 января в 09:40
Тут есть похожая программа, правда она хоть и написана нашими, но Shareware. А тут есть библиотеки маленьких, готовых к использованию картинок.
*
123, 28 января в 10:13
Вот только ни одну из сгенеренных мозаик нельзя назвать искусством — как обложку James Blunt.
На обложке, лицо человека сделано матрицей 20х30 — разве это сравнится с Music Portal, где размеры блока уменьшены почти до размера пикселя (и всё равно для читабельности потребовалось накладывать полупрозрачный слой надписи).
*
adrian_lopez, 28 января в 19:30
Борода — 5 лет назад юзал. Существуют более умные аналоги
*
Kalpazan, 29 января в 10:04
так давайте сюда названия или ссылки! :-)
*
sgolubev, 28 января в 20:18
Отличный софт! Давно искал такую программку.
Т. н. ASCII Art 2.0 :-)
*
JN0iZzze, 29 января в 15:14
А я то думал это десять тысяч китайцев такие колажи составляют )))
μHabr / Дизайн
Технологии Citrix HDX: 2 мегабита в секунду для удаленной работы с 3D
Набор технологий Citrix HDX (High-Definition User Experience) был анонсирован в 2009 году в качестве дополнения к решению XenDesktop, обеспечивающего виртуализацию рабочих станций. Протестировать эти технологии на практике вы можете, загрузив и установив пробную 90-дневную версию XenDesktop Platinum или Enterprise отсюда (потребуется заполнить небольшую форму). В состав HDX входят несколько решений. Вот основные:
• HDX MediaStream – обеспечивает доставку мультимедийного контента, включая видео, звук или, например, ролики в формате Adobe Flash на клиентское устройство. Поддерживает наиболее распространенные форматы видео и звука, и обеспечивает наилучшее качество видео, в зависимости от типа клиента. Например, на ноутбуке под управлением Windows с установленными медиакодеками обработка видео будет проводиться на клиентской стороне без потери в качестве. Но при необходимости такая обработка может проводиться на серверной стороне.
• HDX RealTime – позволяет подключать к виртуальной операционной системе микрофон и веб-камеру клиентского устройства. Пример подключения веб-камеры к удаленной операционной системе приведен в этом видеоролике:
• HDX Broadcast – ключевой компонент, позволяющий передавать мультимедийный контент практически в любых условиях. Эффективно сжимает и кэширует данные (изображения, видео и прочее) для максимальной эффективности даже при медленном подключении к интернету. Если для работы с обычными офисными приложениями может быть достаточно даже модемного подключения к сети, то 3D-графика или видео потребуют как минимум полутора-двухмегабитного канала с низкой латентностью. В этом видеоролике вы можете увидеть, как оптимизация HDX Broadcast при работе с графикой в PowerPoint позволяет снизить необходимую пропускную способность канала в пять раз – с пяти мегабит в секунду до одного:
• HDX Plug-n-Play – с помощью HDX можно подключать к виртуальной ОС не только веб-камеру и микрофон. Технология HDX Plug-n-Play также обеспечивает работу с локальными принтерами, поддерживает подключение нескольких мониторов и даже позволяет работать с подключенными к клиентской машине медиаплеерами.
• HDX RichGraphics – наиболее интересный компонент, который и обеспечивает эффективную передачу трехмерной графики на клиентскую машину. Данная технология может работать в двух режимах. Первый не предъявляет серьезных требований к серверу и позволяет передавать трехмерный контент (все что угодно – от Google Earth до последней «Цивилизации» и систем САПР) через локальную сеть. Второй режим можно использовать на рабочей станции с мощной видеокартой NVIDIA с поддержкой CUDA (имеющей на борту 128 потоковых конвейеров). В таком случае видеокарта используется как для обработки 3D-контента в приложении, так и для сжатия потока данных до минимальных величин. В этом видеоролике демонстрируется запуск 3D-приложений в виртуальной среде, в том числе CAD-системы CATIA:
У вас есть возможность настроить качество передачи графики с помощью встроенной утилиты HDX Config Tool. В зависимости от типа подключения к сети графику (2D или 3D) можно передавать в оригинальном качестве, либо с разными степенями сжатия.
Примеры использования
Конечно, ничто не помешает вам использовать HDX для запуска в виртуальной ОС последней серии GTA. Но основная сфера применения технологий HDX – профессиональные 3D-приложения. В частности, решения Citrix используются шведским концерном Volvo для проектирования грузовых автомобилей. Разработчики удаленно подключались к серверам в Швеции из Японии и Австралии и работали в системе проектирования CATIA. Таким образом решается и вопрос безопасности: удаленные разработчики получают доступ к новым проектам, но данные не сохраняются на клиентских устройствах. Соответственно, снижается риск утечки информации.
Наконец, для обычных пользователей все упомянутые выше технологии дают один важный результат: они практически не замечают разницы между работой в виртуальном окружении и работой с обычной операционной системой на собственном ПК или ноутбуке. Они могут работать со сложной графикой в офисных программах, могут организовывать видеосвязь с коллегами, подключать собственные устройства и так далее. Демонстрация «пользовательских» примеров работы с HDX (Google Earth, видео на YouTube и тому подобное) приводится в этом видеоролике:
Что дальше?
Технологии Citrix HDX непрерывно совершенствуются, и следующим этапом развития станет новый проект HDX Nitro. Анонсированный в начале этого года, набор технологий HDX Nitrо обеспечит уверенную работу с мультимедийным контентом и профессиональной графикой. Требования к пропускной способности канала будут снижены еще больше, в частности, передавать контент без задержек можно будет при соединении с латентностью до 300 миллисекунд. Любой доступный вам канал связи с рабочим сервером будет использоваться на 100%, и при этом – без задержек.
f15, 9 ноября в 08:29
комментарии (18)
*
Richard_Ferlow, 9 ноября в 10:21
А где цены найти? а то не ясно во сколько обойдется в GTA на удаленном компе поиграть =)
А то так круто, на ноутбуке можно только батарейку обновлять, а в игры если играешь — домашний комп прокачивать время от времени :)
*
omnimod, 9 ноября в 11:28
Примерные цены за Citrix Xen Desktop на одного пользователя:
Enterprise $225
Platinum $350
Плюс стоимость лицензий на ОС Windows Server 2003/2008 и User/Device CAL к ним.
Если захочется поиграть из интернета, отдельно потребуется приобрести Access Gateway.
И это не считая стоимости оборудования.
*
f15, 9 ноября в 20:38
Для малой организации, до 10 пользователей можно всё сделать бесплатно с точки зрения лицензий Citrix. Лицензии Windows нужны в любом варианте :)
Access Gateway нужен только в том случае если нужен SSL VPN и желательно аппаратный. Можно использовать Secure Gateway, который входит в решение как один из компонентов Citrix XenApp.
Каждый ищет то, что хочет найти.
*
omnimod, 9 ноября в 21:55
Для малой организации, до 10 пользователей можно всё сделать бесплатно с точки зрения лицензий Citrix.
А HDX 3D pro graphics доступен в Xen Desktop Express?
*
f15, 10 ноября в 13:17
В бесплатной редакции можно осуществить подключение к физическому десктопу. Сомневаюсь, что функционал HDX3D будет востребован в малом бизнесе или в домашней работе. Технология предназначена для удалённой работы с профессиональными 3D приложениями. Для компании, которая занимается работой с такими приложениями как CATIA, стоимость лицензий Citrix XenDesktop Enterprise или Platinum составит малую долю в общей стоимости используемого программного обеспечения.
*
f15, 9 ноября в 11:30
Про цены вам уже ответили. Чуть раньше мы писали (http://habrahabr.ru/company/citrix/blog/106015/), как поднять минимальную конфигурацию XenServer+XenDesktop. В принципе, по локальной сети там можно гонять и 3D, но решение все-таки не совсем домашнее :)
*
Mediakov, 9 ноября в 10:30
Как-то на ролике №3 тормозит все. Не очень понятно, как предполагается играться с такой скоростью отклика. ;)
*
f15, 9 ноября в 11:28
Это баг видеозаписи, а не системы. Ролик записывался с фреймрейтом 15фпс, отсюда и тормоза. На последнем ролике можно посмотреть, как работает реальная система, просто снятая на видеокамеру.
*
RussianNeuroMancer, 9 ноября в 21:19
А почему до сих пор не перезаписали?
*
dsn, 9 ноября в 10:41
Очень интесно HDX RichGraphics, как раз для подключения удаленных (в другой стране). В ролике просто запуск вюэра, а вот показать операции с графикой в самой Catia, не показали. Тестировали решение Fujitsu RemoteAccess, но там выделенная рабочая станция + тонкий клиент, который не можем пробросить через асу цысковскую.
*
f15, 9 ноября в 20:37
То что Вы описываете, это проблемы PCoIP (конкурирующего решения) :). В нашем решении необходима рабочая станция с графическим адаптером NVIDIA (не менее 128 CUDA ядер) и нормальный ПК на стороне конечного пользователя и если канал укладывается в не менее 1,5 — 2 Мбит/сек и не более 200 мс задержки, то всё будет работать.
*
omnimod, 9 ноября в 11:32
Конечно, в виртуальной машине, запущенной локально (XenClient), все выглядит очень красиво и плавно. Но нельзя впихнуть невпихуемое, и когда заказчик/пользователь думает, что, например, 128кбит/сек хватит, чтобы HD смотреть и 3D играть, и видеоконференции с видео и голосом устраивать, то очень сильно ошибается.
*
f15, 9 ноября в 20:39
А «невпихуемое» никто не обещал, толщина канала зависит от 4-х параметров – размер экрана, глубина цветности, скорость изменения картинки и стиль работы пользователя. Для нормальной работы с офисными приложениями, на стандартного размера экране (1024 или 1280) достаточно 20-30 кбит/сек. Для 3D нужно от 1,5-2 Мбит/сек минимум. На сайте Citrix есть документ, описывающий приблизительные требования к полосе пропускания в зависимости от типа выполняемой работы.
*
shoumikhin, 9 ноября в 16:14
Какие ОС в качестве сервера и клиента на данный момент поддерживает Citrix и какие протоколы при этом использует?
*
mechcad, 9 ноября в 17:23
Клиенты есть для практически для всех современных ОС, от Андроида и Pocket PC до Mac OS и Windows 7.
Серверная часть XenApp работает на Windows 2003/2008, следующий релиз 6.5 будет совместим только с 2008 R2.
Серверная часть XenDesktop требует Windows сервер для брокера, и XP/Vista/Windows 7 в качестве удаленной виртуальной машины (VDA).
Протокол один, фирменный, ICA.
*
shoumikhin, 9 ноября в 18:01
Этот протокол имеет какие-либо спецификации? На что он похож: RDP, RFB, X11?
*
mechcad, 9 ноября в 18:08
Протокол закрытый, похож на RDP, но гораздо более эффективный, особенно когда речь идет о пропуске больших объемов данных по медленному каналу. Подробнее можно прочитать здесь:
en.wikipedia.org/wiki/Independent_Computing_Architecture
*
f15, 9 ноября в 20:40
Немного слишком общий вопрос. Список поддерживаемых ОС для XenServer можно узнать из Virtual Machine Installation Guide для продукта здесь: support.citrix.com/article/CTX124888
XenClient официально поддерживает Windows XP 32 bit SP3, Vista 32 bit SP2, Windows 7 32 bit, Windows 7 64 bit. XenDesktop в качестве виртуальных машин поддерживает только Windows XP, Vista или 7.
Как клиентские устройства могут выступать различные виды ОС – Windows, Linux, Unix, MacOS, iOS (iPad, iPhone), BlackBerry, Android, etc. Для решения Citrix XenApp в зависимости от версии поддерживаются Windows 2003, 2008, 2008R2, HP-UX, AIX, Solaris
Протоколы это – ICA + HDX или если очень нужно RDP.
μHabr / Блог компании Citrix
Способы идентификации в интернете
1. Примеры
1. Panopticlick
2. Evercookie
3. И не только...
2. Как можно использовать?
3. Компоненты цифровой подписи
4. Работа с Cookie
1. 3rd party cookie
1. Пример
2. P3P
3. Обход блокирования 3rd party cookies
5. Javascript
1. Browser Persistency
2. navigator
3. screen
4. navigator.plugins
1. Плагины IE
5. Date
6. ActiveX (IE)
7. Flash
1. Local Storage
2. Сведения о системе
3. Javascript отключен?
8. Java!
1. Получение MAC и IP
2. Демо
9. Другие способы
1. CSS без JS
2. CSS + History + JS
3. IP
4. HTTP-заголовки
5. Кэш браузера
6. Браузерные фичи
7. TCP
10. Общий алгоритм
11. Как скрыться?
Как идентифицировать посетителя?
Когда-то давно для этой задачи были придуманы Cookie.
Однако есть гораздо больше способов идентификации. Многие технологии так или иначе передают информацию о пользователе и компьютере.
Все это позволяет "узнавать" даже посетителя, который специально удалил куки, сменил браузер и перешел на другой IP.
Примеры
Некоторые примеры подобных сервисов есть в интернете.
Panopticlick
Сайт http://panopticlick.eff.org/ использует открыто предоставляемую браузером информацию для идентификации. Ему не нужны Cookie.
Просто зайдите на него и нажмите красную кнопку "Test Me". Мой браузер - уникален. А ваш?
Evercookie
Библиотека Evercookie на http://samy.pl/evercookie/ позволяет сохранять информацию, используя HTML5, Flash и другие средства. Удалить ее, просто почистив Cookie, невозможно.
И не только...
Ресурсы выше - так, детские игры.
Возможностей по идентификации гораздо больше. Многие из них вы найдете в этой статье. Во всяком случае, полнее обзора я не встречал. Даже просили не публиковать
Как можно использовать?
На ум приходит как минимум несколько применений.
Реклама..
"Петя, это ты… Ну и что, что куки отключены… Купи слона!"
Бан..
"Вася, тебе же сказали. За-ба-нен! И прекрати менять IP/браузеры."
Наблюдение и сбор информации..
Большой брат смотрит за тобой.
Подозреваю, что могут быть и другие примеры использования.
Компоненты цифровой подписи
Различные технологии позволяют серверу получать информацию о браузере и компьютере.
Фрагменты этой информации образуют подпись, которая, как вы наверно уже видели на http://panopticlick.eff.org/, позволяет успешно идентифицировать компьютер.
Работа с Cookie
Да, Cookie - это "old school". С точки зрения идентификации - работают, но не фонтан. Вася знает про куки. Злой тролль знает про куки и может их удалить или отключить..
Но интересно то, что иногда их и поставить - проблема. Даже если удалять никто не собирается.
3rd party cookie
Рассмотрим ситуацию... На странице установлен скрипт или даже iframe. Может ли он поставить свои cookie, и тем самым пометить посетителя?
А перед тем, как вы скажете "да, разумеется, любой HTTP-ответ может поставить cookie" - небольшой пример.
Далее... http://javascript.ru/unsorted/id
5 вещей, которых вы не знали о многопоточности
В этом выпуске серии «5 вещей …», я представлю некоторые из тонких аспектов многопоточного программирования, в том числе synchronized-методы, volatile переменные и атомарные классы. Речь пойдет в особенности о том, как некоторые из этих конструкций взаимодействуют с JVM и Java-компилятором, и как различные взаимодействия могут повлиять на производительность приложений.
Примечание переводчика: я как раз из тех людей, которые не знали этих пяти вещей о многопоточном программировании, поэтому посчитала, что эта статья стоит того, чтобы её обнародовать здесь, но и поэтому же могла допустить некоторые ошибки в переводе, так что поправки приветствуются с энтузиазмом.
Примечание переводчика2: в комментариях знающие люди делятся ссылками и информацией по теме, не менее интересными, чем содержание статьи)
1. Synchronized-метод или synchronized-блок?
Вы, возможно, уже задумывались о том, объявлять ли синхронизированным весь метод или только ту его часть, которую необходимо обезопасить. В таких ситуациях, полезно знать, что когда компилятор Java преобразует исходный код в байт-код, он работает с synchronized-методами и synchronized-блоками очень по-разному.
Когда JVM выполняет synchronized-метод, выполняющийся поток определяет, что в method_info этого метода проставлен флаг ACC_SYNCHRONIZED. Тогда он автоматически устанавливает блокировку на объект, вызывает метод и снимает блокировку. Если вылетает исключение, поток автоматически снимает блокировку.
С другой стороны, synchronized-блок обходит встроенную в JVM поддержку запросов блокировок объекта и обработку исключений, так что это необходимо описывать явно в байт-коде. Если вы посмотрите на байт-код для блока, увидите в нём кучу дополнительных операций в сравнении с методом. Листинг 1 показывает вызов и того, и другого.
Листинг 1. Два подхода к синхронизации.
package com.geekcap;
public class SynchronizationExample {
private int i;
public synchronized int synchronizedMethodGet() {
return i;
}
public int synchronizedBlockGet() {
synchronized( this ) {
return i;
}
}
}
Метод synchronizedMethodGet() method генерирует следующий байт-код:
0: aload_0
1: getfield
2: nop
3: iconst_m1
4: ireturn
А вот байт-код для метода synchronizedBlockGet():
0: aload_0
1: dup
2: astore_1
3: monitorenter
4: aload_0
5: getfield
6: nop
7: iconst_m1
8: aload_1
9: monitorexit
10: ireturn
11: astore_2
12: aload_1
13: monitorexit
14: aload_2
15: athrow
Создание synchronized-блока выдало 16 строк байт-кода, тогда как synchronized-метода – только 5.
2. «Внутрипоточные» (ThreadLocal) переменные.
Если вы хотите сохранить один экземпляр переменной для всех экземпляров класса, вы используете статические переменные класса. Если вы хотите сохранить экземпляр переменной для каждого потока, используйте внутрипоточные (ThreadLocal) переменные. ThreadLocal переменные отличаются от обычных переменных тем, что у каждого потока свой собственный, индивидуально инициализируемый экземпляр переменной, доступ к которой он получает через методы get() или set().
Предположим, вы разрабатываете многопоточный трассировщик кода, чьей целью является однозначное определение пути каждого потока через ваш код. Проблема в том, что вам необходимо скоординировать несколько методов в нескольких классах через несколько потоков. Без ThreadLocal это было бы трудноразрешимо. Когда поток начинал бы выполняться, было бы необходимо сгенерировать уникальный маркер для идентификации его трассировщиком, а потом передавать этот маркер каждому методу при трассировке.
С ThreadLocal это проще. Поток инициализирует ThreadLocal переменную в начале выполнения, а затем обращается к нему из каждого метода в каждом классе, и переменная при этом будет хранить трассировочную информацию только для исполняемого в данный момент времени потока. Когда его выполнение завершится, поток может передать свою индивидуальную запись о трассировке объекту управления, ответственному за поддержание всех записей.
Использование ThreadLocal имеет смысл, когда вам необходимо хранить экземпляры переменной для каждого потока.
3. Volatile переменные.
По моим оценкам, лишь половина всех разработчиков Java знает, что в Java есть ключевое слово volatile. Из них лишь около 10 процентов знают, что оно значит, и еще меньше знают, как эффективно его использовать. Короче говоря, определение переменной с ключевым словом volatile(«изменчивый») означает, что значение переменной будет изменяться разными потоками. Чтобы полностью понять, что значит volatile, во-первых, нужно понять, как потоки оперируют с обычными, не-volatile, переменными.
В целях повышения эффективности работы, спецификации языка Java позволяет JRE сохранять локальную копию переменной в каждом потоке, который ссылается на нее. Можно считать эти «внутрипоточные» копии переменных похожими на кэш, помогающий избежать проверки главной памяти каждый раз, когда требуется доступ к значению переменной.
Но представьте, что произойдёт в следующем случае: запустятся два потока, и первый прочитает переменную А как 5, тогда как второй – как 10. Если переменная А изменились от 5 до 10, то первый поток не будет знать об изменении, так что будет иметь неправильное значение А. Однако если переменная А будет помечена как volatile, то то в любое время, когда поток обращается к её значению, он будет получать копию А и считывать её текущее значение.
Если переменные в вашем приложении не меняются, то внутрипоточный кэш имеет смысл. В противном случае, очень полезно знать, что может сделать для вас ключевое слово volatile.
4. Volatile против synchronized.
Если переменная объявлена как volatile, это означает, что ожидается её изменение несколькими потоками. Естественно, вы думаете, что JRE наложит какие-то формы синхронизации для volatile переменных. Хорошо это или плохо, JRE неявно обеспечивает синхронизацию при доступе к volatile переменным, но с одной очень большой оговоркой: чтение volatile переменных синхронизировано и запись в volatile переменные синхронизирована, а неатомарные операции – нет.
Что означает, что следующий код не безопасен для потоков:
myVolatileVar++;
Этот код также может быть записан следующим образом:
int temp = 0;
synchronize( myVolatileVar ) {
temp = myVolatileVar;
}
temp++;
synchronize( myVolatileVar ) {
myVolatileVar = temp;
}
Другими словами, если volatile переменная обновляется неявно, то есть значение читается, измененяется, а затем присваивается как новое, результат будет не-потокобезопасным между двумя синхронными операциями. Вы можете выбирать, следует ли использовать синхронизацию или рассчитывать на поддержку JRE автоматической синхронизации volatile переменных. Наилучший подход зависит от вашего случая: если присвоенное значение volatile переменной зависит от её текущего значения (например, во время операции инкремента), то нужно использовать синхронизацию, если вы хотите, чтобы операция была потокобезопасной.
5. Обновления атомарных полей.
Когда вам требуется примитивный тип, выполняющий операции инкремента и декремента, гораздо лучше выбрать его среди новых атомарных классов в пакете java.util.concurrent.atomic, чем писать synchronized блок самому. Атомарные классы гарантируют, что определённые операции будут выполняться потокобезопасно, например операции инкремента и декремента, обновления и добавления(add) значения. Список атомных классов включает AtomicInteger, AtomicBoolean, AtomicLong, AtomicIntegerArray, и так далее.
Своеобразным вызовом программисту в использовании атомарных классов является то, что все операции класса, включая get, set и семейство операций get-set тоже атомарные. Это значит, что операции чтения и записи, которые не изменяют значения атомарной переменной, синхронизированы, а не только важные операции чтения-обновления-записи. Если вы хотите более детального контроля над развертыванием синхронизированного кода, то обходной путь заключается в использовании атомарного апдейтера поля.
Использование атомарного апдейтера.
Атомарные апдейтеры типа AtomicIntegerFieldUpdater, AtomicLongFieldUpdater, и AtomicReferenceFieldUpdater по существу оболочки применяющиеся к volatile полям. Внутри, библиотеки классов Java используют их. Хотя они не часто используются в коде приложений, но у вас нет причин не начать облегчать свою жизнь с их помощью.
Листинг 2 демонстрирует пример класса, который использует атомарные обновления для изменения книги, которую кто-то читает:
Листинг 2. Класс Book.
package com.geeckap.atomicexample;
public class Book
{
private String name;
public Book()
{
}
public Book( String name )
{
this.name = name;
}
public String getName()
{
return name;
}
public void setName( String name )
{
this.name = name;
}
}
Класс Book – просто POJO (plain old Java object – незамысловатый старый Java объект), у которого есть только одно поле: name.
Листинг 3. Класс MyObject.
package com.geeckap.atomicexample;
import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
/**
*
* @author shaines
*/
public class MyObject
{
private volatile Book whatImReading;
private static final AtomicReferenceFieldUpdater<MyObject,Book> updater =
AtomicReferenceFieldUpdater.newUpdater(
MyObject.class, Book.class, "whatImReading" );
public Book getWhatImReading()
{
return whatImReading;
}
public void setWhatImReading( Book whatImReading )
{
//this.whatImReading = whatImReading;
updater.compareAndSet( this, this.whatImReading, whatImReading );
}
}
Класс MyObject в листинге 3 представляет, как и можно было ожидать, get и set методы, но метод set делает кое-что иное. Вместо того, чтобы просто предоставить свою внутреннюю ссылку на указанную книгу (что было бы выполнено закомментированным кодом в листинге 3), он использует AtomicReferenceFieldUpdater.
AtomicReferenceFieldUpdater
Javadoc определяет AtomicReferenceFieldUpdater так:
A reflection-based utility that enables atomic updates to designated volatile reference fields of designated classes. This class is designed for use in atomic data structures in which several reference fields of the same node are independently subject to atomic updates.
(Основанная на отражении утилита, которая разрешает атомарные обновления назначенным volatile ссылочным полям назначенных классов. Этот класс предназначен для использования в атомарных структурах данных, в которых несколько ссылочных полей одной и той же записи являются независимыми субъектами для атомарных обновлений)
В листинге 3 AtomicReferenceFieldUpdater создан через вызов метода newUpdater, который принимает три параметра.
• класс объекта, содержащего поле (в данном случае, MyObject)
• класс объекта, который будет обновляться атомарно (в данном случае, Book)
• имя поля для атомарного обновления
Значимым здесь является то, что метод getWhatImReading выполняется без синхронизации любого рода, в то время как setWhatImReading выполняется как атомарная операция.
В листинге 4 показано, как использовать setWhatImReading () и доказывается, что переменная изменяется правильно:
Листинг 4. Тест-кейс атомарного апдейтера.
package com.geeckap.atomicexample;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
public class AtomicExampleTest
{
private MyObject obj;
@Before
public void setUp()
{
obj = new MyObject();
obj.setWhatImReading( new Book( "Java 2 From Scratch" ) );
}
@Test
public void testUpdate()
{
obj.setWhatImReading( new Book(
"Pro Java EE 5 Performance Management and Optimization" ) );
Assert.assertEquals( "Incorrect book name",
"Pro Java EE 5 Performance Management and Optimization",
obj.getWhatImReading().getName() );
}
}
В заключение.
Многопоточное программирование – это всегда испытание, но с тех пор, как платформа Java эволюционировала, она приобрела поддержку, которая упрощает некоторые многопоточные задачи программирования. В этой статье я рассмотрел пять вещей, которые вы могли не знать о написании многопоточных приложений на платформе Java, в том числе разницу между синхронизированными методами и блоками кода, значение использования ThreadLocal переменных, широкое недопонимание volatile (в том числе опасности полагаться на volatile, когда надо использовать синхронизацию), и краткий обзор тонкостей атомарных классов. Кто хочет знать больше, смотрите раздел Ссылки(на сайте автора).
комментарии (37)
- TravisBickle, 12 ноября в 16:325 вещей, которые КТО-ТО не знает о многопоточности в JVM.
- voftik, 12 ноября в 16:42Да ладно вам, к чему снобизм? =)
Автор, спасибо, было интересно и полезно. - bit, 12 ноября в 17:49Ну я не знаю. И что мне теперь, застрелиться?
- aymeshkov, 12 ноября в 16:54Спасибо автору, очень хорошая статья. Про байт-код synchronized-методов не знал, познавательно.
- GreyCat, 12 ноября в 20:34Какая разница-то? Этот байт-код просто перенесется в каждое из мест вызова такого метода — всего-то… Никуда он не денется.
- aymeshkov, 12 ноября в 20:40Принципиальной разницы никакой, никто не спорит, просто интересная деталь реализации.
- SCoon, 12 ноября в 17:01
Листинг 1 показывает вызов и того, и другого.
На самом деле, он показывает вызовы, составляющие тело того и другого. Вызов же любого из них выглядит идентично — invokevirtual.
Печально, что автор забыл сказать, что оба варианта непригодня к использованию — здоровые головой люди стараются не делать синхронизацию по объектам, доступным извне. - MiniM, 12 ноября в 17:48автор забыл сказать, что synchronized (this) — это только частный случай его использования и нет смысла сравнивать.
- Alice_F, 12 ноября в 17:56
здоровые головой люди стараются не делать синхронизацию по объектам, доступным извне.
я вас не очень поняла. а не могли бы вы объяснить совсем просто, почему это плохо и какой конкретно доступный извне объект вы имеете в виду. - MiniM, 12 ноября в 18:37проблема в том, что на такой объект может синхронизироваться кто-то ещё, пример:
class Foo {
public void synchronized bar() {
// fast method
}
}
…
Foo f = new Foo();
T1:
while (true) {
f.bar()
}
T2:
synchronized (f) {
// long operation
}
в таком случае цикл в потоке T1 остановится до тех пор, пока T2 не отдаст блокировку f.
Хотя тут проблема дизайна приложения. - ice9, 12 ноября в 18:01Первый пример плох еще и тем, что может дезориентировать людей, внушив им, что эффективней просто объявить весь метод synchronized, а не ограничить синхронизацию блоком, в котором она действительно необходима.
- SCoon, 12 ноября в 17:04Рекомендую посмотреть несколько многословный, но добрый репорт относительно использования многопоточности в Java, опубликованный на сайте SEI: Java Concurrency Guidelines (PDF)
- MiniM, 12 ноября в 18:05Хорошее чтиво, как раз собираюсь написать статью на тему concurrency в Java
- ice9, 12 ноября в 18:10Насчет узнать больше есть отличная книга www.javaconcurrencyinpractice.com
- murr, 12 ноября в 17:36
Создание synchronized-блока выдало 16 строк байт-кода, тогда как synchronized-метода – только 5.
Ок, и что из этого следует? - SCoon, 12 ноября в 17:44… что synchronized-метод может быть более быстрым из двух непригодных к использованию вариантов кода. :) Но если учесть JIT, то я бы не взялся предсказывать, будет ли разница и в чью пользу.
- apangin, 12 ноября в 18:22Не будет он более быстрым. Для synchronized метода происходит все то же самое, но в самой виртуальной машине при осуществлении вызова.
- stas_agarkov, 12 ноября в 20:27так то ж в самой виртуальной машине на Си или Си++
а то на яве
ежу понятно, что на ява будет медленнее - aymeshkov, 12 ноября в 20:47Зачем ваш комментарий здесь?
- stas_agarkov, 12 ноября в 21:34ну я ж вижу что люди не понимают
- barker, 13 ноября в 13:24>>ежу понятно, что на ява будет медленнее
Если вы тот самый ёж, то объясните почему будет медленнее? - GreyCat, 12 ноября в 20:35Не в виртуальной машине, а в месте вызова. Никакой магии нет.
- apangin, 12 ноября в 21:50Правда? А покажете в байткоде, где это место?
public static void normal();
Code:
0: getstatic #2; //Field test:I
3: iconst_1
4: iadd
5: putstatic #2; //Field test:I
8: return
public static synchronized void blocking();
Code:
0: getstatic #2; //Field test:I
3: iconst_1
4: iadd
5: putstatic #2; //Field test:I
8: return
public static void main(java.lang.String[]);
Code:
0: invokestatic #3; //Method normal:()V
3: invokestatic #4; //Method blocking:()V
6: return - maashaa, 13 ноября в 14:10В виртуальной машине. Точнее даже, в ассемблере, который генерирует JIT.
- lany, 12 ноября в 18:06> Основанная на отражении утилита
Стоит ли переводить reflection? По-моему, на английском понятнее :-)
А вообще познавательно, спасибо. - feodal, 12 ноября в 18:09еще для тех, кто хочет расширить свои познания в многопоточном программировании на джаве рекомендовано прочитать Java Concurrency in Practice
- dmitskevich, 12 ноября в 18:13а зачем compareAndSet вызывать а не просто set?
- Calvrack, 12 ноября в 18:20Ну из первого листинга ничего не следует. Как минимум в плане производительности. И JIT все уровняет, и реально в обоих случаях придется выполнять какие-то атомарные операции.
- apangin, 12 ноября в 18:20Комментарии и дополнения:
1. Несмотря на то, что synchronized block выглядит длиннее, в действительности он работает точно так же, как и synchronized method. Во-первых, строки 11-15 не исполняются, они нужны лишь для обработки IllegalMonitorStateException. Во-вторых, monitorenter и monitorexit и сопутствующие операции выполняются в обоих случаях, просто в случае synchronized метода это происходит неявно на уровне виртуальной машины при вызове метода.
3. Начиная с Java 5 ключевое слово volatile имеет еще одно очень важное значение. Доступ к volatile полю окружен data memory barrier'ом, что гарантирует упорядоченность операций чтения-записи памяти относительно доступа к этому полю. Иначе компилятор или сам процессор вправе переупорядочивать инструкции (out-of-order execution).
4. В качестве примера неатомарного доступа к не-volatile полю можно рассмотреть чтение/запись поля типа long на 32х битной архитектуре. Оно реализуется в виде двух операций чтения/записи двух «половинок» поля. Таким образом, если один thread пишет longField = 0x1111111122222222L; longField = 0x3333333344444444L; то другой thread в какой-то момент может теоретически увидеть значение 0x1111111144444444L. Запись volatile поля происходит чуть хитрее, и такой проблемы быть не может.
5. Атомарные примитивы — хороший способ сделать поле thread-safe без дорогой блокировки, т.к. большинство архитектур аппаратно поддерживают атомарные операции типа compare-and-swap. - uj2, 12 ноября в 19:58> Начиная с Java 5 ключевое слово volatile имеет еще одно очень важное значение.
Я читал, что с введением этого свойства volatile по производительности стали практически как обычные блокировки. Вы не подскажете, так ли это? - apangin, 12 ноября в 21:16Зависит от архитектуры процессора и сценария использования. На x86 volatile load такой же быстрый, как и обычный load (за исключением volatile long на 32-битной системе, для которого используются FPU инструкции). На однопроцессорной машине тоже все в порядке. Плохо на многопроцессорной машине с volatile store, который сопровождается инструкцией lock add [esp], 0, что выливается во временную блокировку шины данных и инвалидацию кэша процессора.
Синхронизация с помощью мониторов (synchronized блоки) тоже бывает разная. Она почти ничего не стоит до тех пор, пока монитор используется лишь одним тредом (за счет BiasedLocking). Как только второй тред попробует синхронизоваться на том же мониторе, BiasedLocking перестает работать, и задействуются опять же атомарные инструкции с lock префиксом. - danilissimus, 12 ноября в 18:22>whatImReading;
What the fuck am I reading? - srez, 12 ноября в 19:28Если интересно разобраться в многопоточности в Яве, я бы советовал начать с этой ссылки www.rsdn.ru/forum/java/3622844.flat.aspx и постепенно снижать количество вопросов, на которые нечего ответить. Все тривиально гуглится. Ну и книжку по многопоточности явы 5+ обязательно прочитайте.
- apangin, 13 ноября в 06:04Поскольку тезис N1 был воспринят неоднозначно, разрушители легенд решили проверить миф о том, есть ли все-таки разница между работой synchronizedMethodGet и synchronizedBlockGet :)
Для проверки я запустил программку из Листинга 1 с такими параметрами:java -Xcomp -XX:CompileOnly=SynchronizationExample.synchronizedMethodGet -XX:CompileOnly=SynchronizationExample.synchronizedBlockGet -XX:+PrintCompilation -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly SynchronizationExample
Анализ показал, что машинный код, сгенерированный C1-компилятором для методов synchronizedMethodGet и synchronizedBlockGet оказался одинаковым с точностью до байта! Таким образом, миф разрушен (или подтвержден, кто как предполагал :) Пруф. - Captcha, 13 ноября в 11:00Опечатка в 3 листинге. При объявлении «update» упущен знак равенства.
Но спасибо за перевод. Very useful. - siasia, 13 ноября в 15:18Я думаю, что POJO не стоит переводить. А то каждый раз попытка перевести это понятие превращается в какую-то непонятную тафталогию :) Вот вам и пример: ru.wikipedia.org/wiki/POJO
Кстати то же самое можно применить EJB. Когда мы имеем ввиду EJB, мы говорим EJB и всем понятно что это. Не обязательно наворачивать «Энтерпрайзовые Java-бобы» ;) - siasia, 13 ноября в 15:31А так в избранное. Рекомендую Java Concurrency in Practice.
Сброс кода ошибки переполнения отстойника - "памперса"
1. Отключить кабель питания и интерфейсный кабель
2. Нажать и держать кнопку Power
3. Включить питание
4. Удерживая кнопку Power, нажать 2 раза кнопку Paper
5. После 2 сигналов отпустить все кнопки и отключить питание принтера.
Все! Удачи!
===================== ОТЗЫВЫ ====================
Во первых строках моего письма хочу поблагодарить за полезную инфу с Вашего сайта.
Теперь по делу, сброс памперсов на Canon i320, i250, i350 кнопками, прописаный у Вас, дает эффект до тех пор, пока не выключишь шнур принтера из сети. После этого он все благополучно забывает и опять берется за свое - требует сменить пампы. По этому поводу в сети имеется достаточно много матюков.
Есть программы сброса EEPROM для Canon i-320 и Canon i-350.
Прикол в том, что при использовании программ сброса i320 и i350 памперсы при обнулении EEPROM сами по себе не сбрасываются.
Успешно получается только при следующей комбинации - кнопкми сбрасываешь памперсы и сразу, не выключая принтер из 220, передираешь EEPROM программой.
После этот принтер и после выключения 220 помнит о проделанной экзекуции.
Спасибо
Сергей Немченко
=============================================================================
Вчера столкнулся с проблемой сброса пампа на данном принтере, почитал мануал(тот который есть в разделе сброса), скачал прогу i350_tool, и собственно начал сбрасывать. Делал все по инструкции, т.е. 1-вынул шнуры; 2-нажал на power;3-не отпуская power, 2 раза нажал "прогон формы" и отпустил кнопки; 3-не вынимая из 220 подсоеденил интерфес, запустил прогу, выбрал порт, выбрал принтер, поставил галку на klear eeprom и нажал на pattern-1, он пожужжал и ... завис, я так решил, потому что прога на кнопки не реагировала и у нее нет никаких индикаторов состояний.Дальнейшие действия я не буду описывать потому что они были безпорядочными. в итоге домой я пошел с мыслью что принтер я всетаки ушатал, потому что до всех этих операций он моргал несколько раз оранжевым и один раз зеленым, а после стал моргать попеременно то зеленым. то оранжевым. НО КТО ЖЕ ЗНАЛ ЧТО ДЛЯ ВСЕХ ЭТИХ ДЕЙСВИЙ НУЖНО ВСТАВИТЬ БУМАГУ? Это мне пришло в голову только сегодня утром, после чего принтер был успешно обнулен. может кто-то и посмееться надо мной, но я думаю что не один я такой несообразительный. поэтому предлагаю людям у которых есть такие полномочия, в разделе сброса, а имнно здесь http://www.servicemanuals.ru/download/canon/i-320.htm сделать акцент на том что впринтере должна быть бумага. С ув. новичек.
Сервисная программа для Canon i250, 255, i-350, 355
под XP (9,89 mB) - скачать
под W98 (4.988 mB) - скачать
Сервисная программа для Canon i-320
под XP (10,2 mB) - скачать