Концепция владельца данных
Sep. 10th, 2015 10:42 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
В традиционной парадигме 70-х годов у данных, которые лежат на диске владельца (не в смысле пользователя в многопользовательской системе, а в смысле какого-то куска программного кода) нет.
Приходи кто хочешь, бери файл, копируй, перемещай, меняй в нем байтики.
И у этого подхода есть масса преимуществ. Во-первых, прекраснореализуется toolbox phylosophy. Во-вторых, авторам приложений не нужно думать о поддержке таких операций как бэкап, или о способах передачи данных по сети - это можно поручить отдельным программам - сетевым FS, ftp-клиентам и т.д, и они прекрасно справятся с любыми данными.
Но чего-то в этой парадигме не хватает, и ее постоянно пытаются поломать. Из тех примеров, с которыми приходилось сталкиваться лично мне, первым была MacOS classic, с атрибутами creator и owner у файла. Концепция была, конечно. сильно кривая и мешала, когда нужно обрабатывать некие данные несколькими программами.
Но тем не менее, почему-то подобные концепции постоянно пытаются пролезть в энд-юзресккие операционные системы. Причем не только в виде необязательных настроек вроде ассоциации расширений с приложениями.
Вот в Андроиде, например, появился механизм Intents, который позволяет опять же работать в парадигме тулбокса, но уже над набором приложений-обработчиков данных, а не файлов. Ему, правда не хватает стандартизованных механизмов для бэкапа и обмена данными с другими устройствами, но это задумка такая - привязать пользователей к чужим облачным сервисам, чтобы нельзя было список покупок с компьютера на телефон скопировать, не пропусти в его через индексатор фирмы, торгующей контекстной рекламой.
Или для обмена данными по шнурку вместо избыточно низкоуровневого для этой цели USB Storage используют не протокол уровня файловой системы (SMB, например), а какой-нибудь PTP или MTP.
Если вдуматься, то вообще-то клиент-серверные базы данных и всякие веб-сервисы это примерно то же самое. Вместо того, чтобы хранить данные в файловом хранилище, к ним приделывают процесс, который реализует свою собственную политику доступа, и реализуют какой-то протокол взаимодействия с этим процессом. Иногда не один - вот у ЖЖ, например. есть один протокол для доступа из браузера, а второй - API для всяких программ-клиентов.
Я регулярно сталкиваюсь с описаниями OpenSource проектов, которые норовят использовать D-Bus в качестве аналога андридных интентов и передавать по ней данные от процесса-владельца данных к процессу-потребителю данных. Получается, естественно, плохо. Но упорство таких попыток о чём-то свидетельтсвует.
Я вот тут задумался над вопросом, а какая нужна надстройка над протоколом, подобным интентам, чтобы реализовать те полезные возможности файловой системы, которых нас лишает андроид, стремящийся максимально изолировать приложения друг от друга.
1. Нужен стандартизированный протокол бэкапа. То есть любое приложение, которое хоть что-то хоть где-то хранит (ну кроме очень специальных случаев вроде HSM, должно поддерживать операцию "скачать всё" и, по возможности - "скачать изменения со времен такого-то бэкапа", а также "восстановить вот это".
В принципе, даже HSM-ы можно бэкапить, если предусмотреть защиту бэкапа секретом, который хранится где-то отдельно от бэкапа.
2. Нужен стандартизованный object sharing протокол. Что-то вроде того же PTP или MTP - посмотреть какие объекты есть в библиотеке у данной программы, вытащить указанный объект в виде, пригодным для того, чтобы скормить аналогичному приложению на другом устройстве, положить объект.
Возможно, в обоих случаях нужно поддерживать что-то типа rsync-протокола, то есть возможность передачи по кускам с контролем целостности.
Ну и нужен качественный набор паттернов разделения менеджера данных и приложения с пользовательским интерфейсом. Хотя все равно хрен соблюдать будут. В мире где наиболее распространенным языком является php, созданный для того, чтобы смешивать логику и представление, идея разделения этих двух сущностей будет оставаться благим пожеланием.
Upd А придумает ли кто-нибудь третий случай операции кроме "забэкапить все" и "поделиться избранным", применимый к ЛЮБОЙ информации хранящейся на устройстве? (понятно что варианты "открыть в соответствующем приложении" и "стереть нафиг" не в счет).
Приходи кто хочешь, бери файл, копируй, перемещай, меняй в нем байтики.
И у этого подхода есть масса преимуществ. Во-первых, прекраснореализуется toolbox phylosophy. Во-вторых, авторам приложений не нужно думать о поддержке таких операций как бэкап, или о способах передачи данных по сети - это можно поручить отдельным программам - сетевым FS, ftp-клиентам и т.д, и они прекрасно справятся с любыми данными.
Но чего-то в этой парадигме не хватает, и ее постоянно пытаются поломать. Из тех примеров, с которыми приходилось сталкиваться лично мне, первым была MacOS classic, с атрибутами creator и owner у файла. Концепция была, конечно. сильно кривая и мешала, когда нужно обрабатывать некие данные несколькими программами.
Но тем не менее, почему-то подобные концепции постоянно пытаются пролезть в энд-юзресккие операционные системы. Причем не только в виде необязательных настроек вроде ассоциации расширений с приложениями.
Вот в Андроиде, например, появился механизм Intents, который позволяет опять же работать в парадигме тулбокса, но уже над набором приложений-обработчиков данных, а не файлов. Ему, правда не хватает стандартизованных механизмов для бэкапа и обмена данными с другими устройствами, но это задумка такая - привязать пользователей к чужим облачным сервисам, чтобы нельзя было список покупок с компьютера на телефон скопировать, не пропусти в его через индексатор фирмы, торгующей контекстной рекламой.
Или для обмена данными по шнурку вместо избыточно низкоуровневого для этой цели USB Storage используют не протокол уровня файловой системы (SMB, например), а какой-нибудь PTP или MTP.
Если вдуматься, то вообще-то клиент-серверные базы данных и всякие веб-сервисы это примерно то же самое. Вместо того, чтобы хранить данные в файловом хранилище, к ним приделывают процесс, который реализует свою собственную политику доступа, и реализуют какой-то протокол взаимодействия с этим процессом. Иногда не один - вот у ЖЖ, например. есть один протокол для доступа из браузера, а второй - API для всяких программ-клиентов.
Я регулярно сталкиваюсь с описаниями OpenSource проектов, которые норовят использовать D-Bus в качестве аналога андридных интентов и передавать по ней данные от процесса-владельца данных к процессу-потребителю данных. Получается, естественно, плохо. Но упорство таких попыток о чём-то свидетельтсвует.
Я вот тут задумался над вопросом, а какая нужна надстройка над протоколом, подобным интентам, чтобы реализовать те полезные возможности файловой системы, которых нас лишает андроид, стремящийся максимально изолировать приложения друг от друга.
1. Нужен стандартизированный протокол бэкапа. То есть любое приложение, которое хоть что-то хоть где-то хранит (ну кроме очень специальных случаев вроде HSM, должно поддерживать операцию "скачать всё" и, по возможности - "скачать изменения со времен такого-то бэкапа", а также "восстановить вот это".
В принципе, даже HSM-ы можно бэкапить, если предусмотреть защиту бэкапа секретом, который хранится где-то отдельно от бэкапа.
2. Нужен стандартизованный object sharing протокол. Что-то вроде того же PTP или MTP - посмотреть какие объекты есть в библиотеке у данной программы, вытащить указанный объект в виде, пригодным для того, чтобы скормить аналогичному приложению на другом устройстве, положить объект.
Возможно, в обоих случаях нужно поддерживать что-то типа rsync-протокола, то есть возможность передачи по кускам с контролем целостности.
Ну и нужен качественный набор паттернов разделения менеджера данных и приложения с пользовательским интерфейсом. Хотя все равно хрен соблюдать будут. В мире где наиболее распространенным языком является php, созданный для того, чтобы смешивать логику и представление, идея разделения этих двух сущностей будет оставаться благим пожеланием.
Upd А придумает ли кто-нибудь третий случай операции кроме "забэкапить все" и "поделиться избранным", применимый к ЛЮБОЙ информации хранящейся на устройстве? (понятно что варианты "открыть в соответствующем приложении" и "стереть нафиг" не в счет).
no subject
Date: 2015-09-10 08:29 am (UTC)no subject
Date: 2015-09-10 08:31 am (UTC)no subject
Date: 2015-09-10 08:44 am (UTC)А USB Storage - отмонтировали на устройстве, изображаем на USB флешку. Как отцепили - примонтируем обратно и пытаемся понять, что нам там успели напортачить.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2015-09-10 08:55 am (UTC)no subject
Date: 2015-09-10 09:11 am (UTC)Понятно что оно connectionless и отмонтировать не надо.
Но чем оно лучше даже не сетевой файловой системы вроде NFS и SMB, а протокола передачи файлов вроде ftp?
(no subject)
From:(no subject)
From:no subject
Date: 2015-09-10 08:40 am (UTC)Ну вот SMB например чем вам не угодила? "Посмотреть какие объекты есть в библиотеке у данной программы, вытащить указанный объект в виде, пригодным для того, чтобы скормить аналогичному приложению на другом устройстве, положить объект" - всё есть.
no subject
Date: 2015-09-10 08:48 am (UTC)no subject
Date: 2015-09-10 09:04 am (UTC)Вот "список объектов" в этом протоколе должен быть более интересной сущностью.
(no subject)
From:(no subject)
From:no subject
Date: 2015-09-10 10:37 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2015-09-10 08:48 am (UTC)no subject
Date: 2015-09-10 09:08 am (UTC)(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2015-09-10 10:36 am (UTC)no subject
Date: 2015-09-10 09:07 am (UTC)В файловой системе, конечно, есть стандартизованная метаинформация, возвращаемая системным вызовом stat. Но ее мало. thumbnail там, например, нет. Ссылок на другие каталоги (тэги), где может присутствовать тот же объект - тоже нет.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From:no subject
Date: 2015-09-10 11:57 am (UTC)(no subject)
From:(no subject)
From:no subject
Date: 2015-09-10 11:17 am (UTC)no subject
Date: 2015-09-10 11:26 am (UTC)no subject
Date: 2015-09-10 11:43 am (UTC)no subject
Date: 2015-09-10 11:53 am (UTC)Во-первых, там про сети. А я про взаимодействие между приложениями локально.
Я как раз против того, чтобы позволять каким попало приложениям лазить в сеть. Работой с сетью должны заниматься специальные, выделенные приложения, написанные людьми, понимающими что такое информационая безопасность.
Во-вторых, там предусмотрено разделение устройств на хранители и потребители. За это по-моему стоит убивать с громким воплем "Копираст!".
1, Любое устройство, на котором можно смотреть контент, должно обладать возможностью долговременного хранения хотя бы одного элемента (книги, фильма etc) этого контента. Ибо никто никому постоянную connectivity не обещал.
2. Любое устройство, способное хранить эту самую единицу контента, должно способно по требованию пользователя эту единицу отдать на другое стройство. Вот сидишь ты где-нибудь в очереди в поликлинике, где никакие беспроводные протоколы не работают по причине помех от магнитно-резонансного томографа, читаешь со смартфона книжку. К тебе подходит приятель, и спрашивает "что ты такое читаешь, дай посмотреть". Если ты не можешь тут же скопировать эту книжку ему на планшет, то это жестокий DRM.
Понятно, что всякие организации злобных вендоров будут рекламировать именно такие решения.
(no subject)
From:(no subject)
From:no subject
Date: 2015-09-10 12:54 pm (UTC)Разные варианты фильтров-обработчиков, впрочем, тоже можно считать частным случаем "поделиться".
Ещё можно рассмотреть такую операцию, как "задержать до определённого момента/снапшот". Которую также можно реализовать как создание ссылки (которая будет существовать, даже если другой клиент удалит контент).
Про зоопарк клиент-серверных протоколов и прибамбасов для обработки данных: Проблема тут не в том, что протокола нет, а в том, что информации стало очень много, её трудно искать и зарождается экономика основанная на обработке информации (и в частности на запрещении/затруднении к ней доступа техническими методами).
В конце концов, HTTP+WebDAV предоставляют приличное количество стандартных глаголов для управления контентом. И навесить их поверх USB достаточно просто. Но вот сидит какой-то архитектор или аналитик, читает записку "разработать механизм, что бы можно было фоточки скидывать не отмонтируя SD-карту", и думает: 1) зачем ему плодить лишнюю точку возможных подводных камней на стыке USB и HTTP_over_USB?; 2) чем заменить в новом протоколе host:port (т.е. потребуется сделать какую-то подсистему поиска/перечисления приложений/фоток на обоих сторонах)? 3) Как все эти сложности с обеспечением интероперабельности помогут (точнее, не помешают) заработать? И в результате рождается велосипед, который, хоть и коряво, но едет туда, куда нужно.
И так получается, даже если в исходной задаче для архитектора нет требования обеспечить явный lock-in. Просто недостаток времени и прочих ресурсов на изучение best practices приводит к тому, что если бы вдруг электроннной почты по каким-то причинам не было бы до сих пор, то сейчас она возникла бы в виде каких-нибудь "Google messages", которыми бы пользовались лишь пользователи гугла.
Нам лишь остаётся пытаться остаться на предыдущем уровне технологического уклада и как минимум сохранять на своих компьютерах традиционные файловые системы, rsync, программы, которые работают с файлами как с файлами, а не как своими личными БД и т.д.
no subject
Date: 2015-09-10 01:13 pm (UTC)Ну то есть стандартизовать это надо по принципу "Если приложение реализует функцию печати объекта, API должен быть такой-то".
Разные варианты фильтров-обработчиков - это скорее всего. либо "альтернативное приложение, умеющее работать с объектами такого типа" (ну, возможно, неинтерактивное, да, либо хрень требующая абсолютно другого API, применимого не "ко всем объектам, которые могут храниться". Например, могу себе представить протокол для индексатора полнотекстового поиска. С вариантами для звуковых файлов "позвать имеющуюся в системе распознавалку голоса", "взять хэш и сходить в imdb за lyrics".
То есть если мы делим приложение на "хранилку", "обработчик" и UI, то и печать, и полнотекстовый поиск - это интерфейсы не храники, а обработчика. Они должны слишком много знать о внутреннем устройстве информационного объекта. Настолько много, что дешевле потерпеть UI, если его не удается отделить от обработчика (а, скажем, рендеринг для печати может составлять как бы не 90% UI).
(no subject)
From:no subject
Date: 2015-09-10 01:56 pm (UTC)no subject
Date: 2015-09-10 02:28 pm (UTC)"Получить доступ к файлу" чтобы скопировать, забакапить, переслать, вложить внутрь какого-нибудь документа и "Получить доступ к информации в файле" чтобы просмотреть, процитировать, отредактировать различать будем?
Оно слегка не одно и то же.
no subject
Date: 2015-09-10 02:36 pm (UTC)Соответственно, API для получения доступа к информации, которое приложение предоставляет (если предоставляет) другим приложениям на устройстве, существенным образом зависит от типа этой информации. А мы тут обсуждаем API, которое будет общим для любой информации, про которую мы знаем только то, что она хранится на устройстве, а не где-то в облаке.
no subject
Date: 2015-09-17 08:15 am (UTC)Суть-то таки не в политике доступа, она вторична, а в том, что у каждой базы данных есть некая схема и набор ограничений. Если любой желающий сможет сходить в глубины жж по файловому протоколу (или, как вариант, по SQL, причём с правом не только на DML, но и на DDL) и написать в эти файлы произвольный набор байт (а файл - это произвольный набор байт), то даже при очень добронамеренных желающих структура жж с пользователями, постами и комментами быстро превратится в тыкву.
no subject
Date: 2015-09-17 08:18 am (UTC)Заметим, что многие файловые форматы отнюдь не проще по устройству, чем база данных (а зачастую они этой базой данных и являются). Взять те же офисные форматы документов. Это совершенно не мешает с ними работать как с файлами.
(no subject)
From:(no subject)
From:(no subject)
From:(no subject)
From: