Home
Lev Walkin [entries|archive|friends|userinfo]
Lev Walkin

[ website | My Website ]
[ userinfo | livejournal userinfo ]
[ archive | journal archive ]

Паскальный вброс [Nov. 29th, 2009|06:42 am]
[Tags|]

В духе обучения двадцатилетнего медведя новой игре на балалайке, Жаклин Аддеса, студент из Virginia Tech, сделала доклад про использование языка Хаскель1 (который обычно избегают использовать для больших коммерческих применений) для высокопроизводительных вычислений. Аддеса сравнила Хаскель с Си на задачах по совмещению множества последовательностей, и обнаружила что код на Си быстро стал примерно в 37 раз длиннее, чем та же имплементация с использованием Хаскеля. Хаскель работал примерно в 2.68 раз быстрее на внушительных базах даных генетических последовательностей.

[info]antilamer добавляет:
Там речь идет о multiple sequence alignment; утверждается, что взяли один и тот же алгоритм и реализовали его на си и на хаскеле.

К сожалению, без кода никакой ценной интерпретации этот факт не имеет. Не сказано даже, сама ли Жаклин писала обе программы.

Тем не менее, забавно и применимо в качестве мини-вброса :)

[1] Haskell, Pascal — пишем либо Хаскель и Паскаль, либо Хаскелл и Паскал.
Link68 comments|Leave a comment

Частота брани [Nov. 27th, 2009|03:42 am]
Частота появления неприличных эпитетов в результатах поиска по Google Code.



via [info]dk379, via http://www.mixx.com/photos/9482795/photo

Upd: ([info]itman, 2006: Программисты Java матерятся в 4 раза реже, чем программисты С++)
Link17 comments|Leave a comment

Дрейдель с хануками [Nov. 22nd, 2009|07:42 am]
Таргет используется нами ровно по одному назначению — там нужный типоразмер памперсов для Марка продаётся. Вот на днях с Ольгой забрали Марка из сада, и едем куда-то провести остаток вечера в разнузданности и оргиях.

Как там у Марка Твена?
Вещи мы будем держать здесь и оргии тоже здесь будем устраивать. Для оргий тут самое подходящее место.
— А что это такое «оргии»?
— Я почем знаю. Только у разбойников всегда бывают оргии, значит, и нам тоже надо.

Подъезжаем к магазину. Марк сидит и требует: «Хочу луну!» Вот ведь запрос! Я думал такое только в сказках для родителей бывает, а тут в реальности. Хочу, говорит, луну, и всё. Последняя стадия. Кто научил?

Ну так вот, памперсы купили, воду купили, и тут — я увидел ПРИБОР. Вот, говорю, Марк, это почти как луна, но даже лучше, чем луна!

Удержаться я не мог, эту хрень нужно было видеть своими глазами. Она висела над головой и просто жаждала составить нам компанию.

Так мы купили дрейдель. Марк, говорю, хочешь дрейдель? Хочу дейдель! Ну не вопрос, берём. Мне самому даже интересно, как оно сработает.

А он с ханукой внутри.

А он не просто с ханукой внутри — он с двумя хануками.

Дрейдель с двумя хануками и с огнями дивными, на LED.

Картинки )
Link13 comments|Leave a comment

По волнам структуры памяти [Nov. 15th, 2009|11:42 pm]
http://www.lenta.ru/conf/ms/:

— …[К]огда уже можно будет удалить открытый на запись файл, как в линуксе?
Отвечает специалист Microsoft:
— Надеюсь, что никогда. Подобные операции наносят серьезный вред структуре памяти системы. Проблему с принудительным закрытием открытых дескрипторов очень хорошо осветил Реймонд Чен в своей статье в апрельском Technet magazine.
<…>
Если вы программист, то не вполне понятно, что вам мешает средствами Windows API принудительно закрыть все операции работы с файлом (закрыть все handles, ведущие к этому файлу) и затем безопасно удалить его.
(Курсив мой — [info]lionet)

Специалист Microsoft такой специалист Microsoft… ;(
Link125 comments|Leave a comment

Языки программирования в условиях, приближенных к боевым [Nov. 5th, 2009|04:42 pm]
Кросс-пост из http://users.livejournal.com/_adept_/99574.html:

Существует классическая статья "Haskell vs. Ada vs. C++ vs. Awk vs. ... An Experiment in Software Prototyping Productivity", написанная в 1994 году. За 15 лет многое изменилось, и, думается, многим было бы интересно прочитать подобную статью про положение дел сегодня.

В связи с этим ищутся:
1) Условия подходящей задачи (критерии см. ниже)
2) Желающие реализовать ее на Haskell/C+/Ocaml/Java/Scala/C#/... с тем, чтобы ваш код был нещадно сравнен с другими и опубликован для всеобщего обозрения.


Q: Зачем все это делается?
A: На других посмотреть, себя показать. В частности, чтобы люди имели возможность посмотреть на решения на других языках, и составить о них какие-то мнение.

Q: Чем не устраивает The Great Language Shootout?
A: Тем, что там отдается предпочтение "быстрым и грязным" решениям, которые всячески "срезают углы". Во-первых, в таком стиле пишется дай бог чтобы 5% от всех программ, во-вторых, людям, не знающим язык X, строго противопоказано смотреть на решения на языке X в Language Shootout — останется превратное впечатление.

Q: Как будут сравниваться решения, чтобы определить победителя?
A: Никак, т.к. победителей не будет. Будут приведена определенная статистика по всем решениям, без выводов.

Q: Какой тогда стимул участвовать?
A: На других посмотреть, себя показать :)

Какой должна быть задача?
1) Не заточенной под конкретную ОС (т.е. "Реализовать компонент, встраеваемый в Word" или "плагин для libpam" — не катит)
2) Не заточенной под конкретный язык/фреймворк/... (т.е. "получить список сигнатур методов всех объектов указанной сборки .Net" — не катит)
3) Если глубокие знания в предметной области дают решающее преимущество — это fail (т.е. "реализовать DES-CBC" — не катит)
4) Чтобы она не была из категории "мне не нужно, чтобы плац был чистый, а нужно, чтобы вы задолбались" (т.е. "распарсить XLS-файл, не пользуясь библиотеками" — не катит)
5) Задача не должна требовать много времени на реализацию (если это будут человеко-недели - никто за нее не возьмется)

Какой должна быть реализация?
1) Чтобы ее было не стыдно показать другим. В частности, чтобы решение на языке X не заплевали бы как кривое и неидиоматичное другие программисты, знающие язык X.
2) Идеально было бы давать две реализации: первую с ориентиром на "красоту", "образцово-показательность" и легкость поддержки/развития кода (т.е. пишем как пример кода, который будет прилагаться к резюме :), а вторую — "грязную и быструю".
3) Т.к. библиотеки — это неотъемлемая часть силы и популярности языка, библиотеками "общего назначения" (контейнеры, парсинг, ...) пользоваться можно и нужно
4) Но! Решение, которое свелось к исключительно к нахождению и использованию какой-то (узкоспециальной) библиотеки никому не интересно и рассматриваться не будет.

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

Если у вас есть идея подходящией задачи и вы хотите ей поделится — напишите комментарий, а?

([info]lionet: Так как исходный пост уже порядком замусорен, я оставляю комментарии открытыми здесь. Может быть, это даст какой-то более позитивный эффект. Если хотите предложить решение — добро пожаловать! Первый уровень комментариев — только по делу: предложения задач. Для того, чтобы поболтать, идите всё-таки в исходный пост.)
Link30 comments|Leave a comment

(no subject) [Nov. 3rd, 2009|06:42 am]
San FranciscoMountain View
Welcome to San Francisco! Please drive safely!
Link4 comments|Leave a comment

Комментарий алгоритма [Nov. 2nd, 2009|12:42 am]
[Tags|]

Вот здесь [info]antilamer проверяет двудольность графа, а вот здесь [info]metaclass, по всей видимости, чуть-чуть не догоняет, что происходит.

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

Код в изначальной записи:
import qualified Data.Map as M
import Data.Maybe
import Data.Array
import Control.Monad
import Control.Monad.State
import Control.Monad.IfElse

type Graph = Array Int [Int]

isBipartite g = isJust $ runStateT (mapM_ fill (indices g)) M.empty
  where
    fill     v = whenM (M.notMember v`fmap`get) $ spread True v
    spread k v = whenM (paint k v)              $ mapM_ (spread (not k)) (g!v)

paint k v = get >>= \c -> case M.lookup v c of 
    Nothing     -> put (M.insert v k c) >> return True
    Just x|x==k ->                         return False
          |True ->                         fail ""

Перед расшифровкой выясним, что такое двудольный граф: http://en.wikipedia.org/wiki/Bipartite_graph
Там есть и алгоритм тестирования на двудольность: «Testing bipartiteness».

Определим тип, который будет хранить наш граф. Граф имеет набор вершин, адресуемых по их уникальным целочисленным индексам, например вершины 1, 2, 3. Кроме этого граф должен для каждой вершины иметь несколько ветвей, ведущих в другие вершины. Допустим, с каждой вершиной (Int) ассоциирован список соединённых с ней ветвью вершин (список индексов вершин: [Int]).

Будем хранить весь граф в виде массива вершин, каждой из которой поставлен в соответствие список ветвей (индексов соединённых с данной вершиной вершин).

> -- Каждой вершине типа Int ставится в соответствие список вершин, соединённых с ней: [Int]
> type Graph = Array Int [Int]


Мы хотим иметь функцию, которая для данного графа даёт нам Bool (True или False), в зависимости от того, является ли граф двудольным. Назовём её isBipartite. Соответственно, тип этой функции будет чем-то типа Graph → Bool:

> isBipartite :: Graph -> Bool

По желанию автора этой программы, мы будем вычислять наш ответ в монаде State, сконструированной поверх Map: состоянием является отображение (карта, ассоциативный массив) типа Map Int Bool, которое мы протаскиваем через вычисления. (Для самого поверхностного, первоначального понимания можно представить, что такая монада соответствует в императивных языках осуществлению вычислений над ассоциативным массивом, лежащим в глобальной переменной.) Вот как мы можем делать что-то в монаде State, которая начальным состоянием имеет пустое отображение Map Int Bool:

runStateT long_and_complex_computation Data.Map.empty

Например, код, не выполняющий почти ничего: игнорирующий протаскиваемое состояние и дающий константный ответ:

*Test> runStateT (return 42) Data.Map.empty
(42,fromList [])
*Test>


Как видим, в этом коде нам вернулась пара: финальное значение и финальное состояние. fromList [] — это как раз состояние: репрезентация Data.Map.empty.

А вот код, который нам просто возвращает начальное состояние:

*Test> runStateT (get) Data.Map.empty
(fromList [],fromList [])
*Test>


Одной особенностью вычисления в монаде является возможность быстрого завершения вычислений: fail. (Быстрая интуиция: часто fail в монаде моделирует исключение в императивных языках). Этот fail в нашей монаде, организованной через монадный трансформер, ничего не делает, кроме выкидывания исключения в монаду повыше. Вот, например:

*Test> runStateT (fail "oops") Data.Map.empty
*** Exception: user error (oops)
*Test>


Из-за того, что вычисления в строке ghci происходят в монаде IO, мы видим "*** Exception: user error (oops)", который порождён именно монадой IO, в которую runStateT "передала" исключение. Но ведь можно и по-другому: давайте завернём runStateT в монаду попроще: Maybe, которая превращает исключения в Nothing, а всё остальное просто возвращает как есть:

*Test> fromJust $ runStateT (return 42) Data.Map.empty
(42,fromList [])
*Test> isJust $ runStateT (fail "oops") Data.Map.empty
False
*Test> case runStateT (fail "oops") Data.Map.empty of Nothing -> "yes, got Nothing"
"yes, got Nothing"
*Test>


Для простоты, будем считать аварийное завершение нашего алгоритма неуспехом (граф не двудольный), а неаварийное — тем, что у нас граф двудольный. У нас есть специальная функция: isJust, которая различает между Just a и Nothing, возвращая True или False, соответственно. Раз Nothing в монаде Maybe возвращается тогда, когда мы вызываем в этой монаде fail, это как раз то что нужно, чтобы отловить "исключение" и превратить его в булево значение:

*Test> isJust $ runStateT (fail "oops") Data.Map.empty
False
*Test> isJust $ runStateT (return 42) Data.Map.empty
True
*Test>


Вооружившись знанием того, как исключение в какой-то монаде превратить в True/False, рассмотрим определение isBipartite, как оно дано в рассматриваемом коде.

> isBipartite g = isJust $ runStateT (mapM_ (fill g) (indices g)) Data.Map.empty

Курсивом выделено то самое "длинное вычисление", которое мы делаем в монаде. Что такое mapM_: эта функция вычисляет (fill g) для каждой вершины графа g (indices g), в данной монаде. Вызов indices g для нашего гипотетического графа с вершинами 1, 2, 3, даст просто [1, 2, 3].

