Информация

Последние записи

Теги


Блоги


Записи из всех блогов на Sql.ru


Создание своей CMS - очередной велосипед? Или шаг в карьере?

Блог: maple4
Каждый человек должен построить дом, вырастить сына, посадить дерево. Веб-программист - должен создать свою CMS.

Я не говорю, на чем она будет создаваться (PHP, ASP,...), это не имеет никакого значения.
Я не говорю, стоит ли это делать вообще, ведь многое уже создано ранее да еще и распространяется бесплатно.
Я не касаюсь аутентификации, авторизации, регистрации и прочего - всего, что связано с правами и возможностями пользователя. Как это все будет реализовано - отдельная тема (например - с помощью тегов). Для простоты понимания - в дальнейшем будет обсуждаться ТОЛЬКО пользователь с возможностью изменения структуры сайта и заметок к нему. Для остальных такая возможность закрыта.

Поэтому, сразу к сути (вариант проекта своей собственной CMS).

1. Сайт строится на основе некой структуры (ВНЕЗАПНО!), группе страниц, организованных в виде дерева .
Но, общее количество таких страниц не означает, что только они и будут. Структура - только основание.

2. Заметка - мельчайшая частица информации для построения сайта. Лист для дерева :)
Зайдя на сайт без заметок, можно будет перемещаться между страницами (вся навигация строится автоматически на основе структуры, но это НЕ ЕДИНСТВЕННЫЙ способ организации навигации, о чем будет рассказано чуть ниже), и - как бы и всё.

3. ЛЮБАЯ страница строится на основе шаблона.
Шаблон - обычная HTML-страница с размещением в необходимых местах специальных меток (поля редактирования).
Наличие метки означает, что в этом месте будет организован вывод единичных заметок ИЛИ группы заметок, отобранных по какому-либо критерию (например, последние десять новостей сайта).
Кроме того, существуют шаблоны для вывода отдельной заметки, просто группы заметок, или группы заметок, организованных по фильтру или иному принципу (ниже).

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

4. ЛЮБАЯ заметка может иметь тег или несколько тегов, которые виртуально "группируют" заметки.
Одна и та же заметка может входить в разные группы, например "Россия" "Новости" "Спорт" "Олимпиада".
Когда, в какой момент времени будет формироваться страница для вывода таких групп? Ведь в структуре этого НЕТ?
ВОТ. И это самое интересное. Опять же, ниже.

Открыв страницу структуры в самом начале редактирования мы видим пустую страницу с возможностью добавления заметки (или группы заметок).

На одной странице может быть несколько полей редактирования - Заголовок, Подвал, Основное поле ввода, Левая часть, Правая часть, ЧТО-ТО ЕЩЕ.

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

Допустим, необходимо внести какой-то текст, к примеру "Hello, World!" в основном поле редактирования.

И тут оказывается, что внести просто текст НЕЛЬЗЯ.

Зато можно добавить заметку с любым заголовком (вывод заголовка настраивается - нужно это или нет, датой/временем - аналогично, и прочее) и собственно с текстом "Hello, World!" с нужным форматированием и рисунками к нему.
Сохраняем заметку - и она уже появляется на самой странице.

Почему так сложно? Можно же было все реализовать и без этих заметок?

Такой способ только кажется сложным. А в дальнейшем появляется куча преимуществ:


  • Любую заметку можно использовать многократно. Заметка - часть общего фонда.
  • Заметки можно добавлять на страницу в виде ленты заметок - отобранных по фильтру (по тегу/тегам/сложному правилу и/или по времени).
  • Добавленные заметки/ленты заметок могут выводиться с заданным порядком - новые сверху или наоборот (соответствующая настройка).
  • Если заметок в поле редактирования много - автоматически строится навигация к ТОЙ ЖЕ странице структуры проекта (но с другими параметрами в адресной строке) для отображения следующего списка заметок/группы заметок (настройка по максимальному количеству на странице).
  • Заметка может выводиться полностью или частично (клик по "Далее" приведет к открытию полной версии заметки), причем открытие страницы в новом/том же окне - уже с навигацией по своей группе заметок (например по "Новостям") - опять же с настройкой.
  • Заметка может иметь один/несколько тегов. Их отображение настраивается. Клик по тегу ведет к открытию заметки или всех заметок по выбранному тегу (настраивается тип открытия и максимальное количество на странице) с навигацией.
  • Так как сами теги ТАКЖЕ МОЖНО группировать в виде деревьев - может отображаться одно из деревьев тегов (настраивается). Клик по любой ветке дерева тегов приведет к отбору/отображению (настройка) сразу по группе тегов - опять же со всей сопутствующей навигацией.
  • Заметка, так же как и страница структуры, может иметь свой особый шаблон (настройка).


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

