Category: it

Символьные вычисления при помощи нейронных сетей



Нейронные сети хороши в решении статистических задач, в распознавании и генерации речи и изображений. В новой статье, опубликованной на arxiv.org, исследователи из Facebook AI Research показали, что нейросети позволяют получать отличные результаты также в символьном интегрировании и решении дифференциальных уравнений. Причём результаты нейросетей превосходят результаты в решении аналогичных задач коммерческих систем компьютерной алгебры, таких как Matlab или Mathematica.

Сама идея «механизировать» символьные вычисления появилась ещё на рубеже девятнадцатого и двадцатого веков.

В чём тут смысл?

Читать целиком


О реальности импортозамещения в области софта



Вступление



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

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

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


Современная сфера программного обеспечения



Collapse )

20 фактов о Microsoft Word



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

Читать целиком

Ферзи и множества



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

Иными словами, никакие два ферзя не должны находиться на одной горизонтали, вертикали или диагонали — именно так ведь ходит ферзь.

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

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

Казалось бы, а чего тут такого? 1 — есть на этом поле ферзь, 0 — нет ферзя. Переберём все варианты, для каждого проверим, не бьют ли какие-то ферзи друг друга…


Читать целиком


Современное программирование на примере словогенерации



Современное программирование на примере словогенерации

Говоришь людям, что в современном подходе к программированию всё уже не так, как раньше — не верят. Однако не только управление памятью, но и циклы отходят в прошлое. И что там циклы — даже условия, оформленные в виде «if-then-else», в хорошем коде теперь нечасто встретишь. И перехват ошибок при помощи «try-catch».

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

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

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

Но фишка в том, что таки можно. И люди таки избавляются. И программирование становится всё ближе к «формальному языку для человеческих рассуждений» и всё дальше от минимализма и неинтуитивности Машины Тьюринга.

Collapse )

Многозначная логика своими руками



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

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

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

Это, впрочем, не умаляет реальной содержательности того, что он упомянул — пусть даже он и не понимает его устройства. Заблуждение тут не в том, что «он думает, будто существует нечёткая логика, но на самом деле такой нет», а в том, что «он думает, будто бы нечёткая логика — альтернатива формальной, но на самом деле…».

Что же должно в данном случае следовать за «но на самом деле…»? Если это не «альтернатива», то что? Дополнение? Развитие? Усовершенствование?

Collapse )

Топ-7 мифов о программировании



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

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


1. Чтобы быть программистом, надо хорошо знать математику



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

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

Collapse )

Миф о «простом языке для непрограммистов»

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

В 99% случаев за этой фразой скрывается не более чем оправдание для плохо задизайненного языка. И от того, чтобы написать «100%», меня удержало только то, что я не все случаи в истории видел, поэтому, мало ли — надо дать миру шанс.

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

Тут вся штука в том, что очень многие путают «язык, у которого очень мало команд» с «языком, на котором легко писать программы» или с «языком, на котором легко научиться писать программы». На самом деле, всё обстоит чуть ли не с точностью до наоборот: язык, у которого очень мало команд, крайне сложен и в освоении, и в использовании.

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

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

Collapse )

Реализация (NM – 1)-нашек

Для интересующихся выкладываю реализацию (NM – 1)-нашек на языке Wolfram. Сама постановка задачи описана вот тут.

До строки, начинающейся с «pos» — инициализация. Со строки «click» — интерфейс. Между ними «движок». Проверка выигрыша вписана в «интерфейсную часть» — в конец длинного «win».

Да, вся логика возможных перемещений и их реализация содержится в шести выражениях.

Примерно вот этим годные современные языки программирования отличаются от негодных и от несовременных: они позволяют сосредоточится на решении задачи, а не на соблюдении всех программистских ритуалов.

Collapse )

(NM – 1)-нашки

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

И таки проверил. На языке Wolfram в среде Mathematica. Естественно, по сравнению с представленным по ссылке адовым трешем на Wolfram получилось коротко и довольно понятно.

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

После этого товарищ в комментах предложил флеш-моб, смысл которого в реализации пятнашек на чём угодно — ну, на чём нравится конкретному человеку.

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

  1. Должен быть реализован случай для доски размера N на М


  2. Настройки размера доски можно прописать прямо в коде


  3. Сама игра должна быть представлена в графике и управляться кликами мышки


  4. С мега-дизайном можно не заморачиваться — любая графика, более-менее изображающая фишки с числами, сойдёт


  5. Должна диагностироваться победа, когда она наступила, и об этом должно писаться на экране


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


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


  8. Программа должна, блин, работать, а не быть написанной чисто «в уме»


Collapse )