Category: it

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

moose, transparent

нейронные сети имени козьмы пруткова

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

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

Очень смешно.



Если на клетке слона прочтешь надпись "буйвол", не верь глазам своим.
moose, transparent

эта вежливая культура опенсорса

Вот небольшой уютный ламповый автоматический репликатор базы данных SQLite, интересная идея (интересно только программистам): https://github.com/benbjohnson/litestream

Но больше, чем сама программа, меня заинтересовало объяснение автора о том, что он не хочет, чтобы ему присылали изменения исходников - что для починки багов, что для новых возможностей. "Открытые исходники, но не открыто для совместной работы" (Open-source, not open-contribition). Он там объясняет, что в прошлом его опенсорс проекте у него случилось нервное истощение от того, что ему присылали кучу запросов с кодом, на которые у него уходило невозможное совершенно количество времени. И в конце концов он тот проект прикрыл, а в этом решил заранее заявить: ничего не принимаю.

Почему вообще нужно такое заявление? Ну не хочешь принимать чужой код, и не принимай, никто не может тебя заставить. Мне кажется, что дело в том, что практически весь опенсорс перешел на github.com, а там царит культура pull request. Любой может открыть в твоем проекте pull request и попросить тебя принять код, и ты конечно ничего не обязан сделать, но ожидается, что ты постараешься отнестить благосклонно.

Когда-то в доисторическую эпоху, до Гитхаба, если я скачивал откуда-то в интернете опенсорсную библиотеку или программу, у меня не было автоматического ожидания, что я могу послать автору патч и он с ним станет что-то делать. Я искал какое-то README в архиве и смотрел, что там написано на эту тему - если ничего, то мог спросить у автора почтой, перед тем, как слать код. Теперь это все кажется лишним: вот же он, репозиторий на Гитхабе, посылай pull request и все.

Проблема решается легко: надо всего лишь сделать так, чтобы владелец репозитория на Гитхабе мог запретить в нем pull requests. Тогда и объяснять ничего не надо, видно, что закрыто тут. У Гитхаба пользователи выпрашивают эту возможность последние лет семь. Гитхаб аккуратно отвечает, что да-да, мы планируем сделать, и не делают. При этом ясно же, что для них это более или менее тривиально сделать. Им просто наплевать или это хитрая политика такая?

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

advent of code

Народ (программисты, стремящиеся и близлежащие), а вы помните еще про Advent of Code, милое такое ежегодное состязание с не очень сложными задачками? Если не пишешь код все время, а форму хочется сохранять, это по-моему хорошая штука. Или если учишься программировать, тоже тогда.

Оно уже с начала декабря идет, конечно. Я сегодня увидел ссылку на 18-ю задачку там, вспомнил, что есть такое, понравилось, милая задачка, сокращать арифметические выражения. Давайте тряхнем стариной, или новизной, или как еще там? Короче, если уже решили ее, или захотите попробовать, кидайте в комментарии ссылки на ваш код (на pastebin/github/gitlab/где угодно), на любом языке. Если написали обе части (там дают доступ ко второй, если на первую даешь правильный ответ), кидайте обе. Не стесняйтесь, мы все уже все видели! Завтра вечером обещаю кинуть свой код (я уже написал, но не хочу начинать с него сразу).
moose, transparent

об искусственном интеллекте и целеполагании

Скопирую сюда свой комментарий из фейсбука Алексея Цветкова, из дискуссии о возможных рисках от развития сверхразумного искусственного интеллекта. Цветков комментирует книгу Ника Бострома "Superintelligence":

Я уже писал, что читаю Superintelligence Николаса Бострома, и вот наконец дошел до самого интересного места - до обещанного анализа мотивов, по которым AI покончит с нами и примется переустраивать мир по своему разумению. [...] Об этих мотивах у Бострома написано совершенно невнятно. Допустим, расхожий вариант бунта (метафора конечно): мы создаем сверхразумную машину, которая изготовляет конторские скрепки. Она сама себя совершенствует и принимается делать эти скрепки из всего, что ей попадется под руку, в том числе из нас, превращать всю ткань вселенной в скрепки. Если это сверхразум, то вы меня извините. Но заметьте, что мотив, которым она руководствуется, изначально вложен в нее нами, он не возник сам по себе.

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

Я попытался прояснить, как я понимаю этот аргумент об опасности "бунта сверхразума":

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

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

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

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

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

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

два интересных курса

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

1. MIT 18.S191, Introduction to Computational Thinking

Начался на прошлой неделе, обещают всякую интересную прикладную математику и обработку изображений, на языке Джулия (давно хотел посмотреть на него) и один из лекторов - легендарный Грэнт Сандерсон, известный своим поклонникам на Ютубе как 3Blue1Brown (образовательные видео по математике, знаменитые высоким качеством и очень хорошими объяснениями). Вот обсуждение на HN.

