вторник, 13 декабря 2016 г.

Запись и чтение

Минимальная запись состоит из двух чисел - номер своего узла и номер другого узла. Например, узел с номером 5 связан с узлами 1, 234 и 5782. Записи в файле будут выглядеть так:

... 5:5,0 ... 65720:234,5 ... 2387456:5782,5 ...

где первое число - это адрес.

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

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

... 5:5,65720 ... 65720:234,2387456 ... 2387456:5782,0 ...

Благодаря тому, что последовательность задана жёстко, можно "допрочитывать" связи узла в параллельных процессах.

четверг, 8 декабря 2016 г.

Mail.Ru Group: Можно ли автоматизировать работу политика?

Можно ли автоматизировать работу политика? Думаю, что можно, вот только политики, скорее всего, будут дольше всех сопротивляться. В одной из последних серий «Черного зеркала» нарисован дистопичный мир, в котором на смену деньгам пришли оценки, которые люди ставят друг-другу, и на основе которых формируется некий рейтинг, определяющий уровень доступа человека к общественным благам. Хочешь арендовать машину — хорошая машина в аренду только для тех, у кого рейтинг больше 4. Если у тебя рейтинг низкий, то дают развалюху с устаревшим интерфейсом для зарядки.



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

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

«Есть много истин, правда лишь одна:
Штампованная признанная правда.
Она готовится
Из грязного белья
Под бдительным надзором государства
На все потребности
И вкусы и мозги.
Ее обычно сервируют к кофе
Оттиснутой на свежие листы,
Ее глотают наскоро в трамваях,
И каждый сделавший укол с утра
На целый день имеет убежденья
И политические взгляды:
Может спорить,
Шуметь в собраньях и голосовать».
Максимилиан Волошин. «Путями Каина»


Представители технической интеллигенции, скептически относящиеся как к компетенции собственников бизнеса, так и к способности широких слоёв населения принимать действительно разумные решения, часто поддерживают идею меритократии. Почему бы не экзаменовать людей на наличие у них знаний, необходимых для принятия квалифицированных решений? Допустим, мы будем считать, что голос необразованного человека имеет при голосовании меньший вес, чем голос образованного. Или же сделаем так, что эксперты в какой-то области будут иметь больший вес при принятии решений в своей области, и так далее. За такими схемами всегда стоят различные опасения, которые достаточно воспитанному человеку нельзя озвучивать вслух, ведь демократия является одной из основополагающих декларируемых ценностей первого мира. На мой взгляд корень проблемы с демократией заключается именно в том, каким образом организован доступ к знаниям, к образованию в мире. Как много тратит наше общество на воспитание и образование подрастающего поколения? Почему вместо школ и институтов мы предпочитаем тратить ресурсы на огромный аппарат военного, полицейского и идеологического подавления, призванный бороться с последствиями голода, темноты и неграмотности? Многие современные исследователи считают, что описанные проблемы вполне можно преодолеть, используя именно ресурсы прямой демократии. Такие исследователи как Пол Кокшотт и Аллин Коттрелл из Университета Глазго ещё в начале 90-х в книге «К новому социализму» («Towards new socialism») рассмотрели возможности изменения нашего общества на базе возможностей, предоставляемых прогрессом новых информационных технологий.


Электроовцы съели людей: возможные последствия от развития ИИ для рынка труда

пятница, 25 ноября 2016 г.

Кант и медузы

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

Кант и медузы

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

четверг, 10 ноября 2016 г.

VPN, виртуальное государство

В одном физическом сетевом кабеле может одновременно сосуществовать множество виртуальных сетей (VPN). На одной территории может одновременно сосуществовать несколько виртуальных государств. Часть людей подчиняется правилам одного виртуального государства, часть людей - правилам другого. Будут ещё люди, которые одновременно участвуют в жизни нескольких государств. Представьте, что в вашем городе есть пять государств и вы можете получить их гражданство, никуда не перезжая.

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

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

воскресенье, 6 ноября 2016 г.

Вовлечение в новую валюту

Вовлекаем несколько человек. Объясняем суть предстоящей игры. Даём первому тысячу рублей в долг на месяц и с возможностью вернуть любым способом на выбор:
1) в рублях с процентом (скажем 1100р.);
2) в новой валюте без процента (1000у.е.).
Этот человек выдаёт эту сумму следующему с теми же условиями и так по цепочке. Последний в цепочке выдаёт эту сумму нам с теми же условиями.
Получаем кольцо взаимных обязательств. Любой участник цепочки делает что-либо для любого другого, в результате чего создаётся виртуальный эквивалент в новой валюте, который используется для возврата долга. Кто не успел ничего сделать, возвращает в рублях с процентами. Как?

Электронное государство. Кто не успел, тот опоздал.

Внимайте тому, что вам уготовано свыше. Электронные государства, новые языки, информационные деньги, другое общество.

Кхм...

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

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

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

Но не дождётся. Ибо есть альтернатива! Электронное криптогосудаство. И не одно, а множество. Идеи для таких государств вы получите очень скоро в виде озарений.

Кхм...

Принцип выборов изменился. Голосуем на за партию, не за депутата, а за образ жизни, организацию которого берут на себя криптогосударства. Они будут соревноваться за ваше внимание. Вы будете выбирать те, которые позволяют организовать вам свою жизнь в соответствии с вашими взглядами. Но граждане существующих криптогосударств будут предъявлять определённые требования к новым иммигрантам.



среда, 12 октября 2016 г.

Quatro: формат линейного представления графа

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

Связи хранятся в виде одного файла.
Файл содержит двоичные числа одинаковой разрядности.
Первое число - единица и одновременно является идентификатором первого узла. Это обстоятельство позволяет легко определить разрядность остальных чисел.
Файл не может содержать болше чисел, чем значение самого большого из них.
Признак идентификатора узла - нечётное число равное своему порядковому номеру в файле.
Признак связи - нечётное число отличное от своего порядкового номера в файле. Это число равно одному из имеющихся в файле идентификаторов узлов.
В узле без связей сразу после идентификатора записан ноль.
В узле со связями сразу после идентификатора следует число с порядковым номером связи в файле.
В последней связи узла сразу после идентификатора другого узла записан ноль.
В прочих связях узла после идентификатора другого узла записан порядковый номер следующей связи.
На месте удалённой связи записываются два числа со значением ноль. Предыдущая связь переключается на следующую за удалённой.


Значения хранятся в отдельных файлах. В качестве имени файла берётся идентификатор соответствующего узла.

Идентификатор узла определяется по хэшу значения.

Новые узлы и связи записываются в конец файла.  Добавление связи состоит из нескольких этапов:
1) последняя связь проверяется на возможность записи (ноль - в качастве ссылки на следующую связь)
2) связь блокируется (единица - в качастве ссылки на следующую связь)
3) в конец файла дописывается связь с другим узлом (и ноль - в качастве ссылки на следующую связь)
4) в последнюю связь записывается вместо единицы порядковый номер добавленной ссылки, после чего добавленная ссылка считается последней





вторник, 4 октября 2016 г.

Гонки

Старт

Здесь шумно. У линии старта толпятся болельщики. В воздухе запах жжёной резины. Покрышки моего автомобиля ещё горячие. Скоро начнётся второй заезд. Он определит победителя соревнований.

Уверен, что победа достанется мне. Почему я в этом уверен? Кто я такой? Я такой же гонщик, как и ты. Выгляни из окна. Мой жёлтый скоростной болид стоит слева от твоего автомобиля. Смотри, я машу тебе рукой.

Заметил, какой необычный корпус у моей машины? Обтекаемая форма позволяет мне нестись по трассе быстрее пули. Тебе будет трудно меня обогнать. Лучше закрой книгу и иди домой, посмотри мультики.

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

Школа гонщиков

Добро пожаловать в нашу школу. Я твой учитель. Мой предмет называется "подготовить гонщика". Почему тебе это название кажется странным? Название как название.

Я обучу тебя приёмам экстремального вождения автомобиля. Ты спрашиваешь, как меня зовут? Тебе знать этого не положено. Гонщики не должны знать, кто их обучил. Меньше знаешь -- быстрее едешь! Всё равно, когда ты покинешь здание школы, ты сразу забудешь о её существовании.

Главное запомни, что я тебе сейчас скажу: "В игре есть машины и на них можно ехать быстро или медленно." Почему ты говоришь, что это чепуха. Это не чепуха. Лучше запиши себе в тетрадь, чтобы не забыть. Записал? Молодец, что записал. Теперь ты настоящий гонщик и можешь принять участие в соревнованиях.

Не веришь? Хорошо. Вот тебе учебный автомобиль. У него на двери кнопка. Читай, что на ней написано. Да, верно. Написано: "посадить гонщика". Жми, не бойся.

Так, теперь ты сидишь за рулём. Нет, руль вертеть не нужно. Это за тебя сделает компьютер. Да, согласен, это круче, чем коробка-автомат. Чтобы ехать быстро, жми на кнопку с надпистью "ехать быстро". Чтобы ехать медленно, жми на кнопку рядом. На ней так и написано: "ехать медленно".

Не буду спорить с тобой. Это и правда проще простого. По прямому участку трассы ты едешь быстро. На крутом вираже сбавляешь скорость и едешь медленно.

Ты спрашиваешь, где кнопка с надписью "остановиться"? Её нет. Это же спортивный автомобиль. Не беспокойся, в конце трассы компьютер остановит его автоматически. Ну, прощай! В добрый путь! Пока! Успехов!

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

Ответы на вопросы

Скорее всего ты запутался, куда попал. Это не беда. Сейчас ты получишь ответы на все вопросы. Дело в том, что ты находишься внутри компьютерной игры. Прямо внутри микросхем компьютера, который исполняет программу. Программы пишут люди, а компьютеры их только исполняют.

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

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

