Показаны сообщения с ярлыком гы-гы. Показать все сообщения
Показаны сообщения с ярлыком гы-гы. Показать все сообщения

четверг, 30 января 2025 г.

Про конденсатор и прочую электростатику

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

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

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

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

Захотелось увидеть всё, так сказать, своими глазами, пусть и на грубой модели, и посмотреть, что происходит в проводнике и в конденсаторе. Поэтому я, не долго думая, набросал простенькую программку на JS, в которой "в лоб" моделируется ансамбль точечных элементарных зарядов. Пять тысяч частиц -- это, конечно, не число с двадцатью тремя нулями, но хоть какие-то тени реальных процессов удастся углядеть, надеялся я.

Сначала пара слов о модели. Сразу оговорюсь -- модель средневекового уровня, со свободными положительными и отрицательными зарядами, и, разумеется, без соблюдения всяких масштабов, без количественных оценок, т.е. исключительно в иллюстративных целях. Массы и абсолютные величины положительных и отрицательных зарядов предполагаются одинаковыми, поэтому взаимодействие, подчиняющееся закону обратных квадратов, а также масштабные коэффициенты (шаг дискретного времени и пространственный масштаб) оказалось возможным засунуть в один коэффициент k. На каждом шаге насчитываются новые координаты участвующих во взаимодействии частиц по следующему простому алгоритму:

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

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

Прям даже жалко, что у меня нет электроскопа проверить это на опыте...

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

Теперь стало понятно, что происходит при замыкании ключа. Замыкающийся ключ сам превращается в этакий конденсаторчик, в котором пучности на концах проводников усиливаются по мере сближения контактов.

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

Кроме того, модель показала, что включенные последовательно конденсаторы действительно взаимодействуют, так что условие задачи "на одном конденсаторе заряд q, а на другом заряд ноль", строго говоря, не имеет места в реальности.

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

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

В общем, спасибо авторам ролика и отзывчивым зрителям за то, что заставляют думать. Вот ссылка на песочницу: https://huh-muh.blogspot.com/p/blog-page_30.html

среда, 4 марта 2020 г.

Машина Тьюринга

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

С полубесконечной лентой. Всё по канону - каретка считывает символ, берёт своё текущее состояние и на основе этой пары делает работу: пишет новый символ, меняет своё состояние и сдвигается влево/вправо или остаётся на месте. Для решения учебных задачек - типа, "заменить в строке все символы b на c" - вполне подходит.

Пусть лежит для коллекции.
Если что, там же болтаются худо-бедно работающие эмуляторы нормального алгоритма Маркова и машины с неограниченными регистрами.

понедельник, 6 августа 2018 г.

Для взлома шифра Цезаря

S = "Кгылчусеюегм ефб лрчсупгщлб"

S = S.upper()

chars = "АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"
for i in range(0, len(chars)):
    print(i, "".join(chars[(chars.find(s) + i)%len(chars)] if chars.find(s) >= 0 else s for s in S))

можно было, конечно, и так:
for i in range(0, 33):
    print("".join(chr(ord('А')+(ord(s)-ord('А')+i)%(ord('Я')-ord('А')+1)) if ord(s) in range(ord('А'),ord('Я')+1) else s for s in S))
но вдруг набор символов слегка отличается от привычного?

четверг, 1 декабря 2016 г.

Шаблоны в веб-разработке

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

Но, как и всё вокруг, наш веб-сайт имеет тенденцию разрастаться и видоизменяться. Из одной веб-страницы мы делаем другую копированием соответствующего HTML-файла и изменением его содержимого, и этих файлов становится всё больше и больше. Рано или поздно мы заметим тревожные симптомы:
  1. различий внутри двух близких по времени файлов наберётся дай бог процентов на 10;
  2. HTML-код на сайте от страницы к странице становится всё более и более разнородным, потому что мы узнаём новые приёмы, а старый код исправлять лень или некогда;
  3. всё труднее поддерживать единообразное оформление, например, чтобы изменить шапку страниц или название одного пункта навигации, приходится править кучу HTML-файлов, валяющихся на сайте с начала времён.
