?

Log in

No account? Create an account
Расширение для раскрытия коротких ссылок.
ejuo
 Зафигачил расширение для Оперы, Хрома и Фаерфокса. Занимается разыскиванием настоящих адресов, которые закодированы под короткими ссылками (типа такой). Настоящий адрес выводится в виде тайтла при наведении на ссылку.
 Объясню смысл сие творения. Короткие ссылки совершенно не информативны. Под ними может скрываться что угодно: сайты, музыка, пути к фотохостингам или сами jpg. Ссылка http://youverysexymegadisplaypornking.xxx/Eclecticism_in_modern_art.mp4, например, где всё ясно и понятно, или вот bit.ly/15kHEeF - русская рулетка, пройди, скачай 4Гб HD видео, порадуй себя :)
 Изначально хотелось чего-то изящного, унифицированного, простого, лёгкого, как белое облачко средь ясного неба :) Но в итоге вышла россыпь расширений и прокси-сервер в придачу. Обрисовал схему работы расширения:

Создаётся фоновый процесс, ищущий по шаблону вхождения (пока список коротких ссылок захардкоден). Далее этот список XHR запросом отправляется на гугловский appengine с включённым Access-Control-Allow-Origin = "*". В последнее время они проводят жёсткую политику, если количество входящих запросов взлетит до неведомых высот, то создатель сможет послать только лучи сочувствия и сожаления. Это очень узкое место.
Серверный Java-код создаёт соединение, далее получает заветный Location из заголовка запроса:
         HttpURLConnection connection = (HttpURLConnection) url.openConnection();
         connection.setInstanceFollowRedirects(false);
         connection.connect();
         String expandedURL =  connection.getHeaderField("Location");

В итоге полученный массив раскидывается по атрибутам title в выбранных ссылках.
sleexample
Наступает счастье. Теперь видно, куда нас послали и стоит ли туда вообще ходить.

Гитхаб расширения: здесь.
Расширение для Оперы, Хрома, Фаерфокса.
Tags: ,

Тай, Январь 2013
ejuo
Tags: ,

Отправка сообщений между клиентом и сервером в реальном времени.
ejuo
На работе почувствовал, что проект недостаточно «отзывчив».
Есть интерфейс со списком элементов. Каждый элемент характеризуется набором свойств, в т.ч. у него меняется статус. Редактирование элемента происходит в новом окне. Следовательно, отредактировав его, и переключившись на вкладку со списком, хочется видеть, что он уже изменился, стал не такой как прежде [, бросил пить, курить, и, вообще, теперь хороший человек :)].
В качестве 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.
Tags: ,

Souther video
ejuo
Tags: ,

Souther
ejuo

Tags: ,

***
ejuo
Ехали на закат. Промокли насквозь, но эти эпичные раскаты превзошли ожидания.


Ехали делать плакаты, но на лужайке никого не было. Лишь свежая, ещё не скошенная трава, наполненная одуванчиками и невероятным запахом.
 
Сроки, планы, работа на результат, дедлайны — лишь прелюдия. Главное — где-то в воздухе, в фиолетовой дымке пылающего восхода.
Tags: , ,

***
ejuo

Tags:

Песок
ejuo


Накопившаяся рефлексияCollapse )

Tags: ,

***
ejuo

Tags:

***
ejuo

Tags: