Заметки из категории «Веб-разработки»

Снова в строю!

Довольно долго я ничего не писал в блоге. На это были свои причины. Была и учёба, была и работа, кое-что интересного уже сделано, а кое-что ещё делается.

Зато теперь я более-менее освободился и продолжу регулярно публиковать заметки в блоге. Тем более, что тем для них накопилось уже немало. В том числе немного расскажу и про те вещи, которыми занимался в конце зимы и в начале весны.

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

Тонкости и хитрости: как посмотреть закрытые фото на vkontakte.ru?

28 января 2009, 15:55
Уверен, почти у всех читателей моего блога есть аккаунт в социальной сети ВКонтакте.ру. Не буду рассуждать, плохо это или хорошо, но это так. А поскольку на vkontakte.ru есть профили почти всех знакомых, то зачастую там можно найти любопытные вещи.

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


Способ первый, самый примитивный, но работающий процентах в шестидесяти случаев. Открываете вы профиль человека, а вам показывается страница с адресом вида vkontakte.ru/search.php?id=123456789. В данном случае, 123456789 – это ID профиля пользователя. Набираем vkontakte.ru/photos.php?id=123456789. И что мы видим? Видим список альбомов пользователя, а в них уже фотографии, которые можно посмотреть :)

Отчего так происходит? Пользователь поставил в настройках приватности галочку на опции скрывания профиля от всех, кроме своих друзей, но не поставил галочку на опциях скрывания своих фото. Пользователям обычно лень вникать в длинный список настроек, которые им предлагаются. Чем можно и воспользоваться. Между прочим, замечу, что таким же образом зачастую можно посмотреть друзей пользователя – набираете vkontakte.ru/friend.php?id=123456789, перечень заметок пользователя – vkontakte.ru/notes.php?id=123456789, список аудиозаписей – vkontakte.ru/audio.php?id=123456789. Стена комментариев, которая находится по адресу vkontakte.ru/wall.php?id=123456789, к сожалению, обычно по умолчанию скрыта.

Но вернемся все же к фотографиям. Представьте, что вы открыли страницу с фотоальбомами пользователя, а вместо этого видите страницу с надписью, гласящей, что у вас нет ни одного альбома. Это значит, что пользователь все же закрыл свои фотографии от просмотра людьми, которые не находятся в его списке друзей. Что же делать? Идём дальше.

Способ второй, немного более хитрый. Отдельное спасибо за него хочется выразить разработчикам ВКонтакте.ру, а также их тестерам (если, конечно, они там есть) – за то, что они прохлопали такой удобный для нас баг! Удобнее всего использовать этот способ в случае, если вы открываете страницу «Фото с пользователем таким-то», т.е. список всех фото, на которых этот человек был отмечен. Для начала включите ускоренный режим просмотра фотографий (включается при помощи ссылки внизу любой страницы с фотографией). Это и просто удобнее, чем обычный режим просмотра, с полной перезагрузкой страницы. Но не в этом дело.

Дело в том, что если вы открываете страницу фото, которую вы можете смотреть, то переходы дальше (вперед или назад на одно фото) происходят с помощью ajax. То есть в исходном коде страницы прописывается массив (равный по числу элементов числу фотографий в списке), каждый элемент которого содержит ID фотографии и ее URL. А потом, при кликах по ссылкам «Вперед» и «Назад» попросту происходит загрузка следующей фотографии из массива – в текущей странице, без перезагрузки страницы целиком. Если же вы заходите на страницу с фото, которое вам недоступно, то переходы на другие фотографии в этом списке происходят без ajax, путем загрузки новой страницы.

Так вот, если вы открыли страницу с фото, которое вы можете просмотреть, то путешествуя по списку фото вперед или назад, вы можете просмотреть все фотографии, в том числе и те, которые были открыты только для друзей. Впечатляет, не так ли?

То есть задача по большому счету сводится к тому, чтобы найти в списке фотографий ту фото, которую вы, как человек со стороны, можете просмотреть. Дам подсказку: чаще всего такой «входной» фотографией может быть какая-нибудь картинка наподобие «Поздравляю всех вас с новым годом», на которой автор фото отмечает всех своих 345 друзей, в том числе и того человека, фото с которым вы хотите посмотреть. Бывают и обычные фото, открытые для всех, но вот такие дурацкие картинки почти всегда открыты для всех. Клацайте, смотрите, изучайте.
Уязвимым местом этого способа является тот факт, что рано или поздно разработчики ВКонтакте.ру все же заметят этот баг и прикроют его. Пробуйте, пока ещё не поздно.

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

