egorius: (Default)
2025-01-25 01:01 pm

Оно настоящее

Решил тут посмотреть, что за зверь DeepSeek R1, благо даром и без лишних приседаний.

И слегка прифигел. Эта зараза решает задачи по программированию в духе «сделай то-то и то-то одним SQL-оператором»!

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

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


В PostgreSQL в двух разных сеансах (обозначенных 1=> и 2=>) выполняются по очереди следующие команды:

1=> CREATE TABLE t(id integer);
1=> BEGIN ISOLATION LEVEL REPEATABLE READ;
2=> BEGIN ISOLATION LEVEL READ COMMITTED;
2=> INSERT INTO t VALUES (1);
2=> COMMIT;
1=> SELECT count(*) FROM t;

Какое число выведет последняя команда?




Хорошо, давайте разбираться. У меня есть два сеанса в PostgreSQL: первый (1=>) и второй (2=>). Они выполняют команды в определённой последовательности. Нужно определить, какое число выведет последняя команда SELECT count(*) FROM t; в сеансе 1.

Сначала посмотрим на последовательность действий:

1. В сеансе 1 создаётся таблица t с колонкой id типа integer.

2. Затем сеанс 1 начинает транзакцию с уровнем изоляции REPEATABLE READ.

3. Сеанс 2 начинает свою транзакцию с уровнем READ COMMITTED.

4. Сеанс 2 вставляет в таблицу t значение (1) и коммитит эту транзакцию.

5. После этого сеанс 1 выполняет SELECT count(*) FROM t; и нужно понять, что он увидит.

Начну с понимания уровней изоляции. Уровень REPEATABLE READ гарантирует, что в течение транзакции будут видны только те данные, которые были закоммичены до начала транзакции, а также изменения, сделанные самой транзакцией. То есть, если другие транзакции закоммитят изменения после начала текущей, то в REPEATABLE READ эти изменения не будут видны.

Сеанс 1 начал транзакцию в REPEATABLE READ. В этот момент создаётся снимок данных (snapshot), который фиксирует состояние базы данных на момент начала транзакции. Далее, сеанс 2 вставляет запись и коммитит её. Но поскольку сеанс 1 работает в REPEATABLE READ, он должен видеть данные на момент своего начала, то есть до того, как сеанс 2 сделал вставку. Однако есть нюанс: таблица t была создана в сеансе 1 до начала транзакции. То есть таблица уже существует, когда сеанс 1 начинает транзакцию.

Но когда сеанс 2 вставляет данные и коммитит, эти данные добавляются в таблицу t. Теперь вопрос: увидит ли сеанс 1 эти изменения после коммита сеанса 2?

Поскольку уровень изоляции REPEATABLE READ создаёт снимок данных в начале транзакции, все изменения, закоммиченные после этого момента, не будут видны в текущей транзакции. Но важно, что таблица t была создана до начала транзакции сеанса 1. Значит, в снимке сеанса 1 таблица t уже существует. Однако на момент начала транзакции сеанса 1 таблица t пустая, потому что сеанс 2 ещё не вставил данные. Вставка сеанса 2 происходит и коммитится после начала транзакции сеанса 1, значит, в снимке данных сеанса 1 этих изменений нет.

Таким образом, когда сеанс 1 выполняет SELECT count(*), он должен видеть только те данные, которые были закоммичены до его транзакции. Поскольку сеанс 2 вставил данные после начала транзакции сеанса 1, сеанс 1 не должен видеть эту вставку. Но тут нужно проверить, влияет ли то, что таблица создана в том же сеансе до транзакции. Но нет, это не влияет на уровень изоляции. Уровень изоляции определяет видимость данных, а не структуру таблиц. Структура таблиц уже зафиксирована, так как CREATE TABLE был выполнен до BEGIN.