То есть, мы чего-то там заполняем (fill: наполнить) для каждой вершины оригинального графа. Судя по коду, именно в fill должна происходить магия, использующая вспомогательное "глобальное" состояние — отображение Data.Map.

И верно: fill g использует get, для того, чтобы втащить состояние (изначально равное Data.Map.empty) внутрь нашего вычисления:

> fill g v = whenM (Data.Map.notMember v`fmap`get) $ spread g True v

Здесь мы для каждой вершины v (помним, что функции fill g v передаётся одна за другой все вершины графа, выраженные индексами) вычисляем, есть ли эта вершина в нашем "глобальном" состоянии — отображении Data.Map. Если нет этой вершины (значит, не обрабатывали ещё)?, для неё вызываем spread g True v, которая что-то там раскрашивает (paint):

> spread g k v = whenM (paint k v) $ mapM_ (spread g (not k)) (g!v)

А, вот оно что: функция spread, если удалось раскрасить (paint), то для каждой вершины, с которой соединена данная вершина (g!v, помните, что в нашем графе каждой вершине v поставлен в соответствие список вершин, с которыми она соединена?) мы запускаем себя же (spread), с противоположным вторым аргументом. Граф — первый аргумент, а второй аргумент, получается, это серия чередующихся True/False/True/….

То есть, мы идём и красим вершины, которые встречаем, краской k, которая то True, то False, попеременно.

Как мы это делаем? Вот в этом коде мы опять встречаем get, который нам выдаёт текущее значение "глобального" отображения Data.Map, которое мы протаскиваем в монаде состояния:

> paint k v = get >>= \c -> case Data.Map.lookup v c of
   Nothing -> put (Data.Map.insert v k c) >> return True
   Just x|x==k -> return False
         |True -> fail ""


Здесь для вершины v мы смотрим, есть ли она в нашем отображении Data.Map, е если есть, и покрашена также, как мы её и пытаемся раскрасить, то это одно дело (возвратим False, для того чтобы перестать раскрашивать дальше (код whenM paint … внутри spread), ибо цикл), а если пытаемся раскрасить другой краской, то, извините, граф не двудольный. Вызываем fail "", который, как мы знаем, приводит к тому, что исключение нашей монадой выбрасывается на уровень монады Maybe, которая даёт Nothing, который даёт False в итоге для нашей функции isBipartite.

Если же в нашем "глобальном состоянии" ещё ничего не известно про вершину v, добавляем её с указанным цветом (put (Data.Map.insert v k c)) и возвращая (return True), который попадёт в whenM paint … внутри spread, вызвав рекурсивный спуск spread далее по вершинам графа.

Всё. Ровно как в википедии, там даже картинка есть.

Неточности в формулировках присутствуют; кому глаза режет — с удовольствием заменю неточности на ваши уточнения.

Upd: Ещё пара вариантов алгоритма: http://users.livejournal.com/_adept_/99610.html
Link114 comments|Leave a comment

Конкурс! [Oct. 26th, 2009|08:42 am]
[Tags|]

Этот пост вообще-то должен был попасть в [info]ru_ucdesign. Но я не дождался, пока модераторы меня в нём авторизуют. А без авторизации нельзя — сиськоспам всех достал, очевидно.

Ну так вот. Дохлое комьюнити какое-то, этот [info]ru_ucdesign. Давайте попробуем разнообразить. Ежели кто имеет доступ к [info]ru_ucdesign — сделайте кросспост или форвард сюда (Upd: сделали).

Конкурс!


Кто лучше всех преобразует вот эту картинку в другую картинку, на которой все эти настройки представлены в юзабельной форме, тот получит приз — iPod nano с видеокамерой. Победитель определится голосованием через неделю или сколько там нужно для того, чтобы варианты устаканились.

Что настройки значат — не суть важно1, предлагаю чуть-чуть фантазию проявить, где это не очевидно.

Спасибо!

P.S. Я к этому приложению никакого отношения не имею. Просто хочу катализировать креатив чуть-чуть. Те, кто говорит "я забесплатно работать не буду", могут продолжить бесцельно торчать в ЖЖ. В смысле, пусть отдыхают. Давайте чуть более позитивно на вещи смотреть.



[1] Конечно, при проектировании интерфейсов исключительно важно знать, что значат настройки. Но в данном случае мы не имеем роскоши знать, что они значат: я не в курсе того, что значат эти настройки. Мопед не мой. Поэтому прошу проявить здравый смысл и самостоятельно придумать наиболее логичную семантику и паттерны использования представленных элементов. И на основании этого спроектировать интерфейс.
Link266 comments|Leave a comment