И постепенно становится ясно: пришла пора задуматься о том, как упорядочить этот нарастающий хаос.

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

Будем использовать модельный пример. Пусть у нас есть сайт, стоящий из трёх веб-страниц, соответствующие HTML-файлы которых выглядят так:

Файл index.html
<html>
<title>Главная страница</title>
<body>
<div>Шапка сайта</div>
<div><a href="first.html">На первую страницу</a> | <a href="second.html">На вторую страницу</a><div>
</body>
</html>

Файл first.html
<html>
<title>Первая страница</title>
<body>
<div>Шапка сайта</div>
<div><a href="/">На главную</a> | <a href="second.html">На вторую страницу</a></div>
<div>Содержимое первой страницы</div>
</body>
</html>

Файл second.html
<html>
<title>Вторая страница</title>
<body>
<div>Шапка сайта</div>
<div><a href="/">На главную</a> | <a href="first.html">На первую страницу</a></div>
<div>Содержимое второй страницы</div>
</body>
</html>

Итак, приступим.

Первым делом надо произвести аудит наших наработок и выделить те части, которые должны остаться неизменными от страницы к странице. Это наверняка будет шапка сайта, меню, оформление и т.п. Дальше нужно будет выбрать путь из множества вариантов, доступных (или потенциально доступных) веб-разработчику.

Например, можно творчески использовать тег <iframe>, выделив шапку сайта и меню в отдельный фрейм. Наш модельный сайт в этом случае может выглядеть так:

Файл header.html
<html>
<body>
<div>Шапка сайта</div>
<div>
<a target="_top" href="/">На главную</a> |
<a target="_top" href="first.html">На первую страницу</a> |
<a target="_top" href="second.html">На вторую страницу</a>
</div>
</body>
</html>

Файл index.html
<html>
<title>Главная страница</title>
<body>
<div><iframe src="header.html"></div>
</body>
</html>

Файл first.html
<html>
<title>Первая страница</title>
<body>
<div><iframe src="header.html"></div>
<div>Содержимое первой страницы</div>
</body>
</html>

Файл second.html
<html>
<title>Вторая страница</title>
<body>
<div><iframe src="header.html"></div>
<div>Содержимое второй страницы</div>
</body>
</html>

Теперь, если мы захотим вместо "Шапка сайта" написать "Кепка сайта", нам не придётся править все три HTML-файла, достаточно поменять лишь страницу header.html. Но на самом деле это - не очень хороший подход. Так не удастся избавиться от большей части однообразного содержимого HTML-файлов: заголовков, разметки и т.п. Поэтому более разумным вариантом представляется использование шаблонов.

Что такое шаблон в веб-разработке? Ближайшим его аналогом в материальном мире является бланк. Да-да, та самая отпечатанная типографским способом разлинованная бумажка, вписав в которую свои ФИО и другие реквизиты получаешь заявление на загранпаспорт, квитанцию о переводе денежных средств, товарную накладную и т.п. Так что при этом подходе нам понадобится разработать некую заготовку, в которую останется лишь вписать в нужный момент нужные данные. Но кто будет эти данные вписывать?

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

Первый путь предполагает наличие на стороне сервера какого-то механизма для обработки клиентских запросов. Стоит отметить, что в наше цивилизованное время сами веб-серверы научились в какой-то мере производить необходимые манипуляции со страницами перед отправкой их клиенту. Мы имеем в виду технологию Server Side Includes (SSI).

В частности, наш модельный пример с использованием SSI принимает вид:

Файл header.shtml
<div>Шапка сайта</div>
<div>
<a href="/">На главную</a> |
<a href="first.shtml">На первую страницу</a> |
<a href="second.shtml">На вторую страницу</a>
</div>

Файл index.shtml
<html>
<title>Главная страница</title>
<body>
<!--#include file="header.shtml"-->
</body>
</html>

Файл first.shtml
<html>
<title>Первая страница</title>
<body>
<!--#include file="header.shtml"-->
<div>Содержимое первой страницы</div>
</body>
</html>

