?

Log in

Спешу обрадовать тех веб-разработчиков, кто в своём JavaScript коде использовал свойство стиля background-image или background, при этом ориентируясь на позиции символов и получая адрес фоновой картинки через slice. Теперь ваш код не работает :)

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

Дело в том, что вопреки общепринятым стандартам (видимо, ради совместимости с Apple-овской версией WebKit) это свойство всегда хранилось в Chromium в формате url(src) вместо url("src"), то есть без кавычек. Теперь кавычки добавили - и старый код, где это не было учтено, больше работать не будет. Другого выхода это исправить, конечно же, не было, но могли бы хоть какой-то пресс-релиз сделать по этому поводу. В общем, как и в случае со сменой алгоритма рендеринга шрифтов, никого не спросили.

Вносите правки, господа)

http://vk.com/note1845668_11846626
I have always been the type
to think before I speak
I have always been the type
to look before I leap
And like the bolt out of the blue
I was struck and there was you
For the moment I believed
that I could let go


You lift me up into the sky
It feels like I could fly
Never gonna die
N' I almost made it but not quite
Now you're flying out of sight
And you know I can't come with you
I'll always be scared of heights


I didn't think I'd meet someone
who'd make me change my ways
Never thought I'd find someone
who'd brighten up my days
Someone who made me forget
My hands were tied, my wings were clipped
Someone who made me believe
that I could let go


You lift me up into the sky
It feels like I could fly
Never gonna die
N' I almost made it but not quite
Now you're flying out of sight
And you know I can't come with you
'Cause I'll always be scared of heights
Scared of heights


I wish I never knew how great
it feels up in the air
Wish I never got to feel
the wind blow through my hair
Well, in my dreams you'll always be
Flying high along with me
In my dreams I'll always feel
that I can let go


You lift me up into the sky
It feels like I could fly
Never gonna die
N' I almost made it but not quite
Now you're flying out of sight
And I know I can't come with you
'Cause I'll always be scared of heights
I'll always be scared of heights
Всегда я думал прежде чем
произнести слова,
Осматривался перед тем,
как сделать первый шаг
И вдруг внезапно, словно гром
Явилась ты - и я сражён,
Я поверил, что свобода –
это не сон


И я взлетаю в вышину,
Словно окрылён,
Как будто не умру,
Забыв про горе и печаль,
Но ты улетаешь вдаль,
Только мне нельзя с тобою,
Я боюсь высоты, как жаль


Я ни разу не встречал
таких людей, как ты,
Кто может вдруг раскрасить жизнь
и подарить мечты,
И я на миг забыл про страх,
Забыл про путы на руках,
Я поверил, что свобода –
это не сон


И я взлетаю в вышину,
Словно окрылён,
Как будто не умру,
Забыв про горе и печаль,
Но ты улетаешь вдаль,
Только мне нельзя с тобою,
Я боюсь высоты, как жаль
Как мне жаль


Лучше б мне не знать, как там
чудесно в небесах,
Лучше бы не чувствовать
тот ветер в волосах,
Но ты всегда теперь во сне
Паришь со мною в вышине,
И я знаю, что свобода –
это не сон


И я взлетаю в вышину,
Словно окрылён,
Как будто не умру,
Забыв про горе и печаль,
Но ты улетаешь вдаль,
Мне нельзя лететь с тобою,
Я боюсь высоты, как жаль
Я боюсь высоты, как жаль


http://vk.com/note1845668_11745603
À l'horizon, une touche d'argent
Comme après l'orage, s'en vont les nuages
Les nuits d'été, sommeils oubliés
Grâce à ton parfum, je retrouve mon chemin


Il pleut de l'or,
Chaque fois que tu me parles d'amour
Il pleut de l'or
Il pleut de l'or,
Ensemble partons pour faire le grand tour
Sous la voûte étoilée,
Les destins sont dorés
Il pleut de l'or


Et au matin, secret commun
Des regards échangés sont complices de l'été
Le jour chasse la magie
Restent les yeux qui brillent


Il pleut de l'or,
Chaque fois que tu me parles d'amour
Il pleut de l'or
Il pleut de l'or,
Ensemble partons pour faire le grand tour
Sous la voûte étoilée,
Les destins sont dorés
Il pleut de l'or,
Toute la nuit et jusqu'à l'aurore
Il pleut de l'or


Danse avec moi, vole avec moi
Parle tout bas, parle moi


Il pleut de l'or
Il pleut de l'or
Il pleut de l'or,
Ensemble partons pour faire le grand tour
Sous la voûte étoilée,
Les destins sont dorés
Il pleut de l'or,
Toute la nuit et jusqu'à l'aurore
Il pleut de l'or
Чист горизонт, светясь серебром
Нет облаков, словно ливень прошёл
Отблеск в ночи забытой мечты,
Твой аромат путь укажет назад


Солнечный дождь
Идёт, когда ты шепчешь "люблю",
Солнечный дождь
Солнечный дождь,
Вдвоём с тобой нас вдаль унесёт
На рубеже миров
Лишь золото и любовь,
Солнечный дождь


Утром рассвет сохранит наш секрет,
Лето поймёт эти взгляды без слов,
Мы будем днём гнаться за волшебством,
Только б он не погас, этот блеск наших глаз


Солнечный дождь
Идёт, когда ты шепчешь "люблю",
Солнечный дождь
Солнечный дождь,
Вдвоём с тобой нас вдаль унесёт
На рубеже миров
Лишь золото и любовь,
Идёт всю ночь
Золотой бесконечный дождь,
Солнечный дождь


Танцуй со мной, лети со мной,
В дымке паря золотой


Солнечный дождь
Солнечный дождь
Солнечный дождь,
Вдвоём с тобой нас вдаль унесёт
На рубеже миров
Лишь золото и любовь,
Идёт всю ночь
Золотой бесконечный дождь,
Солнечный дождь

http://vk.com/note1845668_11819514
В этой статье я постараюсь осветить основные вопросы и подводные камни, связанные с переходом на язык программирования C# с языка Java. 

В интернете есть немало источников по этой теме, начиная от Cheat-Sheat от Microsoft, заканчивая разнообразными обзорами энтузиастов. Тем не менее, и то и другое нельзя назвать дотаточно удобным средством ознакомления с новым языком - прежде всего, в силу поверхностности рассмотрения и излишней краткости.

Моя цель - постараться дать максимально подробное и развёрнутое описание ключевых особенностей C# с точки зрения программиста Java.

Итак, начнём с терминологии. Несмотря на то, что в книге Бена Ватсона, лежащей передо мной на столе, классы в C# именуются типами, я всё же буду в рамках этой статьи называть их классами, по аналогией с Java. Дело в том, что в C# типы делятся на структуры и ссылочные типы (т.е. привычные классы из Java). Есть ещё делегаты, но об этом чуть позже. Так что, такая терминология позволит избежать возможной путаницы.

Итак, в чём основные отличия? Начнём с базовых понятий. C#, как и Java, объектно-ориентированный язык со строгой типизацией. В C#, также как в Java, есть наследование, причём множественного наследования  нет. Там и там есть интерфейсы, и вот их можно реализовывать в любом количестве. И там, и там есть абстрактные классы. В абстрактных классах все методы или их часть являются абстрактными, т.е. не имеют реализации. Здесь наблюдается полное сходство, вплоть до синтаксиса (ключевое слово abstract). Так же обстоит дело и с final клссами и методами, разве что вместо ключевого слова final C# использует слово sealed.

Вместо ключевого слова import используется слово using, вместо package my_pkg; - namespace my_space { }, причём весь наш код помещается внутри этих фигурных скобок.

Наследование осуществляется похожим образом, только вместо слова extends следует ставить знак двоеточия : .

Также, как и в Java, у класса есть конструктор по умолчанию. Если мы не задали ни одного конструктора, система сгенерирует конструктор автоматически. Всё, что он будет делать - вызывать дефолтный конструктор предка.
Если мы хотим в явном виде определить, какой конструктор предка вызвать в начале своего конструктора - как и в Java, нам потребуется это указать. Как мы помним, в Java такой вызов обязан стоять в коде первой строкой, то есть до выполнения всех других команд. В C# ситуация аналогична; более того, здесь, видимо, ради наглядности, такой вызов пишется ещё до тела конструктора, сразу после сигнатуры:

Вызов конструктора родительского классаCollapse )

Вместо привычного слова parent в C# принято ключевое слово base.

Существенные различия начинаются во время переопределения методов родительского класса.
Во-первых, при переопределении обычного метода следует указывать модификатор override (в Java это была лишь аннотация).
Во-вторых, в Java все методы виртуальны. В C# - наоборот. Чтобы сделать метод виртуальным, используется специальное ключевое слово virtual. Для тех, кто не в курсе, что это означает. Виртуальность метода предполагает, что он не привязан к конкретному классу. То есть, вызывая переопределённый метод класса-потомка даже через ссылку типа предка, мы в итоге получим реализацию потомка, так как она хранится в его таблице виртуальных функций. Здесь играет роль тип объекта, а не переменной, которая на него ссылается. В случае невиртуального метода - только тип переменной-ссылки будет определять, какая реализация будет вызвана.
Расмотрим пример:

Переопределение виртуальных и невиртуальных методовCollapse )

Эта программа выведет следующее:

Результат выполненияCollapse )

Как видно из этого листинга, в случае с виртуальным методом при обоих вызовах исполнился код потомка. В случае же с невиртуальным методом всё зависело от ссылки, через которую делался вызов.  Обратите внимание, что в случае переопределения невиртуального метода используется слово new, что ещё раз напоминает о том, что мы не перекрываем родительскую реализацию, а добавляем  новую. 
Отсюда можно сделать такой вывод: делая метод виртуальным, мы лишаем потомка подобной "полиморфности". Тем не менее, даже в этом случае мы сможем вызвать реализацию предка, обратившись к ней явно: base.DoSomethingVirtual(). Поэтому, во избежание ошибок, если только нам специально не требуется получить такое поведение, стоит делать переопределяемые методы виртуальными - это избавит от путаницы.
Следующее новое понятие C# - это свойства. Свойства проще всего представить себе как внешние интерфейсы доступа к полям. Создавая свойство, в лаконичной форме задаются привычные любому Java-программисту геттер и сеттер, причём геттер оперирует со значением поля (он может как-то обработать его перед выдачей, а может вообще выдать что-то другое, хотя это уже лишено всякого здравого смысла), а сеттер оперирует значением value (то, что присвоили извне, записывая его в поле (при этом он тоже может его обработать перед записью). 
Сеттер можно сделать приватным; в таком случае, изменять свойство можно будет только внутри класса. Обычно свойствам дают имена соответствующих им полей, заменяя первую букву имени поля на заглавную.
Рассмотрим пример элементарных геттера и сеттера, которые ничего не делают, кроме своей прямой функции:

Задание свойстваCollapse )

Такие простейшие свойства применяются в C# буквально на каждом шагу. Поэтому для них придумали специальную сокращённую форму записи: 

Задание свойства в сокращённой формеCollapse )

Оцените краткость подобной записи! Код стал компактнее и изящнее в разы.
Также есть способ сделать приватный примитивный сеттер:

Задание свойства в сокращённой форме с приватным сеттеромCollapse )

Таким образом, классы в C# могут иметь не только методы и поля, но ещё и свойства. 
И последнее, о чём я расскажу в этой части, это структуры. Структурный тип в C# всегда передаётся по значению, а не по ссылке. В этом он схож с примитивными типами данных. От него нельзя наследоваться, он не может иметь пользовательский конструктор без параметров (но при этом такой конструктор всегда создаётся в неявном виде и заполняет все поля структуры нулями). Все поля структуры должны быть проинициализированы в конструкторе с параметрами, если мы его создаём. 
Структуры даже могут иметь методы, хотя в основном они используются для хранения связанных наборов данных.
Структурам также можно добавлять и свойства  для доступа к полям, как и обычным классам.

Небольшой пример использования структур:

Задание структурыCollapse )

Обращение к структуреCollapse )

Как мы видим, во втором случае поля структуры были заполнены нулями.

http://vk.com/note1845668_11617624
Итак, хочу вернуться к теме шифрования в XMessenger. Почему же оно всё-таки работает? Не будем сейчас о переборе, стойкости шифра, разных атаках... Я бы хотел рассказать о самой концепции защищённого относительно канала без применения SSL (который, разумеется, влечёт необходимость покупки сертификата, замедление в работе, ряда мероприятий по установке купленного сертификата на сервер, необходимость в абсолютных ссылках для явного указания протокола и т.п.).


Итак, как работает схема? Предположим, мы имеем сильный ключ, известный только участникам конференции и никому более (длиной 16-20 символов или около того). Как происходит процесс создания шифрованной комнаты? Для начала для комнаты выбираются имя и ключ. Но ключ по сети не передаётся. Вместо этого берётся некоторая известная последовательность символов (относительно короткая, чтобы не ставить под угрозу взлома остаток ключа), и шифруется по алгоритму AlphaCrypt с применением введённого ключа на клиенте. Полученный результат посылается на сервер и записывается в базу. Как видим, у владельца сервера при этом нет никакой возможности "подсмотреть" введённый ключ. Знание же кодированной спецпоследовательности ничего не даёт.


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


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


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


Таким образом, шифрование данных при передаче через стандартный HTTP протокол вполне реализуемо с применением открытых алгоритмов. Этот приём можно использовать для шифрования  не только переписки, но и любых данных форм, но только в тех случаях, когда на серверной стороне не требуется расшифровка данных для обработки. Если цель - только их хранение, такой подход вполне оправдан.
В противном случае клиенту и серверу потребуется, как минимум, обменяться симметричным ключом заранее, а ещё лучше - завести ассиметричные ключи, и шифровать данные публичными ключами друг друга, а читать с помощью собственных секретных. Что, к слову, с успехом реализуется в SSL.


Но даже и в этом случае можно обменяться публичными ключами в начале сессии (используя не HTTPS c сертификатом, а произвольный алгоритм ассиметричного шифрования и сгенерированный заранее или в режиме реального времени ключ). Аутентификации, конечно, при этом не будет, зато мы остаёмся в рамках HTTP со всеми вытекающими преимуществами 

http://vk.com/note1845668_11764585

Шифрование в XMessenger

Я недавно решил, что хорошо бы сделать шифрование личной переписки. Причём шифрование на сервере - это не очень интересно, так как слишком просто, да и данные по дороге можно перехватить. И я решил реализовать шифровку и дешифровку на стороне клиента средствами JavaScript. Поскольку JS не предоставляет стандартных возможностей шифрования, я стал искать библиотеки. Первое, что мне попалось - это реализация Blowfish. Вот она: [http://aam.ugpl.de/?q=node/1062|http://aam.ugpl.de/?q=node/1062]

Тут всё довольно хорошо, но, к сожалению, шифровать русский текст таким образом не получится. Надо переводить его в латиницу. Алгоритм по умолчанию этого не делал, а возиться с транслитом было уж совсем неохота. Поэтому я посмотрел в сторону библиотеки AlphaCrypt2: http://www.angelfire.com/ny5/consigliere/alphacrypt.html

Позже выяснится, что тут тоже с кириллицей всё плохо. Чем меня привлёк второй вариант? Менее распространённая библиотека, менее популярный алгоритм. Оригинально, взломщик может просто не догадаться, чем зашифровано (если он просто перехватывает траффик). К тому же, как уверяет автор, очень дёшево и сердито. То есть простой банальный алгоритм, усиленный с помощью MD5 хэширования так, что ну прямо вообще просто жесть какой устойчивый ко всему и взломать почти невозможно. Впрочем, оговаривается, что гарантий всё-таки никаких нет.

В отличие от Blowfish, который в PHP реализован, этого алгоритма для PHP нет. Вообще. Так что мне пришлось изрядно повозиться ещё и с портированием. По дороге я досконально изучил, как всё это счастье работает. Вроде всё понял.

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

Что до кириллицы, то я не придумал ничего лучше, как воспользоваться механизмом кодирования URL (urlencode в PHP, encodeURIComponent в JavaScript). После такого преобразования остаются только цифры, буквы от A до F (шеснадцатеричная система счисления) и знаки процента через каждые два символа.

В итоге всё отладилось и заработало. Казалось бы, вот он, Happy End.

Однако, самое интересное здесь только начинается :)

Посмотрим на код:

AlphaCrypt2


c64 = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'.split(), l64 = {};
for (i=0; i<64; i++)
l64[c64[i]] = i;

function alphar(s) {
   // I only pray--let me be ready.
   var i;
   // s must contain only base-64 characters!
   s = s.replace(/[^0-9A-Za-z+\/]+/g, );
   s = s.split();
   // preparse k into n-series
   for (i=0; i<s.length; i++)
   s[i] = l64[s[i]];
   return s;
}

// circular--acraw(acraw(a, k, r, sec), k, r, sec) == a
function acraw(s, k, r, seed) {
   /* seed is a sec feature;
   read some papers about non-repeated initializations */
   var i;
   s = s.split();
   // isn't it thrilling?
   for (i=0; i<s.length; i++)
   s[i] = c64[l64[s[i]] ^ k[i%k.length] ^ r[i%r.length] ^ seed];
   return s.join(); // yahoo!
}

function alphac(s, k, r, on) { /* encrypt = on | off */
   // get read, get set
   var d, i; k=alphar(k), r=alphar(r);
   // dump empty stuff
   if (r.length == 0 || k.length == 0 || s.length == 0) return s;
   // split s into bunches of base-64/non-base-64
   s = s.match(/[^0-9A-Za-z+\/]+|[0-9A-Za-z+\/]+/g);
   i = /[0-9A-Za-z+\/]/.test(s[0]) ? 0 : 1;
   // give a 1-2 punch! go!
   if (on)
   for (; i<s.length; i+=2)
   d = c64[Math.floor(Math.random()*64)],
   s[i] = acraw(s[i], k, r, l64[d])+d; /* si + d, Sidney Hall */
   else
   for (; i<s.length; i+=2)
   d = s[i].length-1,
   s[i] = acraw(s[i].substring(0, d), k, r, l64[s[i].charAt(d)]);
   // finished!
   return s.join();
}

Обратите внимание на жирный комментарий. Из него следует, что кодируемая строка делится на чередующиеся группы символов, входящих в кодировку Base64 (большие и маленькие буквы, цифры и ещё два символа, обычно это + и /) и не входящих в неё. При кодировании шифрующая функция начинает с первой "годной" группы и шифрует ровно через одну. Неподходящие группы просто игнорируются, но не выбрасываются. Таким образом, в нашем примере знаки процента являются группами, не подходящими под набор Base64, и кодирование осуществляется на группах по 2 символа (!). После кодирования мы получаем группы по три символа (так как дописали случайный элемент в конец строки, помните?), разделённых процентами. При чём если изначально у нас был набор A-F0-9, то теперь мы имеем весь диапазон (A-Za-z0-9+/). Посмотрите ещё раз на то, что мы получили и на то, как мы это получили.
Всё нравится? Лично мне нет.

Давайте взглянем на процедуру шифрования. Берётся символ с номером i (где i - индекс в исходной строке) и вычисляется остаток по модулю длины ключа. Ключ мы можем сделать абсолютно любой длины, это может быть 8, 10 символов, даже 16... Да хоть 30! И при шифровании к каждому символу исходного текста будет применяться свой символ ключа. Но что мы видим здесь? Разбив весь текст на группы по два символа, мы используем только первые два символа в ключе! Такой ключ перебирается примерно за 64 * 64 = 4096 итераций, если предположить, что в нём нет спецсимволов (а в нём их нет, функция alphar() режет все символы, не входящие в Base64 набор). И что же? Понятное дело, что спецпоследовательность, используемая в XMessenger для контроля корректности, не имеет "плохих" символов, и к ней ключ можно подбирать до старости. Но ведь злоумышленник не будет этого делать. Получив доступ к базе данных или перехваченным фрагментам, он начнёт их дешифровывать напрямую (алгоритм ведь известен). И он сразу же увидит, что за данные к нему попали, обратив внимание на проценты. В итоге, уже через час всё будет расшифровано без особых усилий! 

Собственно, есть два способа, как с этим бороться. Первый - удалить знаки процента перед шифрованием, а после дешифровки восстановить их. Благо, между каждой парой % ровно по два символа. Второй - ещё лучше. Заменить плюс или слэш в Base64 наборе на %. Как просто, но как эффективно!

Собственно, я это и сделаю. Теперь переходим к финальной части истории. Я решил из любопытства попробовать расшифровать шифрованную строку из базы данных с помощью ключа с изменённым "хвостом". Я ожидал, что всё расшифруется корректно. Ан нет, на выходе получалась совсем другая строчка. Структура была верной, но вот символы между процентами выходили совсем другие. Значит, хвост ключа всё-таки играет роль! Но как?..

И вот тут мы подходим к главной изюминке этого алгоритма. Третье слагаемое операции XOR - MD5 хэш от ключа. Да-да. Вот откуда влияние хвоста!.. Как известно, при вычислении MD5 влияние оказывает каждый символ. Поменяв хвостик ключа, даже один символ, мы получим лавинный эффект, и весь хэш станет другим! Да, в текущей реализации и от хэша берутся только два знака. Но они зависят от всего ключа, в том числе и от хвоста!..

Вот какой чудесный алгоритм разработали авторы. А ведь этому коду уже много-много лет :-)

http://vk.com/note1845668_11733003

Шедевр :)

Естественные науки
Кирилл Зима 
вчера в 23:13

Этот сложный русский язык.

Перед нами стол. На столе стакан и вилка. Что они
делают? Стакан стоит, а вилка лежит. Если мы воткнем
вилку в столешницу, вилка будет стоять. Т.е. стоят
вертикальные предметы, а лежат горизонтальные?
Добавляем на стол тарелку и сковороду. Они вроде как
горизонтальные, но на столе стоят. Теперь положим
тарелку в сковородку. Там она лежит, а ведь на столе
стояла. Может быть, стоят предметы готовые к
использованию? Нет, вилка-то готова была, когда
лежала.
Теперь на стол залезает кошка. Она может стоять,
сидеть и лежать. Если в плане стояния и лежания она как-
то лезет в логику «вертикальный-горизонтальный» , то
сидение – это новое свойство. Сидит она на попе.
Теперь на стол села птичка. Она на столе сидит, но сидит
на ногах, а не на попе. Хотя вроде бы должна стоять. Но
стоять она не может вовсе. Но если мы убьём бедную
птичку и сделаем чучело, оно будет на столе стоять.
Может показаться, что сидение – атрибут живого, но
сапог на ноге тоже сидит, хотя он не живой и не имеет
попы.
Так что, поди ж пойми, что стоит, что лежит, а что сидит.
А мы ещё удивляемся, что иностранцы считают наш
язык сложным и сравнивают с китайским. (с)
Мне нравится
159
сегодня в 0:32
Скрыть комментарии

Евгений Калиниченко
Вова Киселев

Посвящается С. Лему

Ходят трамваи, там где не надо,
Показать полностью..
Мне нравится
6
сегодня в 0:38

Татьяна Серкина
а с временами еще интереснее,например,приказ-быстро сделал! Какое время? Призыв к действию в будущем выражается глаголом в прошедшем времени.
Мне нравится
сегодня в 0:46

Мария Брюханова
м-да,это надо понять,(для баб,у которых нет логики,надо:точнее вдуматься,потом представить,и реализовать).а потом обдумывать........хоть и так все понятно)
Мне нравится
сегодня в 0:46

Андрей Petrov
» сапог на ноге тоже сидит
Это уже совсем другое значение.
Мне нравится
сегодня в 1:04

Артемьев Виван
Таня, это просто вид глагола - совершенный. Ко времени имеет отношение посредственное. Почти все глаголы имеют совершенную и несовершенную форму.
Мне нравится
сегодня в 1:17

Евгений Калиниченко
http://readr.ru/vladimir-kiselev-sobranie-sochineniy...
Мне нравится
сегодня в 1:48

Андрей Андрей
Если в стол воткнуть вилку-она будет торчать,а не стоять,раз на то пошло
Мне нравится
6
сегодня в 3:40

Вячеслав Рогожин
Не-е... Торчать вилка будет из глаза:)
Мне нравится
3
три часа назад Андрею

Алексей Bibiap
А почему Тарелка и Сковородка могут только стоять на столе?могут и лежать )запросто..
Мне нравится
два часа назад

Адам Абубакаров
Класс))
Мне нравится
час назад

http://vk.com/note1845668_11730726

Без названия

Идеи объединения функциональности сотового телефона и карманного персонального компьютера появились практически сразу после появления первых карманных персональных компьютеров в начале 90-х годов XX века. Первой подобной попыткой считается телефон IBM Simon, впервые представленный публике в качестве концепта в 1992 году компанией IBM. В 1994 году данный аппарат был выпущен в продажу американским сотовым оператором Bell South. Стоимость устройства составляла 900 долл. с контрактом и чуть более 1000 без оного. Помимо телефонных функций аппарат включал в себя функции органайзера, мог отправлять и получать факсы, позволял работать с электронной почтой, а также содержал несколько игр. Клавиш управления не было, все действия совершались посредством сенсорного экрана. Вследствие больших габаритов и веса (более 1 кг) аппарат не получил значительного распространения.
В начале 1996 года компания Hewlett-Packard совместно с Nokia выпустили КПК HP 700LX. Фактически это была переработанная модель HP 200LX с местом для установки сотового телефона Nokia 2110. Программная часть также была доработана для более тесного взаимодействия с мобильным телефоном. Разумеется, данный аппарат нельзя считать коммуникатором, поскольку он состоял из двух независимых устройств.
В августе 1996 года появилось первое успешное устройство, объединяющее КПК и сотовый телефон в одном корпусе — Nokia 9000 Communicator, работавший под управлением операционной системы GEOS. Коммуникатор обладал полноразмерной QWERTY-клавиатурой и монохромным экраном высокого разрешения (640х200). Размеры устройства составляли 173?65?38 мм, а вес — 397 г. В закрытом виде устройство выглядело как обычный, только несколько громоздкий телефон, а в раскрытом виде — как типичный КПК (Handheld PC) того времени. Коммуникатор Nokia 9000 по функциональности не уступал КПК того времени и позволял совершать звонки, однако ОС была закрыта и сторонние приложения установить было нельзя. Главным недостатком устройства (по сравнению с КПК) было отсутствие разъёмов для расширения функциональности (PCMCIA и карт памяти). Впоследствии линейка коммуникаторов 9xxx была продолжена моделями 9000i, 9110, 9110i.
В 1997 году в Тайване была образована компания High Tech Computer Corporation (HTC), главной целью которой была разработка мобильных устройств, совмещающих в себе функциональность КПК и мобильного телефона.
В 1998 году компаниями Psion, Nokia, Ericsson и Motorola был основан консорциум Symbian, целью которого была разработка полноценной операционной системы для мобильных устройств.
Вплоть до начала 2000-х, конкурентов у коммуникаторов Nokia практически не было. Отдельные модели выпускались на локальных рынках и успехом практически не пользовались. Например, в 1999 году для американского рынка были выпущены коммуникаторы Qualcomm pdQ 800 и pdQ 1900, работавшие под управлением Palm OS. Из-за большого веса и высокой цены данные аппараты провалились в продаже.
Термин «смартфон» был введен компанией Ericsson в 2000 году для обозначения своего нового телефона Ericsson R380s. Устройство обладало относительно малыми габаритами (130х50х26 мм) и сравнительно небольшим весом (169 г). Особенностью устройства был сенсорный экран, закрытый откидной крышкой (флипом). Названием «смартфон» производитель подчеркивал интеллектуальность устройства, однако этот аппарат нельзя считать полноценным смартфоном, поскольку он не позволял устанавливать сторонние приложения (ОС была закрытой).
Бурное развитие смартфонов и коммуникаторов началось в 2001 году: компания Nokia выпускает очередную модель коммуникатора: Nokia 9210. Данная модель работала под управлением Symbian OS 6.0 и была первым устройством серии 9xxx с открытой ОС. Устройство было основано на новой платформе series 80, несовместимой с программами для предыдущих поколений коммуникаторов Nokia. Модель обладала весьма внушительной функциональностью, внутренний экран был цветным. Кроме того был анонсирован телефон Nokia 7650, который считается первым «настоящим» смартфоном, поскольку он работал под управлением открытой для сторонних разработчиков операционной системы Symbian OS 6.1 (платформа series 60). Однако, компания Nokia позиционировала данную модель в первую очередь как имиджевый телефон с расширенными мультимедийными функциями, а не как интеллектуальное устройство с открытой ОС. Впрочем, маленький размер доступной памяти (4 Мб) и отсутствие разъёма для карты памяти сильно ограничивали возможности аппарата. В том же году появились первые коммуникаторы под управлением Pocket PC 2000 (например, Siemens SX45).
В 2002 году выходит целый ряд коммуникаторов на базе платформы HTC Wallaby (ОС Microsoft PocketPC 2002) и смартфонов на базе платформы HTC Canary (ОС Microsoft Smartphone 2002) под разными торговыми марками (Qtek, O2, Siemens и другие). Коммуникаторы и смартфоны на базе операционных систем Microsoft получают значительное распространение и становятся массовыми. Неофициальное название «коммуникатор» закрепляется за (Pocket PC) с сенсорным экраном. В том же году появились смартфоны BlackBerry (получили большое распространение в США и Канаде) с QWERTY-клавиатурой, ориентированные на работу с электронной почтой. В то же время выпускается целый ряд коммуникаторов на базе Palm OS, которые стали весьма популярными. Коммуникаторы Nokia из-за высокой цены так и остались нишевыми устройствами.
В 2003 году компания Microsoft выпускает операционную систему Windows Mobile 2003. Nokia представляет сразу несколько смартфонов под управлением Symbian OS, а ряд производителей — под управлением Windows Mobile. Рынок смартфонов начинает стремительное развитие. В том же году выходит первый смартфон на платформе UIQ: Sony Ericsson P800. Данная модель продолжила ряд телефонов Ericsson с сенсорным экраном, закрываемым флипом, но уже с полным правом носила название «смартфон». В конце 2003 года компания Nokia также анонсировала свой первый сенсорный аппарат — Nokia 7700 на базе новой программной платформы series 90. Устройство должно было выйти в середине 2004 года, однако, после нескольких переносов срока выпуска было отменено и в широкую продажу не попало. Вместо него в конце года была выпущена модель Nokia 7710 — первый и единственный смартфон на рынке на базе series 90.
В 2005 году компания Microsoft выпустила Windows Mobile 5.0, обладающую целым рядом значительных улучшений. Операционная система была выпущена в трёх вариантах: для смартфонов (Windows Mobile 5.0 for Smartphone), для КПК (Windows Mobile 5.0 for Pocket PC) и коммуникаторов (Windows Mobile 5.0 for Pocket PC Phone Edition). Все три версии ОС были построены на единой платформе, этот факт способствовал увеличению функциональности смартфонов и размыванию границ между смартфонами и коммуникаторами. Компания Nokia объявила о прекращении поддержки программных платформ series 80 и series 90 и концентрации усилий на развитии единой для всех устройств платформы series 60. В конце 2005 года были представлены первые смартфоны Nokia на обновлённой платформе series 60 version 3
В 2006—2007 годах рынок смартфонов испытывает значительный рост (увеличение поставок смартфонов и коммуникаторов примерно в два раза). В начале 2006 года тайваньская компания High Tech Computer Corporation приняла решение о ликвидации торговой марки Qtek и продвижении своей продукции под единым брендом HTC. В этом же году компания выпустила HTC MTeoR — первый в мире 3G смартфон на базе Windows Mobile. Компания Palm, Inc. объявляет о начале сотрудничества с Microsoft и анонсирует коммуникатор Treo 700w под управлением Windows Mobile 5.0.
Компания Nokia выпускает линейку смартфонов на базе новых Symbian OS 9.1 и Symbian OS 9.2 (основаны на обновлённой series 60 version 3). Целый ряд устройств получил функции, характерные ранее только для коммуникаторов (такие как Wi-Fi и GPS), обновлённая программная платформа позволила осуществить поддержку больших разрешений (большинство моделей получили экраны с разрешением 320?240 точек). Кроме того, некоторые устройства обладали QWERTY/ЙЦУКЕН-клавиатурой. Линейка коммуникаторов Nokia была продолжена аппаратом Nokia E90. Одной из главных особенностей данной модели является то, что в сложенном виде она представляет собой полноценный смартфон (предыдущие модели сочетали в себе обычный телефон на базе программной платформы series 40 и коммуникатор на базе series 80). Все смартфоны N-серии в официальных пресс-релизах Nokia именуются «мультимедийными компьютерами». На базе обновлённой UIQ 3 (Symbian OS 9.1) был выпущен ряд сенсорных смартфонов Sony-Ericsson (модели M600i, P990, P1, W950, W960). Кроме того, в 2007 году появился первый смартфон на базе UIQ 3.1 без сенсорного экрана Motorola Z8.
В первой половине 2007 года компания Microsoft выпустила Windows Mobile 6. Из названия версий операционной системы были исключено слова Smartphone и Pocket PC (версия для аппаратов без сенсорного экрана называлась Standard, а с поддержкой оного — Professional). Это окончательно закрепило объединение смартфонов и коммуникаторов в один класс устройств. Версия 6.0 отличалась от предыдущей в основном переработанным интерфейсом и рядом незначительных улучшений. Новая операционная система была совместима с программами для предыдущей версии.
В середине 2007 года компания Apple выпустила бесклавиатурный аппарат iPhone. Аппарат не отличался функциональностью (например, отсутствовала возможность MMS-сообщений, передачи файлов посредством Bluetooth и т. п.), единственным аппаратным новшеством был способ управления устройством двумя пальцами (Multi-Touch). Однако емкостной экран, невиданный до той поры тактильный пользовательский интерфейс (кинетическая прокрутка, мультитач и т. п.), создающий ощущение управления изображением на экране движениями пальцев, и агрессивная рекламная кампания сделали это устройство хитом продаж. Следует отметить, что изначально операционная система iPhone была закрытой, среда разработки приложений iPhone SDK для сторонних разработчиков появилась только в начале 2008 года. Смартфон от Apple привлёк значительное внимание, многие производители выпустили телефоны и коммуникаторы с интерфейсом, ориентированным на управление пальцами. Часто анонс таких аппаратов освещался в прессе как появление «убийцы iPhone».
В конце 2007 года компанией Google была анонсирована открытая мобильная платформа Android, основанная на ядре Linux, и была сформирована группа компаний Open Handset Alliance (OHA), целью которой является разработка открытых стандартов для мобильных устройств.
В середине 2008 года компания Google объявляет об открытии исходных кодов Android.
Компания Nokia также объявляет о намерении открыть исходный код Symbian OS и начинает процесс покупки полного пакета акций Symbian, с целью образования некоммерческой организации Symbian Foundation. Процесс покупки был завершен 2 декабря 2008 года. Предполагается, что унифицированная открытая платформа Symbian появится в 2010 году.
В 2008 году Apple представила обновлённую версию своего смартфона iPhone 3G. В аппарате появилась поддержка сетей 3-го поколения, GPS и исправлены некоторые недостатки предыдущей модели. Официальные поставки устройства осуществляются более чем в 70 стран (в том числе и в Россию). Благодаря успешным продажам iPhone компания Apple начала завоевание рынка смартфонов (около 5 % мировых продаж).
Осенью 2008 года вышел первый аппарат на базе Android — T-Mobile G1 (HTC Dream).
В конце 2008 года компании Sony Ericsson и Motorola отказались от дальнейшей разработки платформы UIQ[2]. В это же время компания Nokia выпускает сенсорный аппарат Nokia 5800 на базе Symbian OS 9.4. Смартфон поддерживает управление без использования стилуса и ориентирован на массовый рынок. Одновременно с данным устройством был анонсирован флагманский смартфон Nokia N97 c сенсорным экраном и выдвижной QWERTY/ЙЦУКЕН-клавиатурой, который вышел в середине 2009 года.

Источник: http://my.mail.ru/mail/a.pigasov



http://vkontakte.ru/note1845668_11700246
Windmills of your mind
(оригинал Michel Legrand)

Like a circle in a spiral
Like a wheel within a wheel,
Never ending or beginning,
On an ever-spinning reel
Like a snowball down a mountain,
Or a carnival balloon
Like a carousel that's turning
Running rings around the moon
Like a clock whose hands are sweeping
Past the minutes of its face
And the world is like an apple
Whirling silently in space
Like the circles that you find
In the windmills of your mind!

Like a tunnel that you follow
To a tunnel of its own
Down a hollow to a cavern
Where the sun has never shone
Like a door that keeps revolving
In a half-forgotten dream
Or the ripples from a pebble
Someone tosses in a stream.
Like a clock whose hands are sweeping
Past the minutes of its face
And the world is like an apple
Spinning silently in space
Like the circles that you find
In the windmills of your mind!

Keys that jingle in your pocket
Words that jangle in your head
Why did summer go so quickly?
Was it something that I said?
Lovers walk along a shore
And leave their footprints in the sand
Was the sound of distant drumming
Just the fingers of your hand?
Pictures hanging in a hallway
In a fragment of this song,
half-remembered names and faces
but to whom do they belong?
When you knew that it was over
You were you suddenly aware
That the autumn leaves were turning
To the color of his hair?

Like a circle in a spiral
Like a wheel within a wheel
Never ending or beginning
On an ever-spinning reel
As the images unwind
Like the circles that you find
In the windmills of your mind!
Ветряки внутри сознанья
(примерный перевод)

Словно круг внутри спирали,
Словно втулка в колесе,
Без конца и без начала,
Вместе вертимся мы все,
Словно снежный ком с вершины,
Как большой воздушный шар,
Карусель, что вечно мчится
Вкруг луны под звон гитар,
Словно стрелки в циферблате,
Чьи движенья так точны,
Мир, как яблоко, парящий
Среди звёздной пустоты,
Ветряков внутри сознанья,
Округлённые черты.

По туннелю ты стремишься
Через толщу пустоты,
По лощине вглубь пещеры,
В царство вечной темноты,
Как крутящиеся двери,
В мир полузабытых снов,
Или рябь на водной глади
Вдалеке от берегов,
Словно стрелки в циферблате,
Чьи движенья так точны,
Мир, как яблоко, висящий
Среди звёздной пустоты,
Ветряков внутри сознанья,
Округлённые черты.

Звон ключей в твоём кармане,
Шумный гомон в голове,
Лето кончилось так быстро,
Растворившись в синеве.
Возле моря ног влюблённых
Отпечатки на песке,
Это грохот барабанов,
Или звон в твоей руке?
Позабытые страницы,
Как картины на стене,
Имена, фрагменты, лица -
Части песен, как во сне...
Когда всё уже кончалось,
Осознал ли ты всерьёз,
Что осенних листьев краски -
Это цвет её волос...

Словно круг внутри спирали,
Словно втулка в колесе,
Без конца и без начала,
Вместе вертимся мы все,
Словно кадры киноленты,
Жернова, что крутит ветер
Мельниц в нашей голове...




http://vkontakte.ru/note1845668_11682848

My tweets

  • Fri, 03:38: Галерея - Категория: Снегопад: зимние игры и праздники - Файл: Антонян Альвина 1... http://t.co/T0XhMX2x

Tags: