Паук под наркотиками

Паук под чем? (44.35КиБ)

Фотография выше — часть очень известного эксперимента учёных НАСА. Они давали паукам разные наркотики и смотрели какую паутину они сплетут. Под этим наркотиком паутина получилась самой неправильной и бесполезной (она как раз на фото).

Сможете угадать что за наркотик?

39 комментариев

Imagine Cup 2013 в Казани

Imagine Cup 2013 (78.50КиБ)

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

Больше всего впечатлил тринадцатилетний мальчишка (на фото он второй справа), участвующий в разработке игры «Fitness4You», которая должна помочь людям в занятиях спортом. Пусть он кое в чём заблуждается, пусть некоторые вопросы он изучил недостаточно глубоко, но в тринадцать лет он самостоятельно изучил рынок, аналоги, подсчитал бюджет, нанял программиста и провёл отличную презентацию!

Первое место заняли ребята из Волгограда, который придумали, реализовали и уже внедрили (!) за рубежом (!!) систему, которая по прогнозу погоды регулирует отопление здания, так как здание обладает инерцией, регулировать отопление надо заранее. На объекте, где было произведено внедрение, экономия составила 20% в год или 44% за холодное время года.

Sun Flowers (35.58КиБ)

Второе место — ребята из Sly Lamb, из Нижнего Новгорода (если не ошибаюсь), выпустившие очень симпатичную логическую игру, я их не фотографировал, но игра качественная, с неплохой графикой и собственным звуковым оформлением.

На третьем месте парень из КФУ (это универсистет Казани), разрабатывающий программу 3Д-моделирования, в которой вы можете, используя голосовые команды и положение рук (используется «Киннект»), буквально «лепить» в воздухе фигуры. Пока они появляются только на экране, в будущем планируется использовать очки виртуальной реальности. Проект интересный, но пока очень сырой. Я, пожалуй, заменил бы голос на жесты (например, сжатый кулак — поставить точку, ладонь — убрать).

3Д-редактор (37.76КиБ)

Спасибо «Микрософту» за этот ежегодный конкурс, это очень нужно дело, тем более в России, где качество образования постоянно падает, а люди охотнее идут в криминал, чем в науку и информационные технологии.

4 комментария

Кесарю — кесарево сечение

Всегда думал, что кесарево сечение называет так, потому что через него родился Цезарь.

А вот нет. Оказывается, кесарево делали в Древнем Риме, только если женщина при родах умирала (делать кесарева так, чтобы мать выжила стали только в 19 веке), а мать Цезаря прожила ещё долгие годы после его рождения.

Доподлинно же, почему оно называется «кесаревым» неизвестно, есть несколько версий:

  1. Вышеупомянутая версия про Цезаря 2. По одному из императорских законов (Lex Caesarea), ребёнка умирающей матери полагалось спасти кесаревым сечением 3. От латинского «caedere» — резать

3 комментария

Earworm

У меня сейчас в голове противный мотивчик крутится, никак избавиться не могу. Слова что-то вроде «я всегда помню о главном», попса, подхваченная в такси. По-английски это называется «earworm» («ушной червь»). На форумах встретил высказывание, что, смотрите-ка, в английском есть слово для этого понятия, а в русском — нет.

Да какое это слово? Английский делает то, что русский уже давно боится — берёт два слова («ear» и «worm») и соединяет. А у нас с изобретения «самобранок», «самокатов», «самолётов», «вертолётов» появился только «пенопласт». Носители стали бояться изобретать новые слова, проще заимствовать из языка, где это не боятся делать.

Ломоносов придумал слово «градусник», Карамзин — «катастрофа», Достоевский — «стушеваться», Хлебников — «лётчик», Иван Панаев — «хлыщ», Салтыков-Щедрин — «головотяпство», Игорь Северянин — «бездарь», Чуковский — «канцелярит». Давайте каждый придумает по слову, пусть все они не приживутся, но что-то выживет и обогатит наш язык.

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

24 комментария

Кто сильнее — кит, слон или «Фауст» Гёте?

Кстати, в прошлом году я прочитал «Фауса» Гёте. Просто для того, чтобы иметь право говорить «эта штука посильнее „Фауста“ Гёте».

17 комментариев

Королевич Вахрамей

Наткнулся сегодня, наполняя своё родовое дерево, на очередное редкое имя — Вахраме́й. Это мой прапрапрадед со стороны мамы (примерно 1840-50 годов рождения).

Долго не мог распознать что написано, попросил историка, с которым я работаю, расшифровать. Написано, кстати, с ошибкой — Вохрамей.

Вахрамей — простонородный вариант имени Варфоломей (переводится как «сын Толмая» с арамейского).

Возможно, кстати, прапрапрадеда звали Вахра́м, такой вариант имени тоже существует, а само имя мне стало известно из сокращения отчества моей прапрабабушки, которая записана в похозяйственной книге №1 одной из письмянских артелей за 1937 год:

Вахрамей (143.33КиБ)

13 комментариев

PCRE и UTF-16

Прочитал в документации по библиотеке PCRE, что с версии 8.30 она поддерживает кодировку UTF-16. Решил сравнить производительность по сравнению с UTF-8. Всё-таки кодировка UTF-16 (почти) фиксированного размера, обрабатывать её сильно проще, чем UTF-8, которая переменной длины.

Написал два примера на Си: один для UTF-8, второй для UTF-16 и запустил, разницу посмотрите сами:

# это я на своём «Маке» скомпилировал
~$ gcc-4.7 -I/usr/local/Cellar/pcre/8.32/include/ -L/usr/local/Cellar/pcre/8.32/lib/ -lpcre -std=c99 -o utf8 utf8.c
~$ gcc-4.7 -I/usr/local/Cellar/pcre/8.32/include/ -L/usr/local/Cellar/pcre/8.32/lib/ -lpcre16 -std=c99 -o utf16 utf16.c

# два файла в разных кодировках, почти 1,5 млн. строк, правда используется далеко не это количество
~$ wc -l utf8.txt
 1424462 utf8.txt
~$ wc -l utf16.txt
 1424462 utf16.txt

~$ time ./utf8
PCRE version: 8.32 2012-11-30
Yes!
…
Yes!

real	0m1.372s
user	0m1.286s
sys	0m0.039s

~$ time ./utf16
PCRE version: 8.32 2012-11-30
Yes!
…
Yes!

real	0m0.048s
user	0m0.004s
sys	0m0.035s

Либо я где-то неверно что-то напрограммировал, либо разница почти в 29 раз!

Лично мне кажется, что API толком не работает и ошибка в том, что в pcre16_compile не указывается длина шаблона.

5 комментариев

Русская народная медицина

Я тут любопытную вещь за собой заметил. На фоне общей истерии ко всему «натуральному» и народной медицине, сегодня, принимая с утра ванну, понял, что я-то народной медицине не доверяю.

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

Когда это у меня случился такой скачок в сознании, я не заметил, раньше, кажется, мне народная медицина нравилась, а тут прямо полярность сменилась. Наверное, какая-то критическая масса накопилась.

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

Воспоминания об этом похоже на воспоминания о любимой детской игрушке — неопределённые и приятные, до тех пор пока эту игрушку не встречаешь в ящике со старыми вещами. И понимаешь, что всё это, конечно, мило, но современные игрушки дадут этой фору.

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

Что могла знать неграмотная бабка из забытой богом деревни, откуда эти знания у неё могли появится? От предков? А у предков откуда? Я так представляю, знания добывались на месте, «не умер от такой-то травки, значит помогло» — вот все знания. Никакого систематического наблюдения за больными, никаких экспериментов (далеко не все современные учёные умеют это правильно делать, откуда это бабке уметь?), никакого обмена опытом (с кем? как?).

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

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

Тысячу лет, по секрету, перед смертью бабушка шептала своей подросшей внучке «тайные знания»? И та всё это запоминала в этот же момент? Ведь, если вообразить, что была некая сила, которая запрещала это практиковать (церковь?), то возможности спокойно передать знания через каждодневную практику не было. Если запретительной силы не было, то где знания?

Можно, конечно, попытаться на большевиков всё свалить, но что тогда делать с огромной смертностью до революции?

В общем, это мой сознательный анализ. А бессознательный выбор таков: из двух тюбиков я выберу тот, который к народной медицине отношения не имеет.

32 комментария

Уходим с телефоном, «МакБук» выключается

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