Файл second.shtml
<html>
<title>Вторая страница</title>
<body>
<!--#include file="header.shtml"-->
<div>Содержимое второй страницы</div>
</body>
</html>

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

Более тонкой настройке поддаются программы или скрипты для обработки шаблонов, написанные на каком-нибудь подходящем языке программирования. Это может быть PHP, Python, ASP, node.js, черт, дьявол, да всё что угодно вплоть до bash-скриптов. У каждого из этих языков есть свои достаточно мощные инструменты и модули для работы с шаблонами. Мы не будем углубляться в эти дебри, а покажем на нашем модельном примере сам принцип обработки шаблонов с помощью серверных приложений.

Пусть у нас на сайте установлен Python. Перепишем наш пример следующим образом:

Файл template.html
<html>
<title>%(title)s</title>
<body>
<div>Шапка сайта</div>
<div>
<a href="/">На главную</a> |
<a href="first.py">На первую страницу</a> |
<a href="second.py">На вторую страницу</a>
</div>
<div>%(content)s</div>
</body>
</html>

Файл index.py
from mod_python import Cookie, apache

def index(req):

  return open('template.html').read() % \
    {
    'title' : 'Главная страница',
    'content' : ''
    }

Файл first.py
from mod_python import Cookie, apache

def index(req):

  return open('template.html').read() % \
    {
    'title' : 'Первая страница',
    'content' : 'Содержимое первой страницы'
    }

Файл second.py
from mod_python import Cookie, apache

def index(req):

  return open('template.html').read() % \
    {
    'title' : 'Вторая страница',
    'content' : 'Содержимое второй страницы'
    }

Как видим, в этом примере данные удалось полностью отвязать от их отображения, что является несомненным плюсом. Правда, при этом увеличилась нагрузка на сервер и пришлось изучить Python, но оно того стоит. Весь HTML код оказался в файле шаблона, и если мы, скажем, захотим сверстать наш сайт как-то по-другому, нам не придётся переписывать кучу файлов HTML. Конечно, большое множество изменений, связанных с оформлением, можно сделать с помощью стилевых файлов. Но, скажем, подключить какой-нибудь javascript или установить тег META с помощью CSS, насколько я в курсе, не получится.

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

Файл template.xsl
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

  <xsl:template match="/root">

    <html>
    <title><xsl:value-of select="title"/></title>
    <body>
    <div>Шапка сайта</div>
    <div>
    <a href="/">На главную</a> |
    <a href="first.xml">На первую страницу</a> |
    <a href="second.xml">На вторую страницу</a>
    </div>
    <div><xsl:value-of select="content"/></div>
    </body>
    </html>

  </xsl:template>

<xsl:stylesheet>

Файл index.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?>
<root>
<title>Главная страница</title>
<content/>
</root>

Файл first.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?>
<root>
<title>Первая страница</title>
<content>Содержимое первой страницы</content>
</root>

Файл second.xml
<?xml version="1.0" encoding="utf-8"?>
<?xml-stylesheet type="text/xsl" href="template.xsl"?>
<root>
<title>Вторая страница</title>
<content>Содержимое второй страницы</content>
</root>

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

Как оказалось, не все браузеры поддерживают эту технологию. Например, браузер, встроенный в Android, до 4-й версии XML+XSLT не понимал. И, самое главное: сайты, сверстанные с использованием XML+XSLT, крайне неохотно индексируются поисковиками. То есть, боты преобразованием XSLT не заморачиваются. Можно слегка поправить ситуацию, если привести XML-файлы с данными к виду "почти HTML", но это - явный костыль.

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

понедельник, 25 января 2016 г.

Разбирал тут у себя в почте квитанции о недоставленных сообщениях. Среди привычных "mailbox is full" и "account is disabled" обнаружилось зловещее:
Message was not accepted -- invalid mailbox. Local mailbox XXX@mail.ru is unavailable: user is terminated
Вот прямо даже не знаю, что и подумать...

пятница, 22 января 2016 г.

мало ли, вдруг пригодится...

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

- И какой же? - с интересом спросил Оруженосец.

Рыцарь немного помолчал.

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

- То есть, - оживился Оруженосец, - если мы встретим, например, шестиглавого четырехлапого дракона, то... м-м-м, получим одну принцессу, а дракон станет двуглавым?

- Совершенно верно.

- А если дракон будет тринадцатиглавым и трёхлапым, то мы обзаведёмся гаремом из четырех принцесс, а одноглавый дракон станет правильным? Вот это чудеса!

- Да, если папа не врал. А у меня нет причин ему не верить. По крайней мере, мама и тётя Марта всегда подтверждали его слова.

- Хм-м, постойте, господин, а вдруг дракон окажется, скажем, десятиглавым и пятилапым?

Рыцарь задумался.

- Вообще-то, об этом не принято говорить вслух, но дракон куда-то пропадает, а вместо него мы получаем двух принцесс.

- О-чу-меть! Надо же, какая загадочная зверюга. Прожорливая, небось?

- Ужасно прожорливая. Хорошо, что травоядная. Пощиплет травку, смотришь - а число голов удвоилось, ну и лап тоже. Только что бегал по лужайке на семи ногах и жрал одуванчики в одну пасть, а тут, глядь: уже лап четырнадцать и две башки поглощают флору гораздо шустрее. Или три головы на двадцати одной лапе... Зависит, в общем, от объёма переваренного силоса.

- И что же, никак его не убить?

- Никак. Разве что сократить, да и то не всех.

- Не понял, господин. Это как "сократить"?

- Ну, сам я не пробовал. Но Жан - ты знаешь его, он живёт во дворце на Серых Холмах - рассказывал, что однажды на него напал огромный двуглавый двенадцатилапый дракон. И что делать - непонятно. Убить нельзя, убежать - тоже како-то несолидно. Тогда Жан достаёт свой меч-кладенец, посильнее размахивается, и р-р-аз! отполовинивает число голов. Тут же каким-то чудом число ног тоже уменьшается в два раза, и чудовище, ставшее одноглавым шестилапым - не больше таракана - шустро исчезает в ближайших кустах.

- И это у всех так?

- Да, во сколько раз уменьшается число голов, во столько раз становится меньше число ног.

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

среда, 3 июня 2015 г.

чтобы не потерять

1.
В белом небе растает стремительный след,
Будет спуск протекать по спиралям крутым,
Я вернусь постаревшим на тысячу лет
и таким же, как прежде -
почти молодым.

Знаю, век - это миг,
Знаю, век - это час,
Значит, тот, кто давно,
Это всё же - сейчас.
Значит, я, а не он - обезьяний стан
Выпрямлял, не умея плавить руду,
Сбил на землю камнем спелый банан,
И потомки сказали:
- Слава труду! -

А потом в белом небе - стремительный след,
И виски от космической пыли как дым...
Это мир постареет на тысячу лет,
Это я остаюсь навсегда молодым.

2.
Земля зелёным мячиком
Мчится сквозь года.
О чём же вы, мальчики,
Спорите тогда?
Мы, Прометеи,
Создатели огня!
Есть идея -
Нет коня.
Время забыто
Счёта нет.
Бывают же орбиты
Без планет.
Расщеплён стронций.
Умчались ввысь.
Но кто же крикнет Солнцу:
- Эй, остановись!
Не хочу в старость,
Лучше - в никуда.

Пой, гитара,
Пока молода.
Беспощадность клеток -
Спасенья нет.
Сегодня малолеток.
Завтра - дед.
Хочу в невесомость.
Возмите нас...
Сейчас - потомок,
Предок - через час.
Земля зелёным мячиком
Лупит сквозь ночь.
Мальчики, мальчики,
Чем же вам помочь?

3.
Ожидала звонка.
Ожидала давно.
За погашенной шторой светилось окно.
Он вошёл и сказал, бросив шляпу на стол:
- Добрый день, дорогая. Я прощаться пришёл... -
Что ж, прощаются люди на день
и на два,
Иногда на года.
Он сказал:
- Я прощаться пришёл навсегда...

Да, об этом узнала она из газет:
В белом небе растает стремительный след.
И на тысячу лет...
И на тысячу лет.