Поле редактирования может НЕ ИМЕТЬ ленты объектов, если параметры отображения, выставленные "по умолчанию", устраивают пользователя.
К примеру, поле редактирования Header по умолчанию выводит в самом начале при помощи объекта MainMenu основное меню для навигации по основной структуре сайта.
Если не отменять вывод этого меню - ленты как таковой и не понадобится. В ином случае - т.е. необходимо отключить генерацию меню - появится лента, в которой и можно задать параметры отображения.

Еще пример - поле редактирования GroupColumn - по умолчанию в самом начале, при помощи объекта GroupMenu формирует меню для навигации в группе страниц (к которой принадлежит отображаемая страница) по основной структуре.
Если же понадобится перед меню добавить что-то свое - появится лента объектов с уже включенным в нее этим объектом. А уже в самой ленте - можно с объектами что угодно: перемещать, разрешать/запрещать вывод (в том числе по правилам) или эти объекты удалять. Само поле редактирования GroupColumn может располагаться в шаблоне страницы в зависимости от дизайна в левой или правой ее части.

Еще пример - поле редактирования Footer. Располагается обычно в самом низу страницы. По умолчанию, при помощи спецобъекта ImportantPages выводятся, ссылки на определенные важные страницы - Начальную, Контакты, Поиск. Кроме того - после ссылок - выводятся Счетчики объектом Counters.
Если же нужно задать свой определенный текст (внести заметку), поменять параметры вывода или порядок отображения (какой выводится в первую очередь) - появится лента объектов с объектами ImportantPages и Counters.

Еще, как замечание - все манипуляции с объектами ведутся НЕПОСРЕДСТВЕННО на самой странице. Поменял-сохранил-тут же на этой странице увидел изменения. Да-да, Drupal-оподобный способ редактирования :) (ну, или как это реализовано в широко обсуждаемой теме).



Минусы:

  • Похожее уже реализовано (причем МНОГОКРАТНО. Забавно, да? Че это они велосипеды создают, а?).
  • Шаблонная система - как-то не профессионально (честно, я видел и такой аргумент).
  • Своя реализация прав по редактированию - и проблемы с администрированием.
  • Автоматическое формирование меню (у меня с этим проблем особых, кстати, не возникло).


Плюсы:

  • Простота создания шаблонов - на основе предлагаемых в том числе бесплатно или создаваемых лично. Достаточно в нужных местах разместить метки с полями редактирования. Кроме того - это повышает общую безопасность (вероятность взлома меньше, так как в других местах, кроме как в шаблонах, размещение полей редактирования ни к чему не ведет).
  • Своя реализация прав по редактированию.
  • Полный контроль над СВОИМ проектом - я время от времени вижу появление сообщений об очередном взломе/критической ошибке различных CMS. И это при том, что многие проекты распространяются бесплатно и в открытом коде.
  • В любом случае - создание своего - отличная практика.


Чем не личный Drupal, Joomla! или Wordpress?

ГРАЖДАНЕ!
Призываю всех не использовать данную тему для рекламы своих профессиональных качеств или переливанию из пустого в порожнее!
СПАСИБО!
автор: maple4 добавлено: 12 мар 18 просмотры: 1600, комментарии: 1



CMS для сайта на чистом HTML

Блог: maple4
«Что, опять?»
Прогресс движется вперед семимильными шагами, но некоторые компании продолжают предоставлять хостинг без поддержки PHP.
Если отказываетесь от PHP, экономия, например, на nic.ru — сразу в полтора раза (сравнение минимального тарифа с ценой тарифа уже с поддержкой PHP).

Спрашивается, стоит ли экономить? И когда это вообще допустимо?

Представьте, что у Вас есть некий опросник. Если :


  • Сайт нужно создать БЫСТРО
  • Сайт будет (в ближайшее время — точно) представлять из себя сайт-визитку, с контактами, образцами продукции или оказываемых услуг, схемой проезда и временем работы
  • Нет времени (именно сейчас) заниматься настройкой и администрированием
  • Нет навыков при работе с HTML или PHP
  • Не хочется переплачивать за хостинг


… и выбрано хотя-бы два пункта — хостинг без PHP Вам подходит.
Да, WordPress или Joomla теперь не установишь.

Но я же и не призываю создавать сайт в блокноте (даже если Вы знаток HTML), зачем кидаться из крайности в крайность?

Сразу хочу указать на несколько нюансов, если все-таки попытаетесь это сделать (у меня есть знакомый, который утверждает о необходимости прохождения через «этот ад»):

  • Создание структуры сайта — любое ее изменение ведет к полному изменению внутренних связей между страницами.
  • Добавление раздела — смерти подобно.
  • Формирование меню с ссылками на страницы — та еще тема… Что должно попадать туда, как организовать простой доступ к дочерним подразделам, какова будет навигация в пределах одного раздела?
  • Наполнение контентом — добавление и редактирование, в том числе — работа с картинками. Мягко говоря — не очень просто, если вы не знаток языка разметки.
  • Обновление сайта на хостинге — кажется, что это не самая большая проблема. До тех пор, пока количество всех файлов не превысит пятидесяти штук. И наиболее простым решением окажется копирование ВСЕХ файлов проекта.


Да, я являюсь разработчиком бесплатной программы для создания/редактирования/публикации сайта, и сайт программы http://maple4.ru/ написан на ней.
Попытался в свое время реализовать навыки программирования на Visual FoxPro (кстати, внешний вид интерфейса для знакомых с FoxPro точно удивит), и уверен, что программа как минимум этим должна заинтересовать.


Ну а максимум… (для тех, кто с FoxPro не знаком)

Что реализовано:

  • Сайт строится на основе структуры. В любой момент можно добавить раздел сайта или необходимый уровень подраздела.
  • Все ссылки между страницами, меню (меню — в зависимости от стиля) и ссылки на дочерние разделы автоматически формируются в момент открытия страницы или при переходе по страницам внутри проекта.
  • Редактирование ведется в WYSIWYG-редакторе, при сохранении изменений — сразу же и с отображением на экране.
  • Редактирование HTML-кода никуда не делось (для знатоков), причем для удобства добавлен специальный объект, «защищающий» этот код от оптимизации редактором.
  • Есть специальный объект — NEWS — при использовании которого автоматически формируются не входящие в структуру проекта страницы (что значительно снижает объем обновлений) с новостями или обновлениями.
  • На локальном компьютере не нужно заниматься установкой/настройкой IIS, для запуска программы достаточно распаковать zip-архив в каталог с именем без пробелов внутри и запустить exe-шник maple4_ru.exe
  • Встроенный FTP-Connection опубликует сформированные статичные страницы на хостинге, причем сделает это интеллектуально — обновится только то, что добавилось или изменилось. Алгоритм обновления прост до безобразия (используется кэш для проверки), но эффект от этого очень значителен. К примеру, в контенте была допущена грамматическая ошибка. Исправляете/формируете и обновляется ТОЛЬКО та страница, где было исправление.
  • Программа оптимизирует состав файлов-рисунков таким образом, что не допускается их дублирование (т.е. рисунки с различными именами, но идентичные по составу — будут автоматически заменены одним файлом).
  • Не требуется знаний языков программирования, но для программистов на FoxPro есть бонус — можно использовать код языка для, допустим, обращения к базам данных с автоматическим формированием таблиц на их основе. Еще раз повторюсь, для работы с программой знать язык FoxPro обычному пользователю не обязательно.
  • Смена стиля в один клик. Есть возможность загрузки/установки стиля (доступно более 100 штук) прямо из навигатора программы. Изменение стиля не влияет на контент, так содержимое физически от стиля отделено. НО, обязательно требуется проверка окончательного результата, т.к. то, что отлично выглядело в одном стиле может выглядеть нелепо в другом.
  • Возможность редактирования файлов стиля — по сути, это обычные HTML-страницы с внедренными спец.объектами.
  • Ведение мета-тегов и статистика страницы по используемым словам.
  • Автоматическое создание sitemap.xml и robots.txt для более быстрой индексации сайта в поисковых системах.
  • Возможность публикации сразу на нескольких ресурсах.
  • Возможность автоматического формирования и публикации на хостинге — удобно, если при формировании используются базы данных и требуется обновление с некоторой периодичностью
  • Вишенка на торт — так как сайт использует чистый HTML, для опробования результата, сформированный проект без потери функциональности можно разместить даже на бесплатных хостингах