Прочитав эту книгу, ты узнаешь из каких частей состоит программа и сможешь сам начать программировать. А начинать нужно с самого интересного. С программирования гоночной машины!

Гоночная машина



суббота, 30 января 2016 г.

Сетевая база в одном файле 2

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

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

четверг, 28 января 2016 г.

Сетевая база в одном файле

Размышляя над системой, написанной на PHP, пришёл к пониманию того, что лежащую в основе графовую базу данных нужно переработать. Порядок привязанных узлов нужно отслеживать на уровне базы данных. Желательно сократить список технологий, задействованных при реализации базы данных, и максимально всё упростить. В идеале описать формальные требования. Чем и займусь.

  1. Записи не удаляются.
  2. Связи могут только добавляться.
  3. Связи имеют направление.
  4. Одному строковому значению соответствует один узел.
  5. У всех узлов есть значение - NULL или хэш строки.
  6. Хранятся только цепочки связей.
  7. Звено ценпи состоит из порядкового номера звена, номера следующего звена и ссылки на звено-узел.
  8. Порядковый номер звена соответствует его расположению в файле.
  9. Узел - это первое звено в цепочке, которое не указывает на другие узлы.
  10. При каждом запросе узла, создаётся новый объект.
Пример: узел 3 связан с узлами 1 и 2.

address    next    link    комментарий
1          0       1       узел 1
2          0       2       узел 2
3          4       5       узел 3 (последнее звено 5)
4          5       1       связь узла 3 с узлом 1
5          0       2       связь узла 3 с узлом 2 (последняя в цепи)
6          0       6       узел 6

Поскольку приложение, использующее базу данных, отслеживает тип узла, нет необходимости помечать узлы, привязанные к значениям. Функция node.hasValue() не нужна.




четверг, 7 января 2016 г.

Компьютерная лингвистика, так сказать...

Попытался между делом написать код на PHP под правила языка, описанные в одной из предыдущих статей.

Работа ещё не завершена, но что-то уже прорисовывается. Можно нащупать проблемные места и сделать доработки. Код выложен на GitHub.

Код разделён на две части: сетевая (графовая) база данных и правила синтаксиса. Называются, соответственно, - graph и syntax.

Сетевая база предоставлет средства для извлечения и изменения связей узлов, а также позволяет прикреплять к узлам некоторый набор данных. После нескольких мучительных дней терзаний понял, что этот набор данных является значимой сущностью на более высоких слоях абстракции. Представление его в виде объекта с интерфейсом приводило к усложнению кода. Сначала было два варанта строка для хранения слов и строка для хранения ссылок на файл. (Да-да... Члены предложения могут быть и файлами. И кусками кода, если уж на то пошло.) И эти два интерфейса стали расползаться из глубин хранилища наверх до самого ГУЯ. Вобщем, теперь у узла может быть два значения NULL или строка. Интерпретация строки выполняется за пределами хранилища. Файл можно хранить в виде JSON-чика, в котором указан тип данных и ссылка или путь к файлу. Данные привязываются к узлу в момент создания и не могут быть изменены. По хэшу строки всегда можно найти, привязанный к ней узел. Узлы не удаляются. Причина тому в том, что свзи в базе однонаправленные, и для удаления некоторых узлов пришлось бы долго обходить, возможно, миллионы имеющихся узлов. Ради упрощения и ускорения действует принцип - слово не воробей, вылетит не поймаешь. На самом низком уровне связи хранятся в виде папок и ссылок файловой системы. Простенькие штучки на бесплатном сервере Cloud9 занимают где-то 0,1 секунды. Не плохо бы попробовать замерить на SSD и на машинке помощнее. На нижнем уровне хранилища можно будет задействовать Redis или подключиться к другой базе. Была идея выложить эти папочки со связями узлов в открытый доступ, чтобы можно было скармливать внешним системам как статику.

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

clause
Простое предложение. Содержит одно единственное сказуемое, обозначающее описываемое действие, и несколько уточняющих членов.

complimnet
Член предложения (кроме сказуемого). Привязывается через валентность к сказуемому и вопросам от него.

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

predicate
Сказуемое. Связано через валентность с вопросительными словами и всевозможными ответами на них в разных предложениях. Буквы сказуемого хранятся в специализированных узлах - словах.

question
Вопросительное слово. Берёт на себя функции падежных окончаний и много ещё чего, поскольку употребляем по новым правилам только начальные формы слов. Вопрос связан с ответом через валентнось и второстепенный член предложения. Буквы, как и в случае со сказуемым, содержаться в узлах-словах.

answer
Ответ.

word
Слово. Одно и то же слово может содержать ссылку на сказуемое, вопрос и ответ. В английском, например, одно и тоже слово может обозначать как действие, так и предмет. Или ещё для такого случая: "важно не сколько, а как".

Отсутствуют пока что узлы типа reference, которые позволят в качестве ответов использовать подчинённые предложения.

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

Схема связей такова: