Category: it

Category was added automatically. Read all entries about "it".

moose, transparent

квайны

Кстати, каждому программисту, который этого еще не сделал в своей жизни, стоит написать квайн. Квайн (quine) - это программа, которая не получает никаких входных данных, и печатает свой собственный исходный текст. У него такое смешное название в честь философа по фамилии Quine.

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

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

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

забавно

(для программистов, остальных прошу извинить)

Если бы меня спросили, до того, как я это сам прочитал:

($=_=>`($=${$})()`)()


1. На каком языке этот код?
2. Что он делает?

То отнюдь не уверен, что за три попытки дал бы правильный ответ на каждый из вопросов!
moose, transparent

чем пахнет математика?

Гадание на исскуственном интеллекте уже превратилось в клише. Пишем контекст и начало фразы, и даем модели GPT-3 от OpenAI продолжить по своему усмотрению. Сегодня в твиттере попался забавный пример, реально понравился:

Кто-то спросил: чем пахнет математика?

Чтобы ответить на это, программист Дан Пипони ввел подсказку для GPT-3:

Электроника пахнет канифолью.
Биология пахнет формалином.
Химия пахнет серой.
Живопись пахнет льняным маслом.
Математика пахнет...

Как продолжил фразу ИИ? Если хотите, подумайте сами, перед тем, как читать продолжение:

[Spoiler (click to open)]
------------------------
спойлер
спойлер
спойлер
спойлер
спойлер
спойлер
спойлер
спойлер
-----------------------

Математика пахнет МЕЛОМ.

И дальше ИИ продолжил:

Физика пахнет смазанными механизмами.
История пахнет пылью и временем.
Философия пахнет древесным дымом.
Экономика пахнет деньгами.
Теология пахнет благовониями.
moose, transparent

знаменитые программисты

Вопрос к программистам: может привести примеры потрясающе продуктивных программистов, которых за это все в их области уважают/ценят/боготворят?

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

Я так подумал, на ум пришли в первую очередь:

djb (qmail, djbdns, много криптобиблиотек и хэш-функций итп.)
Simon Tatham (Putty, puzzle collection)
Fabrice Bellard (ffmpeg, QEMU, TCC, Linux in JS, ...)
John Carmack (wolf3d, doom, quake)

Предлагайте еще?
moose, transparent

полвека паскаля

А еще в прошлом году, оказывается, исполнилось 50 лет языку программирования Паскаль. В связи с этим Никлаус Вирт (дай бог долгой жизни) опубликовал ностальгически-историческую статью 50 Years of Pascal, которую я прочитал с интересом и рекомендую. Для сравнения: Паскаль появился в 1970-м году, язык Си в 1972-м, Питон в 1991-м, Java (первый публичный релиз) в 1996-м.

Я научился программировать в самом конце 80-х; как и многие в то время, я сначала научился писать на Паскале (и много работал в Turbo Pascal, потрясающе быстрой и удобной для того времени - да и для нашего, если подумать! - интерактивной среде), и только пару лет спустя перешел на Си. Время от времени задумывался о сравнительной популярности этих языков. Если вас тоже интересует этот вопрос, то одним из важнейших исторических документов, который и сейчас интересно перечитать, это Why Pascal is Not My Favorite Programming Language (1981) Брайана Кернигана.

Не все, о чем пишет Керниган, одинаково важно, и мне кажется, что его критическое эссе не дает достаточно полного представления о том, насколько Си и Pascal в те годы были на самом деле похожи - сходств намного больше, чем различий, если сравнивать с другими популярными тогда языками. Мне кажется, что наиболее существенными причинами того, что к середине 90-х Паскаль почти полностью перешел в нишевый статус (да, я помню про Дельфи, но это исключение, которое подтверждает правило) была относительная гибкость Си, легкость, с которой по сравнению с Паскалем в нем можно нарушать абстракции, и благодаря этому - то, как Си естественным образом был и системным языком, и языком для приложений более высокого уровня. Ну и C++ подключился в какой-то момент. Как-то так.
moose, transparent

oracle vs google

Еще пару недель назад американский Верховный Суд вынес окончательный вердикт в долгой судебной тяжбе - почти 11 лет! - между Oracle и Google.

