Category: it

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

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? Сложная система самовнушения?), поделитесь в комментариях!
moose, transparent

еще про кубики

В дополнение к предыдущей записи про прекрасную головоломку "кубики Сома".

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

Внутри статьи забавная цитата из Джона Конвея (изобретателя игры "Жизнь", одного из моих персональных героев) за 1961 год: "For a puzzle the size of Soma, it's an admission of defeat to use a computer. If you find the right way of organizing the material, it should take less time to do the whole thing by hand than it does to program the machine." Поскольку именно это я и сделал - не решил вручную и запрограммировал компьютер - ощущаю, что меня строго отчитали через пространство в 48 58 лет. Тем временем и жена, и зашедший в гости друг решили ее вручную минуты за три, и тем самым отчитали меня через пространство в два метра.

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

Я добавил в свой код определение всех уникальных решений (с точностью до поворотов и зеркальных отражений). Как и ожидалось, он находит 240 разных решений (после того, как находил больше и я подчистил несколько багов).
moose, transparent

код для кубиков

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



Наконец это меня так разозлило, что написал сегодня код, который находит решение.

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

P.S. Он находит все решения, включая повороты и отражения; при желании можно додавить, чтобы находил только уникальные, но мне уже лень было.
moose, transparent

куда вы удалились

Синим цветом - продолжение, написанное нейронной сетью, натренированной на корпусе русской литературы. Особенно удачный пример, по-моему:



Можете сами попробовать на чем угодно. seminarist увлекся вот.
moose, transparent

компьютерные ссылки

  1. Ultimate list of all tools we used to create a hit HTML5 game on Steam. Интересно. Можно игру целиком написать в современном джаваскрипте, упаковать с Электроном и распространять через Steam. В обсуждении на HN тоже много полезного.

  2. Interfaces Generally Belong With Users. Хорошее объяснение того, почему полезно иметь duck typing в языке (как в Go и Typescript: объект подходит под тип интерфейса, если воплощает задекларированные в интерфейсе функции; упоминать само название интерфейса и даже знать о его существовании объекту не нужно). Не уверен, что это целиком и полностью добро, но как минимум один весьма полезный тип примеров здесь описан.

  3. The New Illustrated TLS Connection: Every byte explained and reproduced. Исключительно удобное оформление, полезный материал.

    P.S. Да, разумеется, каждый поток TLS 1.3 притворяется потоком TLS 1.2 и даже версию 1.2 указывает в заголовках. А как вы думали эта индустрия работает?

    "Client Version: A protocol version of "3,3" (meaning TLS 1.2) is given. Because middleboxes have been created and widely deployed that do not allow protocol versions that they do not recognize, the TLS 1.3 session must be disguised as a TLS 1.2 session. This field is no longer used for version negotiation and is hardcoded to the 1.2 version. Instead version negotiation is performed using the "Supported Versions" extension below."

  4. Recording Audio from the User. Записывать звук с микрофона внутри веб-приложения стало совсем легко. Я думаю воспользоваться этим для простой системы домашних заданий для ребенка, поэтому искал эту информацию. Пользователь получает подсказку и должен согласиться на запись, это не вопрос прайвеси.

  5. New Tricks for an Old Z-Machine, Part 3: A Renaissance is Nigh Длинная, но очень интересная ностальгическая запись о корнях текстовых интерактивных игр, системы Inform в 90-х, Z-Machine в 80-х итд. Может понравиться и тем, кто не знаком с темой текстовых интерактивных игр (а познакомиться стоит, кстати).