Идея выглядела просто: надо посмотреть присутствует ли в эфире мой смартфон, если нету, значит я куда-то ушёл (я без смартфона не хожу). Я сначала это на «Баше» сделал и всё даже работало, но случилось неожиданное: Mac OS время от времени стала падать с серым экраном смерти. Тогда я взял в руки Пайтон. Я даже запрограммировал сканирование эфира, но выяснилась неприятная штука — через какое-то время моя «Нокия» автоматически выключала видимость устройства и никакими уговорами не удалось убедить её этого не делать. Пришлось делать проверку соединением со смартфоном (не знаю как это сажает батарею, не успел ещё проверить).

В общем, всё получилось у меня. Если хотите, чтобы у вас работало так же, то двигайтесь по шагам.

Шаг №1.

Нужно узнать так называемый «адрес» вашего устройства и привязать его к компьютеру. Тут ничего сложного нет, заходим в настройки «Блютуз» на «Маке» (они находятся в «Системных настройках»), привязываем его как обычно и переписываем себе 12 букв, разделённых минусами, это и есть адрес:

Настройки Bluetooth (80.68КиБ)

Шаг №2.

С этого шага потребуется уметь пользоваться терминалом. Создаём запускаемый файл /usr/local/bin/bt-lock следующего содержания:

#!/usr/bin/python

import objc
import sys
from subprocess import call

objc.loadBundle('IOBluetooth', globals(), bundle_path=u'/System/Library/Frameworks/IOBluetooth.framework')

def CheckDevice(address):
    dev = IOBluetoothDevice.withAddressString_(address)

    if dev.isConnected():
        return True

    conn = dev.openConnection()

    if conn == -536870185: # Bluetooth is off
        return True

    if conn == 0:
        dev.closeConnection()
        return True

    return False


cmdtorun=(r'/System/Library/CoreServices/Menu Extras/User.menu/Contents/Resources/CGSession', r'-suspend')

try:
    if not CheckDevice(sys.argv[1]):
        call(cmdtorun)
except IndexError:
    print("Usage: bt-lock <device address>")

В скобках замечу, чтобы сделать файл запускаемым нужно в терминале выполнить следующую команду: chmod a+x /usr/local/bin/bt-lock.

Шаг 3.

Создаём файл ~/Library/LaunchAgents/ru.bolknote.Bluetooth-lock.crontab.plist с таким вот содержимым:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>Label</key>
  <string>ru.bolknote.Bluetooth-lock.crontab</string>

  <key>Program</key>
  <string>/usr/local/bin/bt-lock</string>

  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/bin/bt-lock</string>
    <string>а̲д̲р̲е̲с̲ ̲в̲а̲ш̲е̲г̲о̲ ̲у̲с̲т̲р̲о̲й̲с̲т̲в̲а̲</string>
  </array>

  <key>Nice</key>
  <integer>20</integer>

  <key>StartInterval</key>
  <integer>30</integer>

  <key>RunAtLoad</key>
  <true/>
</dict>
</plist>

И выполняем в терминале команду «launchctl load ru.bolknote.Bluetooth-lock.crontab.plist». Это всё.

Чтобы отключить всю эту марахайку, достаточно выполнить в терминале команду «launchctl unload ru.bolknote.Bluetooth-lock.crontab.plist» или выключить Bluetooth на ноуте.

Решение только для «Мака», как работать из Пайтона с Блютузом под другие операционные системы, я не знаю.

20 комментариев

Bluetooth в Mac OS из Python: комментарии к коду

Пока не забыл, что происходит в коде к предыдущей заметке, опишу для себя.

Первая строка после импортов — загрузка, собственно, самого АПИ, загружается разделяемая библиотека, находящаяся по указанному пути. Далее определяется класс-объект, наследуемый от NSObject, это специальный класс, который позволяет прикидываться объектам Пайтона объектами Обжектив-Си.

В этой связи, объекту приходится ставить специальные подпорки — посмотрите на последнюю строку, там вызывается метод new класс-объекта, для Пайтона это непривычный метод создания объектов. Необычен так же конструктор, вместо него используется метод init, внутри которого я назначаю данный объект обработчиком ассинхроных вызовов, методы которого будут вызываться во время сканирования. Внутри конструктора первая строка тоже обязательна, это так же специальная подпорка.

В методе getfounddevices я вызываю метод, запускающий сканирование, и дожидаюсь, когда один из методов (deviceInquiryDeviceFound_device_, вызывающийся на успешном скане или deviceInquiryComplete_error_aborted_, который вызывается, если произошла ошибка или ничего не найдено) установит флаг, что сканирование завершено.

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

Декораторы objc.typedSelector указывают сигнатуру вызываемого объекта и позволяют указать как именно будут переданы параметры. До конца эта магия мне пока непонятна.

Например, «v@:@iB» расшифровывается как «void», «объект», «селектор метода», «объект», «int», «булевое». Т. е. метод ничего не возвращает, потом идут параметры: никаких идей что такое «объект-селектор метода» (но по наблюдениям, этот параметр всегда соответствует self), дальше передаётся объект, потом целое, потом значение булевского типа.

Всё что перечисленно через подчёркивание — это имена сообщений, в терминах Обжектив-Си. Например, сообщение из кода «[myRect setWidth:10.0 height:20.0]» имеет имя «setWidth:height:» и кодируется вот так: setWith_height_, то есть, двоеточие в имени сообщение заменяется на подчёркивание. Полный вызов будет выглядеть следующим образом: «myRect.setWith_height_(10.0, 20.0)».

2 комментария

Bluetooth в Mac OS из Python

Я тут учусь работать с Блютузом из Пайтона на «Маке», пока сделал сканирование всех видимых в эфире устройств:

import objc
import time
from Foundation import NSDate, NSDefaultRunLoopMode
from AppKit import NSApplication, NSAnyEventMask

objc.loadBundle('IOBluetooth', globals(), bundle_path=u'/System/Library/Frameworks/IOBluetooth.framework')

class DeviceInquiry(NSObject): 
    def init(self):
        self = super(DeviceInquiry, self).init()
        self._inquiry = IOBluetoothDeviceInquiry.inquiryWithDelegate_(self)    
        self._stop = False
        
        return self
        
    def getfounddevices(self):
        self._inquiry.start()

        app = NSApplication.sharedApplication()
        app.setActivationPolicy_(2)        
        while not self._stop:
            time.sleep(.01)
            app.nextEventMatchingMask_untilDate_inMode_dequeue_(NSAnyEventMask,\
            NSDate.dateWithTimeIntervalSinceNow_(1), NSDefaultRunLoopMode, True)

        return tuple((dev.getName(), dev.getAddressString()) for dev in self._inquiry.foundDevices())

    @objc.typedSelector("v@:@@")
    def deviceInquiryDeviceFound_device_(self, inquiry, device):
        self._stop = True 

    @objc.typedSelector("v@:@iB")
    def deviceInquiryComplete_error_aborted_(self, inquiry, err, aborted):
        self._stop = True

print DeviceInquiry.new().getfounddevices()

Модуль pyobjc (в маковском Пайтоне он уже есть) — это мост между Пайтоном и Обжектив-Си, т. е. в реальности вызывается «кокосовое» АПИ «Мака».

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

4 комментария

Вы поняли? Обновление установлено! Вы поняли? Обновление установлено! Вы поняли? Обновление установлено!

Обновление установлено! (91.04КиБ)

Моя «Нокия» порадовала с утра апдейтом. Я ещё для себя не решил что это — текст песни с припевом или, может, мой смартфон знает, что я утром плохо соображаю и мне всё надо повторять по пять раз.

6 комментариев

Юникод в помощь!

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

#Казань-ю (34.18КиБ)

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

12 комментариев

Юникодные часы

В Юникоде есть несколько символов часов (не знаю, отобразятся ли они у вас, вот они): «🕐🕜🕑🕝🕒🕞🕓🕟🕔🕠🕕🕡🕖🕢🕗🕣🕘🕤🕙🕥🕚🕦🕛🕧.»

Тут, как видите, шаг полчаса. Я вчера за завтраком сделал Юникодные часы, которые «ходят» поворотом символа (через ЦСС-трансформации). Часовая стрелка очень некрасиво скачет (я только для Вебкита делал и испытывал только в Сафари), потому что мне приходится вращать символ, чтобы минутная стрелка двигалась, а потом переходить на следующий символ. В общем, просто разминка для пальцев.

Юникодные часы (3.72КиБ)

Рассказать я хотел не об этом. Я и раньше встречался с тем, что часть Юникода не воспринимается многими программами нормально, особенно что касается раздела «Эмодзи, например „Яндекс.Фотки“ не так давно порадовали меня следующим (стоило переименовать картинку, всё стало в порядке):

«Яндекс.Фотки» (52.51КиБ)

Редактор „Сублиме Текст 2“ часто падает, если в тексте программы встречаются эти символы, а вот „Сафари“ удивил больше всех. Он их, вроде бы, понимает, но как-то не до конца:

"🕐".length; // 2
'🕐'[0]; // строка со «сломанным» символом
escape('🕐'); // "%uD83D%uDD50"

То есть, он считает символы Эмодзи не одним символом, а двумя. Такой вот баг. Мне пришлось в коде на ДжаваСкрипте это учитывать.

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

6 комментариев

Самое короткое письмо Льва Толстого

Господа, это прекрасно! На «Лепрозории» всплыло (а на «Ленте.ру» было переопубликовано) самое короткое письмо Льва Толстого в те времена ученику третьего класса, прадеду товарища одного из пользователей «Лепрозория», Сергѣю Владимировичу Ѳедорову.

История целиком:

У меня есть товарищ, прадед которого, учась в третьем классе, читал «Войну и мир» и задался вопросом: «Как же правильно ставить ударение в фамилии Ростовы?». И он, недолго думая, написал телеграмму Льву Толстому. Писатель ответил ему. Вот карточка с его ответом. Позже семья моего товарища обнаружила биографию Льва Толстого, где упомянут этот случай.

Росто́вы (64.50КиБ)

Как видите, читать надо «Росто́вы», это подтверждает сам Лев Николаевич. На обратной стороне почтовой карточки написано: «Его Высокоблагородiю Сергѣю Владимировичу Ѳедорову» с указанием адреса.

Аверс карточки (165.85КиБ)

12 комментариев

Казань ✈ Москва ✈ Тбилиси → Сингаги → Мцхета → Кутаиси → Батуми ✈ Москва ✈ Казань

В первые майские праздники едем в Грузию, давно хотел посетить эту замечательную страну. Побываем в пяти городах: Тбилиси, Сингаги, Мцхета, Кутаиси, Батуми, увидим Метехский Храм, крепость Нарикала, Майдан, серные бани, гору Мтацминда, монастыри Бодбе и Джвари, Алазанскую Долину, Кавказский Хребет, Цинандали, соборы Светицховели и Баграта, Гелатскую Академию и наверное что-то ещё.

Спасибо казанской фирме «Корсо», которая второй раз подряд отправляет нас на отдых и второй раз подряд делает какие-то чудеса. На этот раз не было билетов в Тбилиси и из Батуми, девушка из турагенства забронировала билеты от которых могли отказаться владельцы, повезло, они почему-то отказались.

24 комментария

Где откроются двери в метро

Где же откроются двери? (104.90КиБ)

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

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

17 комментариев

Привет из прошлого, Ассемблер Z80

Читая один из постов Аввы, наткнулся на ассемблерные алгоритмы быстрой очистки экрана, вспомнил, что мне тоже что-то такое приходилось использовать, я одно время много на Ассемблере программировал, на Ассемблере под Зет80 («Спектрум») — тоже. Чтобы было понятно как иногда приходилось извращаться в те годы, цитирую:

penguinny: Опыт работы в ассемблере даёт это знание самым непосредственным образом. Кстати, тесно связанный трюк в ассемблере Z80 служил как один из самых быстрых (и точно самый компактный) способ очистки экрана:

ld hl,screen_addr ld de,screen_addr+1 ld bc,6143 ld (hl),0 ldir

Команда ldir копирует bc байт информации, начинающейся с адреса hl, в блок памяти, начинающийся с адреса de. С учётом выбранных адресов, 0 вручную пишется в первый байт, а затем копируется из первого во второй, из второго в третий, и т. д. Экран очищается по индукции.

kray_zemli: говорят, как-то через стек можно ещё было. вы его имели в виду?

penguinny: Да, именно так. Регистр стека устанавливался в конце экрана, один из 16-битных регистров очищался и затем в частично развёрнутом цикле многократно сохранялся в стек. 16-битные операции на 8-битном процессоре! Шок.

14 комментариев

Смирнов вернулся в Новосибирск

Дима Смирнов (помните ещё такого?) переехал обратно из Москвы в Новосибирск. И написал небольшую и разумную заметку о своём переезде:

Я ехал не в Москву, а в Яндекс. При этом люди годами не могли понять, почему я такой талантливый и хороший до сих пор не ринулся покорять Москву.

Я и не ринулся, потому что прекрасно осознавал, что Москва мне не нравится. Но если Яндекс — лучшая айти компания в России, а я такой талантливый и хороший — то мне там место, а Москву можно потерпеть. Оказалось, нет.

7 комментариев