Но после создания таблицы и до начала транзакции в сеансе 1, таблица пустая. Начав транзакцию в REPEATABLE READ, сеанс 1 зафиксирует, что таблица t существует и пуста. Сеанс 2 вставляет строку и коммитит. Однако сеанс 1, при выполнении SELECT, должен видеть только данные, которые были на момент начала его транзакции. То есть, в таблице t должно быть 0 строк. Но это только в случае, если таблица действительно была пустой на момент начала транзакции сеанса 1. Однако, если таблица была создана в сеансе 1, то при создании таблицы она, вероятно, была закоммичена, так как CREATE TABLE — это DDL-операция, которая неявно коммитит транзакцию, если не находится внутри блока транзакции. Но в данном случае сеанс 1 выполняет CREATE TABLE, а затем начинает транзакцию. То есть, CREATE TABLE выполняется вне транзакции и сразу коммитится. Потом начинается транзакция в REPEATABLE READ.

Но тогда, когда сеанс 1 начинает транзакцию, таблица t уже существует и пуста. Сеанс 2 вставляет строку и коммитит. Теперь сеанс 1 делает SELECT. Так как уровень изоляции REPEATABLE READ, он не видит изменения, сделанные после начала его транзакции. Поэтому count(*) вернёт 0.

Но есть ли тут какие-то особенности? Например, в PostgreSQL в REPEATABLE READ можно видеть изменения, сделанные в собственной транзакции, но не других. В данном случае, сеанс 1 не делал никаких изменений, только читает. Сеанс 2 сделал изменения и закоммитил. Но для сеанса 1 эти изменения произошли после начала его транзакции, поэтому они не видны.

Таким образом, ответ должен быть 0.

Сеанс 1 начинает транзакцию с уровнем изоляции REPEATABLE READ, который фиксирует снимок данных на момент начала транзакции. На этом этапе таблица t уже создана, но пуста. Сеанс 2 вставляет строку и коммитит изменения, но это происходит после начала транзакции сеанса 1.

В PostgreSQL уровень REPEATABLE READ гарантирует, что транзакция видит только те данные, которые были закоммичены до её начала. Таким образом, сеанс 1 не увидит вставку, выполненную сеансом 2, так как она зафиксирована позже.

Ответ: 0.



А все-таки, в какой именно момент в транзакции REPEATABLE READ создается снимок, который используется затем всеми командами этой транзакции?




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

Сначала нужно вспомнить, как работают уровни изоляции в PostgreSQL. Уровень REPEATABLE READ гарантирует, что в течение всей транзакции видны только те данные, которые были зафиксированы до ее начала. Это отличается от READ COMMITTED, где каждый запрос видит последние зафиксированные изменения.

Важно точно определить момент создания снимка. Документация PostgreSQL говорит, что снимок для REPEATABLE READ создается при первом выполнении команды, читающей данные, а не сразу при BEGIN. Это ключевой момент. То есть если транзакция начинается с BEGIN, но первое обращение к данным происходит позже, снимок создается именно в момент первого чтения.

В исходном примере транзакция в сеансе 1 начинается с BEGIN ISOLATION LEVEL REPEATABLE READ, а затем выполняется SELECT. Значит, снимок создается при первом SELECT. Но в примере после BEGIN транзакции 1 до выполнения SELECT сеанс 2 успевает вставить данные и закоммитить. Поскольку снимок создается только при первом чтении, которое происходит после вставки и коммита сеанса 2, то SELECT в сеансе 1 должен увидеть данные после коммита сеанса 2. Но это противоречит предыдущему ответу, где я сказал, что результат будет 0. Возникло противоречие.

Нужно проверить это. Возможно, я ошибся в предыдущем ответе. В PostgreSQL для REPEATABLE READ снимок действительно создается при первом операторе SELECT, а не при BEGIN. Поэтому если в примере транзакция 1 начинается, затем транзакция 2 вставляет данные и коммитит, и только потом в транзакции 1 выполняется SELECT, то снимок создается в момент первого SELECT, который уже видит изменения от сеанса 2. Тогда результат должен быть 1, а не 0.

Но тогда возникает путаница с тем, как работают уровни изоляции. Возможно, я перепутал с SERIALIZABLE, где снимок создается при начале транзакции. Нужно свериться с документацией PostgreSQL.

Согласно документации, в REPEATABLE READ снимок создается при первом операторе чтения. Таким образом, в примере, если транзакция 1 начала REPEATABLE READ, но до выполнения SELECT в ней произошла вставка и коммит в другой транзакции, то SELECT в транзакции 1 увидит эти изменения, так как снимок создается в момент первого SELECT. Следовательно, результат должен быть 1. Это меняет предыдущий ответ. Но тогда я допустил ошибку в первом ответе.

Но возможно, есть нюансы. Например, если первая транзакция после BEGIN выполняет какие-то операции, влияющие на создание снимка. В данном примере транзакция 1 создала таблицу до BEGIN, затем начинает транзакцию с REPEATABLE READ, затем сеанс 2 вставляет данные и коммитит, и только потом транзакция 1 делает SELECT. Поскольку таблица уже существовала до начала транзакции 1, и снимок создается при первом SELECT, который происходит после коммита сеанса 2, то SELECT должен увидеть вставленные данные. Но это противоречит предыдущему выводу.

Значит, я ошибся в первом ответе, и правильный ответ — 1. Но нужно это проверить на практике или перечитать документацию.

Проверяю документацию PostgreSQL:

"In REPEATABLE READ mode, a snapshot is taken at the start of the first query or data-modification command (SELECT, INSERT, UPDATE, DELETE, or MERGE) within the transaction, and that same snapshot is used for all subsequent commands in the same transaction."

То есть снимок создается при первом запросе или команде модификации данных. В примере транзакция 1 после BEGIN не выполняла никаких команд до SELECT. Поэтому снимок создается в момент выполнения SELECT. В этот момент транзакция 2 уже закоммитила вставку, значит, SELECT должен увидеть строку с id=1. Следовательно, результат будет 1, а не 0.

Таким образом, предыдущий ответ был неверным. Нужно исправить его и объяснить, что снимок создается при первом запросе, а не при начале транзакции. Поэтому в данном случае SELECT в сеансе 1 увидит изменения, закоммиченные сеансом 2 до первого SELECT в транзакции REPEATABLE READ.

В PostgreSQL при уровне изоляции REPEATABLE READ снимок данных создается не в момент выполнения BEGIN, а при первом операторе, обращающемся к данным (например, SELECT, INSERT, UPDATE, DELETE). Это ключевой нюанс, который влияет на видимость изменений из других транзакций.

Итоговый ответ: 1.



Ну да, мысли путаные, но ведь доперла же! Сама!

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

Но интере-е-есно, блин.
egorius: (Default)
2023-08-26 07:15 pm

Сочи

Сразу после Непала, в конце мая, поехал в командировку в Сочи на финал олимпиады по SQL. Про олимпиаду подробно писал на Хабре (про второй этап и про финал), повторяться не буду. А потом ко мне присоединилось семейство, и мы провели в тех краях еще дней десять.

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

Удивительно, что несмотря на всю приятную атмосферу и симпатичные улицы, рука не потянулась к фотоаппарату ни разу. По-моему, впервые со мной такое в новом месте. Только на телефоне несколько снимков осталось, но он жуткую постобработку делает, особенно на 2× и когда чует людей в кадре.

* * *

Дальше двинулись повыше в горы, в Красную Поляну. Там типа природа, но в непосредственной близости_от все подвытоптано, окультурено, обнесено заборами и заточено под горнолыжников. В самих городках делать нечего от слова совсем. Роза Хутор (какой к® придумал это название? почему без дефиса?) производит впечатление декораций к вестерну. Ну, разок интересно прокатиться на подъемниках, посмотреть водопады какие-нибудь, горы на горизонте, то-се.

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

* * *

Напоследок спустились к морю и провели еще несколько дней в Адлере, в районе Имеретинской долины. Там все хорошо, пока тебя интересует маршрут от гостиницы до пляжа с променадом по набережной. Любая попытка свернуть в сторону приводит к забору. Нефига шляться, отдыхай давай! Особенно порадовал райончик «Бархатные сезоны» — там кварталы однотипных безликих домов обнесены трехметровыми решетками, как резервации. Не знаю, что у людей в головах®.

По набережной ходят молодые люди в фирменных сириусовских футболках с надписью «Иссλедуй, тβори, побежΔай». Лямбду я еще понимаю, заглавная дельта посреди слова уже вызывает вопросы, а с бетой вообще не угадали.

Но вот ради этого стоило съездить:

egorius: (Default)
2023-07-28 01:57 pm

Непал — конференция

В мае довелось слетать с коллегами в Непал на конференцию. Международную: кроме Непала были представлены Россия (это мы!), Штаты, Пакистан и Индия. Конференция, между прочим, уже вторая, а первая была еще в доковидные времена и злые языки утверждают, что проходила она при свете лучины. Но нет, всё врут! это была керосиновая лампа. В этот раз, к счастью, обошлось без отключения электроэнергии, да и вообще университет Катманду произвел приятное впечатление. В стране взросла нормальная Постгрес-тусовка, которую волнуют всё те же нетленные вопросы: почему всё тормозит, для чего использовать JSON и как мигрировать с Оракла. А декан факультета, Бал Кришна, тот вообще учился в Волгограде и до сих разумеет по-русски.

На конференцию я вез полный чемодан книжек-малюток (96 штук, двадцать с лишним кило). А в Катманду напечатали тираж «PostgreSQL 14 Internals». Сейчас ее, кстати, уже можно за небольшую денежку напечатать по требованию (paperback, hardcover), и lulu сообщает, что меньше чем за месяц двадцать книг уже приобретено. География занятна: Польша, Франция, Великобритания, Ирландия, Германия, Сербия, Португалия, Болгария, Штаты, Корея и Австралия.

На конференцию я привез обновленный двухдневный вводный курс. Предыдущую версию я читал несколько лет назад в Тель-Авиве, а в этот раз мне помогал мой коллега Павел — вдвоем гораздо веселее. И еще у меня был доклад, который я в начале 2020-го делал на московском PGConf-е, а потом перевел и подался было с ним в Европу, но тут-то и началось: то понос, то золотуха, то медные трубы тазы. А сейчас стряхнул с него пыль, подкрасил и вишь чё — пригодился.

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

Фотографий и впечатлений еще много, продолжение следует.

egorius: (Default)
2022-09-20 12:12 am
Entry tags:

Приключения слона-из-книжки

Зайдя некоторое время назад на mos.ru передать показания счетчиков, увидел заметку о коллекции редких книг Дарвиновского музея и прифигел. С разворота книги на меня смотрел Тот Самый Слон, вот только книга была другая:

«Мой» слон из книги Топсела выглядит так:

Заметка и гугл быстро привели меня к нужной книге. Ей оказалась Historiæ animalium Конрада Гесснера, изданная на добрую сотню лет раньше.

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

И, как оказалось, Топсел на обложке все честно написал:

Collected out of Writings of Conradus Gesner and other Authors

В латыни я не силен, но тексты не совпадают; сложилось впечатление, что Топсел пересказывает Гесснера на свой лад. А с точки зрения типографики старое латинское издание симпатичнее.

egorius: (Default)
2022-06-19 01:33 am

О цифрах

Листая «Компьютерную типографию» Кнута, наткнулся на ценную мысль. В главе «Набор книги Concrete Mathematics» он рассуждает о том, что в математическом шрифте Euler (который они сделали, на минуточку, с Германом Цапфом!) рисунок цифр заметно отличался от того, что используется в обычном текстовом шрифте.

...полезно и разумно различать цифры в тексте и цифры в математических выражениях. Текстовые цифры следует использовать в таких случаях, как «1776 г.», «глава 5» и «41 способ», когда числа служат составной частью обычной литературной фразы; математические цифры, напротив, должны использоваться в контексте типа «наибольшим делителем чисел 12 и 18 является 6», когда числа являются составной частью математического выражения. (Авторы технических текстов, пишущих, например, на японском языке, в котором принято использовать арабские цифры только в формулах, но не в обычном тексте, всегда хорошо чувствовали это отличие; теперь и у меня появился шанс испытать это на себе.)

