Избранное

Позднее Ctrl + ↑

Об ООП

Наконец-то сформулировал, что меня не устраивает в объектно-ориентированном программировании.

Объектно-ориентированное программирование — это не парадигма, а просто синтаксис, но многие его считают парадигмой и чуть ли не молятся на него.

Инструкции процессор пока что исполняет по очереди, ну и ещё он умеет прыгать по разным адресам. Возможность в языках программирования использовать всевозможные ветвления и остроумные циклы вроде foreach вместо повсеместного goto — это не парадигма, а просто удобный синтаксис. Иногда нам удобен if, иногда — case, иногда — while, иногда — for, а иногда, как ни крути, goto. Но всё это сводится к jmp, jz и подобным.

Возможность использования подпрограмм — это ещё чуть более сложная абстракция от прыганий по адресам в памяти, на этот раз ещё и с использованием стека. Она настолько важная, что реализована прямо в железе, и поэтому сводится к call и ret.

Но ничего принципиально нового в теорию алгоритмов все эти конструкции не вносят, они лишь дают возможность формулировать эти алгоритмы более наглядно. Глупо, скажем, вообще всё, что угодно, в программе реализовывать через функции. Для некоторых задач удобнее макросы, а для некоторых даже простой copy/paste кода. Синтаксически операторы часто удобнее и нагляднее функций: a = b+c понятнее, чем a = sum (b, c);

Всё то же самое и с ООП. Объекты — это штуки, которые дополняют список операторов, функций, макросов и всякого другого. Это ещё один вид абстрации от реальности, который иногда удобен, а иногда — нет. Поскольку это всего лишь синтаксис, то использовать его нужно только тогда, когда это удобно, а не вообще всегда.

Проиллюстрируем сказанное на примере:

// a = sin (b);

s = new Sinusor ();
s -> angle = b;
s -> initiateEvaluation ();
a = s -> extractValue ();

Смайлы

В комментариях к недавней заметке про «вушники» всплыла тема правильного оформления текста со смайликами.

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

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

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

На мой взгляд, смайлики стоит использовать только при общении — по электронной почте или в болталке. Тут я чаще всего придерживаюсь подхода Ромы Воронежского, когда считается, что смайлик заменяет знаки препинания :-) Если предложение заканчивается на вопросительный или восклицательный знак, то смайлик я пишу после них. А вы? ;-) Приоритет над любыми соображениями имеет следующее правило:

Главное правило на все случаи жизни: написал, посмотрел, если похоже на говно — напиши как-нибудь иначе.

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

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

Об области применения правил типографики

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

Иногда встречаются удивительные попытки людей оформлять отдельные англоязычные блоки текста (скажем, цитаты) в соответствии с некими английскими правилами типографики, скажем, брать слова “вот в такие” кавычки.

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

Некоторые скажут, что отдельные слова — нет, но вот цитаты вполне можно типографить «на языке оригинала». Но правила типографики — не вопрос языка (в отличие от правил пунктуации), а вопрос национальных издательских традиций. Цитируя текст на английском языке, должны ли мы отбивать тире пробелами? От чего это зависит, от национальности автора текста; от страны, где цитируемый текст был впервые опубликован; от страны, где автор пребывал, когда писал?.. Или, может, нам стоит проанализировать текст и, если он написан на британском английском, то пробелы ставить, а если на американском английском, то не ставить?

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

Другой пример, в некоторой степени аналогичный. По-русски мы пишем «Бейкер-стрит, 221-б», хотя в Англии номер дома пишут перед названием улицы: 221B Baker street. Но несмотря на то, что адрес — лондонский, нам не важно, как его пишут сами лондонцы — читать его нам.

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

Но если мы просто цитируем Нильсена, то оформлять цитату нужно по-русски.

Розовый цвет

По неизвестным причинам огромное число людей считает сиреневый цвет розовым. Это какое-то недоразумение. Давайте разберёмся.

Трам-пам-пам — этот цвет называется сиреневым (lilac).

Трам-пам-пам — этот цвет называется фиолетовым (violet).