Скажу вам, что добавят. Многие добавят из любопытства, многие просто так. А чтобы уж точно добавили, можно произвести над своим профилем некоторые действия, которые этому поспособствуют. Это работает, я пробовал и на vkontakte.ru, и на myspace.com, и на facebook.com, и везде те люди, которых я хотел зафрендить, добавляли меня в свой френдлист. Вообще, эта тема требует отдельного освещения, чему я и думаю посвятить одну из следующих заметок – с более подробным рассказом на эту тему.

Ну а пока что – пробуйте в деле те возможности, про которые я рассказал сейчас.

Сервис тематических брендов

19 декабря 2008, 18:49
Скриншот с места событий
Скриншот с места событий
Анонсирую мой новый проект, выполненный по заказу Даниила Маула как сервис для его блога. Сервис носит гордое имя «Тематические бренды» и находится тут, приглашаю зайти и попробовать его в действии.

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

Бренды разделены на две основные рубрики: SEO и блогосфера.

Написан весь сервис на PHP + MySQL, что для меня в последнее время редкость, так как я практически полностью перебрался на ASP.NET + MSSQL Server. Но поскольку блог Даниила работает на WordPress, то и сервис было решено делать на PHP. Получилось неплохо, как мне кажется.Блогун - монетизируем блоги

ASP.NET: тонкости работы с контролом CascadingDrowDown

30 ноября 2008, 12:43
Добавлено в: Веб-разработки
Пример работы CascadingDropDown
Пример работы CascadingDropDown
Контрол CascadingDropDown, входящий в состав ASP.NET Ajax Control Toolkit, служит для создания нескольких зависимых друг от друга выпадающих списков (DropDownList-ов) — например, в первом выбирается страна, во втором после выбора страны загружается список городов выбранной страны и так далее. Очень удобный контрол, позволяет работать как с данными из БД, так и с данными из xml-файлов.

И вот буквально сегодня я столкнулся с одной проблемой. Рассказываю, в чём она заключалась и как я её решил.

В чём проблема?
В одном из своих проектов я использую user-friendly URL's. Для этого я подключаю к проекту UrlRewriting.NET — компонент для rewrite адресов в ASP.NET-сайте. Кстати, весьма удобная вещь, рекомендую к использованию.
Так вот, страница регистрации физически находится по адресу вроде /system/signup.aspx, но все ссылки на сайте ведут на /signup/ — для большей красоты :) И вот на этой странице перестал работать CascadingDropDown. Выдаёт ошибку «Error method 500» — и всё.

Как я искал проблему
Покопался я немного в коде и после нескольких экспериментов установил, что если страница после реврайта (скрытой переадресации) находится по адресу /signup.aspx или /signup/default.aspx, то CascadingDropDown работает. Если по адресу вроде /signup/a — тоже работает. То есть если страница находится не по адресу /signup/, а заканчивается на имя какого-то файла, то CascadingDropDown работает.

Тогда я додумался поглядеть уже сгенерированный код html-страницы — и быстро понял, в чем проблема. Посмотрите, вот это ASP.NET код на странице signup.aspx:
<asp:DropDownList ID="CountryLives" runat="server" Width="252px" CssClass="inputfield"></asp:DropDownList><br />
<cc1:CascadingDropDown ID="CascadingDropDown2" runat="server"
TargetControlID="CountryLives"
Category="Live"
PromptText="[выберите область]"
LoadingText="[загрузка списка областей]"
ServicePath="~/WebServices/GetLocation.asmx"
ServiceMethod="GetLives"
ParentControlID="Country">
</cc1:CascadingDropDown>

А вот что генерируется в конце концов в html-коде (при загрузке страницы по адресу /signup/):
Sys.Application.add_init(function() {
$create(AjaxControlToolkit.CascadingDropDownBehavior, {"Category": "Live", "ClientStateFieldID": "ctl00_ContentPage_CascadingDropDown2_ClientState", "LoadingText": "[загрузка списка областей]", "ParentControlID": "ctl00_ContentPage_Country", "PromptText": "[выберите область]", "ServiceMethod": "GetLives", "ServicePath": "WebServices/GetLocation.asmx", "id": "ctl00_ContentPage_CascadingDropDown2"}, null, null, $get("ctl00_ContentPage_CountryLives"));
});

Как видно, я ASP.NET-контроле я прописываю ServicePath от корня приложения: ~/WebServices/GetLocation.asmx. В JavaScript-е в генерируемой html-страницеServicePath прописывается как WebServices/GetLocation.asmx – то есть не от корня сайта, а от текущего каталога. То есть определяется неправильно.

Если же адрес страницы заканчивается каким-то файлом (/signup/default.aspx – к примеру), то в JavaScript-е ServicePath имеет значение "../WebServices/GetLocation.asmx". То есть в этом случае определяется правильно.

