Короче, я пришёл <s>нести свет истины</s> рассказать о важном для меня опен-сорсном проекте, с целью получить интеллектуальных инвестиций (то есть идей, советов, субъективных оценок и т.д.). Ща пока расскажу на пальцах, потом что-нибудь покажу. #reality
Проект, надо понимать, называется Reality. Вот тут был маленький скриншотик: https://mokum.place/zverok/352814. Вот тут гитхабик: https://github.com/molybdenum-99/reality (написанное в Ридми для master уже неактуально, более актуально написанное скажем тут: https://github.com/molybdenum-99/reality/wiki, а вот код там короч самый наиактуальнейший, сегодня запушенный) ‎· обломался весь банный день
Что такое проект Reality? Это такая штука, построенная из зависти к Wolfram Language, в котором «данные обо всём на свете являются частью самого языка». Я хочу, в пределе, сделать то же самое, только с открытыми исходниками и только на открытых источниках данных. ‎· обломался весь банный день
Какой прицел? Должно быть очень, невероятно, невообразимо просто сделать штуки типа «все страны мира → столицы → количество населения» или там «планеты солнечной системы → расстояние от солнца» или «рок-группы → топ-10 → (год создания; сколько участников ещё живы)» и т.д. и т.п. по всем «общеизвестным» областям человеческого знания. ‎· обломался весь банный день
Некоторая часть из этого уже работает! Напр. Reality.countries.map(&:capital).map(&:population) кажется вполне себе сработает. Вообще много чего работает, я потихоньку буду набивать тред примерами. ‎· обломался весь банный день
В первую очередь, работает Reality.entity(название-чего-угодно) — получается такой объект (а, да это Ruby, если вдруг кому ещё было неочевидно), у которого некоторое количество прикольных данных. Почти для любого хорошоизвестного чегоугодно — данные почти наверняка будут. Хотя бы чучуть. ‎· обломался весь банный день
Как оно работает? 1) по «название-чего-угодно» вытаскивается статья англ.википедии; 2) вытаскивается соответствующий ей набор данных из wikidata.org; 3) всё это парсится и по небольшому количеству разных правил превращается собственно в данные; 4) в некоторых случаях подключаются дополнительные модули — например, тянущие погоду с OpenWeatherMap, или корректную таймзону для данной точки с GeoNames, или (в будущем) другие данные из источников открытых данных. ‎· обломался весь банный день
Как оно НЕ работает? На самом деле, многими способами — когда данные в Википедии/Викидате тяжело распарсить, когда длинные списки сущностей, когда всякие человеческие вещи (например, Reality.continents выдаст — в соответствии с Википедией — список континентов, где есть Австралия, но нет «Океании», зато «континент Австралия», оказывается, стран не имеет — в соответствии с классификацией Википедии, есть т.н. «страны Океании»). Я буду с этим работать. ‎· обломался весь банный день
Там много всяких handcrafted штук, а будет ещё больше (то есть например в коде въявную прописано, что для всех стран список городов есть на странице List of cities in %countryname%, а для США — страница называется по-другому), но базовая цель — простым «обобщённым» кодом+конфигами давать доступ ко всему вообще. То есть Википедия (а позже и не только она) как «оглавление», а потом все данные мира с тобой. В виде простых объектов-словарей, которые хоть в JSON сохраняй, хоть на график выводи, и будет хорошо. ‎· обломался весь банный день
Оно, конечно, небыстрое (ну то есть вытянуть «все страны мира» из википедии — это не то совсем, что «выбрать несколько полей из БД»), но я стараюсь, чтобы было разумно быстрое (то есть скажем данные из Википедии тянуло батч-запросом, а не двумя сотнями отдельных). Плюс в следующих версиях будет суровое кеширование, то есть если вы тыщу раз тестируете скрипт «красиво вывести на график население всех столиц», вам же не оч.хочется, чтобы оно каждый раз за всеми странами и страницами по интернетам лазало? Ну, вот. ‎· обломался весь банный день
Зачем оно надо, вообще? (Учитывая, что не сильно быстрое и не супер-точное) Мне представляется, что: а) для обучения (то есть можно демонстрировать студентам _всякоэ_ на живых примерах Reality.tv_series(2016).map(&:actors).group_by... и т.д.; б) для демок — то есть вы сделали какой-то новый крутой алгоритм визуализации, а чо б так визуализировать, чтоб понятно было?.. да говно-вопрос, берёшь вот соотношение ВВП стран к их площади, разбиваешь по континентам, и .... в) «для науки», всяких исследований и инфографики — то есть на самом деле, даже сейчас (в состоянии 0.0.2.pre-alpha) оно уже приспособлено добыть всяких смешных данных больше, чем любой известный открытый датасет, типа «по списку рок-групп возраст их участников и кто из них ещё жив и выпускает ли сольные альбомы» и ты пы ‎· обломался весь банный день
Короче, вот! Я пока сделаю паузу, со мной тут можно разговаривать дальше просто, чё-то я устал писать. Потом я буду потихоньку подкидывать в этот тредик чо оно умеет — смешные примеры однострочного кода, которые дают осмысленный результат. ‎· обломался весь банный день
Reality.entity('Cambodia').cities.sample(10).map(&:area).reduce(:+) — напр, сумма площадей 10 случайных камбоджийских городов :) ‎· обломался весь банный день
Мне не так давно приснился сервис для метеопатов, который подбирает идеальное место для проживания (температуру, влажность, давление, предпочитаемая еда etc). ‎· very lovely tea
Reality.entity('Beatles').parts.select(&:alive?).map{|m| m.albums.last} — напр., последние альбомы тех участников Битлз, которые ещё живы (NB: я чучуть упрощаю код для понятности, о чём я, в реальности нужны пара доп.проверок) ‎· обломался весь банный день
@teavera: а кстати это смешной кейс. моя убер-идеальная Reality пожалуй даже это должна бы типа в пару строк делать :) ‎· обломался весь банный день
Reality.entity('Yukihiro Matsumoto').birth_place.population там например. ‎· обломался весь банный день
Reality.entity('Elbrus').elevation / Reality.entity('Eiffel Tower').height # => 17.4 напр. Плохо, штоле?.. ‎· обломался весь банный день
Меня одно смущает: в любом реальном, не развлекательном кейсе будут требоваться ссылки на источники данных (не на вики, понятно). Но концептуально очень клёво. ‎· несомненный злоумышленник
Ну наше дело маленькое. То есть там дальше будет (один чувак делает) скажем подключение всяких экономических точных датасетов. И вот там и данные будут точнее, и к ним будут референсы встроенные, серьёзнее чем википедия. А моё пока дело — «всё по периметру» (никому непонятная цитата) охватить. ‎· обломался весь банный день
Reality.entity('Hyde Park, London').coord.sunrise # => 2016-02-27 06:51:07 UTC ‎· обломался весь банный день
Зверёчек, а как поставить ту версию, по которой документация в вики (или это пока какой-то внутренний документ)? gem install reality ставит версию 0.0.2, в которой нет Reality.entity. gem specific_install -l https://github.com/molybdenum-99/reality.git ставит версию, которая тоже помечена 0.0.2, в ней есть entity, но Reality.entity('Eiffel Tower') имеет properties == nil и description == nil (height, coord и country при этом работают). ‎· крайне левый кот
@mindszenty эээ gem install ставит версию соответствующую, я так мыслю, ридме (то есть там будет Reality.country('Ukraine') работать, напр., но так себе.). В штуке из мастера должно бы работать так (вики тож врёт): et = Reality.entity('Eiffel Tower'); et.values; et.height, например ‎· обломался весь банный день
Да, specific_install как раз из мастера ставит. Но некоторые твои примеры (.select(&:alive?), sunrise, Reality.entity('Yukihiro Matzumoto')) у меня не работают - это я делаю что-то не так или это ещё не выложено? ‎· крайне левый кот
Примеры немного условные. alive? ещё не выложил, про матца в примере опечатка, он должен быть Matsumoto, но я вот сейчас попробовал — в одном из последних коммитов я кажется чот сломал, починю. ‎· обломался весь банный день
Fixed both, though, check it now ‎· обломался весь банный день
Спасибо! Я сейчас уже стремительно засыпаю, продолжу изучение завтра. ‎· крайне левый кот
↑↑ Количество изменений в этом коммите, в идеале, должно говорить о том, какой крутой и чистый у меня код. Ну, или нет: https://github.com/molybdenum-99/reality/commit/b5410502474a8.... Зато это юбилейный, сотый, коммит! ‎· обломался весь банный день
А где мой код пройдёт — не растёт трава! http://i.imgur.com/1lODPVv.png ‎· обломался весь банный день
^ why the question marks? ‎· 9000
@9000: незагруженные ещё entities, просто указатели/ссылки. после загрузки у неё например может оказаться чуть другое название, или вообще окажется что не существует такой entity, это мёртвая ссылка. ‎· обломался весь банный день
а что получится, если спросить про Reality.entity("Bush")? вообще интересно, как literal превращается в entity, если можно в двух словах. ‎· marat
@marat на данный момент — тупо чз википедию. то есть как в википедии Bush резолвится в disambig page — так и в reality резолвится в энтити без свойств в нынешней версии (и в специальный тип DisambigList в будущей, от которого можно будет одним вызовом можно узнать «а какие варианты» и перейти к нужному варианту). я завтра выложу более информативный ридми, который все эти вопросы будет проговаривать. ‎· обломался весь банный день
/* задумался, как это всё могло бы выглядеть в статически типизированном языке. забавно! */ ‎· 9000
Так. Я полностью с нуля переписал РЕАДМЕ! Пожалуйста-пожалуйста, если вдруг у кого-то хватит сил и желания — почитайте его и скажите мне что-нибудь. Понятно ли, что за штука описывается? Понятно ли какие у неё бенефиты и проблемы?.. Прикольно ли и весело ли?.. https://github.com/molybdenum-99/reality (там два раздела под конец у меня уже рука колоть устала, завтра добью). Спасибо! ‎· обломался весь банный день
↑ бамп в прайм-тайм! need halp! ‎· обломался весь банный день
ну фсё. гем зарелизен, отчёт отправлен, трогательный блог-пост (http://zverok.github.io/blog/2016-03-02-reality.html) выложен. ‎· обломался весь банный день
теперь ожидаем что скажут суровые ниппонские грантодатели (что, в принципе, не очень важно, потому што я это делал по зову сердца, а не за грантовые деньги, которых пока не видел) ‎· обломался весь банный день