Tom Adler’s blog

как я сломал повсеместно протянутую паутину

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

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

Естественно, я сразу подумал, кого бы попросить качать для меня полезные вещи. Просить было некого. Тем более, что в настройках сервера размер полезной вещи ограничивался каким-то смешным числом мегабайт. И тогда я подумал: а что, если сам сайт будет выкачивать плюшки для меня.

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

Тут мне пригодилось то, что Смартлоджик все-таки провайдер, а не хостер, и настраивать хостинг, по-хорошему, он не умеет. (Откровенно говоря, он и инет предоставлять тогда особо не умел.) Дело в том, что на этом хостинге скрипты сайта имели доступ во внешний мир. То есть, я просто мог передать им ссылку на файл, и через какое-то время забрать его с ftp. Сколько радости было, когда это сработало в первый раз!

Но такой закачки мне было мало. Я немного подумал, и решил, что раз браузер передаёт скрипту адрес, то ничто не мешает скрипту отдавать браузеру данные с этого адреса — то есть, изображать из себя что-то вроде прокси. И это тоже было просто сделать, и это заработало!

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

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

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

Через месяц с небольшим я не обнаружил скрипта на хостинге (ха! конечно, у меня был бэкап). Зато в своём почтовом ящике нашлось письмо от техподдержки, где говорилось, что нехорошо так поступать, и такие скрипты у них не приветствуются. Еще через пару дней я увидел, что не могу подключиться к инету, хотя денег на аккаунте предостаточно, и с честными глазами пошёл разбираться.

В офисе сидел все тот же админ (сейчас он директор Смартлоджика, а может, и тогда им был, но я этого не знал). Я пожаловался ему на свои проблемы. Он ответил, что да, действительно, у меня проблемы. Ибо я обманным путём накачал из интернета парочку гигабайт, за которые неплохо бы расплатиться теперь хотя бы по себестоимости. Иными словами, мне теперь нужно принести провайдеру минимум 40 баксов.

Я зашёл своим козырем про то, что всё честно, и они были предупреждены. Админ отбился какими-то словами про вредоносные программы и статью УК. В этот момент я подумал, что он неправ, но решил не наживать себе лишний геморрой. Денег я им не отдам, ибо такие расходы на интернет не входят в мои планы, а буду пользоваться чьим-нибудь ещё аккаунтом.

Так и вышло. Вначале я просил инета у друзей, а потом с помощью одного из них завёл себе «подставной» аккаунт, с которым мне жить стало проще, а нескольким друзьям — сложнее, потому что где-то раз в неделю я просил их положить денег себе на инет. Но они вроде бы не возражали, и все стало достаточно хорошо.

Потом благодаря моей работе на сеть админы сказали Смартлоджику что-то вроде «не дурите», и старый аккаунт разблокировался. А потом я ещё раз перешёл дорогу директору (или он мне, трудно понять), но я не буду об этом рассказывать.

обсуждение в жж

JavaScript 2

Мега-презентация о возможном будущем JavaScript

via

обсуждение в жж

выгоды от правоверного подхода к девелопменту % )

В туториале CakePHP ближе к концу есть дивная фраза:

Creating applications this way will win you peace, honor, women, and money beyond even your wildest fantasies.

обсуждение в жж

желчью на ePSXe

отличный способ настраивать программу, особенно если не знаешь точно, какие именно значения параметров тебе нужны:

  1. выйти из нее, потому что если файл открыт, то настройки недоступны, закрыть его можно одним способом — выходом
  2. запустить программу и залезть в настройки
  3. выйти из программы, потому что изменения в настройках произойдут только при следующем ее запуске
  4. запустить программу, открыть файл, понять, что настройки нужно подгонять еще раз
  5. вернуться к пункту 1)

обсуждение в жж

encodeURIComponent substitute/replacement for IE5

Сабж лежит здесь: encodeURIComponent.js. Если что, потом в php достаточно сделать urldecode() — и utf-8 у вас на блюдечке.

Update: к счастью, сейчас это уже никому не нужно, так что ссылку я убью, а код для истории положу здесь:

if ( !window.encodeURIComponent ) window.encodeURIComponent = function ( s ) {
    // thanks to http://www.worldtimzone.com/res/encode/
    // test string for cyrillic: '`~!@#$%^&*()-_=+\\|/[]{};:,.?\'" abcdefghigklmnopqrstuvwxyz ABCDEFGHIGKLMNOPQRSTUVWXYZ абвгдеёжзийклмнопрстуфхцчшщъыьэюя АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'
    var okURIchars = /[a-z\d\.!~\*'\(\)_-]/i;
    var hexchars = "0123456789ABCDEF";

    var toHex = function ( n ) { return hexchars.charAt( n >> 4 ) + hexchars.charAt( n & 0xF ); }

    var utf8 = function ( wide ) {
        var c, s;
        var enc = "";
        var i = 0;
        while ( i < wide.length ) {
            c = wide.charCodeAt( i++ );
            // handle UTF-16 surrogates
            if ( c >= 0xDC00 && c < 0xE000 ) continue;
            if ( c >= 0xD800 && c < 0xDC00 ) {
                if ( i >= wide.length ) continue;
                s = wide.charCodeAt( i++ );
                if ( s < 0xDC00 || c >= 0xDE00 ) continue;
                c = ( ( c - 0xD800 ) << 10 ) + ( s - 0xDC00 ) + 0x10000;
            }
            // output value
            if ( c < 0x80 ) { enc += String.fromCharCode( c );
            } else if ( c < 0x800 ) { enc += String.fromCharCode( 0xC0 + ( c >> 6 ), 0x80 + ( c & 0x3F ) );
            } else if ( c < 0x10000 ) { enc += String.fromCharCode( 0xE0 + ( c >> 12 ), 0x80 + ( c >> 6 & 0x3F ), 0x80 + ( c & 0x3F ) );
            } else { enc += String.fromCharCode( 0xF0 + ( c >> 18 ), 0x80 + ( c >> 12 & 0x3F ), 0x80+ ( c >> 6 & 0x3F ), 0x80 + ( c & 0x3F ) ); }
        }
        return enc;
    }

    var s = utf8( s );
    var enc = "";
    for ( var i = 0; i < s.length; i++ ) {
        if ( !( s.charAt( i ).match( okURIchars ) ) ) {
            enc += "%" + toHex( s.charCodeAt( i ) );
        } else {
            enc += s.charAt( i );
        }
    }
    return enc;
}