Category: it

Category was added automatically. Read all entries about "it".

WebDAV Облако Mail.Ru



Несколько лет назад компания Mail.Ru проводила щедрую раздачу на своём облачном хранилище. Я оказался счастливым обладателем 1ТБ.
Но выяснилась неприятная особенность: их можно использовать только для синхронизации со своим локальным диском. Стал искать в интернетах, есть ли возможность подключить облако как сетевой диск (WebDav). Нашёлся даже официальный сайт https://webdav.cloud.mail.ru, но с закрытым доступом. Проблема волновала не меня одного. На хабре оказалось довольно много статей на данную тему: на текущий момент есть как минимум доступ к непубличному API, плагин для TotalCommander и консольное приложение. TotalCommander'ом не пользуюсь, консольное приложение использует открытый ввод логина/пароля, ни одно приложение не поддерживает двойную аутентификацию.

Решил допилить консольное приложение (написано на .net) до юзабельного состояния, основные критерии:

  • UI интерфейс: логин/разлогин, сворачивается в трей;

  • Поддержка двойной аутентификации;

Исходники выложил на ГитХаб. Готовое приложение можно скачать по ссылке.


Чтобы подключить сетевой диск, необходимо запустить программу MailRuCloudWebDav.exe, ввести свои учётные данные на сервисе Mail.Ru, авторизоваться. Далее в мастере подключения сетевого диска Windows (или в консоли с коммандой net use) указать папку «http://127.0.0.1:8080»:

Настройки локального сервера хранятся в файле MailRuCloudWebDav.exe.config.

Отправка сообщений между клиентом и сервером в реальном времени.

На работе почувствовал, что проект недостаточно «отзывчив».
Есть интерфейс со списком элементов. Каждый элемент характеризуется набором свойств, в т.ч. у него меняется статус. Редактирование элемента происходит в новом окне. Следовательно, отредактировав его, и переключившись на вкладку со списком, хочется видеть, что он уже изменился, стал не такой как прежде [, бросил пить, курить, и, вообще, теперь хороший человек :)].
В качестве back-end'а используется iis с asp.net mvc. Первой итерацией решил попробовать polling/long polling техники, как максимально простые, использующие стандартные асинхронные запросы к серверу.
Опирался на метод, описанный Клэем в статье WebSockets is cool, but what can you do today?
В клиенте делал $.post и прицеплял таймер:
setTimeout(function () {
            getMessages();
        }, 500)

На уровне сервера: создал асинхронный контроллер с менеджером количества запросов.
Всё бы хорошо, но где-то в таймере я ошибся. Страница периодически подвисала на 0.5-2 мин, данных из контроллера не приходило.
Вопрос этот отложил, до будущих свободных времён.
На курсе по javascript предоставилась возможность поинтересоваться у Миши. Он посоветовал веб-сокеты, которые я отмёл в начале из-за частичной поддержки в браузерах (надо включать вручную, т.к. старые версии протокола не безопасны). Привёл пример использования в Node.js (socket.io) — там это делается в несколько строк, быстро и просто. 
 Незащищённую версию протокола поддерживают все основные браузеры, что не фатально для текущих дел, поэтому всё-таки решил попробовать. Поиск выдал несколько библиотек для работы в среде .net, по гитхабу сравнил уровень поддержки, документации и дату последних коммитов. Выбор пал на SignalR. По мере доступности использует технологии: WebSockets - Server Sent Events - Forever Frame - Long polling.
Инициализация и отправка сообщений из клиента реализуется просто:
$(function () {
            // Proxy created on the fly
            var signal = $.connection.signal;
            // Call the chat method on the server
            //do something
            var msgVal = ...

            // Start the connection
            $.connection.hub.start(function () { signal.send(msgVal) });
        });

На сервере класс выглядит ещё проще:
 [HubName("signal")]
    public class signal : Hub
    {
        public void Send(string message)
        {
            //Call the addMessage method on all clients.
            Clients.addMessage(message);
        }
    }

Всё бы хорошо, но возникла необходимость создавать сообщения и на сервере. Следуя документации, в версии 0.5 это делается вызовом контекста соответствующего хаба в контроллере:
var context = GlobalHost.ConnectionManager.GetHubContext();
         context.Clients.say(message);

Но вызова не происходит. В трекере уже создана задача. Посмотрел stackoverflow, в одном из ответов, как решение, предложили вызывать статический метод из самого класса хаба, где динамически вызывается метод addMessage. После замены на context.Clients.addMessage(message), сообщения пошли:)

P.S. Вводная лекция Дэмиана, разработчика SignalR vimeo.com/43659069.

QuTheatre

 Для диплома писал игрушку, которая, предполагается, заинтересует малышей и школьников-первоклашек :) Правдами-неправдами решил использовать QStateMachine. В программе, конечно, притянута за уши, но функцию свою выполняет. Приложение представляет из себя подобие театра: имеются фигуры, которые пользователь двигает по временной шкале, а так же предметы, остающиеся неподвижными во время всей сцены. Включена возможность простым перетаскиванием только что нарисованный палку-палку человечек включить в увлекательное путешествие, организованное ребёнком :)


 



Исходники программы располагаются здесь. Чтобы скачать скомпилированный вариант в виде win32 приложения (рекомендуется Vista/7) нужно пройти по этой ссылочке.
  • Current Music
    ATB — The sunset beach DJ session
  • Tags
    ,

первый снег


Помню детское неподдельное чувство радости. Просто хорошо как-то на душе, свежо. Природа засыпает, а тебе хочется идти в бой, сделать уже то, что так давно планировал. Например, слепить снеговика :)
 Collapse )