Tuesday, November 11, 2008

AddToFavorites function for IE6, Firefox 3 and Opera 9.6

Solution presented here and in some other places, offered by google doesn't work for me. The solution is to have a link <a href="#" onclick="addToFavorites();" rel="sidebar" id="addToFavoritesLink">Add to Favorites</a> with rel=sidebar attribute.
There are some tricks for this. When you click the link the name for link in the dialog box equals to the title attribute of your link. So i added a javascript function onclick="addToFavorites();". I do the following
function addToFavorites()
{
var lnk = document.getElementById('addToFavoritesLink');
if (lnk!=null)
{lnk.title = 'Some name';}
}

Thursday, October 9, 2008

Джошуа Клессиг , Земля (тм)

Закончил перевод рассказа, оригинал здесь
Перевод ниже

Джошуа Клессиг: ЗЕМЛЯ (tm)
Перевод: Е.С. Федотов, 2008
Было 9 часов 57 минут вечера, три минуты до закрытия.
«К нам только что зашли, они хотят красной свеклы и рикотту с начинкой из жидкокого сыра, плюс еще салат,» раздался голос совсем рядом с кухней Итальянского Ресторана Марсело. Для Адама Ева, шеф-повара, почти наступило время уходить домой. Он жил в нескольких домах от ресторана, находяшегося в Мэдисоне, штат Висконсин. Адам приготовил рикотту, а его помошник – салат. «Рикотта готова», сказал Адам снимая свой рабочий халат и бросая его в бак в углу. Он попрощался с оставшимися на кухне работниками и вышел. Пройдя через заднюю дверь, он пошел по тротуару к своему дому. Он был на полпути, когда заметил на тротуаре что-то мерцающее через дом от него. Подойдя поближе, он обнаружил что мерцает сам тротуар. Выглядело это как телевизионная картинка при плохом приеме. Он потрогал его и тот оказался необычайно гладким, но иногда можно было почувствовать шероховатости. Он вглядывался в тротуар некоторое время и тут мерцание прекратилось. Он продолжил свой путь домой, размышляя о мерцании.
Адам подошел ко входу в здание, где распологалась его квартира. Оно находилось сразу за Стейт стрит, улицей, набитой псевдохиповскими магазинами и барами. Здесь интересно жить, город закрывает улицу по выходным, потому что слишком много народа развлекается и ширяется здесь, так что ездить по улице становится слишком опасно. В любом случае движение тут никогда не было оживленным, может быть потому что было не похоже что дорога ведет куда-нибудь, кроме самого высокого здания в городе, а множество других улиц делали то же самое. На торце его жилого здания имелась большая цветная фреска, комнаты были просторными и обслуживание дома было на уровне. Он набрал код на цифровой клавиатуре рядом с дверью в свою квартиру и вошел.
Он плюхнулся на свой диван и схватил карманный компьютер «Юпитер». Его всегда восхищало, как быстро они превратили маленькую игрушку в полнофункциональный компьютер. Что было большим наладонником на рынке несколько лет назад, Палм Пилот? Он сжал компьютер и направил его на телевизор. Тот ожил, молодой репортер говорил об избирательной кампании Моники Левински на выборах 2004 года. Щелк, и вот MTV. Адам вытянулся на своем диване и погрузился в сон.
Облака, потом гром. В облаках образовалась трещина и стена цифр, букв и знаков полилилась с неба, окружая Адама. Потом все закружилось и его объяла тьма. Он был чистыми данными, соединеным со всем сразу. Раздался голос.
— Черт! Вот опять. Кто-то опять просочился за границу виртуальной среды.
Другой голос, «Я всегда говорил, что REM подпрограмма сна слишком глючная, чтобы ее использовать. Мы должны прекратить ей пользоваться.»
Снова первый голос, «Если они не спят, то она ведет себя как по-настоящему большая неконтролируемая переменная величина при исследованиях. Симулятор должен быть единым целым, иначе поведение будет неточным».
— Ладно, неважно. Я изолировал у объекта нервный канал ввода/вывода. Мы просто обнулим тот сектор...
Внезапная вспышка, потеря ориентации, и вот Адам стоит на кровати. Он не знает почему стоит, или когда он проснулся и встал, но он запомнил сон. Этот сон был не похож на другие, когда память сразу начинает блекнуть как полароидная фотография, только наоборот. Снова садясь на кровать, он смотрел на телевизор, прием был плохой. Он присмотрелся, прием на самом деле был необычно хорош, это само изображение было плохим, рваная, мерцающая картинка тротуара.
Адам схватил свой наладонник и посмотрел на экран. Тоже самое. Он поднялся и подошел к своему компьютеру, тот тоже застыл и показывал ту картинку, которую он видел по дороге домой. Адам нажал кнопку сброса. Экран побелел, потом вернулся к жизни. Вместо нормальной заставки при загрузке, там оказалось изображение вращающейся Земли, а под ней появилась надпись «Добро пожаловать в ОС Земля версия 2.3».
Затем картинка превратилась в экран интерфейса. Адам начал водить мышкой, но обнаружил, что курсора там нет. Он с сомнением попытался коснуться кнопок на экране. Появилась карта мира. Он коснулся США. Она увеличилась и подсветила 50 штатов. Он выбрал Висконсин, потом Мэдисон, потом Стейт стрит, потом свою квартиру. И увидел самого себя сидящего за экраном своего компьютера. Он нажал кнопку отмены. Назад к главному экрану. Он нажал кнопку, помеченную «Голосовое управление».
— Модуль голосового управления активирован. Что вы хотите сделать?
— Что такое Земля?
— Земля является широкомасштабной симуляцией окружающей среды человека, с целью изучения взаимодейсвия человек - человек и взаимодействия человек – окружающая среда. Группа добровольцев из различных слоев общества была отобрана для сканирования мозга устройствами квантовой интерференции. Структуры их мозга были затем использованы в качестве моделей для коренных обитателей Земли.
— Как насчет тепершних обитателей, откуда они взялись?
— Когда два «человека» воспроизводятся, упрошенная составная комбинация их моделей служит основой для новой личности.
— Так я виртуальное существо?
— Согласно нашим записям, да.
— Здесь все модели?
— Нет, некоторые из обитателей земли это исследователи, изучающие человеческое поведение на личном опыте, с помощью устройств для нейронных взаимодействий.
— Нейронных взаимодействий?
— Нейронный интерфейс напрямую соединяет компьютерную систему с сознанием индивида, создавая таким образом полное погружение в среду.
— Хорошо, я работал с компьютерами с детства и знаю кое-что о программировании. Может ли менять Землю и управлять ей?
— Да, используя ОС Земля, вы можете управлять внешними и внутренними условиями. Исследователи подключаются к ОС Земля через наладонники или домашние компьютеры, когда они погружаются в среду Земли.
— Почему они просто не изучают настоящих людей?
— ОС Земля очень управляемая среда, и они могут ставить довольно экзотические эксперименты. И потом, целью этого проекта является не просто изучение человеческого поведения, цель – изучить как личность воспримет реальность которую ей скармливают.
— Что конкретно пытаются найти ученые?
— Человеческое общество достигло точки в которой технологическое/социальное развитие пришло в безвыходное положение. Они пытаются понять, может ли виртуальная среда дать подсказку для дальнейшего продвижения, изменений в истории.
— И когда решение будет найдено, что случится с нами?
— В планах превратить эту программу в своебразное развлечение. Типа снисходительного подглядывания.
— Могут ли люди снаружи видеть меня?
— В данный момент процессоры не следят за вашими действиями. Земля может отслеживать действия 10 миллионов человек одновременно. У процессоров есть свои ограничения.
— Могу ли я быть удален?
— Да.
«Это все, что мне нужно знать. Отключить голосовое управление», сказал Адам и компьютер затих. Он знал, что пройдет немного времени, прежде чем кто-нибудь обнаружит его подключение к ОС Земля. Быстро подумав он схватил наладонник, который ничего не показывал, как впрочем, и телевизор. Он перезагрузил его и тот заработал в обычном режиме. Подключив его в разъем, он стал управлять им с домашнего компьютера. Используя программы в своем наладоннике он создал вирус, защищающий его от удаления, и проверив его продолжил работу с ОС Земля.
«Теперь посмотрим, сработает ли это», и Адам выбрал «черных ход на Землю» на своем наладоннике. Сначала появился маленький экран приветствия, затем всплыло меню. Он нашел файл самого себя внутри Земли, а затем стал играться с параметрами тела. Его тело изменилось, сбросив около 20 фунтов лишнего веса, который он набрал с тех пор как стал шеф-поваром. Он встал перед зеркалом, изучая себя. Потом он выбрал настройку лица, по нему пробежала волна и глаза стали ближе друг к другу, нос стал короче и общий вид улучшился. Следующими были волосы, он поменял цвет со светло-коричневого на черный. Адам забавлялся, но забава могла подождать. Он решил, что если возможности Земли обрабатывать действия индивидуума ограничены, то ему надо попасть туда где плотность населения относительно высока. Используя ОС Земля, он заказал билет на самолет до Мехико Сити, население 22 миллиона. Это значительно лучше, чем холодные зимы в Висконсине. Адам отправился в аэропорт Мэдисона; было 3 часа утра.
На рассвете Адам проходил таможню. Он был уверен, что пройдет, даже если бы у него было оружие, ОС Земля позаботилась об этом. Он подумал от том как он выглядит для центрального компьютера Земли. Думает ли тот, что он просто пользователь, подключившийся к земле, или он похож на очередную программу?
В любом случае, он был уверен, что кто-то снаружи уже узнал, что происходит. Он вышел из аэропорта и пошел по улице. Сперва нужно было найти, где остановиться. Нет, плевать на жилье, сначала нужен транспорт. Он обошел паркинг, стараясь не привлекать внимания, и оказался в дальнем его конце. Вытащив свой наладонник, он выбрал генератор объектов. Маленький двухдверный Олдсмобиль материализовался перед ним.
Он уже был в машине, когда заметил две черные машины, выскочившие впереди и сзади него. Он запаниковал и завел машину. Он сдал назад, развернулся и поехал в обратную сторону. Достав пистолет он выжал газ и поехал прямо к выходу, который теперь блокировала вторая машина. Он позволил трем пулям вылететь из его пистолета, две из них попали в машину, и та начала отъезжать. Адам проехал мимо нее.
Он выскочил на городские улицы, но машины все еще преследовали его. Заднее стекло лопнуло и рассыпалось, когда две пули попали в его машину. Благодаря вирусу, они не могли его ранить, но они все еще могли повредить его тачку.
Адам свернул на другую улицу, аллею, погруженную в сумрак. Еще две пули пролетели сзади него, одна попала в бок машины, в опасной близости от бензобака, другая прошла совсем мимо. Машины теперь находились с двух сторон от него. Одна вмяла его в другую. Адам ударил по тормозам и обе машины проскочили вперед. Он дал задний ход, удаляясь от них.
Двое мужчин выскочили из машин и открыли огонь. Удачный выстрел пробил Адаму шину. Он влетел в стоящее рядом здание. Подушка безопасности сильно ударила его по лицу, он на секунду застыл, но быстро пришел в себя и вывалился из машины на аллею. Потом он побежал, обрывки одежды со свистом развевались за ним. Он поворачивал за угол, когда услышал шаги за спиной, но до того как он смог обернуться, он почувствовал как что-то сильно ударило его сзади. Потом все почернело.
*****
Когда Адам пришел в сознание, он не мог пошевелить ни рукой, ни ногой.Он был привязан к стулу в пустой комнате с очень толстыми стенами. Открылась дверь.
«Ну, не первый ли человек на земле перед нами. Вы знаете, мистер Ева, у вас действительно ироничное имя, ваша модель, это клон одного из первых людей в мейнфрейме Земли. Переработка старых моделей позволяет экономить дисковое пространство», сказал мужской голос. Адам еще не пришел в себя и перед глазами у него все расплывалось. Человек подошел близко к нему, с хрустом открыл капсулу с нюхательной солью и поводил ей перед носом Адама. Тот тут же очнулся.
«Я знаю что в действительности этого можно было и не делать. Я мог бы просто нажать кнопку. Но так веселее», говорил человек, в то время как другой мужчина входил в комнату.
«Где я?» сказал Адам, еще не полностью придя в себя.
«Ты в заброшенном доме, предназначенном на снос. Никто не найдет тебя – не то чтобы это было важно – мы же все еще можем удалять других людей. Это подводит меня к первому вопросу, как получилось, что мы не можем тебя удалить?»
«Я не знаю», солгал Адам, пока человек, который только что вошел, подступил совсем близко к нему.
«О, я думаю ты знаешь», сказал он и ударил Адама пистолетом в лицо.
«Я же сказал, что не знаю», произнес Адам, оглянулся вокруг, увидел свой пистолет, наладонник и бумажник, на столике поблизости.
«Ты знаешь, что пока мы не можем тебя убить», сказал первый, «Ты единственный, кто знает почему, но это не помешает нам мучить тебя пока ты сам не захочешь умереть.» Сказав это, он разорвал рубашку Адама и прикрепил несколько электродов к его груди.
— С их помощью мы можем стимулировать ощущения боли, самой разной, снова и снова, или мы можем перенести троды на более чувствительные места.
«Да пошли вы», с трудом сказал Адам. Второй мужчина нажал кнопку на своем наладоннике, и внезапно Адам почувствовал сильную боль на всей правой стороне тела. Человек отпустил кнопку.
— Теперь ты нам скажешь?
Адам поколебался. «Вирус, я запустил вирус в код Земли».
— Нам не удалось найти вирус.
— Земля настолько сложна, что мне удалось скрыть вирус внутри файла модели, он... он маленький. Заголовок файла находится на моем домашнем компьютере.
«Прекрасно, мы получили то, за чем пришли, и мы больше ... не отвечаем за вас», оба нажали кнопки на своих наладонниках и замерцали, а потом исчезли совсем. Адам допрыгал на своем стуле до стола. Или они не знали, что он может получить доступ к ОС Земля со своего наладонника, или были слишком беспечны. Адам нащупал компьютер и нажал кнопку сбоку.
— Голосовое управление активировано.
— Доступ к Земле.
— Подключено к Земле.
— Загрузить генератор объектов.
— Генератор объектов доступен, ожидаю комманду.
— Дай мне нож.
— Укажите параметры ножа.
— Просто дай мне чертов нож.
Как только он сказал это, в другой его руке материализовался нож. Он раскрыл лезвие и освободился. Они скоро найдут вирус, и Адам запустил программу, которую он создал во время перелета, как последнее убежище. Она извлечет модель его мозга из общего хранилища Земли и сохранит в виде файла. Потом она выгрузит файл по Интернету в мир за пределы Земли. И тогда он будет существовать распределенно в их Интернете. Может быть они передумают, сделают Землю автономной, но времени обдумывать это уже не было. Двое мужчин в форме спецназа материализовались перед ним, держа в руках оружие.
«Брось его», закричали они. Адам отпрыгнул в сторону и воспользовался своим наладонником, чтобы прервать их подключение к Земле. Голоса двоих мужчин затихли, затем их изображения погасли. Потом он запустил программу, которая сильно затрудняла доступ к Земле. Адам выбежал наружу, программа для побега почти закончила загружаться.
На экране наладонника появилось сообщение: «Мы нейтрализовали вирус, теперь ты уязвим. Если ты начнешь закачку, мы удалим тебя», потом компьютер повторил его тихим голосом. Тут же система проинформировала Адама, что Закачка готова, и ему нужно просто нажать кнопку «Закачать». Они уже могли нейтрализовать вирус, это было возможно, но почему тогда у него все еще есть доступ к ОС Земля? Он мгновенно решил ответить на их блеф. И нажал «Закачать».
Наладонник упал на пол. Тело Адама распалось на тысячи кусочков. Потом показалось что он движется во всех направлениях одновременно, все быстрее и быстрее. Белый свет окружил его, и становился тем ярче, чем быстрее он двигался.Фрагменты стали исчезать один за другим, пока не остался последний. Один фрагмент, бесконечный свет, две возможности.