В 2010-м году Oracle купил Sun Microsystems, главным образом - чтобы завладеть копирайтами и патентами, связанными с языком Джава. Уже через полгода после этой сделки Oracle подал в суд на Гугл за нарушение копирайта и патентов на Джаву в операционной системе Андроид для телефонов, тогда еще весьма новой. Главной претензией было то, что Гугл использовал в Андроиде программные интерфейсы (API) стандартных библиотек Джавы, чтобы программисты могли писать приложения для Андроида на Джаве. Гугл написал заново код, выполняющий функции этих интерфейсов, так что тут не было вопроса о копирайте (кроме одной крохотной и тривиальной функции rangeCheck, о которой в итоге написано в тысячи раз больше страниц судебных заседаний, чем в ней есть кода). Но Оракл утверждал, что сами заголовки функций, сам программный интерфейс - то, как они называются и какие аргументы принимают итд. - подлежит копирайту, и нельзя без разрешения Оракла этот интерфейс копировать и заново реализовывать.

У этого иска была долгая и запутанная история, он тянулся годами от инстанции к инстанции. Ему повезло с первым судьей, который им занимался, и вынес обоснованное решение (по слухам, судья научился программировать на Джаве, чтобы разобраться в сути вопроса); но потом апелляционная инстанция отменила решение и завертелось заново. В конце концов дошло до Верховного Суда, и совсем не было очевидно, что он скажет. При этом - и это то, что мне интересно в этой истории - я не знаю ни одного программиста, который не ощущал бы инстинктивно полную бредовость претензий Оракла в этом иске. То есть, оставив в стороне легализмы и формализмы, если спросить себя, должен ли API библиотеки, платформы, языка подлежать копирайту, так, чтобы нельзя было без спроса написать функции с такими же названиями и аргументами, но собственным новым кодом - и всем, кто собственно знает вкус устриц, т.е. имел дело с API и их реализацией, понятно, что это полный бред. Ну наверное не 100% программистов так считают, но близко к тому. Но стоит отойти чуть в сторону от профессии, и опросить, не знаю там, продакт менеджеров, и думаю, что уже не будет такого единогласия; что уж говорить об адвокатах или судьях.

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

При этом, если бы Верховный Суд США вынес неправильный вердикт, и сказал бы, что API подлежит копирайту и не может быть "добросовестно использован" (fair use, исключения, позволяющие без разрешения использовать даже защищенные копирайтом вещи - например, небольшие цитаты или сатирические обработки подпадают под это) - тогда вредные последствия вообще во всех областях программного обеспечения (не только опенсорс!) были бы поистине гигантскими, подозреваю. В итоге ВС не постановил, подпадают API под копирайт или нет, но сказал, что в любом случае их использование является "добросовестным" и разрешенным. Так что все хорошо, что хорошо кончается.
moose, transparent

об утечке из фейсбука и моей фамилии

Пару недель назад в публичный доступ попала массивная утечка данных из Фейсбука: имя, фамилия, и номер телефона (плюс еще немного по мелочи, но не содержимое постов или что-то в этом духе) 500 миллионов пользователей - примерно 20% всех пользователей ФБ.

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

Моя фамилия - Воробей, но я давно привык к тому, что ее часто неправильно пишут Воробьев, потому что Воробьев - намного более частая фамилия, чем Воробей, по причинам, которые мне не вполне понятны. Но как минимум я смог это проверить по этой утечке из фейсбука. И действительно, суммируя по разным написаниям этих фамилий, а также женскому варианту (Воробьева), я посчитал, что кол-во людей с фамилией "Воробей" в этой базе данных из Фейсбука примерно 4% от кол-ва людей с фамилией "Воробьев/а", в 25 раз меньше.

Не сказать, чтоб супер важное исследование или супер полезные данные, но если кому-то нужно что-то такое, то да, это пол-миллиарда имен-фамилий-стран-городов-телефонов.
moose, transparent

о премии ульмана и соразмерности

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

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

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

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

Надо сказать, что позиция Ульмана как минимум спорная, в том смысле, что можно спорить и за нее, и против, в разных обстоятельствах. Иногда бывает, скажем, что какой-нибудь западный профессор отказывается иметь дело со студентом из Израиля только потому, что профессор очень не любит Израиль (в 2003-м году в Оксфорде одного профессора за это наказали). Мне это кажется неправильным и несправедливым; думаю, иранцам то же самое кажется в случае Ульмана. Разумеется, есть разница между Израилем и Ираном, но тем не менее. С другой стороны, можно представить, что играет роль, собирается студент из Ирана изучать теоретическую информатику - или, скажем, ядерную энергетику.

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

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

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

- членам "обиженной" группы приписываются абсурдные, эпические уровни уязвимости и болезненной восприимчивости. Недавно один из редакторов медицинского журнала JAMA в США подверг сомнению на каком-то подкасте существование "системного расизма". Поднялся дикий скандал, главреда на время отстранили от обязанностей, журнал "расследует", как такое могло случиться, а пресса говорит о "не поддающемся оценке уровне боли и травмы, который причинили эти слова чернокожим врачам и пациентам". В случае Ульмана нам нужно представить себе студента из Ирана, который посылает письмо незнакомому профессору, надеясь получить поблажку в приеме на аспирантуру; получает от него неприятный ответ, в котором написано, что профессор не имеет отношения к приему, но если бы имел, то не помог бы ему; и это настолько его шокирует, что он не подает документы в Станфорд, и в другие американские университеты тоже, вообще бросает информатику и идет мыть посуду у себя в Иране, и вот мир потерял будущего гениального ученого, и так десять раз, и все из-за этого проклятого Ульмана.

- после того, как "обида" превратилась в "оскорбление и дискриминацию группы", а также раздулась во много раз из-за вымышленной уязвимости, включается главный принцип: никакие хорошие поступки не могут реабилитировать столь гнусное поведение, ни за что и никогда. Полная потеря представления о какой-никакой соразмерности. Если вдуматься, это реально самое странное и дикое во всей этой индоктринации. Представьте себе, что Ульман, например, был очень плохим научным руководителем (такое бывает ведь) и из-за него много аспирантов пострадали: карьера задержалась на несколько лет или вообще провалилась. Могло бы такое обстоятельство быть поводом для петиций о том, как ему не полагается премия Тьюринга? Нет, конечно, это звучит полным абсурдом, потому что при всем уважении к деятельности научрука, премия вообще не за это и не про это. Но ведь такой гипотетический Ульман - плохой научрук - принес бы намного больше реального вреда, чем эти дурацкие письма, которыми он отвечал иранским студентам! Но вот каким-то образом из-за того, что речь идет о идентификации по групповому признаку ("он дискриминирует иранцев!"), любые мысли о соразмерности тут же вылетают из головы, и люди ощущают потребность защититься от этого ужасного ужасного поведения, подписать петиции, заклеймить, подтвердить свою моральную чистоту. Так устроены моральные паники.
moose, transparent

компьютерные мемы

The Cursed Computer Iceberg Meme - весьма забавная коллекция мемов (со ссылками), многие из которых будут знакомы компьютерщикам и особенно программистам. На каждую фразу можно нажать и пойти на источник.



Порядок примерно такой: чем выше, тем более известные и мейнстримные, чем ниже, тем более эзотерические и извращенные. Так я понял, по крайней мере. Из верхней категории "above the iceberg", например, я знаю вообще все (т.е. узнаю, что это такое, по названию, даже не идя по ссылке), а из самой нижней - только одно название. Всего из 180 мемов я узнал сходу 75 - стало интересно проверить (их список в тексте можно скопировать из формы для голосования о том, какие вы знаете). Я уже сходил почитать про десяток-другой тех, которые не знал - некоторые очень интересные и забавные.
moose, transparent

с чего вызывается функция

(для программистов)

How C++ Resolves a Function Call

Увлекательный пересказ того, как компилятор C++ находит правильную функцию, которую надо вызвать, когда в коде вызывается функция. Как шаблоны/перегрузки/пространства имен все друг с другом переплетаются итд.

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

Теперь, после прочтения этой записи (а также супер-подробного разбора ADL) понимаю, что именно так работает поддержка << в iostream с аргументами из пространств типов; или, например, std::swap. Так что выходит, что я много раз пользовался ADL, просто не задумывался над тем, как компилятор находит мою функцию. Чувствую себя, как герой Мольера, узнавший, что всю жизнь говорил прозой.