Нетбуки наступают [Oct. 25th, 2009|11:42 pm]
Как и следовало ожидать, нетбуки подмывают рынок портативных компьютеров.

Таблица 1: Доходы и уровни продаж ноубтуков и мини-ноутбуков (в миллионах долларов)
Источник: Ежеквартальный расширенный доклад по продажам и прогнозам на рынке ноутбуков, 3-й квартал 2009, DisplaySearch
Категория 2 квартал 2008 1 квартал 2009 2 квартал 2009 Годовое изменение
Мини-ноутбуки/нетбуки 845 2 241 3 072 264%
Ультра-портативные компьютеры 2 123 1 879 1 475 -31%
Портативные компьютеры 22 687 17 670 19 726 -13%
Портативные компьютеры, замещающие настольные 2 213 2 123 2 086 -6%
Все портативные компьютеры 27 868 23 912 26 359 -5%
Все ноутбуки, кроме нетбуков 27 023 21 672 23 287 -14%


Подробнее: http://oleyka.livejournal.com/19290.html
Link4 comments|Leave a comment

asn1c in iPhone [Oct. 22nd, 2009|06:42 am]
[Tags|]

Вдогонку к блогпосту про копирайты: http://lionet.livejournal.com/31952.html

Мой копирайт появился в iPhone.

Когда я год назад смотрел туда, его ещё там не было. А сегодня [info]sidentdv говорит: «смотрел копирайт на iphone, там вписан asn1c by Lev Walkin». А мы с [info]oleyka вчера как раз ей iPhone купили, вместо сломанного девчачьего Самсунга. Так я полез в Settings → General → About → Legal, и действительно, сидит копирайт мой, с BSD лицензией.

Приятно.

P.S. Вот выгонят меня из JS-Kit, пойду на интервью куда-нибудь. Будут просить код написать — а я им в ответ:
На интервью со зв
…или нет, не так…
— Клоуны, лицензию в своём иПхоне почитайте для начала!
Link30 comments|Leave a comment

Перл на лиспе [Oct. 20th, 2009|11:42 pm]
Сегодня [info]fritzmorgen написал собиралку и фильтр данных по голосованиям на LISP'е.

Кто-то ему ответил, что, мол, лисп сосёт, и на Perl'е легче бы получилось. И написал — 23 строки на Perl'е, вместо 42 строк на LISP'е.

http://what-me.livejournal.com/6815.html

И вот что здесь замечательно — в варианте [info]what_me перловый код всё равно написан на LISP'е! Как ни пиши, элегантное выражения задания по трансформации данных получается именно в функциональном стиле.

Я бы поправил его код, впрочем, избавившись от сайд-эффектов в print_rows. Расщепил бы print_rows на пару: format и print.

В любом случае, это лисп, а не Перл. Неиндоктринированные на перле так сами по себе не пишут.
Link23 comments|Leave a comment

Кола колор [Oct. 20th, 2009|03:42 am]
Продолжая серию заметок о вкусной и здоровой пище, хочу заметить вот ещё что. В моей френд-ленте возникают какие-то инсинуации по поводу цвета Кока-Колы. Мол, неправильного она цвета, не по Пантону.

Сегодня увидел в магазине мексиканскую колу в маленькой бутылке. Обычная американская кола — она с какой внутри. Кака называется HFCS (гугл в помощь), и заменяет коле сахар.

Мексиканская же кола каку не содержит, а содержит настоящий сахар. Отчего приравнивается к вкусной и здоровой пище. За последнюю неделю это уже второе место, где я в ритейле увидел мексиканскую колу. Первое — Инь-Янь кафе на Santana Row в San Jose, второе — Cravery в даунтауне Лос Альтоса.

Что-то я отвлёкся. Так вот, специально взял и сфотографировал бутылку, чтобы показать цвет колы, пусть во вредленте сидят со своими чёрными колами, у нас она нормального органического цвета, аз адвертайзед.

Link9 comments|Leave a comment

Вопрос к жителям бывшего СССР [Oct. 15th, 2009|09:42 pm]
Почему смешивать сырую (из-под крана) и однажды перекипевшую воду «нельзя», а ополаскивать сварившиеся сосиски или даже промывать от слипания макароны — можно?