Итак, как решить проблему?
Теперь, используя результат этих наблюдений, это совсем несложно: просто в ASP.NET коде устанавливаем значение ServicePath не “~/WebServices/GetLocation.asmx”, а “/WebServices/GetLocation.asmx” – принудительно от корня приложения. В таком случае в JavaScript значение параметра ServicePath тоже прописывается как “/WebServices/GetLocation.asmx” – и CascadingDropDown работает так, как и должен был работать. Ура :)

Как у меня пытались домен увести

18 ноября 2008, 21:06
Вот такие они, киберпреступники :)
Вот такие они, киберпреступники :)
Не так давно, быть может, недели полторы назад, у меня в ICQ появился некто, который хотел купить у меня домен avrillavigne.ru. Помимо вопиющей неграмотности, этот некто не имел никакого понятия о деловых переговорах. Я бы привел текст переписки, но к сожалению, видимо, удалил её вместе с контактом.

Так, в частности, он никак не хотел называть свою цену, а хотел услышать мою. И до тех пор, пока я не сказал, что в таком случае можно прекращать разговор, он не называл. Но потом всё же назвал. Угадайте, сколько? Этот типус (честно скажу, не помню, как его звали, не то Сергей, не то Максим) предложил начать торг от тысячи.

Вам тоже неясно, тысячи — в какой валюте? Мне тоже было неясно. Да и честно скажу, домен продавать я не думал, мне было просто интересно оценить масштаб сумм, которые могут за него дать.

И когда я переспросил, тысячи — долларов или евро — это повергло моего собеседника в шок. Он думал, за тысячу рублей! Русских рублей. Это примерно 35-40 долларов. Когда же я попытался объяснить ему абсурдность его предложения, этот паренёк рассказал мне, что за тысячу долларов он купит не только домен, но и сайт, и у него ещё останется. На что я пожелал ему искать дальше такие проекты, а ко мне обращаться в том случае, если будет готов играть по моим правилам.

На этом мы и расстались. Но в чём же проявилось то, о чём написано в заголовке заметки? Это ещё не конец истории.

В прошлую пятницу у меня в аське появился новый контакт, подписанный как «Михаил Нестеров, RU-CENTER» (UIN 499998123, в информации про номер ICQ прописан сайт auction.nic.ru). И автор этой аськи в первом же сообщении перешёл к делу. Представившись сотрудником компании RU-CENTER, этот Михаил сообщил, что их интересует покупка у меня за *** у.е. (да, цифра была прописана сразу) домена avrillavigne.ru.

Хм, подумал я, что ж за внимание такое к этому домену? Неужели случилось в мире что-то, связанное с певицей Avril Lavigne? Знаете, такой ажиотаж вокруг доменов зачастую начинается после какого-нибудь события, связанного с известными людьми — рождение ребёнка, награждение какой-нибудь кинопремией или ещё чем-то.

Вот я и спросил:
---
Илья (15:39:50 14/11/2008)
хотелось бы узнать, а для чего вам этот домен?

RU-CENTER (15:41:11 14/11/2008)
ну буду обеснять (можем не правильно друг друга понять) вы посмотрите сайт и все поймете www.auction.nic.ru

Илья (15:41:44 14/11/2008)
я знаю этот аукцион, и?

RU-CENTER (15:44:26 14/11/2008)
ну вопшем обесню по русский, наша отдел считает что этот домен можно выгодно продать и выстевела конкретную цену за которую мы хотим выкупить, пока другие копание не сделали тоже самое

RU-CENTER (15:44:26 14/11/2008)
я думаю тепер все вам понятно

Илья (15:45:03 14/11/2008)
ок, я обдумаю ваше предложение

RU-CENTER (15:45:28 14/11/2008)
хорошо ждем ответа
---

Знаете, посмотрев на этот диалог, что-то заставило меня усомниться. Я очень сомневаюсь, что сотрудник столь уважаемой компании будет писать с такими ошибками, да к тому же так формулируя свои мысли. К тому же я поискал в Google по запросу «Михаил Нестеров RU-CENTER» и ничего толком не нашёл, что меня ещё более насторожило.

Потому я продолжил разговор:
---
Илья (16:24:51 14/11/2008)
Пожалуйста, отправьте мне письмо с Вашим предложением на e-mail, который указан в моей учетной записи на auction.nic.ru. И укажите в письме, пожалуйста, мой номер договора. Спасибо.

RU-CENTER (16:28:56 14/11/2008)
В вашей учотной записи указон домен www.avrillavigne.ru ?

Илья (16:29:32 14/11/2008)
нет, в ней указаны мои Ф.И.О.

RU-CENTER (16:29:45 14/11/2008)
хорошо спасибо
---

Если это действительно сотрудник RU-CENTER, к тому же, как он это задекларировал, занимающийся работой над auction.nic.ru, для него не составило бы труда узнать и мой e-mail (в принципе, его можно узнать и более простым путём), и мой номер договора с RU-CENTER (а вот это постороннему уже узнать никак).

Да и опять же, вопиющая неграмотность, которая сразу же напомнила мне о предыдущем разговоре о продаже этого домена... «У посла медальон, у Шпака магнитофон... Меня терзают смутные сомнения», как говорил герой одного известного фильма.

Да, с тех пор прошло уже 5 дней, а никакого письма я так и не получил, равно как и продолжения разговора по ICQ больше не было. Любопытно, вы не находите? :)

Microsoft DevDays 2008 в Днепропетровске

16 ноября 2008, 23:59

Я собирался написать об этом раньше, но дела заставили меня отложить написание этой заметки на несколько дней. Больше, чем на неделю. Наверное, так даже и лучше. Получится более объективный рассказ.

Большую часть докладов делал Сергей Байдачный. Я в свое время слышал про него и даже читал в своё время его книгу по MSSQL. Мне очень понравился его стиль изложения – такой оптимистичный и уверенный :)

Итак, что же было на конференции Microsoft DevDays?

Стартапы

В самом начале Сергей Байдачный рассказал про программу Microsoft для стартапов. Мне это было особо интересно, потому как скоро может пригодиться.
В общем, если ваша компания существует меньше 3 лет, имеет годовой доход менее $1 млн, то можно заключить с Microsoft договор, по которому можно официально и бесплатно получить лицензии на ПО для разработок. Кроме того, для веб-проектов Microsoft может оказать помощь в размещении в сети на своих серверах или серверах украинских хостеров, с которыми у Microsoft будет заключен договор. Весьма неплохо, да? Лицензии, кстати, выдаются из расчёта до 25 рабочих мест.

Докладчик сказал, что Microsoft будет весьма тщательно рассматривать все предложения и заявки, чтобы лицензии получали действительно те компании, которым это нужно, а не аутсорсинговые компании (в которых зачастую каждый разработчик юридически оформлен как независимый частный предприниматель), которые могут захотеть получить «на халяву» лицензий. Надеюсь, что так и будет сделано.

На перерыве я подошел к докладчику и спросил насчёт того, Microsoft помогает стартапам только софтом и размещение в сети, или же в планах есть денежные инвестиции в проекты? Он сказал, что нет, непосредственно денег в проекты вкладываться не будет, но они могут помочь с поиском инвесторов, по крайней мере, в Украине у них есть контакты уже с несколькими подобными организациями.

Потом еще нам рассказали про InnovateOn и Metro, но про них – позже.
Ну а после всех этих аннотаций начались сами доклады.

Visual Studio Team System 2010
Новая версия среды разработки будет называться не просто Visual Studio 2010, а гордо – Visual Studio Team System 2010.
Базируется на WPF, основной упор на архитектуру и тестирование проектов, будет включена поддержка .NET Framework 4.0.
Пообещали и новую версию SharePoint – вроде как без багов. Посмотрим, так ли это.
Уже сейчас на сайте microsoft.com можно скачать VSTS 2010 CTP.

Silverlight 2.0

Вообще-то, доклад по Windows Internet Explorer 8 должен был пройти раньше, чтобы, как сказал кто-то из докладчиков, создать соответствующую атмосферу, но поскольку случились какие-то накладки по времени, пришлось поменять местами доклады. Ничего страшного из-за этого не произошло, и мне доклад очень понравился.

Знаете, возможности второго силверлайта меня очень впечатлили. На DevDays я заполнил анкету, которую раздавали всем при регистрации (кроме традиционного пакетика со всяким печатным добром и прочими канцтоварами с лейблом Microsoft), в том числе указал и свой адрес, чтобы на него прислали книгу по Silverlight 2.0. Обещали к январю прислать, впрочем, меня это устраивает, ведь уже довольно скоро начнется сессия, и придётся заниматься учёбой :)

Вообще-то, я там и на рассылки подписался. Мне действительно интересно, чего нового делает Microsoft в области разработок софта и веб-разработок. Посмотрим, насколько регулярно будут приходить рассылки, и насколько они будут интересными.

На бюллетень MSDN я подписался, и даже получил уже один (ежемесячный) выпуск. Жаль, кстати, что в бюллетене MSDN, на который я подписан, не было анонса предстоящих DevDays – узнал от товарища. Но теперь я заполнил анкету, и меня должны не забывать приглашать на следующие мероприятия :)

Ну а вообще, надо обязательно попробовать что-то написать на Silverlight, еще не знаю, что, и не знаю, в виде отдельного проекта или как часть приложения к SunSpace или 2S, но напишу точно. Очень, очень мощная технология. И очень удобная для разработчиков. Кстати, мне понравилось, как продумано взаимодействие программиста и дизайнера в рамках работы над Silverlight-проектом. Да и silverlight-плагин для браузера «весит» совсем немного – около 4 мб. У меня у самого давным-давно в Firefox стоит silverlight-plugin, еще с тех времен, когда сильверлайт был бетой. Думаю, довольно скоро можно будет делать сайты и прочие веб-приложения на Silverlight без опасений, «а стоит ли у пользователя Silverlight».

Windows 7
Отличная штука, только пока ещё довольно сырая. Пока что внешне – та же Виста (еще не успели сделать новый дизайн), но работает гораздо шустрее. Всё показанное было интересным, но подождём релиза или хотя бы более-менее устойчивой беты.

К тому же мне, как веб-разработчику, хочется поскорее рассказать вам про Internet Explorer 8, потому не буду долго задерживаться на седьмой Windows.


После этого был обед – тоже немаловажная часть мероприятия :) Майрософт явно не поскупился на прокорм разработчиков :) А потом… А потом было то, что заинтересовало меня так же, как и программа для стартапов.


Windows Internet Explorer 8
Пожалуй, один из самых интересных докладов всего мероприятия. По крайней мере, меня этот доклад очень заинтересовал. К сожалению, на нём было не так уж много народа, многие не вернулись после обеда. А может, и не к сожалению. Докладчик (Дмитрий Маленко, компания «СофтСерв») очень подробно рассказал про все новшества в IE8.

Знаете, если 8-ой Эксплорер в релизе будет таким, как его описывали на DevDays, мне будет не стыдно одевать футболку с логотипом IE8 (ага, такие дарили всем присутствующим разработчикам в конце мероприятия).

Смотрите, ведь в нём будет:
- Изоляция вкладок (как в Google Chrome)
- Группирование вкладок (подкраска вкладок, отрывавшихся одна из другой, общим цветом)
- Search Suggest (как и в Firefox, давно пора)
- Автоматическое восстановление вкладок (аналогично)
- В адресной строке домен подсвечивается ярче всего URL-а (мелочь, а удобно, вспомните уже упоминавшийся мною парой строчек выше Google Chrome)
- InPrivate Browser Mode (отключает сохранение истории посещения сайтов – анонимный режим)
- Ну и само собой, новые фильтры безопасности (это очень хорошо)

Но это всё – удобные фишечки-рюшечки для пользователей, но ведь есть много интересных штучек и для разработчиков, и для продвинутых пользователей!
- Быстрый доступ к часто выполняющимся действиям. Такое действие интегрируется прямо в контекстное меню (наподобие firefox-ных плагинов), описывается в специальном xml-файле (OpenService Accelerate Format), поддерживаются GET и POST запросы, а также {selection} – т.е. выделенный пользователем текст.
- Очень интересная технология под названием Web Slieces. По сути, это возможность выбрать на сайте какую-то область и потом загружать её (к примеру, в сайдбаре) без всего прочего контента страницы – только выбранную область. Например, блок с графиком погоды со страницы вашего города на сайте погоды. Это взаимодействие должно обеспечиваться и со стороны разработчиков сайта, потому любую область страницы выделить как веб-слайс нельзя. Блок, который будет работать в том числе и в режиме Web Slieces, должен быть помечен: div class=”hslice”
Внешний вид обеспечивается CSS-стилями родительской страницы, обновление информации в слайсе – через RSS-канал. Состояние сессий не сохраняется, но доступна работа с куками родительского домена.
Согласитесь, очень интересная вещь - эти Web Slieces.
- Search Providers. Быстрый поиск из дополнительного поля возле адресной строки, как в Firefox. Естественно, настраиваемый и расширяемый.
- F12 будет вызывать т.н. Developer Tools (HTML, CSS, JavaScript, Profiler).
- Решены проблемы с утечкой памяти при работы с ajax-приложениями, а также решена проблема с hash при работе с ajax – теперь одна и та же страница с разными hash-ами воспринимается браузером как разные, и, соответственно, нажатие на Back/Forward приведёт к перемещению между этими страницами, а не к уходу с ajax-страницы.
- Рендеринг страниц в различных режимах: IE8 (родной), IE7, IE6 и младше. Отличная штука. Во-первых, удобно при тестировании сайта на работу в различных браузерах. Во-вторых, можно установить «X-UA=Compatible:IE=EmulateIE7», как это сделал, к примеру, Facebook, и не волноваться насчет отображения всяких мелочей в восьмом эксплорере. Эмуляция настраивается либо через meta-теги, либо через headers страницы. К слову сказать, в новой версии SunSpace, над которой я сейчас тружусь, будет выставлена эмуляция работы 7 эксплорера для пользователей бета-версии IE8.

В заключение заметки
Подведя итоги, хочу сказать, что мероприятие в целом очень понравилось, за что большое спасибо докладчикам, создавшим соответствующую атмосферу, и компании Microsoft за их продукты.