Трам-пам-пам — этот цвет называется маджентой (magenta).

Трам-пам-пам — этот цвет называется малиновым (crimson).

Трам-пам-пам — этот цвет называется розовым (pink).

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

Типографская раскладка клавиатуры

Если вы каждый раз, когда нужно в фотошопе вставить правильные кавычки или ещё что-нибудь, мучаетесь, вставляя нужный символ из таблицы символов Windows или вспоминаете, Alt-сколько это будет, то, возможно, вам понравится моя типографская раскладка клавиатуры. Она позволяет вводить кучу разных полезных символов с помощью клавиши Alt Gr (правый Alt) и, кажется, даже подлежит запоминанию.

Если у вас есть какие-нибудь предложения по её усовершенствованию, можете их смело излагать.

Бесконечные периодические дроби

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

Поделим 237 на 5. Нет, не нужно запускать «Калькулятор». Давайте лучше вспомним среднюю (или даже начальную?) школу и просто поделим столбиком:

Делим 237 на 5 столбиком

Ну как, вспомнили? Тогда можно и к делу переходить.

Понятие «дробь» в математике имеет два значения:

  1. Нецелое число.
  2. Форма записи нецелого числа.

Существует два вида дробей — в смысле, две формы записи нецелых чисел:

  1. Простые (или вертикальные) дроби, вроде 1/2 или 237/5.
  2. Десятичные дроби, например, 0,5 или 47,4.

Заметим, что вообще само использование дроби-записи не означает, что записанное есть дробь-число, например 3/3 или 7,0 — не дроби в первом смысле слова, но во втором, конечно, дроби.

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

А раз так, то хочется всякую дробь вертикальную сделать десятичной («горизонтальной»). А для этого нужно просто-напросто числитель поделить на знаменатель. Возьмём, например, дробь 1/3 и попробуем сделать из неё десятичную.

Делим 1 на 3 столбиком

Даже совсем необразованный заметит: сколько ни дели — не разделится: так и будут тройки до бесконечности появляться. Так и запишем: 0,33... Имеем в виду при этом «число, которое получается, когда делишь 1 на 3», или, короче, «одна третья». Естественно, что одна третья — дробь в первом смысле слова, а «1/3» и «0,33...» — дроби во втором смысле слова, то есть формы записи числа, которое находится на числовой прямой на таком расстоянии от нуля, что если трижды его отложить, получится единица.

Теперь попробуем разделить 5 на 6:

Делим 5 на 6 столбиком

Снова запишем: 0,833... Имеем в виду «число, которое получается, когда делишь 5 на 6», или, короче, «пять шестых». Однако, тут возникает путаница: имеется ли в виду 0,83333 (и дальше тройки повторяются), или же 0,833833 (и дальше 833 повторяется). Поэтому запись с многоточием нас не устраивает: непонятно, откуда начинается повтряющаяся часть (она называется «период»). Поэтому период мы будем брать в скобки, вот так: 0,(3); 0,8(3).

0,(3) не просто равно одной третьей, это есть одна третья, ведь мы специально эту запись придумали, чтобы представлять это число в виде десятичной дроби.

Эта запись и называется бесконечной периодической дробью, или просто периодической дробью.

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

Делим 3 на 7 столбиком

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

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

Умножаем 3 на 0,(3) столбиком

И снова мы замечаем, что всё время будут после запятой появляться девятки, девятки и девятки. То есть, используя, обратно, скобочную запись, мы получим 0,(9). Поскольку мы знаем, что произведение одной трети и трёх есть единица, то 0,(9) — это такая вот причудливая форма записи единицы. Однако использовать такую форму записи нецелесообразно, ведь единица прекрасно записывается и без использования периода, вот так: 1.

Как видим, 0,(9) — это один из тех случаев, когда целое число записано в форме дроби, вроде 3/3 или 7,0. То есть, 0,(9) — это дробь лишь во втором смысле слова, но никак не в первом.

Вот так, безо всяких пределов и рядов мы разобрались с тем, что такое 0,(9) и как с ним бороться.

Но всё же вспомним о том, что на самом-то деле мы умные и изучали анализ. Действительно, трудно отрицать, что:

0,(9), представленное в виде суммы бесконечного ряда

Но, пожалуй, никто не будет спорить и с тем, что:

0,(9), представленное в виде удвоенного синуса 30 градусов

Или:

0,(9), представленное в виде натурального логарифма числа Эйлера

Всё это, конечно, верно. Действительно, 0,(9) является и суммой приведённого ряда, и удвоенным синусом указанного угла, и натуральным логарифмом числа Эйлера.

Но ни то, ни другое, ни третье не является определением.

Утверждать, что 0,(9) — сумма бесконечного ряда 9/(10n), при n от единицы, — это всё равно, что утверждать, что синус — это сумма бесконечного ряда Тейлора:

Синус, представленный как сумма бесконечного ряда Тейлора

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

Дак вот, периодическая дробь — это всего навсего десятичная дробь, которая получается, когда при делении столбиком один и тот же набор цифр повторется. Анализа тут нет и в помине.

И вот тут-то возникает вопрос: откуда вообще мы взяли число 0,(9)? Что на что мы делим столбиком, чтобы его получить? Действительно, нет таких чисел, при делении которых друг на друга столбиком мы бы имели бесконечно появляющиеся девятки. Но нам же удалось получить это число, умножая столбиком 0,(3) на 3? Не совсем. Ведь умножать нужно справа налево, чтобы корректно учитывать переносы разрядов, а мы это делали слева направо, хитро воспользовавшись тем, что переносов нигде всё равно не возникает. Поэтому правомерность записи 0,(9) зависит от того, признаём ли мы правомерность такого умножения столбиком или нет.

Следовательно, можно вообще сказать, что запись 0,(9) некорректна — и в определённой степени быть правым. Однако, поскольку нотация a,(b) принята, то просто некрасиво отказываться от неё при b = 9; лучше определиться с тем, что такая запись означает. Так что, если мы вообще принимаем запись 0,(9), то эта запись, конечно, означает число один.

Осталось лишь добавить, что если бы мы использовали, скажем, троичную систему счисления, то при делении столбиком единицы (13) на тройку (103) получилось бы 0,13 (читается «ноль целых одна третья»), а при делении единицы на двойку получилось бы 0,(1)3.

Так что периодичность дроби-записи — это не объективная какая-то характеристика дроби-числа, а всего лишь побочный эффект использования той или иной системы счисления.

0,(9) = 1

Удивительно, что люди не понимают, что 0,(9) = 1, и знак равенства здесь используется в буквальном смысле.

Вчера Дмитрий Кирсанов прислал мне ссылку на подробное объяснение того, почему 0,(9) = 1 (на английском языке; автор развивает тему также в нескольких последующих заметках).

Развлекло меня в этой статье в первую очередь то, что когда я объяснял этот факт одному человеку где-то полгода назад, я использовал все те же самые доводы, причём в том же порядке. Ещё недавно я оставлял на эту тему комментарий у Реймонда Чена.

Насколько я вижу проблему, многие люди просто концептуально не понимают, как что-то может не стремиться, а «быть равным» бесконечности. Они говорят, что «0,(9) стремится, но не равно 1».

Но 0,(9) — это не последовательность и не функция, а число. Число не может никуда стремиться, оно стоит себе на месте на числовой прямой и не дёргается.

Действительно, последовательность 0,9; 0,99; 0,999; и т. д., при стремлении количества девяток к бесконечности, будет стремиться к единице. Но когда девяток станет ровно бесконечное количество — а именно это выражает запись 0,(9), — тогда это число станет ровно единицей.

Запись 0,(9) означает не то, что девяток в числе становится «всё больше и больше», а то, что их есть бесконечное количество прямо сейчас.

Естественно, что это то же самое число, что и 1.

Update: Продолжение темы.

О запятой после «С уважением»

В соответствии с правилами русского языка, после строки «С уважением» (или, скажем, «Искренне Ваш») запятая не ставится. Это логично: чтобы поставить запятую, нужен повод, а там его нет.

Однако в соответствии с современными стандартами оформления деловых писем запятая после «С уважением» всё же нужна. Таким образом, вопрос о постановке этой запятой сводится к тому, что́ для вас важнее — писать по-русски или «по-современному».

Я предпочитаю запятую не ставить (то есть, писать по-русски).

С уважением
Илья Бирман

Мне так представляется, что эта запятая появилась там оттуда же, откуда появилась мода писать «Иван П. Сидоров», то есть из бездумного копирования западного стиля.

Best,
Ilya B. Birman

Аналогичная тенденция, к сожалению, наблюдается и в обращениях; многие пишут:

Уважаемый Илья,

И тут какая-нибудь хрень про e2 или ещё что-нибудь такое. Ля-ля-ля, три рубля.

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

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

Закорючки

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

Закорючки

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

"Прямой штрих" в языках программирования

Осторожно: В HTML ' даёт не апостроф, а именно такой вот прямой штрих.

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

Одинарные кавычки-лапки

Закрывающая кавычка — по совместительству апостроф:

Апостроф

В большинстве случаев Word хорошо справляется с преобразованием программистского штриха в кавычку или апостроф.

Косой штрих (или «прим») используется для обозначения футов и минут, а двойной такой штрих — для обозначения дюймов и секунд:

Штрихи

Такой же штрих используются в математике:

Штрихи в математике

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

Акут в английском языке

Без акута café бы читалось «кэйф», а с ним — «кэфэй».

Поклонникам Mac OS X напомню, что Exposé тоже читается не «экспоуз», а «экспоузэй».

В русском языке акутом обозначают ударение:

Использование акута для обозначения ударения

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

Гравис в английском языке

Это слово читается «миксэт», а не «микст»; грависом можно пользоваться в стихах, когда иначе сломается рифма. Каким образом гравис попал на компьютерную клавиатуру (буква «ё» в английской раскладке) — загадка.

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

Маркированные списки

Одной из претензий нормоконтролёра к моей пояснительной записке было использование маркированных списков с буллетами. Вот таких:

Список маркированный буллетами

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

В любом случае, мне было предложено избавиться от маркированных списков, заменив их нумерованными. Аргумент: в техническом документе должны быть возможность на любой «объект» сослаться по нормальному идентификатору, а не словами вроде «ну, там, где у вас ещё говорится о том-то». Нормоконтролёр сказал, что готов мне простить буллеты в списках из 2-3 элементов, но не в более длинных. Аргумент про возможность сослаться мне представился бесспорным.

Придя домой, я заглянул в справочник и обнаружил там вот что:

Знак тире (кружок, ромбик и т. п.) [рекомендуется употреблять в случае, если] перечень не требует запоминания его элементов в определённом порядке или элементы перечня относятся к самой низшей ступени, когда либо остальные техн. средства обозначения уже использованы, либо по значимости данный перечень относится к низшей ступени в сопоставлении с аналогичными элементами в других перечнях.

Мильчин А. Э., Чельцова Л. К. Справочник издателя и автора. Редакционно-издательское оформление издания. — М: Олимп, 1998; стр. 39

Это написано уже после того, как перечислено несколько способов нумерации, что косвенно подтверждает её предпочтительность. Также обратим внимание, что «кляксы» перечисляются в скобках, а основным символом называется знак тире. Я помню, что в школьных учебниках использовалось именно оно, но многие годы работы с Word и CSS отучили от этого символа совершенно. Попробовав заменить в Word’е в стиле «маркированный» буллет на тире, я обнаружил, что так действительно смотрится лучше:

Список маркированный тире

На вторую попытку прохождения нормоконтроля я пришёл довольным, а ушёл, оставив довольным и нормоконтролёра (по крайней мере, в этой части).

Теперь захотелось посмотреть, как будут смотреться списки с тире на вебе. Но что же делать с CSS? В нём мне не удалось найти никакого способа использовать тире вместо буллетов. Даже в CSS 3. Возможно, я просто чего-то не увидел? Подскажите, кто разбирается (картинки не предлагать).

Ранее Ctrl + ↓