Ну и теперь самое главное — почему программа распространяется бесплатно http://www.maple4.ru/a_downloads_for_maple4_ru/maple4_ru.zip?
Поменялись жизненные приоритеты (можно не верить) ну и поменялась конъюнктура рынка - дорогие проекты все-таки строятся на PHP/ASP
автор: maple4 добавлено: 12 мар 18 просмотры: 1395, комментарии: 0



mini GItHub на ORACLE

Блог: Oracle SQL
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

Название интересное, но это не важно...
на самом это деле небольшая система аудита для заданной схемы на БД.
для начала создадим таблицу для аудита

create table a_code(
  username varchar2(50)
, os_user  varchar2(50)
, date_changed date
, object_type varchar2(50)
, object_name varchar2(50)
, user_source clob
); 


добавим функционал для поддержки версионности

create or replace trigger A_CODE_trigger
  before create on schema
declare
  l_date  date := sysdate;
  l_ver   number;
  l_user  varchar2(20);
  l_cl    clob;
begin
  if (ora_dict_obj_type in
            ( 'PACKAGE'
             ,'PACKAGE BODY'
             ,'PROCEDURE'
             ,'FUNCTION' ) )
  then
    select sys_context( 'userenv', 'os_user' ) into l_user from dual;
    l_cl := '';
    for i in (
    SELECT * FROM user_source
     where name = ora_dict_obj_name
       and type = ora_dict_obj_type order by user_source.LINE
       )  loop   
        l_cl := l_cl||i.text;
       end loop;
    insert into a_code(username , os_user  , date_changed, object_type, object_name, user_source) 
    values (user, l_user , sysdate, ora_dict_obj_name, ora_dict_obj_type, l_cl);
  end if;
end;
/

мы знаем когда и кто менял код, а так же сохраняем разные версии данного кода
автор: Myp3_u_K добавлено: 21 дек 17 просмотры: 3204, комментарии: 2



WITH в ORACLESQL

Блог: Oracle SQL
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA
Оператор WITH позволяет заранее формировать внутренний подзапрос , позволяет обращаться к данному подзапросу по синониму в основном запросе.
Синтаксис
WITH 
T1 as (SELECT field_list FROM T list join WHERE cond group by ...) , 
T2 as (SELECT field_list FROM T list join WHERE cond2 group by ..) , tn as ....
SELECT * FROM T1, T2 where t1.cond= t2.cond

и для того чтобы было совсем понятно - пара примеров :)

WITH T AS (SELECT * FROM ALL_OBJECTS) , T2 AS 
(SELECT * FROM ALL_tables A , T WHERE T.OBJECT_NAME = A.TABLE_NAME ) 
SELECT TABLE_NAME FROM T2 
 
-- сложное обращение 

WITH T AS (SELECT * FROM ALL_OBJECTS) , 
T2 AS (SELECT * FROM ALL_tables) 
SELECT * FROM T, T2 WHERE T.OBJECT_NAME = T2.TABLE_NAME;
 
-- последовательно используем t1,t2

>Splash
>А если перед основным запросом два из WITH, притом что у второго используется первый, а потом они все вместе идут в основной?
with 
t1 as (select object_type, created lstcrdt  , object_name from all_objects),
t2 as (select object_type, count(object_name) cnttype from t1 group by object_type)
select * from t1 inner join t2 on t1.object_type = t2.object_type
автор: Myp3_u_K добавлено: 21 ноя 17 просмотры: 4127, комментарии: 2



Отсутствующие индексы в MS-SQL или оптимизация «по-быстрому»

Блог: SQL Server
При выполнении запроса, как мы знаем, оптимизатор SQL Server исходя из существующих индексов и имеющейся свежей статистики пытается за разумное время найти лучший план запроса, конечно если этот план уже не «сидит» в кэше сервера, и запрос выполняется по этому плану и план сохраняется в кэш сервера. Если план уже построен для этого запроса ранее, то запрос выполняется по существующему плану.
Нам в этой теме интересен следующий момент: Во время компиляции плана запроса, при переборе возможных индексов, если лучшего индекса не нашлось (по мнению сервера), то в плане запроса помечается этот не найденный индекс, и сервер ведет статистику по таким индексам – сколько раз сервер бы воспользовался этим индексом и сколько стоил этот запрос. Эти отсутствующие индексы – missing indexes мы сейчас и разберем, что с ними делать и как с ними работать.читать дальше...
автор: Алексей Куренков добавлено: 10 ноя 17 просмотры: 3816, комментарии: 1



Управление большими объемами требований в BI-проектах. Часть 1.

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

Как правило, BI[1]-системы создаются с использованием ряда промышленных инструментов, как для обработки данных, так и представления их конечному пользователю. Такие инструменты, как например, SAP Business Objects Edge BI, IBM Cognos BI, MicroStrategy обеспечивают наличие в созданной системе развитого и стабильного пользовательского интерфейса с фиксированным набором функциональных возможностей и технических параметров, которые не требуют дополнительной проработки в ходе проекта. Это означает, что функциональные требования к системе будут сосредоточены на соста...

читать дальше...
автор: Дмитрий Зиновьев добавлено: 30 окт 17 просмотры: 3577, комментарии: 1



Управление большими объемами требований в BI-проектах. Часть 2.

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

model_settings_example

Рисунок  3. Пример настройки типов требований и их атрибутов

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

Как уже говорилось, через импорт из XLS возможно создание не только объектов, но и вза...

читать дальше...
автор: Дмитрий Зиновьев добавлено: 28 окт 17 просмотры: 2725, комментарии: 1



Практикум управления требованиями. Пример 1. Автоматизация заполнения атрибутов.

В статье Управление большими объемами требований в BI-проектах я упоминал несколько возможных применений VBS-скриптов в целях автоматизации и увеличения эффективности работы бизнес-аналитика. В обзорном материале я намеренно не вдавался в детали таких скриптов, однако, как мне кажется было бы полезным сделать более подробный разбор таких случаев.

Наиболее востребованный пример, когда при работе с PowerDesigner требуется автоматизация работы – это распространение значений атрибутов внутри иерархии определенного типа требований или по связанным требованиям.

Предположим, что у нас в  модели имеется два типа требований: аналитические задачи (стереотип Analytical task) и показатели (Indicator). Аналитические задачи выстроены в иерархии по подразделениям (стереотип Task group), а показатели – по видам анализа (стереотип Subject area). При этом, для каждой задачи через связь (Traceability link) указаны те показатели, которые требуются для решения задач.

rmp_e1_task_indicator_matrix

Рисунок 1. Зависимость задач от показателей

В модели задачи и показатели разнесены в разные пакеты.

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

читать дальше...
автор: Дмитрий Зиновьев добавлено: 23 окт 17 просмотры: 2425, комментарии: 1



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

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

Сложность для аналитика заключается в необходимости многократного поиска необходимых таблиц и полей для каждого требования. Отчасти проблему можно было бы решить, используя матричное представление для связей (dependency matrix view), но даже для средних по объему моделей, где количество таблиц составляет десятки – работа с матрицей становиться практически невозможной, поскольку такой объем информации не вмещается ни в один дисплей.

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

Разумным выходом из ситуации будет предоставление аналитику сходного с Excel по простоте интерфейса для ввода целевых структур в меппинге через стандартные средст...

читать дальше...
автор: Дмитрий Зиновьев добавлено: 13 окт 17 просмотры: 2638, комментарии: 2



Oracle 12c и JSON немножечко...

Блог: Oracle SQL
Учебный тренинг. SQL от новичка до профессионала.
Бесплатные авторские видеокурсы SQL, PLSQL, JAVA

немного про JSON и ORACLE 12
create table info_user_v (
  id number primary key -- иднтификатор уникальный
, name varchar2(50) -- наименование 
, json_data varchar2(4000) -- данные JSON 
);


в oracle 12 есть специальное ограничение, чтобы добавлять в поле только данные json формата, и чтобы исключить ошибки со структурой JSON
добавим его к нашей таблице
alter table info_user_v add constraint c_1_json_data check(json_data is json);


читать дальше...
автор: Myp3_u_K добавлено: 05 окт 17 просмотры: 3814, комментарии: 0


предыдущие записи