Thursday, September 25, 2008

Joshua Klessig. Earth (tm)

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

Friday, February 29, 2008

Test Multiple Events with Rhino.Mocks

The situation when you should test the raising of one event with Rhino.Mocks is well documented/ But what to do if your page have 2 or more events?
Here is one of possible solutions:

using System;
using System.Collections.Generic;
using MyProject.Presenters;
using MyProject.Presenters.Interfaces;
using NUnit.Framework;
using Rhino.Mocks;
using Rhino.Mocks.Constraints;
using Rhino.Mocks.Interfaces;

// Here we have a page that sends a sms message. We have the ASP.NET ListBox control for
// message templates/ And we have 3 buttons "Add", "Remove" and "Edit". So we need to test // that appropriate events can be raised and the "Presenter" class (we use //(Model-View-Presenter" pattern) is subscibed to those events.

namespace MyProject.Tests.Presenters
{
[TestFixture]
public class SendMessagePresenterTest
{
[SetUp]
public void Setup()
{
mockery = new MockRepository();
e = new EventArgs();
sendMessageView = mockery.CreateMock(typeof (ISendMessageView), null) as ISendMessageView;
}


private MockRepository mockery;
private IEventRaiser raiseEvent;
private ISendMessageView sendMessageView;
private SendMessagePresenter sendMessagePresenter;
private EventArgs e;

[Test]
public void ShouldSubscribeToPageEvents()
{
// we have the list of objects of type IEventRaiser
List listToInvoke = new List();
using (mockery.Ordered())
{
//here we work with IEventRaiser interface of Rhino.Mocks. See the Rhino.Mocks //documentation for details
sendMessageView.AddTemplate += null;
// In this method we make some constraints and we're adding each call to list
PrepareEvent(listToInvoke);
sendMessageView.DeleteTemplate += null;
PrepareEvent(listToInvoke);
sendMessageView.ModifyTemplate += null;
PrepareEvent(listToInvoke);
}
mockery.ReplayAll();
sendMessagePresenter = new SendMessagePresenter(sendMessageView);
//here we invoke all recorded events. If your events have different arguments you can invoke // all events by index like this listToInvoke[1].Raise (null, new MyEventArgs());
foreach (IEventRaiser raiser in listToInvoke)
{
raiser.Raise(null, e);
}

mockery.VerifyAll();
}
private void PrepareEvent(ICollection listToInvoke)
{
LastCall.Constraints(Is.NotNull());
LastCall.IgnoreArguments();
//this is the event to invoke. We register it and then we're adding the event to raise to the //invocation list
raiseEvent = LastCall.GetEventRaiser();
listToInvoke.Add(raiseEvent);
}
}
}