Почему сосиски варят прямо в [пластиковой] кожуре, когда снять кожуру с современной сосиски легче в холодном состоянии?

Почему сосиски и макароны варят раздельно, а не вместе, сохраняя сосисочный сок в макаронах?

Есть ли мясо в сосисках, по вашим убеждениям?
Link135 comments|Leave a comment

(no subject) [Oct. 8th, 2009|01:42 am]
http://plumqqz.livejournal.com/78429.html?thread=648797#t648797

Мне неинтересны объективные преимущества ФП. © [info]plumqqz

Открытость к интеллектуальному диалогу поражает! ;)
Link66 comments|Leave a comment

Erlang, Yaws, and the deadly Tornado [Sep. 19th, 2009|12:42 am]
[Tags|, , ]

Good things sometimes happen to the open source community. Since Facebook acquisition of FriendFeed, a bunch of technologies were released to the wild, including, most notably, a Tornado web server written in Python. The Tornado is touted as a «a scalable, non-blocking web server and web framework». See Wikipedia article http://en.wikipedia.org/wiki/Tornado_HTTP_Server on some details on the performance of that server, as well as some comparison with other web servers.

Here's the chart, taken from Wikipedia:

Performance on AMD Opteron, 2.4GHz, 4 Cores
Server Setup Requests per Second
Tornado nginx, 4 frontends 8213
Tornado 1 single threaded frontend 3353
Django Apache/mod_wsgi 2223
web.py Apache/mod_wsgi 2066
CherryPy standalone 785


The numbers looked interesting, so I decided to benchmark Tornado myself to check out how it fares against some Erlang tools. Erlang, Yaws, Tornado benchmark follows )
Link48 comments|Leave a comment

О, что поймал! [Sep. 13th, 2009|10:42 am]
Вдогонку к VSE NA X: NetBSD!



С праздником, программисты!
Link13 comments|Leave a comment

Computer History Museum [Sep. 13th, 2009|03:42 am]
Сегодня с Ольгой и Марком ходили в музей компьютерной истории, в Mountain View.

Узнали и увидели кучу интересностей.

Вот, например, суперкомпьютер Cray-1:



"Кресла" вокруг — это крышки блоков питания и охладительного оборудования, по совместительству являющиеся поверхностью для сидения.

Интересно, что в музее сейчас функционирует одна из двух существующих в природе действующих машин Беббиджа: Difference Engine #2. Тринадцать тонн! Приводится в движение нехилой рукояткой сбоку, и печатает результат с точностью тридцать один знак после запятой на бумажной ленте.

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

Так вот, там ещё есть разные интересности, типа деталей полётного компьютера Apollo 11, который приземлялся на Луну, блинов жёсткого диска, диаметром едва ли не метра в полтора (на снимке ниже нас троих можно увидеть в отражении), и других исторических вещей.



Одной из поразивших меня вещей были компоненты электро-механических машин Конрада Цузе. Z3 (Тьюринг-полная) была сделана в 1941 году!

В связи с этим появилось желание найти какие-то экземпляры техники советской разработки...



Мы пошли правее, ещё правее, ещё...

И, наконец, нашли! )
Link47 comments|Leave a comment

Как добраться до Сан-Франциско [Sep. 7th, 2009|05:42 am]
[Tags|]

Предисловие


Всё началось 2005 году с путешествия профессора моей alma mater в университет Беркли. Н. Ярушкина собиралась на торжества по нечётким вычислениям, дарить мантию почётного профессора УлГТУ Лотфи Задэ. Так как я живу условно рядом, меня попросили помочь найти отель в Беркли, а также встретить-проводить с самолёта в SFO. В качестве одного из артефактов этой математической авантюры появился некий текст, который описывал способ добраться до Сан-Франциско.

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

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

Итак,
Как добраться до Сан-Франциско )
Link123 comments|Leave a comment

Изнанка жизни [Sep. 7th, 2009|01:42 am]
Магазины беспошлинной торговли в аэропорте Шереметьево-2. Вид сверху.

Link1 comment|Leave a comment

Анекдот [Sep. 6th, 2009|10:42 pm]
На золотом крыльце сидели:

Главный дизайнер, вице-президент по бизнесу, директор, тех. директор, ещё один VP.

Вопрос: у кого Dell?
Link21 comments|Leave a comment

navigation
[ viewing | most recent entries ]
[ go | earlier ]

Advertisement