Pull to refresh
92
0
Юрий @m36

User

Send message

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

Может у меня Даннинг-Крюгер, но вот, ответ на "трудный вопрос сознания". Когда мозг путает представление о себе с собой, то и возникает ощущение, что он осознает сам себя. Возникает ложная рекурсия. Мозг считает, что его представление исследует само себя. Представление любого объекта не может заниматься осознаванием или самоисследованием. Исследовать что-то может только мозг, а не то что он о себе представляет.

Так еще можно:

declare @Posts table ( CreationDate date  )
insert into @Posts (CreationDate) values('2010-11-26')
insert into @Posts (CreationDate) values('2010-11-27')
insert into @Posts (CreationDate) values('2010-11-29')
insert into @Posts (CreationDate) values('2010-11-30')
insert into @Posts (CreationDate) values('2010-12-01')
insert into @Posts (CreationDate) values('2010-12-02')
insert into @Posts (CreationDate) values('2010-12-03')
insert into @Posts (CreationDate) values('2010-12-05')
insert into @Posts (CreationDate) values('2010-12-06')
insert into @Posts (CreationDate) values('2010-12-07')
insert into @Posts (CreationDate) values('2010-12-08')
insert into @Posts (CreationDate) values('2010-12-09')
insert into @Posts (CreationDate) values('2010-12-13')
insert into @Posts (CreationDate) values('2010-12-14')
insert into @Posts (CreationDate) values('2010-12-15')  
insert into @Posts (CreationDate) values('2010-12-16')  
insert into @Posts (CreationDate) values('2010-12-19')  

insert into @Posts (CreationDate) values('1900-01-01')  
insert into @Posts (CreationDate) values('3000-01-01')  


;with dates AS (
	select cast(p1.CreationDate as date) FinishDate, cast(MIN(p2.CreationDate) as date) StartDate 
	from @Posts p1, @Posts p2
	where p1.CreationDate < p2.CreationDate
	group by cast(p1.CreationDate as date)
	having MIN(datediff(day, cast(p1.CreationDate as date), cast(p2.CreationDate as date))) > 1
)
select d1.StartDate, MIN(d2.FinishDate) FinishDate from dates d1, dates d2
where d1.StartDate <= d2.FinishDate
group by d1.StartDate;


Стремился только к краткости, как его SQL-SERVER оптимизирует, не проверял. Суть: добавляются две граничные даты сверху и снизу. И ищутся дырки.
Попиарюсь немного. Я хоть и не разработчик игр, но недавно знакомый предложил мне подумать над этим, потому как у него ребенок, он хотел бы, чтобы какую-то игру ему обучающую дать. Для такого возраста не нашел.

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

Может и вашим подойдет.
http://robotinmaze.net/ru
Можно. Я начал работать почти в 28. Уже нет проблем никаких, опыт. Но учтите, что опыт нарабатывается очень долго, знаний очень много. Я даже поначалу не знал, что так много придется читать всего, изучать. Уже 10 лет опыта работы, а всё еще есть пробелы. По образованию не программист, многое догонять пришлось.

Хотя, это зависит, наверное, от направления и языка программирования. Кому-то и поверхностное знание PHP с каким-нибудь фреймворком хватает для зарабатывания денег.
Если вы отличный специалист в С++, то всегда можно написать программу, работающую быстрее, чем на J. Но разница будет: месяц по сравнению с час, утрированно, работы программиста. Иногда это просто неприемлемо. Пусть J и медленнее, но он достаточно производителен. Причем не факт, что он будет медленнее, если писать на плюсах в лоб.

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

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

11&0. — это свалит джей, т.к. нет глагола с цифрой ноль и точкой. буква о с точкой есть. Если вы сюда внесли ошибку. Вообще эта «хитрость» с нулем ищется почти мгновенно, если это в IDE перенести. Глагол о. зеленым рисуется, цифра фиолетовым. Т.е. даже если шрифты бы были неудобные

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

Третий глагол добавляет единицы в голову и хвост вектору, который вернул второй глагол g. Он возвращал без двух элементов, этот глагол их добавляет. И применяет вектор как фильтр к аргументу.

Ну и последний: применяет s — т.е. сортирует по углам исходный вектор. А далее, применяет r в цикле, до тех пор, пока вектор не перестанет меняться.

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