- Я хочу попрощаться с тобой навсегда.
Ты меня понимаешь? -
Ответила: - Да. -
Человеческий век бесконечно жесток,
Человеческий век - электрический ток.
Только бронза способна века простоять.
Но ответила: - Да. Я тебя буду ждать. -
Буду ждать...

Человек превратится в мечту.
Буду ждать...
Но кого? Разве ждут пустоту?
Разве можно дождаться того, кто "никто",
Кто оставит всего лишь стремительный след?!
Человек не способен жить тысячу лет.
Все уйдут - мудрецы и герои труда,
- Ты меня понимаешь? -
Ответила: - Да. Я люблю...
Я люблю навсегда.

4.
Ярославны, вы вслед на плачьте нам.
Не сидите вы взаперти.
Мы еще по чужим галактикам
Не успели пройти.
Может быть, любовь - это вечность,
Но такая вечность, как плеть.
Вы простите нам бессердечность -
Настоящему не сгореть.

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

Мы с собою берём в дорогу
Веру чистую, как кристалл,
Ту, которой жрецу, как Богу,
Первый верующий присягал.

Ярославны, вы вслед не плачьте нам,
У мужчин есть такая слабость:
Убежать за сто тысяч вёрст,
Хватануть не горя, так славы,
Окунуться в пламя звёзд,
Неизмеренное - измерить,
Неизведанное - пройти...
Ярославны, ждите, верьте,
Мы - в пути.

5.
Война и мир,
Добро и зло.
О, человечество, куда тебя несло?
Была вода.
Придумали огонь.
Но славы ради ли ради женщин
Бумагу исчертил Ньютон?
Прокатный стан родил кусочек жести...
Добро и зло!
Кто, прошлое найдя,
Осудит беспристрастней, чем судья?
... В Браунау жил крепкоголовый мальчик.
О человечество, боготвори вождя!
И он проколет Землю, словно мячик.

6.
Родятся строки и умрут.
Возникнут строки и погибнут.
Их дни сотрут,
Века сотрут -
И памятник себе воздвигнут.
Я знаю, бронза простоит.
Но слава, коль она не вечна,
Сгорает, как метеорит.

Мы всё ещё стремимся к славе -
И мудрецы и простаки.
Потомки да простят нам слабость,
Мы заработали венки!

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

Венки нам не нужны.
Метеорит сгорит.
Но ты, наш правнук,
Не бронзу заготовь -
Мы заработали любовь.

7.
Моя телеграмма найдёт меня.
Моя телеграмма - кусок огня.
Она отстучит, отзвенит монисто
В пульсах девчонок-телеграфисток.
Листок подадут.
Распишусь спеша.
Сломаю кончик карандаша.

Я выйду на площадь,
Я выйду к вокзалу.
У поезда встану -
С площадки спущусь.
И обниму.
- Ожидала?
- Да.
- Не отдам никому.

Отбиты аллеи. Враги перебиты.
Но есть на Земле еще мирные битвы,
Где нет орденов и не льётся кровь,
Где гибнет или живёт любовь.

Мы пойдём по городу рука об руку,
Под нами, как мячик, будет прыгать Земля,
А вечером счастье обхватит обручем
И бросит влюблённых под тополя.
На скамейку сядем.
Подальше от сторожа.
Заговорим, приглушив голоса.

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

... Подходит сторож. Он важен и стар.
Он почти поёт:
- Закрывается парк. -
Мы уходим,
Оглядываясь назад.
За окном говорят. Ещё говорят.
Я счастлив.
Я держу любимую за руку.
Я ощущаю её тепло.
Но тот человек...
Он - завтрашний.
Его уже нет. Его унесло.
Под ним площадка окуталась пылью.
Над ее окном встала звезда.

Попробуйте,
Только скажите: они любили.
Неправда!
Любят. Живут. Навсегда.

8.
А Земля не хотела пускать.
- Не пущу! Не пущу. Не отдам.
Я земным притяженьем своим
Удержу тебя на года.
Человек, ты будешь моим.
Только как же так - не уйти?
Он прижался к её груди
Он зарылся лицом в траву.
И ушёл.
Туда.
В синеву...

В небо ввинчены тополя.
По антенам струится ток,
И бежит по орбите Земля,
Словно хочет сказать:
- Сынок!

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

Это значит на день
и на два.
Может быть, на года -
На всегда не уходит никто,
Даже тот, кто ушёл навсегда...
Возвращается человек
И навстречу летит Земля,
В небо ввинчены тополя,
По антенам струится ток...

(Е.Лучковский "Про Любовь")

понедельник, 17 февраля 2014 г.

Python: Числовые ребусы

Программка для разгадывания числовых ребусов. Методом грубой силы (т.е. простым перебором).

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import sys

#equation = u'удар+удар==драка'
#equation = u'кошка+кошка+кошка==собака'
#equation = u'кто+умён+тот==силён'
#equation = u'где*где-всюду==везде'
equation = u'масло+ноль==омлет'

def replace_all(text, srch, repl):
    for i in range(0, len(srch)):
        text = text.replace(srch[i], repl[i])
    return text

letters = []

for l in equation:
    if l not in ('+', '=', '-', '*'):
        if l not in letters:
            letters.append(l)

tops, counters = [], []
for i in range(0, len(letters)):
    tops.append(10 - i)
    counters.append(0)

canExit = False
while(not(canExit)):

    numbers = ['0','1','2','3','4','5','6','7','8','9']
    substs = []
    for i in range(0, len(tops)):
        substs.append(numbers[counters[i]])
        del numbers[counters[i]]

    text = replace_all(equation, letters, substs)
    try:
        if eval( text ):
            print text
    except:
        None

    N = 0
    inc = 1
    while (N < len(counters) and inc > 0):
        counters[N] += inc
        inc = 0
        if (counters[N] == tops[N]):
            counters[N] = 0
            inc = 1
            N += 1

    canExit = True
    for i in range(0, len(tops)):
        canExit &= (counters[i] == tops[i]-1)

понедельник, 18 ноября 2013 г.

Как назвать новый АРМ?

Наверное, в жизни каждого разработчика возникает ситуация, когда надо придумать название своему новому детищу. Желательно, звучное и глубокомысленное. Мне вот нравятся хитрые аббревиатуры, например: СТЭЛС - Союз Транспортных Экспедиторов и Логистов Сибири, ИКС - Информационная комплексная система, СТЭК - Система Транспортного ЭКспедирования.

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

СИСКИ - Сетевая (можно Промышленная, тоже будет неплохо) Информационная Система Комплексной Интеграции
СЦУКО - Система Централизованного Управления Комплексом Организаций
САКУРА - Система Автоматизированного Комплексного Учета Разнородных Абстракций
КОРД - Комплекс Оперативной Работы с Документами
ВИРТ - Веб-Интерфейс Рабочих Технологий
СЕИФ - Сетевой Единый Интерфейс Функционирования
ВИННИ - Веб-Интерфейс Начального Накопления Информации
ПОНИ - Программный Интерфейс Накопления Информации
ПИВО - Простой Интерфейс Ведения Отчетности
ОИОИ - Открытый Интерфейс Обработки Информации
БАЛК - Базовый Аппаратно-Логический Комплекс
ПИОН - Простой Интерфейс Обработки и Накопления информации (а так же Перед Использованием Обработать Напильником)
ПОССУ - Программист Опять Сошел С Ума

воскресенье, 16 июня 2013 г.

Нормальный алгоритм Маркова

В общем, помыкавшись по интернету, обнаружил поразительную вещь: нечасто встречаются реализации нормального алгоритма Маркова, у которых корректно отрабатывает правило:
$0->0$$$$$$$$$$

Не знаю уж, почему так. Точнее, выяснилось, что как-то хитро себя ведет джаваскриптовская функция string.replace(), но дальше разбираться лень. Поэтому накидал свой собственный велосипед.

Введите начальную последовательность символов:



Нормальный алгоритм Маркова (например, a->b):

четверг, 6 июня 2013 г.

четверг, 15 ноября 2012 г.

СПГС

Как обычно, всё началось с мелочи. А именно - понадобился перевод песни Moby из фильма "Угнать за 60 секунд". Поиск по русскоязычному интернету выдавал диковатые варианты (см. например, тут), но, по правде говоря, собственных идей, что означают все эти "Bring Sally up" не было. Может, какая-то идиома...

К счастью, есть англоязычный интернет. В котором буквально за пару минут выяснилось, что не только переводы убоги, но и оригинальный текст безбожно перевран. "Green sally up" - тоже, конечно, непонятное словосочетание, но, по счастью обнаружился комментарий, расставивший всё на свои места.



Вот уж действительно, надмозги...

воскресенье, 8 июля 2012 г.

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

среда, 15 февраля 2012 г.

Википедия, кладезь лулзов

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

В 1986 году, ещё во времена холодной войны, два агента английской спецслужбы МИ-6 — агент 006 Алек Травельян и агент 007 Джеймс Бонд — выполняют секретное задание по взрыву химического завода рядом с плотиной в Архангельске. Во время этой операции полковник Советской Армии Аркадий Григорьевич Урумов убивает Травельяна выстрелом из пистолета в голову, из-за чего Бонд вынужден перевести таймер на бомбах с 6 на 3 минуты и сбежать с завода на самолёте за мгновение до взрыва.

Прошло 9 лет, Советский Союз распался, холодная война завершилась. Бонд отправляется в Монте-Карло на разведывательную миссию. Он знакомится с Ксенией Онатопп, бывшим советским лётчиком-испытателем, разъезжающей на Феррари с фальшивыми французскими номерами. Ночью она на своей яхте в постели душит любовника — канадского адмирала — и забирает себе его пропуск. Утром Джеймс Бонд проникает на эту яхту и находит тело адмирала. Он отправляется на военную презентацию европейского вертолёта-невидимки «Tiger», которая проходит в Монте-Карло. Там Ксения передаёт пропуск Аркадию Урумову, который к этому времени уже стал генерал-полковником. Они оба проходят на презентацию с помощью краденного пропуска. Затем они убивают обоих пилотов вертолёта, одевают их форму и улетают на нём, несмотря на попытку Бонда остановить их.

Вертолёт прилетает на российскую спутниковую станцию «Северная» в Сибири. Ксения расстреливает почти всех служащих станции, а Урумов активирует новое российское космическое оружие под названием «Золотой глаз». Это оружие представляет собой несколько спутников, которые взрываются над любым нужным местом на Земле, создавая мощные электромагнитные импульсы, выводя из строя всю электронику. Урумов направляет удар на станцию «Северная» и улетает на вертолёте вместе с Ксенией и их сообщником, программистом Борисом Грищенко. Один из служащих станции успевает до своей смерти включить сигнал тревоги, и к «Северной» направляются три «МиГа». Однако «Золотой глаз» уничтожает станцию и «МиГи». Украденный Ксенией и Урумовым вертолёт «Tiger» не чувствителен к электромагнитным импульсам, поэтому они спокойно улетают. За событиями следили люди из МИ-6 через спутник, также уничтоженный импульсом «Золотого Глаза». Позже, использовав другой спутник, они заметят, что на «Северной» была одна выжившая — женщина-программист Наталья Фёдоровна Семёнова, которая выбралась из-под обломков спутниковой тарелки и добралась до ближайшего города на собаках.

Новый М понимает, что в этом деле замешана русская мафия. Она отправляет Бонда в Санкт-Петербург разобраться в этой ситуации. Перед этим Q снабжает Бонда несколькими своими новыми изобретениями: ремнём со стальным тросом, ручкой-гранатой, новыми часами со взрывателем и машиной BMW Z3. Также он отдает Бонду билет авиакомпании British Airways маршрутом Лондон — Санкт-Петербург. В это время в Санкт-Петербурге проходит совет Министерства обороны Российской Федерации во главе с министром обороны Дмитрием Мишкиным. На нём выступает Урумов — командующий Космическими Войсками России. Он говорит, что это нападение осуществили сибирские сепаратисты. Но Мишкин считает,что было бы опрометчиво обвинять во всём этом сибирских сепаратистов, так как двое программистов — уже упоминавшаяся Наталья Симонова и Борис Грищенко — спаслись. Урумов заявляет, что готов начать расследование. Тем временем Бонда в аэропорту Пулково встречает резидент ЦРУ в России Джек Уэйд. Он выводит 007 на российского мафиози, бывшего агента КГБ Валентина Дмитриевича Жуковского, которому Бонд когда-то прострелил ногу. Тот считает, что нападение с «Золотого глаза» — дело рук его соперников-мафиози из группировки «Янус». Агент 007 заключает с Жуковским выгодную для него сделку, его выводят на «Янус». Ксения Онатопп приводит Бонда на свалку. В это время в Санкт-Петербург приезжает Наталья Фёдоровна Симонова, выжившая программистка с «Северной». Она связывается с Грищенко, тот приводит её в собор Смоленской Божьей Матери, где её хватают люди «Януса». Тем временем Бонд на кладбище встречается с главой «Януса», которым оказывается бывший агент 006 МИ-6 и бывший друг Бонда — Алек Травельян. Он рассказывает, как сымитировал свою смерть в Архангельске, после чего вступил в русскую мафию. Но взрыв бомб на химическом заводе, таймеры которых Бонд перевёл с 6 до 3 минут, сильно повредил его лицо. Они разговаривают, после чего Травельян усыпляет Бонда, сажает его связанного вместе с Симоновой в вертолёт-невидимку и запускают ракеты вертолёта по нему самому. Бонду удаётся катапультироваться вместе с Симоновой из вертолёта и выжить. Но в это время на кладбище приезжают военные и арестовывают обоих. Они доставляют их в следственный изолятор. Там Бонд пытается познакомиться с Натальей. Затем их допрашивает министр обороны, но затем приходит Урумов и из пистолета Бонда убивает конвоиров и Дмитрия Мишкина. Затем он хочет застрелить из своего оружия Бонда, но тот нападает на Урумова, и вместе с Натальей пытается сбежать, но солдаты ловят Симонову и сажают в «Волгу» Урумова. Тот едет к Травельяну, но его пытается догнать Бонд, угнавший танк Т-54/55. Он едет на танке по Санкт-Петербургу, разрушая всё вокруг, его пытаются остановить военные и милиционеры, но тщетно. В итоге Урумов привозит Симонову в бронепоезд Травельяна, поезд начинает ехать, но агент 007 выстрелом из танка останавливает его. Бонд заходит в покорёженный от столкновения с танком поезд, где берёт на прицел Травельяна. Но Урумов угрожает пистолетом Наталье, и Бонд убивает Урумова, дав время Ксении и Алеку сбежать и закрыть двери. Они улетают на вертолёте и взрывают поезд, но Джеймсу и Наталье всё же удаётся спастись, и кроме того, им удалось узнать местоположение базы Травельяна — на Кубе.

Бонд и Наталья отправляются на Кубу, где им вновь помогает резидент ЦРУ Джек Уэйд. Бонд и Наталья на подаренном Уэйдом самолёте прочёсывают Кубу, но не могут найти станцию врага, пока их не сбивает ракета. Они выживают, но их хочет добить Ксения Онатопп. Бонд убивает её и сбивает вертолёт врага. Затем они находят спрятанную в озере космическую станцию Травельяна. Вдвоём они проникают на станцию, где их ловят люди Алека. Тревельян рассказывает им о своём плане — перевести все деньги с лондонских банков на свой счёт и затем ударить при помощи спутника электромагнитным импульсом по Лондону, вызвав падение биржи и новую Великую Депрессию. Однако Наталья успела помешать Алеку, сменив коды доступа — спутник «Золотой глаз» сгорает в слоях атмосферы. Бонд взрывает ручку-гранату, ломает антенну станции и скидывает Алека с большой высоты. Затем взрывается станция, при этом погибает Борис Грищенко (После разрушения базы он встаёт и ликует о своей непобедимости, но тут же на него выливается жидкий азот). Джеймс и Наталья спасаются. Дальше их находят люди Уэйда и забирают на базу в Гуантанамо.