2. CMU 15-721: Advanced Database Systems. Это было весной, серьезный курс по базам данных, теория и практика, включая и классические основы и совсем недавние новшества. Этот курс очень хвалят в дискуссии в lobste.rs, кстати, весьма интересной.
moose, transparent

правильное небо

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

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

Кому ты веришь - нейронной сети или своим лживым глазам?
moose, transparent

о багах

Потрясающий баг в Хроме (браузере):

https://bugs.chromium.org/p/chromium/issues/detail?id=1116922&q=agoode

Перескажу в двух словах. Есть популярный формат, в котором вебкамеры пересылают видео в компьютер: MJPEG, это по сути каждый кадр отдельная картинка JPEG (для видео высокого разрешения он не используется, если я верно понял). В этом формате яркость пикселей обычно передается значением от 0 до 255, но есть "ограниченный профиль", в котором используется диапазон 16-235 (почему???). Для передачи по USB вроде бы надо использовать этот ограниченный профиль, но оказывается, что многие вебкамеры этого не делают и посылают полный профиль. А программы (включая Хром) ожидают увидеть 16-235, и "расширяют" диапазон значений, которые видят. Не все программы, несколько работают правильно, но многие. Хотя с другой стороны, поди пойми, вроде Хром как раз работает правильно, а вебкамеры посылают неправильно. Короче, в итоге видео чуть хуже качества выходит, особенно в очень темных или очень ярких местах. И это уже много лет продолжается, разработчики не замечали, потому что вебкамеры и так не ахти качество, хотя пользователи жалуются время от времени.

Это все такая рукалицо, когда читаешь, просто не знаю, как еще прокомментировать. А почему не сделать информацию о диапазоне частью метаданных формата, у кого руки отсохли???

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

язык программирования и его рамки

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

Я начал урок с нескольких заданий растущей сложности. Ребенок уже знает, что такое PRINT "something", PRINT X, INPUT X, IF/THEN/ELSE, GOTO, и выражения типа X=X+1, хотя я не уверен пока что, что твердо понимает, что такое переменная в отличие от просто числа.

- Итак, начинаем с программы, которая просто печатает имя JULIA.
- Это легко: 10 PRINT "JULIA".
- Теперь пусть программа распечатает это пять раз подряд.
- Тоже легко: 10 PRINT "JULIA JULIA JULIA JULIA JULIA JULIA".
- Нет, пусть каждое имя будет отдельно на своей строке.
- Хорошо, тогда 10 PRINT "JULIA", 20 PRINT "JULIA" итд.

- Теперь следующее задание. Пусть программа спросит у меня число, и если например это 4, то она четыре раза напечатает JULIA.
- Хорошо, начинаем с 10 INPUT X, это мы умеем. А теперь...

И тут ребенок серьезно завис, причем не так, как я ожидал. Мы не учили еще циклы, но она уже знает, как что-то делать снова и снова и остановиться по условию (IF ... THEN END, а потом GOTO назад на нужную строку). Я думал, что она пойдет в эту сторону, но будет сложно переоткрыть идею переменной-счетчика. Оказалось - нет, она пыталась найти способ "сказать" компьютеру сделать именно то, что надо, за один раз. Например, может PRINT X "JULIA"? Нет, так это не работает. А если PRINT "JULIA" * X? Нет, это же умножение, а "JULIA" это не число (да, я знаю про Питон). Папа, а как будет "раз" по-английски, чтобы написать "X раз"?

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

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

- Давай сделаем что-то другое. Начнем с программы, которая просто печатает 1 2 3 4 5, каждое число отдельно.
- Это легко. 10 PRINT 1, 20 PRINT 2 итд.
- Хорошо, теперь, как сделать, чтобы программа печатала 1 2 3 4 5 6 итд. и не останавливалась, до тысячи и дальше?

Тут пришлось подумать. Я напомнил "как мы делали, чтобы программа делала что-то снова и снова, как в игре про 4 2 1?". Да, точно, GOTO. Первая попытка: 10 PRINT 1, 20 GOTO 10. Очевидно неверно. Что нужно делать, чтобы число все время менялось? Да, точно. Следующая попытка: 10 X=1, 20 PRINT X, 30 GOTO 20. Опять не то, да, забыла увеличить число. Следующая попытка:
10 X=1, 20 PRINT X, 30 PRINT X=X+1, 40 GOTO 20. Что-то не так, что? Нет четкого разделения PRINT и присваивания в уме, оба что-то делают с X. Подумай, что надо изменить. Следующая попытка наконец верна: 10 X=1, 20 PRINT X, 30 X=X+1, 40 GOTO 20. Наслаждаемся бегущим рядом чисел. (все это занимает вместе считанные минуты, просто мне показалось интересным записать подробно эти попытки, и первый опыт по сути отладки программы).

- Хорошо, а теперь можешь сделать так, чтобы она печатала не до бесконечности, а когда дойдет например до 20, остановилась?

Подумала, вспомнила про IF ... THEN END, перечитала прошлую программу, где это использовала, и вставила 35 IF X=20 THEN END. Работает!

- А можно теперь сделать так, чтобы программа сначала спросила у меня число, а если я сказал например 15, она потом остановилась, когда дойдет до 15?

Подумала, вставила 5 INPUT Y, и заменила условие IF X=20 на if X=Y. Работает!

Но не совсем. Если я ввожу 20, она печатает до 19 и останавливается. Что не так? Почитала еще раз программу, подумала, и заменила условие на IF X=Y+1 (лучше было передвинуть условие раньше, перед увеличением, но это уже мелочи).

ОК, теперь у нас есть программа, она работает. Запустили несколько раз, проверили, все хорошо.

- Хорошо, теперь я тебя попрошу сделать небольшое изменение, ты только не пугайся, если это немного взорвет мозг. Попробуй вместо 20 PRINT X написать 20 PRINT "JULIA". Что тогда будет?

Стала изменять это в программе, еще до запуска появилось подозрение. Запустила. Шок, изумление на лице, "Папа, ты взорвал мне мозг! Это же делает то, что ты от меня хотел. Действительно, это же так просто!"
moose, transparent

бейсик

Я не помню, писал ли об этом уже, но без иронии полагаю Бейсик хорошим первым языком программирования. Причем не любой Бейсик, а такой олдскульный, с номерами строк (не QBasic). Например, GW-BASIC, на котором я когда-то сам учился программировать (если не считать язык Лого с "черепашьей графикой", про который было в какой-то книге - предлагаю не считать). Это было на компьютерах Yamaha, которые в большом количестве установили в классах и институтах СССР во второй половине 80-х, и язык формально говоря назывался MSX-BASIC, но почти не отличался от более известного GW-BASIC.

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

Бейсик с номерами строк, без блоков, ограниченных скобочками, без подпрограмм с названиями, словно создан для того, чтобы направить внимание ученика в эту сторону (а почему "словно создан", собственно? Наверное, специально именно так и создан для этого, его же придумали, как язык для обучения). Чтобы сделать что-то нетривиальное, ученик обязян отслеживать глазами ход работы программы, а номера строк дают ему конкретные "зацепки", облегчающие это дело поначалу. Есть и еще преимущества. Сознательно бедный язык, никакой тебе богатой стандартной библиотеке, никаких "импортов" как в Питоне, но вместе с тем включает все нужное для простой работы с числами, строками и графикой (чтобы дети могли рисовать и игры придумывать). Но главное преимущество - отказ от структурного подхода, номера строк. Если бы не это, я бы предпочел для первоначального обучения использовать Питон или Джаваскрипт. А так - можно начать с Бейсика, и через какое-то время перейти к более серьезным языкам.

(Да, я знаю, есть Scratch, и есть игры типа CodeMonkey для совсем маленьких, и я в общем-то не против, я только за, но это как язык Лого с черепашками в моем детстве. Не совсем то же самое. Не вполне то, что надо. Так мне кажется. Если вам идеально подходит, я только рад)

Не убедил вас? Наверное, не убедил, но если вдруг заинтересовались, то современная среда GW-BASIC, почти полностью совместимая с оригиналом, называется PC-BASIC; или можно взять настоящий GW-BASIC (легко находится, где скачать) и запустить внутри DOSBOX, тоже вполне работает.

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



Кто помнит, какие простые программы/игры можно с ребенком сварганить на Бейсике? Мы только-только начали. Игру "отгадай число от 1 до 100" тоже уже написали. Завтра буду циклы объяснять, может, на примере проверки, простое число или нет. А дальше я уж и забыл, чего надо. Может, простая графика и прямая дорога оттуда к рисованию движущихся точек/линий на экране. А может, остаться еще в тексте и разбираться дальше с числами/строками, если найду интересные идеи для программ.
moose, transparent

про эффективную разработку

Забавным и интересным показался совет, прозвучавший в дискуссии "Полезные советы для повышения эффективности разработчика" на Hacker News. Перевожу:

"Я записываю себя во время программирования с помощью OBS Studio и притворяюсь, будто я крутой стример (хоть никто это не увидит). Это помогает потому что:

1. Помогает мне не отвлекаться. Есть конкретное задание для этого видео, именно его и выполняю.
2. Я учусь лучше формулировать то, чем занимаюсь, какие есть проблемы, решения итд.
3. Мотивирует. Я же не могу разочаровать свои "тысячи поклонников".
4. Потом могу посмотреть, где я зависал/ошибался и учиться на ошибках.
5. Это прикольно. Я могу шутить, ругаться как хочу (моим зрителям больше 18).
6. Я филиппинец, но записываю по-английски, это помогает практиковать язык."

С моей точки зрения 1 и 3 главное, интересно, насколько такое реально помогает. Я вряд ли буду, но реально интересно. Кто-нибудь пробовал?

Кстати, если у вас есть какие-то неожиданные помогающие вам способы улучшить свою эффективность программиста (любимый редактор? любимая музыка или белый шум? Pomodoro timer? Сложная система самовнушения?), поделитесь в комментариях!