Ныне никто не делает шрифты для ТеХа. LuaTeX и XeTeX научились использовать системные шрифты, и это очень здорово, но обычный труЪтайп не годится на роль математического — в нем нет нужных символов. Для наших книг я использую семейство PT в качестве основного; для математического набора уговариваю ТеХ брать оттуда же все, что можно, а недостающие глифы (типа квадратного корня) тяну из штатного математического шрифта — обычно они более или менее универсальны и не выделяются. Но это получается ужасно криво и неаккуратно. А с этой новой для меня мыслью можно попробовать решиться на то, чтобы цифры были разные, а переменная x отличалась от второй буквы слова «ухо», набранного курсивом.

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

egorius: (Default)
2022-04-16 01:08 pm

О сыре насущном

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

— Во-первых, нет никаких проблем: вон, полно аргентинского пармезана. А во-вторых, наши фермеры научились варить сыр ничуть не хуже! Езжайте на рынок, попробуйте и ощутите гордость_за!

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

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

Больше нельзя просто так взять и полететь в Европу. — Подумаешь! Во-первых, можно съездить куда-нибудь еще, в Турцию, например. А во-вторых, у нас огромная страна, в которой полно прекрасных и удивительных мест ничуть не хуже_чем!

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

Все вопросительные предложения тут — риторические, ответ на них понятен.

* * *

Стало модным упрекать айтишников в том, что они не интересуются политикой. Для начала надо бы уточнить, не интересуются или не занимаются. Ну интересовался бы я политикой, что бы изменилось? А кому чем заниматься, это каждый сам для себя решает.

А что получается, когда (очевидно неглупые) люди начинают притягивать политику в программирование, мы уже видим. Лишились доверия внешние зависимости: если не потеряешь данные, то как минимум узнаешь о взглядах автора. Компании уходят с нашего рынка; ушел Adobe, и теперь мне не очень понятно, как готовить следующую версию книги к требованиям типографии. Все это, безусловно, способствует установлению мира во всем мире.

А в комментариях к посту Брюса Момджяна «Abuse of Open Source?» люди рассуждают, что надо бы отлучить Postgres Pro от сообщества, дабы не помогали российской военщине. Хорошо, что управляющий комитет сохраняет адекватность, хотя уже само наличие поста говорит о том, что тема обсуждается.

Ну нафиг политику, пойду лучше рогаликов куплю.

egorius: (Default)
2022-03-14 11:10 pm

PostgreSQL изнутри

Ну сколько можно о говне,
Давайте лучше обо мне.
Игорь Иртеньев

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

Появилась она не на пустом месте: ей предшествовали пять лет курсов (которые мы делали с Павлом Лузановым, и которые продолжаем делать расширенным составом) и статей на Хабре. И все равно работа над книгой заняла еще целый год. Не все успел написать, что хотел, зато удалось догнать паровоз PostgreSQL и включить новинки 14-й версии. А про что не успел, напишу иншалла в следующем издании.

Это был очень интересный сам себе режиссерский опыт. В книге все сделано одними руками: текст, код, рисунки, верстка, обложка. Разумеется, мне помогало много хороших людей (респект им и уважуха), но сваливать неудачи просто не на кого. Если обезумевший мир войдет в берега и PGConf состоится, расскажу на ней об этом.

Как обычно, pdf доступен свободно, а на бумаге книгу можно купить на сайте ДМК и во всех магазинах.

egorius: (Default)
2019-04-21 01:22 am

Книги: февраль

Салахалдин Джуба, Андрей Волков, «Изучаем PostgreSQL 10»

Еще одна попытка найти хорошую книгу по теме. Снова неудача.

Начинается все с CAP-теоремы (плохой признак), потом поскакали по верхам реляционной теории. Зачем?

Индексы: это секретный соус. Соус, серьезно?

— Are you classified as human?
— Negative. I’m a meat popsicle.

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

Если вы доверяете своему оборудованию, то можете выключить fsync.

Ну и ляпы, ляпы, ляпы. Квадратичный рост путаем с экспоненциальным, логическая репликация передает команды SQL, RETURN NEXT завершает функцию и т. д.

Увы.

egorius: (Default)
2019-02-03 10:01 pm

Книги: январь

Luca Ferrari, «PostgreSQL 11 Server Side Programming Quick Start Guide»

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

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

В общем, не советую.

Ганс-Юрген Шёниг, «Осваиваем PostgreSQL 11»

Перевод второго издания Mastering PostgreSQL 11 готовится к выходу в ДМК Пресс. Прочитал, выдал издательству кучку правок и редакторских примечаний. Если все предложения будут учтены, то в кои-то веки перевод окажется лучше оригинала.

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

Где хорошие авторы, ау?

egorius: (Default)
2018-02-10 12:22 am

Книги: январь

Dimitri Fontaine, «Mastering PostgreSQL in Application Development»

Годная книга про современный SQL и мир вокруг него. Автор — один из основных разработчиков Постгреса, и говорит исключительно правильные слова.

В принципе, до многого в этой книге можно докопаться. Слова правильные, но стоят иногда в странной последовательности, а иногда не вполне раскрывают тему. Количество опечаток неприлично велико для книги. Оформление небрежное, несмотря на верстку в ТеХе (странное сочетание). Впечатление такое, что текст писался впопыхах и никто, кроме самого автора, в него не глядел.

И тем не менее, таких грамотных книг — единицы, так что рекомендую.

egorius: (Default)
2018-01-31 12:52 am

ТеХнологии на службе

Работа техническим и художественным редактором, помимо бесконечной вычитки, правки и переписки, приносит неожиданно интересные задачи.

Нет, вычитка тоже интересна: когда бы еще довелось пообщаться на равных (ну, почти...) с профессором университета? Одну книгу мы уже выпустили (пособие по SQL), и надеюсь, что в этом году добьем первую часть фундаментального труда по основам технологий СУБД.

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

А сейчас возникла необходимость привести несколько иллюстраций, кое-как нарисованных в каких-то Пауэрпоинтах, к единому стилю. Сначала думал перерисовать в draw.io, но вовремя вспомнил старую историю. В свое время копировал я братцу (тогда еще музыканту) какие-то заковыристые ноты. Ксерить было неспортивно, хотелось набрать на компьютере. Какие только специализированные программы мы с ним не перепробовали: Сибелиус, еще что-то... ничего не получалось, не хватало возможностей. Тогда на помощь пришел ТеХ (MusiXTeX): неделю втыкаешь, потом пишешь какие-то загогулины и внезапно все работает именно так, как надо.

Вот и сейчас — книги-то мы верстаем в ТеХе. Оказалось, что есть пакет TikZ, ноги которого растут откуда-то из глубин Постскрипта и Метафонта. Пришлось честно напечатать кусок документации и даже прочитать его. Окончательно меня покорила авторская глава о хорошем стиле со ссылкой на Тафти.

Для примера решил начать с ER-диаграмм. Казалось бы, несложная штука, но спецсредства порождают ненастраиваемый ужас-ужас, а в том же Либреофисе безгеморройно нарисовать лапку в стиле Баркера — просто невозможно. Но в TikZ можно вообще все что угодно, и вот как это может выглядеть:

Если опустить определения стилей (которые находятся в SO и допиливаются напильником), то сам код хоть и пестрый, но вполне читаемый:

\begin{tikzpicture}
  \pic {entity={courses}{Courses}{
        \#      & course\_no \\
        $\ast$  & title \\        
        $\circ$ & hours \\
  }}; 
  \pic[right=8ex of courses] {entity={exams}{Exams}{
        $\ast$  & score \\        
  }}; 
  \pic[right=8ex of exams] {entity={students}{Students}{
        \#      & student\_id \\
        $\ast$  & name \\        
        $\ast$  & start\_year \\
  }}; \&
  \pic[above=8ex of students] {entity={groups}{Groups}{
        $\ast$  & group\_no \\
  }}; \&
  \draw [one to many uid] (courses) -- (exams);
  \draw [one to many uid] (students) -- (exams);
  \draw [optional one to many] (groups) -- (students);
\end{tikzpicture}

Сплошные прелести:

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

Буду пробовать дальше.

egorius: (Default)
2017-07-29 09:43 pm

В стиле SQL - 7 (жизнь)

Давеча фейсбук подсунул рекламу, которую я не только не скрыл незамедлительно, но и — первый раз такое! — с интересом посмотрел. Это был университет бесполезных знаний, а в особенности меня, конечно, заинтересовали «бесполезные языки программирования».

Одна из статей там посвящена написанию игры Жизнь на APL в одну строчку. Если — вдруг — вы еще не знаете, что такое Жизнь, сошлюсь на другую статью на том же сайте — она написана интересно, с картинками и интригующими подробностями про Машину Тьюринга.

Окей, вполне допускаю, что APL — это хорошо, но зачем, когда у нас есть SQL?

Только вместо Oracle на этот раз я буду использовать PostgreSQL — времена меняются.

поехали )
egorius: (Default)
2017-07-13 12:19 am

Циклы в psql (и sql*plus)

Удивляюсь, почему в интерактивной среде? терминальном клиенте? интерпретаторе командной строки? — короче, в psql (и в sql*plus!) нет конструкций для циклов.

SQL, как и его процедурные расширения типа PL/pgSQL или PL/SQL, не могут напрямую общаться с пользователем; это правильно. А клиенты, типа psql или sql*plus, — наоборот. И действительно, оба умеют задать пользователю вопрос, узнать ответ и использовать его дальше в запросах. Но ни у одного нет даже примитивных конструкций для циклов, ну и для ветвлений. Да хоть goto какой-нибудь! Но нет.

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

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

сервер: Угадай число от 1 до 100?
человек: 42
сервер: Ни фига, 28. Играем еще?
человек: да
сервер: Угадай число от 1 до 100?
...

Или я чего-то не догоняю? Может есть какой-нибудь лайфхак?

egorius: (Default)
2016-05-04 01:27 am

Книги: апрель

Борис Новиков, Генриэтта Домбровская, «Настройка приложений баз данных»

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

Поэтому книжку я купил, даже не открывая. И не пожалел: внутри оказался очень толковый, выстраданный на практике подход к оптимизации и настройке СУБД, полностью соответствующий моему опыту, и к тому же внятно и последовательно изложенный. Прочитал на одном дыхании и пожалел, что двести страниц быстро закончились. Горячо рекомендую всем разработчикам и администраторам СУБД, независимо_от.

Gianni Rodari, «Favole al telefono»

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

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

Иногда сверяюсь с русским переводом, а он такой настоящий, советской закалки. Например, в истории про мышонка из комикса (il topo dei fumetti) переводчику пришлось выкручиваться, потому что слова «комикс» не существовало:

Этот мышонок всю свою жизнь прожил в тоненькой дешевенькой книжонке — знаете, из тех, в которых рассказы в картинках.

А вот прекрасное про сыр:

— ti piace di più il parmigiano o il groviera?

— какой сыр тебе больше по душе — пармиджанский или пошехонский?

egorius: (Default)
2016-02-25 03:07 am

Удивительная штука

Удивительная штука, этот Постгрес.

Давным давно, прослушав в Универе курс Кузнецова по базам данных, напросился я стажером в Протвинский РДТеХ. Мне вручили талмуд «Oracle CASE*Method» про ER-диаграммы и моделирование, с которым я коротал время в электричках. А еще осваивал Oracle Designer/2000, и даже перевел с английского и прочитал учебный курс по этому чудо-продукту.

Разве мог я тогда предположить, что двадцать лет спустя РДТеХ будет читать наш курс по Постгресу?

А сколько городов необъятной родины довелось посетить за каких-то полгода, и в скольких еще предстоит оказаться? В ближайших планах Казань и Новосибирск.

Да и в самой Москве полно интересных мест. На конференции выступил (первый раз после Универа, ага). Предоставился повод навестить ВМК, а там суперкомпьютер «Ломоносов», от которого с улицы видна система охлаждения. Снова заглянул в Яндекс, где было прожито несколько сложных, но интересных лет. Опять же ГАИШ (будем себя хорошо вести, может и в телескоп дадут глянуть).