Жаль, что в прошлом году не побывал на DevDays, хоть и собирался. В следующем году обязательно постараюсь побывать. Ну а в следующей заметке ждите моего рассказа про Microsoft TechNet, на котором я побывал 12 ноября.

Microsoft DevDays

4 ноября 2008, 17:13
Сегодня весь день провёл на конференции Microsoft DevDays — «Дни разработчика. Осень 2008», которая проходила у нас в Днепропетровске.

Впечатлений масса, очень понравилось. Постараюсь в скором времени написать подробнее, у меня только заметок в записной тетрадке на 8 страниц.

Так что ждите следующей заметки :)

jUpload — что это такое и с чем его едят?

21 октября 2008, 17:14
Как я и обещал в прошлой заметке, продолжу рассказ про свою работу с jUpload.

Выбор технологии

Сначала о том, почему надо было выбирать именно решение, основанное на Java-апплете. Задача стояла так: пользователь должен иметь возможность выбрать папку на своём компьютере (например, с фотографиями, сделанными на прошедшей вечеринке), нажать какую-нибудь волшебную кнопочку типа «Upload all selected files» — и выбранные фото должны закачаться на сайт.

Стандартные html-ные file-input не подходили сразу же. Во-первых, они требуют выборки конкретного файла, во-вторых, не всегда (зависит от браузера) запоминают расположение папки, из которой был выбран предыдущий файл, в-третьих, не позволяют (по умолчанию) включать режим предпросмотра (preview). Безусловно, вместо preview можно включить опцию «Показывать файлы как эскизы», но как показала практика, бОльшая часть пользователей об этом не знает либо же не пользуется этой опцией.
Да и мало кто из пользователей будет иметь достаточно выдержки, чтобы указать 40 файлов, идущих по порядку — по одному файлу за клик. Особенно если файлы имеют название вроде DSN6578.JPG. Тут легко и ошибиться.

Соответственно, стало ясно, что надо пользоваться какими-то более расширенными (по сравнению со стандартными) решениями.

Первой же в голову пришла мысль использовать flash. Да, действительно, подержка flash сейчас есть в браузерах большинства пользователей.

Но к сожалению, flash не позволяет выбирать целые папки с файлами. да, с помощью flash можно сделать достаточное продвинутое окно диалога по выбору файла, например, с выбором файлов по маске, т.е. не «*.*», а, например, «*.jpg; *.gif; *.png» (кстати, ссылка по теме — swfupload.org, неплохое flash-решение для улучшения стандартного html file input, есть примеры по работе с ASP.NET, PHP и другими серверными технологиями). Но пользователю всё равно придётся выбирать каждый файл отдельно. Не совсем то, что было нужно мне для текущей задачи.

Кроме перечисленных, я рассматривал (правда, чисто теоретически) вариант с плагинами для браузеров. Вы вполне могли с таким встречаться, к примеру, на сервисе Яндекс.Фотки. Там точно так же выбираются фотографии, как нужно было и мне — хоть по файлу, хоть целой папкой, с предпросмотром картинок. Но основная тонкость тут вот в чем — чтобы получить весь этот функционал, надо установить плагин для браузера.

А это целое дело. Даже со стороны пользователя это непросто. Надо скачать плагин, решиться на его установку (а ведь не каждый на это решится — кто-то не доверяет, у кого-то и так плагинов много), скачать, установить и перезапустить браузер.

А основных браузеров (пускай даже только под Windows) у нас сколько? IE 6,7, 8, Mozilla Firefox, Opera, Safari, Google Chrome. Как видим, семь. И это без учета разных версий Firefox (плагины в котором тоже не всегда совместимы в разных версиях браузеров). А ведь в Опере, насколько я знаю, плагины так просто не применить.

В общем, этот путь тоже был отброшен ввиду своей сложности.

И таким вот детальным методом перебора я пришел к выводу, что лучше всего использовать Java-апплеты. Тем более, на крупных всемирных социальных сетях (MySpace, Facebook) тоже используются подобные загрузчики, основанные на Java. Кстати, Java — мультиплатформенная.

Конечно, это не самый идеальный вариант, ведь у пользователя на компьютере должна быть установлена Java-машина (Java Runtime Environment, JRE). Я решил проверить, просто ли будет простому пользователю установить у себя на компьютере JRE. Для этого я удалил ту версию JRE (кстати, уже немного устаревшую) со своего лэптопа и зашел на www.java.com, чтобы скачать новую версию Java. Меня попросили проверить, какая версия Java установлена у меня сейчас, потом страница о чем-то «подумала» и попросила меня скачать более новую версию. Скачал дистрибутив на 300 килобайт, запустил, он слазил в интернет, чего-то с java.com вытащил и установил. Я потом посмотрел в папку Program Files/Java, там было 72 мегабайта. Мне кажется, он столько с java.com не утащил, потому что таскал данные он всего несколько минут, а скорость у меня полмегабита.

Так что из этого я сделал вывод,что пользователи с выделенными линиями без особых проблем смогут установить себе JRE. Ну а пользователи без выделенных линий могут и не пробовать, ведь на странице массового загрузчика фотографий сам апплет (подробнее о нём — позже) весит около полумегабайта, да и фотографии с диалапа пачками особенно не закачаешь. Впрочем, людей с выделенными линиями сейчас всё больше, а владельцев диалапов всё меньше, что не может не радовать.

Здравствуй, jUpload, великий и могучий!

Вообще, в сети есть масса Java-апплетов, написанных именно для тех целей, которые мне и были нужны. Зачасту с ними были примеры и решения по работе с ASP.NET. Но у большинства из них есть один, но существенный, недостаток. Они платные. А мне, во-первых, совсем не хотелось платить, а во-вторых, даже если бы я и захотел заплатить, сделать это было бы совсем не просто, ведь живу-то я не в Америке.

И какие не смотрел, ASPUpload, PowUpload или прочие — все платные. Разброс цен очень большой — от $20 до $800. Я уж было совсем приуныл. Но вот тут я нашел jUpload. Знакомьтесь, герой моего сегодняшнего повествования, jUpload, великий и могучий, а также бесплатный для non-commercial использования.

Посмотрите на Live Demo последней версии (0.90): www.jupload.biz/demo/0.90/index-demo.html. В демо-версии файлы закачиваются, но не сохраняются на сервере.

В комплекте с jUpload идет большое число примеров, а также несколько вариантов настроек апплета под конкретные цели.

Обратите внимание на несколько параметров конфигурационного файла: Upload.Http.MaxRequestSize (максимальный размер всех выбранных файлов) и Files.MaxImageSize (максимальный размер одного файла). Значения в них выставлены в байтах.

Не забудьте, что при работе с ASP.NET приложением надо увеличить параметр httpRuntime в секции system.web файла web.config.
(пример: <httpRuntime maxRequestLength="20480" /> — лимит суммарного размера обрабатываемых файлов в 20 мегабайт), иначе ваше веб-приложение не сможет обрабатывать файлы более-менее существенного размера.

И обратите внимание вот на что. В jUpload все конфигурационные файлы имеют название вида jupload.default.config. Если вы попробуете развернуть готовый пример в своем приложении, это не получится, потому что при попытке обратиться из апллета к файлу с расширением .config (вы же помните про корневой Web.config?) будет отказано в доступе.

Просто переименуйте jupload.default.config в jupload.default.config.cfg, например, и все нормально заработает.

И обратите внимание на параметр Upload.URL.Action файла конфигурации jUpload-a. Та страница (файл, скрипт), которая прописана в этом параметре, вызывается через сокет, потому все данные об авторизованности пользователя, само собой, недоступны.

Я решил эту проблему путем передачи в апплет некоего секретного ключа, который у каждого пользователя свой. С его помощью я могу идентифицировать, что за пользователь пытается закачать фото, и может ли он вообще их закачивать.

И вот ещё тонкий момент. Если вы хотите вызвать Upload.URL.Action с некими GET-параметрами, их нужно прописывать не в Upload.URL.Action, как того хочется интуитивно (например, «/upload.aspx?a=1»), а в Upload.Http.Query (например, «Upload.Http.Query=a=1,b=2» равносильно передаче uploader.aspx через строку запроса «?a=1&b=2»).

Руководство к jUpload

На сайту jupload.biz есть online-manual, есть и версия для загрузки. Надо отметить, что давно я не встречал настолько хороших мануалов, в особенности если говорить про open-source продукты. После работы с продукцией Microsoft привыкаешь, что есть MSDN, Books Online и в них всегда можно найти то, что нужно. И когда в других продуктах такого нету, это раздражает и вызывает определённый дискомфорт.

Разработчики jUpload написали очень серьёзный мануал, в нём есть ответы на подавляющую часть вопросов, которые могут возникнуть при работу с jUpload. При работе и настройке аплоадера я пользовался в основном этим документом. За что разработчикам и большое спасибо.

Мораль

jUpload — очень хорошее решение, при необходимости использовать массовый загрузчик файлов с использованием Java-технологий я рекомендовал бы обратить внимание именно на него.

И напоследок

Достаточно интересно получилось. В веб-проекте, основанном на одной технологии (ASP.NET), используется решение на принципиально другой, кроме того, конкурирующей, технологии (Java). Вот вам и mashup, как это любят говорить применительно к web2.0-проектам.