Разница небольшая, но есть. Просто я показал как разобрать удачную для Scalа строку джея. Но джей с нуля позволяет и другие, неудобные для других языков вещи писать кратко. Все таки — это работа с многомерными массивами, а не списками.
Вот, расскажу, что делается в предыдущем примере в этом коде. Хотя код аналогичен вашему, но мог бы быть и другим.
s =: /:[:|-/12"_ o.],:<./


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

3 7 8 2 9
2 2 2 2 2
Найти у каждого элемента угол. И отнять от второй строки первую. Далее, найти перестановку для сортировки этого массива и применить эту сортировку к исходному массиву.

Да, это Спарта. Но в джее мышление немного как бы шире списков. Этим он и прекрасен.

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

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

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

Однажды меня попросили описать алгоритм для документа, это была жесть. Мне надо было или врать, или говорить: берем 6-ранговый массив, меняем 3 ранг с пятым и находим проекцию на вектор с операцией агрегации такой-то. Технический писатель отказалась переводить и оформлять этот документ.

Так что тяжело в учении — легко в бою. Эти значки — неплохая и вынужденная вещь. Я думаю, было бы лучше, если бы там были по одному символу на глагол значки и какие-то покрасивее, чтобы картинка подсказывала, что за операция. Но клавиатуры не позволяют. И вообще, это не критичная проблема. За неделю можно заучить все эти комбинации.

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

Один из проектов — высоконагруженный сервер, нереляционная субд, для датамайнинга. Кластер, шардинг. Это еще в далеком 2005 году, когда такие слова не были особо в обиходе у программистов модными.

Я лично, например, писал там еще математические сервер, считающий ОЛАП-преобразования. Еще про олап мало кто слышал.

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

Посмотрите на главной странице http://www.jsoftware.com/ в разделе Representative Users кто его использует и найдете Hewlett Packard, Intel, Microsoft и много других.

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

Я лично тоже считаю, что один красивый уникальный значок на глагол был бы понятнее, чем комбинация из двух. Но клавиатуры мешают. И это не критично. А сама форма записи и разбора предложений — очень и очень неплохая в джее.
Я извините, не внимателен. Scala, а не Питон.
Этот код, который написан, понятен и да, он больше. Но он понятен, но не использует по всей видимости только изначальные языковые вещи. (Я не знаю Питон).
sortBy — это скорее уже библиотечная функция, как и тип List, даже если они из коробки.

Почему это важно? Потому что я показал разбор только одной строки, которая удачно, только с сортировкой связана. На джее таким же образом можно сделать всё. Кстати, у вас голова не вычитается, это меняет алгоритм, потому как 0 может получиться не только у самого себя, но и у точек на одной линии. Далее, вы не сортируете углы относительно минимальной точки. Вы сортируете углы относительно 0+j0, просто отняв угол минимальной точки и взяв абсолютное значение. Это был тест, насколько я пойму код другого неизвестного языка?

На джее, аналогичный вашему код будет поменьше:

s =: /:[:|-/12"_ o.],:<./


И специально, для ненавидящих таситную форму джея и любителей абстракций, то же самое в экслисит форме с именами, чтобы не раздражали значки глаз:
min =: <./
angle =: 12&o.
sortBy =: /:
abs =: |

s =: monad define
   y sortBy abs
(angle y) (angle min y)
)



Как видите, этот код не хуже вашего питоновского, но он все же хуже того, что в таситной форме как по мне.
Почему 12 выбрано? Это к создателям джея. Это язык такой, что там элеметнарным глаголам имена не раздаются направо и налево. o. применяется для разных случаев.
Слишком резкие высказывания. Его используют. Я всеми силами тут пытаюсь объяснить, что язык семантичен, не стоит дураками китайцев например, называть, или немцев, что ж они очень семантический русский не пользуют? Чтобы понять, насколько семантический язык, надо его знать и сравнить, а не пугаться всего, что непонятно.

Это скорее психологическая реакция. Дети в школе так делают — называют всё, что непонятно, идиотизмом. Физику, математику. «какой это идиот придумал?»

Знание глагогов приводит к их узнаванию в тексте, логично. Что приводит к чтению кода. Логично. А вот, насколько сложный код можно записать и насколько легко он читается, при условии, что вы знаете язык — это и будет семантичностью.

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

Вопрос

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

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

То, что вы критикуете, что программист пишет большую часть логики в одном предложении, так это потому, что для него так комфортно писать, что есть, несомненно, плюсом. И ваша критика основывается только на непонимании, почему этот программист понимает этот код. А именно, не знание глаголов и правил построения. Вам кажется тот код сложным? Чистый и простой код. Просто обратите внимание на скобки. Их много? Нет. Если их не много, то внутри код читается линейно. Давайте разберем первое:
s =: ({., }. /: 12"_ o. }. — {.) @: /:~

справа налево. Первый глагол:
/:~
Обозначает отсортировать по возрастанию. Тут наверное вектор, т.к. в задаче вектор. Я давно статью читал и вообще в код не вникаю сейчас, с нуля разбираем. Сортировка — понятно, что это такое.
Далее союз @: — говорит, что после сортировки надо делать то, что в скобках.
В скобках берем три первых (с конца) глагола:
}. — {.
Отсечь голову вектора (списка) и от этого получившегося списка отнять голову.
Следующие два глагола берем:
12"_ o. }. — {.
Сначала выполняется первый левый, потом тот, что посредине, берет правую (уже вычисленную раннее) и левую часть.
12"_ — это хитрый глагол, порождающий константу (12), вне зависимости от аргументов. Просто число не подошло бы, т.к. требуется глагол, а не существительное. Т.е. по сути, далее, если в прямом режиме, без глаголов писать, то выполнится выражение:
12 o. к нашему обрезанному и отнятому списку
12 o. — это поиск угла комплексного числа. К списку применяется, значит там список комплексных чисел — применится к каждому. Берем новые два глагола:
}. /: 12"_ o. }. — {.
То же самое. Сразу левый выполняем — отрезать голову исходному отсортированному (за скобками вначале) списку. И диадный глагол сортировки — это значит, что находим перестановку для углов справа и в этом порядке располагаем список слева. Т.е. перемещаем все комплексные числа так, чтобы углы, если их взять, были отсортированы.
Снова берем два глагола:
{. ,}. /: 12"_ o. }. — {.
Взять голову отсортированного списка и запятой приклеить к списку справа — т.е. отсортированному (без головы)

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

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

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

Так что вполне в разумные сроки можно изучить. Возможно, это требует какого-то специального мышления, у меня статистики нет.
Есть особенности работы человеческого мозга, которые не позволяют эффективно парсить подобные структуры.


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

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

Кстати, в этом тоже плюс джея. На нем можно достаточно легко написать вот такие длинные большие штуки и они работают. И не париться. Там внизу писали, что джей используется когда много данных и мало времени. Это отчасти верно. Джей — он как инструмент для быстрой обработки данных, здесь и сейчас. Иногда и не надо ничего рефакторить, возможно, это одноразовый был бы код в реальной задаче.
В современных языках как раз избегают писать длинные выражения в одну строку. Гораздо понятнее и удобнее разбивать сложный алгоритм на несколько более простых, которые затем комбинируются понятными операторами.

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

В общем, джей позволяет писать бОльшими кусками и не запрещает разбивать на меньшие.

Как быстро вы сможете найти ошибку в следующем алгоритме?

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

На счет выбора знаков, почему именно эти — я не в курсе истории. Наверняка были на то причины.

Но вот это:
max(a) + sum(a)/len(a)
понятно, пока оно просто. А так:
sum(a)/len(a) + max(a)
Тоже понятно. Тогда так:
sum(a)/len(a)<<2 + max(a) Упс, уже надо смотреть приоритеты.
А если надо к сумме добавить максимальное, а потом всё поделить? Только скобки. Когда как в джее всего лишь меняются местами операции. Если выражения усложняются, то вам как математику и программисту на каком-то уровне придется пойти покурить и передохнуть, чтобы понять длинное выражение со скобочками.

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

Только linq где-то сравнится с джеем, но оно не достаточно мощное, кода раза в 4 будет больше обычно. И более захламлен точками, скобками методов, ненужным именами параметров.

А вообще, где-то похоже по ощущениям. На джее вообще, ощущения как и на SQL. Только на последнем реально бывает очень тяжело выразить довольно простые мысли, в отличии от джея. Где-то в мозгах так же на SQL комбинируете множества, как и на джее, но там сложности из-за отсутствия упорядоченности, индексного доступа. На джее же всё пишется легко.
а, да. Комментарии нужны, просто я хотел кпд языка показать. Обычно, под каждый глагол аннотацию желательно писать. Потому как глаголы обобщенные, но часто при создании глагола программист какие-то ожидания на них вешает, тип массива например. Вот, в isVar нужно передавать бокс с текстовой строкой. Хотя, из тела видно, но можно, обычно пишут.

Комментарий после NB.

Не особо плюсы или шарп и естественные. Они позволяют просто давать имена. А ООП ближе к естественному мышлению, чем массивное программирование. Но имена и здесь в джее хорошо даются глаголам, можно и классы писать. Никакой разницы в этом нет. Просто джей позволяет это делать меньше. Хотите, делайте очень маленькие простые глаголы и каждому давайте имя. Будет как в С++
А вам не очевидно, что я, например, вполне себе читаю, иначе бы просто не смог бы написать сколько кода write-only?

isVar =: [:(91&>*.64&<)[:a.&i.[:{.>

Отрыть коробку, взять первый элемент со списка (символ), узнать его номер в алфавите (ASCII), и истина, если он входит в интервал — (91;64) — и называется isVar. Вспоминаем, что в прологе переменные пишутся с большой буквы.
Читается такой код элементарно, никаких хитростей нет. Просто надо знать эти элементарные глаголы и правила построения выражений.

Information

Rating
Does not participate
Location
Киев, Киевская обл., Украина
Date of birth
Registered
Activity