А ведь мог бы так и просидеть со своим OёBSом. Удивительная штука, эта жизнь.

egorius: (Default)
2016-01-27 10:57 pm

Mind the gap

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

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

Дальше пока непонятно: идей разных много, а времени мало...

egorius: (Default)
2016-01-07 11:58 pm

Django

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

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

Во втором — превыше всего приложение, чудесное, высокотехнологичное, в которое пользователи влюбляются с первого клика. Конечно, оно использует данные, так что следует вооружиться ORM-ом и пусть какая-нибудь СУБД обеспечивает персистентность.

Сам я всегда принадлежал (и принадлежу) первому лагерю, но интересно же посмотреть, как другие живут. Поэтому из любопытства поковырял немного Django — на StackOverflow периодически попадаются вопросы типа Как бы мне сделать то-то и то-то, имеющие понятный ответ на SQL.

Занудно про работу Django с базой )
egorius: (Default)
2015-10-06 09:54 pm

Гастроли

Семь дней до вашей поездки: Новосибирск, — сказал мне вчера гуглофон. Вот откуда он узнал? Единственный вариант — нашел и распарсил в почте (причем рабочей, не gmail) билет на самолет. Даже не знаю, что и думать. Двадцать первый век наступил-таки.

* * *

А чего, собственно, еду? Пошел наш базовый курс по администрированию Постгреса в массы. В октябре везем его в Барнаул, в ноябре — в Ульяновск, в декабре — в Омск. Избранные главы, возможно, будем рассказывать на Хайлоаде в начале ноября. А Форс уже начал читать этот курс на коммерческой основе.

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

egorius: (Default)
2015-08-01 10:33 pm

Книги: июль

Ролан Барт, «Camera lucida»

Эту книгу рекомендовал Сергей Максимишин. Взгляд на фотографию через studium и punctum действительно интересен, но в целом философия и рассуждения автора почти ничего во мне не затронули.

Пара моментов.

Барт:

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

А вот Даниэль:

Прежде всего восприятие не может и не должно удовлетворяться видимым... Единовременно в лучшем случае воспринимается изображение, но никак не образ. ... Лучшим опытом восприятия картины служит восприятие «наизусть», как произносят про себя любимые стихи, как предчувствуют, предвосхищают, «репетируют» в душе встречу с самым любимым.

И еще интересно, имел ли в виду Ларс фон Триер вот эти строки Барта:

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

Саймон Ригс, Ханну Кросинг, «Администрирование PostgreSQL 9: книга рецептов»

Единственная доступная сейчас в магазинах книга о Постгресе на русском языке. Но получилась она, при всем уважении к Ригсу, никчемной.

Девиз этой книги: Если вы не знаете, о чем речь, ничего страшного — вам это знать необязательно.

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

Кусочек для иллюстрации:

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

Не зная устройства многоверсионности в Постгресе, невозможно догадаться, на что намекает автор. Я было подумал, что это косяк переводчика, но и в оригинале не лучше:

After loading, if you had load errors, there will be some junk loaded into the PostgreSQL tables. Not junk you can see, or that give any semantic errors, but think of it more like fragmentation.

А перевод безобразный. Партиционирование, логи, касты и все вот такое. Допустим, пользователь спрашивает: «Что, если я хочу знать, подключен ли тот компьютер?» — бррр.

egorius: (Default)
2015-06-16 06:33 pm
Entry tags:

А вот знаний кому, знаний

В ближайшее время будем проводить открытые семинары начального уровня по администрированию PostgreSQL.

Программа примерно такая:

  • Введение
  • Архитектура
  • Установка
  • Использование psql
  • Базы данных и табличные пространства
  • Основные объекты и системный каталог
  • Управление доступом (роли, схемы, привилегии)
  • Подключение и аутентификация
  • Сопровождение
  • Мониторинг работы системы
  • Резервное копирование и восстановление

Анонс будет в фейсбуке в группе PostgreSQL в России. Если интересно — следите за новостями, ну или сюда стучитесь.