Конечно, если бы была возможность, я бы использовал Microsoft Silverlight, но пока что он не настолько распространён (т.е. Java установлена у бОльшего числа пользователей, хотя установить Silverlight plugin совсем не сложно, да и весит он куда уж меньше Java — примерно как flash plugin, мегабайт с копейками), да и готовых подобных решений (а особенно бесплатных) на Silverlight я не встречал. Потому использую то, что есть. Тем более, то, что есть, отлично работает и подходит для моих целей.

jUpload и прочие файл-аплоадеры

20 октября 2008, 17:17
Добавлено в: Веб-разработки
В новой версии SunSpace можно будет загружать фотографии гораздо удобнее и быстрее, чем это сделано сейчас. Одной из опций будет возможность закачивать папки с фотографиями (например, фото с какого-то мероприятия) буквально в пару кликов — при помощи Java-менеджера.

Подобные интерфейсы вы могли видеть на MySpace, Facebook или ВКонтакте. Я нашел очень удобный и довольно гибко настраиваемый Java-applet под названием jUpload. Он, в отличие от большинства своих «коллег», бесплатен.

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

Клиенты бывают разные — и не всегда разумные

16 октября 2008, 22:30
Нудные заказчики, очевидно, были всегда
Нудные заказчики, очевидно, были всегда

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

Штуки эти совершенно не эстетичны и очень функциональны. И вот пришла в голову их директору мысль сделать сайт. Хорошая, здравая мысль. И так получилось, что нашли они меня через общих знакомых и предложили сделать им сайт. А дело было в самых первых числах августа. Я только с моря приехал, многие только уехали, заказов практически нету.

Сходил к ним в гости, в офис, благо это недалеко от моего дома, минут 10-15 пешком. Вроде бы адекватные люди, в общем и целом понимают, чего хотят. Обсудили с ними структуры, материалы, посмотрели вместе сайты конкурентов, обсудили, что хорошо в них, а что плохо, и что хотелось бы видеть в сайте для Конторы.

Кирилл Зима, с которым я сотрудничаю по поводу дизайна, нарисовал (по тем параметрам, что я ему пересказал) вполне симпатичный макет. Показал — не то. Ну что ж, бывает.

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

Кирилл нарисовал дизайн, как по мне, так очень симпатичный, и что самое главное — отвечающий поставленным требованиям и задачам. Впоследствии он его ещё немного улучшил, получилась весьма симпатично. Несколько раз он его отсылал по почте на утверждение, и каждый раз что-то было не так. Ещё несколько (не знаю точно, сколько именно) он туда съездил. В итоге, заказчик чего-то думал-думал, постоянно менял требования и в конце концов поменял все требования. Можно сказать, на прямо противоположные первоначальным.

У этой истории оптимистичный конец. Мы решили расстаться с этим заказчиком. Посудите сами: любой проект состоит из согласования структуры, дизайна, программной части, наполнения и потом утверждения всего получившегося. И за 2 месяца (с начала августа по начало октября) мы не продвинулись дальше стадии дизайна. Точнее, мы её и не преодолели.

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

А ведь ещё предстояла разработка сайта и наполнение его информацией. Представьте себе, сколько бы времени ушло на это — с таким-то заказчиком.

Мы посовещались и решили, что тратить на одного клиента столько времени просто неразумно, да и продолжать сотрудничество было весьма некомфортно. Вот так мы и закончили работу с Конторой и её функциональными, но некрасивыми Штуками.


P.S. А ещё у них был (и есть) довольно страшный логотипчик. И заметьте, никаких предложений по его изменению (редизайн, ребрендинг — называйте любым модным словом, лишь бы помогло решить вопрос) не принимались.

В итоге выяснилось, что рисовала логотип жена директора, дизайнер. На вполне резонный вопрос о том, а дизайнер чего именно она (судя по нарисованному ею логотипу, она очень плохой дизайнер в части полиграфии), получили ответ, что «она — дизайнер интерьеров».

Попытки объяснить, что дизайнеры, как и программисты, бывают разные, и дизайнер интерьеров практически всегда не специалист в веб-дизайне и полиграфии, успехом не увенчались. Зато в ответ мы получили «гениальный» ответ: «Ну и что, что дизайнер интерьеров, но ведь дизайнер же». Вот так-то.
Страницы: 1 2 3
Илья Барков Я занимаюсь веб-разработками, создаю интересные сервисы.
Живу в Днепропетровске.
Весьма разборчив в музыке.

Люблю продукцию компании Apple, пользуюсь Firefox 5 лет, немало работаю с технологиями Microsoft и весьма этим доволен.
  • Сервис отзывов «2 совета»
  • BMW
  • Социальная сеть SunSpace
Если вам интересен мой блог, подписывайтесь на него — feeds.feedburner.com/barkov