<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5594155629928231779</id><updated>2011-12-21T19:42:39.121+04:00</updated><title type='text'>Интернет вокруг программера</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://partnerguide.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5594155629928231779/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://partnerguide.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Горбачёв</name><uri>http://www.blogger.com/profile/08494731560185139223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>4</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5594155629928231779.post-4312503111086056228</id><published>2009-11-20T15:56:00.001+03:00</published><updated>2009-11-20T16:02:45.770+03:00</updated><title type='text'>Гуглос - больше нет идей</title><content type='html'>Все уже знают, что Гугл показал Chrome OS, в которой ничего нельзя запустить, кроме браузера.&lt;br /&gt;&lt;br /&gt;Вот смотрю я на последние проекты Гугла и понимаю, что никаких новых идей у них больше нет. Кто помнит про их "убийцу Википедии"? А "Виртуальные миры"? Я даже названий этих проектов не помню.&lt;br /&gt;&lt;br /&gt;Что я для себя вынес из этих историй: Если есть ресурсы, делай всё, что придёт в голову, а потом посмотришь, что из этого получится. Этакий "(не только) мозговой штурм" - т.е. когда не только высказываются любые идеи, но и сразу воплощаются, а уж потом ненужные умирают.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5594155629928231779-4312503111086056228?l=partnerguide.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://partnerguide.blogspot.com/feeds/4312503111086056228/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5594155629928231779&amp;postID=4312503111086056228' title='Комментарии: 5'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5594155629928231779/posts/default/4312503111086056228'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5594155629928231779/posts/default/4312503111086056228'/><link rel='alternate' type='text/html' href='http://partnerguide.blogspot.com/2009/11/blog-post_20.html' title='Гуглос - больше нет идей'/><author><name>Горбачёв</name><uri>http://www.blogger.com/profile/08494731560185139223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5594155629928231779.post-2148559182689773291</id><published>2009-11-18T13:30:00.001+03:00</published><updated>2009-11-18T13:48:43.862+03:00</updated><title type='text'>Делаем файлообменник [3: Отдача файла]</title><content type='html'>Здесь теория, потому как это ещё не готово.&lt;br /&gt;&lt;br /&gt;В общем, при отдаче нужно:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Проверять, имеет ли этот пользователь право скачивать этот файл&lt;/li&gt;&lt;li&gt;Проверять, не идёт ли этому пользователю отдача этого или другого файла&lt;/li&gt;&lt;li&gt;Ограничивать скорость отдачи&lt;/li&gt;&lt;/ul&gt;Основаная проблема здесь - при ограничении скорости отдачи мы получим большое количество одновременных соединений, что при стандартной для большинства веб-серверов pre-fork модели приведёт к большому количество процессов веб-сервера, а значит к расходу оперативки и замедлению работы системы (из-за повышенных расходов на планирование приоритетов и переключение процессов).&lt;br /&gt;&lt;br /&gt;Обычно для таких задач используют сервер, построенный по модели &lt;a href="http://ru.wikipedia.org/wiki/%D0%9A%D0%BE%D0%BD%D0%B5%D1%87%D0%BD%D1%8B%D0%B9_%D0%B0%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82"&gt;конечного автомата&lt;/a&gt;(&lt;a href="http://ru.wikipedia.org/wiki/%D0%90%D0%B2%D1%82%D0%BE%D0%BC%D0%B0%D1%82%D0%BD%D0%BE%D0%B5_%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B5"&gt;автоматное программирование&lt;/a&gt;). В этом случае один процесс сможет эффективно обслуживать большое количество соединений. Для своей реализации я нашёл &lt;a href="http://poe.perl.org/?What_POE_Is"&gt;библиотеку на Perl&lt;/a&gt;, с помощью которой такой сервер можно достаточно просто написать - &lt;a href="http://poe.perl.org/?POE_Cookbook/Web_Stream_Server"&gt;пример реализации веб-сервера для отдачи файла&lt;/a&gt;&amp;nbsp;(без проверок и ограничения скорости) занимает менее 100 строк кода. Но, ещё раз повторюсь, это всё пока теория, требующая проверки.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Предыдущие части: &lt;a href="http://blog.rumoneybook.net/2009/11/1.html"&gt;1: Планирование&lt;/a&gt;, &lt;a href="http://blog.rumoneybook.net/2009/11/2.html"&gt;2: Индикатор загрузки&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5594155629928231779-2148559182689773291?l=partnerguide.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://partnerguide.blogspot.com/feeds/2148559182689773291/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5594155629928231779&amp;postID=2148559182689773291' title='Комментарии: 10'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5594155629928231779/posts/default/2148559182689773291'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5594155629928231779/posts/default/2148559182689773291'/><link rel='alternate' type='text/html' href='http://partnerguide.blogspot.com/2009/11/3.html' title='Делаем файлообменник [3: Отдача файла]'/><author><name>Горбачёв</name><uri>http://www.blogger.com/profile/08494731560185139223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5594155629928231779.post-4959804457242985708</id><published>2009-11-15T10:00:00.000+03:00</published><updated>2009-11-15T10:00:03.085+03:00</updated><title type='text'>Делаем файлообменник [2: Индикатор загрузки]</title><content type='html'>Итак, на странице есть форма с полем для выбора файла.&lt;br /&gt;&lt;br /&gt;Если просто отправить эту форму, то браузер попытается вывести результаты, т.е. перезагрузит страницу. А нам она нужна для вывода индикатора загрузки. Поэтому нужно чтобы результаты отправки приходили не в текущее окно. Вообще говоря, результаты загрузки нам совсем не нужны, так что мы перенаправим их в невидимый фрейм.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Делаем на странице невидимый фрейм&lt;/li&gt;&lt;li&gt;Для формы устанавливаем target="имя_невидимого_фрейма"&lt;/li&gt;&lt;/ul&gt;Теперь при отправке формы страница не перезагружается. И, кстати, во время отправки форма нам тоже уже не нужна, а точнее, поле выбора файла и кнопка отправки.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;При отправке скрываем поле выбора файла и кнопку отправки&lt;/li&gt;&lt;/ul&gt;Для индикатора загрузки возможны варианты: а) переодически опрашивать состояние загрузки файла, б) открыть соединение, в которое сервер будет переодически скидывать состояние. Выберем вариант "а" - он проще в исполнении.&lt;br /&gt;&lt;br /&gt;Организуем переодические запросы к серверу, возвращающие состояние загрузки. Какие именно данные входят в состояние загрузки? Минимум: размер файла, размер загруженной части, код состояния (ок, ошибка, что-то ещё).&lt;br /&gt;&lt;br /&gt;Как именно получить эти данные, зависит от реализации загрузки. Один из вариантов такой: Принимающий скрипт после приёма каждой порции данных складывает данные состояния загрузки в известное место - строку БД или файл, по ID загрузки. Так как ID загрузки должен быть известен на клиенте, то и формировать его будет тоже клиент (например, с помощью Math.random()). Нужно добавить его скрытым полем в форму отправки файла и в запрос состояния. Что получилось.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Перед отправкой файла формируем ID загрузки и добавляем поле в форму отправки&lt;/li&gt;&lt;li&gt;Принимающий скрипт после приёма каждой порции сохраняет данные состояния загрузки (куда-нибудь), с идентификатором ID загрузки.&lt;/li&gt;&lt;li&gt;Со страницы идут AJAX запросы состояния (с ID загрузки) каждые 2-4 сек.&lt;/li&gt;&lt;li&gt;При получении данных о состоянии загрузки, на странице обновляется индикатор загрузки.&lt;/li&gt;&lt;/ul&gt;Индикатор может быть простой строкой "Загружено XX из XXX Кб" или "графическим" - можно пропорционально изменять ширину div'а, к примеру.&lt;br /&gt;Осталось только по окончании загрузки сохранить в БД информацию о сохранённом файле&lt;br /&gt;&lt;ul&gt;&lt;li&gt;После приёма последней порции файла, информация о нём сохраняется в БД.&lt;/li&gt;&lt;li&gt;В состояние загрузки записывается "ОК"&lt;/li&gt;&lt;li&gt;После приёма на клиенте состояния "ОК" выключаем опрос состояния, скрываем индикатор загрузки и показываем пользователю "Приём файла завершён успешно".&lt;/li&gt;&lt;/ul&gt;В следующий раз рассмотрим отправку адресату ссылки для скачивания файла.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5594155629928231779-4959804457242985708?l=partnerguide.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://partnerguide.blogspot.com/feeds/4959804457242985708/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5594155629928231779&amp;postID=4959804457242985708' title='Комментарии: 4'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5594155629928231779/posts/default/4959804457242985708'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5594155629928231779/posts/default/4959804457242985708'/><link rel='alternate' type='text/html' href='http://partnerguide.blogspot.com/2009/11/2.html' title='Делаем файлообменник [2: Индикатор загрузки]'/><author><name>Горбачёв</name><uri>http://www.blogger.com/profile/08494731560185139223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5594155629928231779.post-5722674715950775077</id><published>2009-11-13T13:14:00.001+03:00</published><updated>2009-11-13T13:15:17.410+03:00</updated><title type='text'>Делаем файлообменник [1: Планирование]</title><content type='html'>&lt;strong&gt;Вступление&lt;/strong&gt;&lt;br /&gt;Что-то у меня в последнее время настроение заняться чем-то общественно-полезным. Пусть это будет цикл постов про создание файлообменника.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Определимся с целью&lt;/strong&gt;&lt;br /&gt;Должен получится сервис, похожий на YouSendIt.com. Вот так кратенько и сформулировал все требования к функционалу:)&lt;br /&gt;Немного разверну - пользователь может загрузить файл и указать эл.почту (или несколько), на которую придёт ссылка на скачивание файла. Получивший ссылку человек может скачать файл себе на комп. Всё без регистраций и прочих сложностей.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Подумаем, как это будет работать&lt;/strong&gt;&lt;br /&gt;Очевидно, что на главной странице должна быть форма с полями для ввода адресов почты, выбора файла, ну и можно ещё пусть будет поле для комментария.&lt;br /&gt;Так как файлы будут пересылаться большие, стандартный способ загрузки файлов нужно расширить, чтобы пользователь видел какая часть файла уже загрузилась и сколько ещё осталось ждать.&lt;br /&gt;&lt;br /&gt;После принятия файла нужно отослать по указанным адресам письма со ссылкой на страницу отдачи файла.&lt;br /&gt;&lt;br /&gt;С отправлением вроде больше никаких сложностей не будет.&lt;br /&gt;&lt;br /&gt;Что нужно для приёма? Допустим, мы хотим ограничить скорость скачивания (чтобы все у всех пользователей были равные возможности:)) и количество скачиваний. С первой задачей можно справиться настройкой веб сервера (nginx это умеет, насколько я помню). А вот со второй так просто не прокатит. Нужно отдавать файл самостоятельно - т.е. через скрипт. При каждой отдаче он будет обновлять в БД время последней отдачи и количество отдач. А потом уже отдавать файл. Ещё один плюс отдачи через скрипт - если мы захотим сделать защиту файла паролем - это легко можно устроить.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Вот и определились с задачами&lt;/strong&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Страница с формой загрузки + Индикатор загрузки&lt;/li&gt;&lt;li&gt;Отправка писем &lt;/li&gt;&lt;li&gt;Скрипт на отдачу&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;В следующей серии подробнее рассмотрим работу индикатора загрузки.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5594155629928231779-5722674715950775077?l=partnerguide.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://partnerguide.blogspot.com/feeds/5722674715950775077/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5594155629928231779&amp;postID=5722674715950775077' title='Комментарии: 8'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5594155629928231779/posts/default/5722674715950775077'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5594155629928231779/posts/default/5722674715950775077'/><link rel='alternate' type='text/html' href='http://partnerguide.blogspot.com/2009/11/1.html' title='Делаем файлообменник [1: Планирование]'/><author><name>Горбачёв</name><uri>http://www.blogger.com/profile/08494731560185139223</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>8</thr:total></entry></feed>
