Asp задание области определения объектов


Содержание

Область определения функции двух переменных

Разделы: Математика

Цели работы:

  • повторить и систематизировать нахождение области определения функции, закрепить это понятие и наглядно представить в координатной плоскости и в пространстве;
  • рассмотреть аналитические и геометрические методы не изолированно друг от друга, а в тесной взаимосвязи. Это позволит облегчить переход от стандартных решений конкретных математических задач к нестандартным;
  • воспитание интереса к математике и мультимедиа, активности, мобильности; восприятие компьютера, как инструмента обучения;
  • использование компьютера для нахождения области определения и построения графиков с помощью графического редактора 3D Grapher 1.2, Copyright © 2000-2002 RomanLab Software и формирование информационной компетентности учащихся.

Определение функции двух переменных

Если каждой паре ( x;y) значений двух независимых друг от друга переменных величин х и у из некоторого множества D соответствует единственное значение величины, то говорят, что z есть функция двух независимых переменных x и y, определенная на множестве D.

Например, S=ab, S=S(a;b)- функции двух переменных; V=abc, V=V(a,b.c) – функция трех переменных;

A= – функция трех переменных.

Способы задания функций нескольких переменных

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

Например, — это явно заданная функция двух переменных; уравнение задает неявно две функции двух переменных .

Область определения функции

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

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

Геометрически изобразить область определения функции можно только для функций:

  • одной переменной – на прямой ,
  • двух переменных – на плоскости ,
  • трех переменных– в пространстве .

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

Графиком функции двух переменных является поверхность, проектирующаяся на плоскость в область D, которая является областью определения функции.

На рис. изображена поверхность графика функции и ее область определения.

В курсе учебного материала 9-го класса мы рассматриваем следующие задания на нахождение и построение области определения функции.

ПРИМЕРЫ

Найти область определения функции

Решение. Областью определения данной функции является вся плоскость, т.к. нет ограничений на переменные x и y.

2. Найти область определения функции .

Решение. Данная функция определена, когда xy > 0, т.е. в тех точках координатной плоскости, в которых знаки координат x и y — одинаковы. Это будут точки, лежащие в I и III координатных четвертях, т.е. множество точек, удовлетворяющих условиям:

3. Найти область определения функции .

Решение. Данная функция определена при условии, когда

т.е. . Это множество точек, лежащих внутри круга с центром в начале координат, радиус которого равен 2.

Изобразить на координатной плоскости Оху область определения функции .

Решение. Подкоренное выражение должно быть неотрицательно, т.е. следовательно, . Геометрическим решением неравенства служит полуплоскость, расположенная выше прямой и сама прямая.

5. Найти область определения функции и изобразить её графически.

Решение. Областью определения функции является множество точек плоскости, координаты которых удовлетворяют системе неравенств:

6. Изобразить на координатной плоскости Оху область определения функции

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

7. Изобразить на координатной плоскости Оху область определения функции

Решение. Учащиеся не могут найти область определения данной функции аналитически, но с помощью графического редактора 3D Grapher 1.2 это выполняется легко.

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

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

Найти и изобразить на плоскости область определения функции


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

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

Покажите на координатной плоскости xOy область определения функции

Решение. Ограничения для функции имеют вид:

3. Изобразить область определения функции

Решение. Эта функция определена при , т.е.

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

4. Найти область определения функции .

Решение. Областью определения функции является решение неравенства . Поэтому нужно решить неравенство

Решая данное неравенство, получим Это область, заключенная между двумя параболами и .

5. Построить область определения функции

Решение. Область определения данной функции определяется системой неравенств:

Первое неравенство определяет круг с центром в точке (-2;0) и радиусом равным 2 за исключением его границы:

Второе неравенство определяет I и III координатные четверти, за исключением осей.

В Приложении приведено ещё несколько примеров, с решениями, для учащихся десятых и одиннадцатых классов.

Рассмотрим задание С5, используя функцию двух переменных.

Найдите все значения параметра а, при которых система , имеет ровно два решения.

Решение. Из второго уравнения находим y = . Первое уравнение принимает вид .

Пусть . В этом случае уравнение имеет единственное решение .

Запишем второе уравнение в виде = 0. Его дискриминант равен 4 , и он положителен, поскольку . Уравнение имеет два различных корня и Значит, в этом случае система имеет ровно два решения и .

Пусть теперь 1. В этом случае уравнение если и имеет корни, то только больше единицы Но тогда дискриминант уравнения = 0 отрицателен. Решений нет.

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

На рисунке видно, что решением является интервал от 0 до 1.

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

Найдите все значения а, такие, что для любого х выполняется неравенство .

Решение. Рассмотрим функцию

Если то убывает.

Если то возрастает.

Значит, наименьшее значение функции равно или , или . Поэтому решение задачи получаем из решения системы

C помощью графического редактора мы построили график функции и определили значение параметра а при . График функции в системе координат выглядит следующим образом.

Список источников и литературы.

  1. Математика (математический анализ): учебно-методическое пособие для студентов нематематических специальностей / О.Ю. Ватюкова, Е.Е.Зайцева, Ю.В.Зайцева и др.; ВолГУ.-4-е изд., Волгоград: Волгоградское научное издательство, 2009. – 238с.
  2. Дифференциальное исчисление функций нескольких переменных: типовой расчет по высшей математике / Сост.: А. В. Анкилов, Н. Я. Горячева, Т. Б. Распутько.- Ульяновск: УлГТУ, 2004.-32 с.
  3. ЕГЭ 2011. Математика. Типовые тестовые задания / И.Р. Высоцкий, Д.Д. Гущин, П.И.Захаров, В.С. Панферов, и др.; под ред. А.Л. Семенова, И.В. Ященко. -М.: Издательство “Экзамен”, 2011.-63с.
  4. Самое полное издание типовых вариантов реальных заданий ЕГЭ: 2010: Математика/авт.- сост. И.Р.Высоцкий, Д.Д. Гущин, П.И. Захаров и др.; под ред. А.Л. Семенова, И.В. Ященко. -М.: АСТ: Астрель, 2010.-93с.
  5. Мордкович А.Г. Алгебра . 9 класс. В 2 ч. Ч.1. Учебник для учащихся общеобразовательных учреждений / А.Г.Мордкович, П.В.Семенов .—11-е изд., стер. -М.: Мнемозина, 2009.-224 с.
  6. Смирнова И.М. Геометрия. 10-11 кл.: Учеб. для общеобразоват. учреждений (гуманитарный профиль).- М.: Мнемозина,2004. -223с.

Asp.net Web API объектов определения

Я работаю на веб-апи asp.net, где я должен вернуться обратно в объекты JSON. Что касается создания лучшего подхода и легко для (Android / КСН) мобильного разработчика для потребляющих эти веб-интерфейсы и разбором объекты JSON, что лучше всего подходят для создания этих объектов определения остаются общими среди WebAPI проекта и мобильного проекта, так что если у нас есть изменить любое свойство, то он легко может быть отражено на обоих проектах в лучшую сторону. Было бы здорово, если бы кто-то объясняет это в деталях.

Там нет такого метода синхронизации, как вы просите.

На вашей стороне WebAPI сервера вы можете определить объекты, а затем вернуть их в своих методах API. JSON сериализации будет автоматически обрабатываться фреймворком, с помощью сериализации выбора (т.е. JSON.NET). Помните, что с WebAPI вы не решаете на сторону сервера выходного формата, вы просто возвращаете ответ, содержащий объект (ы), а затем каркас считывает HTTP заголовки запроса, чтобы определить, является ли спросил клиент для JSON или XML, а затем возвращается то, что было предложено.

Самое лучшее, что вы можете сделать, это определить четкий API с хорошими конвенциями и держать его документально, и если вы изменить что-нибудь есть документация отражает изменения. Избегайте критические изменения, и если вы действительно должны, принизить свойство или объект, по крайней мере, несколько версий, прежде чем удалить его.

Вот так все государственное API работать в любом случае.

Область определения функции

Обозначается область определения функции — или .


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

Схема нахождения области определения функций:

  1. Если представляет собой многочлен, то областью определения функции будет множество всех действительных чисел.
  2. Если — рациональная дробь, то областью является множество всех действительных чисел кроме тех значений , при которых знаменатель равен нулю.
  3. Если функция имеет вид , то областью определения будет множество решений неравенства .
  4. Если функция имеет вид , где некоторый многочлен, то областью определения будет множество решений неравенства 0″ title=»Rendered by QuickLaTeX.com» height=»18″ w />.
  5. Область определения суммы, разности или произведения двух или нескольких функций есть пересечение областей определений этих функций, для её отыскания составляется и затем решается система соответствующих условий.
  6. Для логарифмической функции ( 0,\; \; a\ne 1″ title=»Rendered by QuickLaTeX.com» height=»19″ w />) областью определения есть интервал .

Примеры решения задач

Задание Найти область определения следующих функций:
Решение 1) Функцию можно представить в виде разности двух функций

Функция является многочленом и её областью определения есть множество всех действительных чисел .

Функция является дробно-рациональной. Найдем значения , которые обнуляют знаменатель

Таким образом, область определения функции находится из системы

2) Для нахождения области определения решим неравенство

Разложим на множители левую часть этого неравенства. Для этого решим уравнение . По теореме Виета: , отсюда . Таким образом, неравенство примет вид

Обозначим найденные корни на числовой оси и определим знак неравенства на полученных интервалах.

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

0\Rightarrow 3x>-21\Rightarrow x>-7\]» title=»Rendered by QuickLaTeX.com»/>

Задание Найти область определения следующих функций:
Решение 1) Для нахождения области определения функции решим неравенство

0\Rightarrow 3^ <2x-5>>1\Rightarrow 3^ <2x-5>>3^ <0>\]» title=»Rendered by QuickLaTeX.com»/>

Поскольку основание степени 1″ title=»Rendered by QuickLaTeX.com» height=»13″ w />, то приходим к неравенству

0\Rightarrow 2x>5\Rightarrow x>2,5\]» title=»Rendered by QuickLaTeX.com»/>

2) Для нахождения области определения функции нужно учесть, что подкоренное выражение должно быть неотрицательным, а подлогарифмическая функция — положительной. Имеет место система неравенств

0.> \end\right. \]» title=»Rendered by QuickLaTeX.com»/>

Решим первое неравенство отдельно

Согласно определению логарифма, придем к неравенству

Возвращаясь к системе неравенств, имеем

0,> \end\right. \quad \Rightarrow \quad 0

Таким образом, искомая область определения .

3) Учитывая определение логарифмической функции, область определения найдем из системы

Сопоставьте данные функции с их областями определения . Ответы не точные

Ответ

1

Тут знаменатель никогда не обращается в ноль. Значит, ответ e) .

2

Выражение под корнем должно быть неотрицательным. Т.е или . Ответ д) .

3

Выражение под корнем должно быть неотрицательным, так и не обращаться в ноль. а) .

4

Знаменатель не должен обращаться в ноль, значит . Ответ г) .

Область определения функции

Обозначается область определения функции — или .


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

Схема нахождения области определения функций:

  1. Если представляет собой многочлен, то областью определения функции будет множество всех действительных чисел.
  2. Если — рациональная дробь, то областью является множество всех действительных чисел кроме тех значений , при которых знаменатель равен нулю.
  3. Если функция имеет вид , то областью определения будет множество решений неравенства .
  4. Если функция имеет вид , где некоторый многочлен, то областью определения будет множество решений неравенства 0″ title=»Rendered by QuickLaTeX.com» height=»18″ w />.
  5. Область определения суммы, разности или произведения двух или нескольких функций есть пересечение областей определений этих функций, для её отыскания составляется и затем решается система соответствующих условий.
  6. Для логарифмической функции ( 0,\; \; a\ne 1″ title=»Rendered by QuickLaTeX.com» height=»19″ w />) областью определения есть интервал .

Примеры решения задач

Задание Найти область определения следующих функций:
Решение 1) Функцию можно представить в виде разности двух функций

Функция является многочленом и её областью определения есть множество всех действительных чисел .

Функция является дробно-рациональной. Найдем значения , которые обнуляют знаменатель

Таким образом, область определения функции находится из системы

2) Для нахождения области определения решим неравенство

Разложим на множители левую часть этого неравенства. Для этого решим уравнение . По теореме Виета: , отсюда . Таким образом, неравенство примет вид

Обозначим найденные корни на числовой оси и определим знак неравенства на полученных интервалах.

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

0\Rightarrow 3x>-21\Rightarrow x>-7\]» title=»Rendered by QuickLaTeX.com»/>

Задание Найти область определения следующих функций:
Решение 1) Для нахождения области определения функции решим неравенство

0\Rightarrow 3^ <2x-5>>1\Rightarrow 3^ <2x-5>>3^ <0>\]» title=»Rendered by QuickLaTeX.com»/>

Поскольку основание степени 1″ title=»Rendered by QuickLaTeX.com» height=»13″ w />, то приходим к неравенству

0\Rightarrow 2x>5\Rightarrow x>2,5\]» title=»Rendered by QuickLaTeX.com»/>

2) Для нахождения области определения функции нужно учесть, что подкоренное выражение должно быть неотрицательным, а подлогарифмическая функция — положительной. Имеет место система неравенств

0.> \end\right. \]» title=»Rendered by QuickLaTeX.com»/>

Решим первое неравенство отдельно

Согласно определению логарифма, придем к неравенству

Возвращаясь к системе неравенств, имеем

0,> \end\right. \quad \Rightarrow \quad 0

Таким образом, искомая область определения .

3) Учитывая определение логарифмической функции, область определения найдем из системы

Определения объектов не отрисовываются для ASP.Net Методы страницу

я использую ASP.Net Ajax-Страницы Методов и у меня есть проблема, что перечисление определение не визуализируется. Вот что у меня:

тогда у меня простой веб-методов, таких как:

На стороне клиента, я в конечном итоге с MyNamespace.Contact класса; однако, я не имеюMyNamespace.PhoneNumber или MyNameSpace.PhoneNumberType. Я обнаружил, что если я явно добавить поддельные webmethods просто возвращают те типы затем на стороне клиента видов услуг. Есть ли способ заставить enum, оказываемых другими затем поддельные веб-методы?

я хочу enum, потому что мне нужно перебрать этот Список

Объекты

Как мы знаем из главы Типы данных, в JavaScript существует семь типов данных. Шесть из них называются «примитивными», так как содержат только одно значение (будь то строка, число или что-то другое).

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

Объект может быть создан с помощью фигурных скобок <…>с необязательным списком свойств. Свойство – это пара «ключ: значение», где ключ – это строка (также называемая «именем свойства»), а значение может быть чем угодно.

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

Пустой объект («пустой ящик») можно создать, используя один из двух вариантов синтаксиса:

Обычно используют вариант с фигурными скобками <. >. Такое объявление называют литералом объекта или литеральной нотацией.


Литералы и свойства

При использовании литерального синтаксиса <. >мы сразу можем поместить в объект несколько свойств в виде пар «ключ: значение»:

Свойства объекта также иногда называют полями объекта.

У каждого свойства есть ключ (также называемый «имя» или «идентификатор»). После имени свойства следует двоеточие «:» , и затем указывается значение свойства. Если в объекте несколько свойств, то они перечисляются через запятую.

В объекте user сейчас находятся два свойства:

  1. Первое свойство с именем «name» и значением «John» .
  2. Второе свойство с именем «age» и значением 30 .

Можно сказать, что наш объект user – это ящик с двумя папками, подписанными «name» и «age».

Мы можем в любой момент добавить в него новые папки, удалить папки или прочитать содержимое любой папки.

Для обращения к свойствам используется запись «через точку»:

Значение может быть любого типа. Давайте добавим свойство с логическим значением:

Для удаления свойства мы можем использовать оператор delete :

Имя свойства может состоять из нескольких слов, но тогда оно должно быть заключено в кавычки:

Последнее свойство объекта может заканчиваться запятой:

Это называется «висячая запятая». Такой подход упрощает добавление, удаление и перемещение свойств, так как все строки объекта становятся одинаковыми.

Квадратные скобки

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

Так происходит, потому что точка требует, чтобы ключ был именован по правилам именования переменных. То есть не имел пробелов, не начинался с цифры и не содержал специальные символы, кроме $ и _ .

Для таких случаев существует альтернативный способ доступа к свойствам через квадратные скобки. Такой способ сработает с любым именем свойства:

Сейчас всё в порядке.

Обратите внимание, что строка в квадратных скобках закавычена (подойдёт любой тип кавычек).

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

Здесь переменная key может быть вычислена во время выполнения кода или зависеть от пользовательского ввода. После этого мы используем её для доступа к свойству. Это даёт нам большую гибкость.

Запись «через точку» такого не позволяет:

Вычисляемые свойства

Мы можем использовать квадратные скобки в литеральной нотации для создания вычисляемого свойства.

Смысл вычисляемого свойства прост: запись [fruit] означает, что имя свойства необходимо взять из переменной fruit .

И если посетитель введёт слово «apple» , то в объекте bag теперь будет лежать свойство .

По сути, пример выше работает так же, как и следующий пример:

…Но первый пример выглядит лаконичнее.

Мы можем использовать и более сложные выражения в квадратных скобках:

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

Подведём итог: в большинстве случаев, когда имена свойств известны и просты, используется запись через точку. Если же нам нужно что-то более сложное, то мы используем квадратные скобки.

Имя переменной не может совпадать с зарезервированными словами, такими как «for», «let», «return» и т.д.

Но для свойств объекта такого ограничения нет:

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

Как мы видим, присвоение примитивного значения 5 игнорируется.

Это может стать источником ошибок и даже уязвимостей, если мы намереваемся хранить в объекте произвольные пары «ключ:значение» и позволяем посетителям указывать ключи.

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

Есть способ заставить объекты обрабатывать __proto__ как обычное свойство. Мы поговорим о нём позже, а пока нам нужно узнать больше об объектах.


Также существует другая структура данных Map, которая поддерживает произвольные ключи. Мы изучим её в главе Map и Set.

Свойство из переменной

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

В примере выше название свойств name и age совпадают с названиями переменных, которые мы подставляем в качестве значений этих свойств. Такой подход настолько распространён, что существуют специальные короткие свойства для упрощения этой записи.

Вместо name:name мы можем написать просто name :

Мы можем использовать как обычные свойства, так и короткие в одном и том же объекте:

Проверка существования свойства

Особенность объектов в том, что можно получить доступ к любому свойству. Даже если свойства не существует – ошибки не будет! При обращении к свойству, которого нет, возвращается undefined . Это позволяет просто проверить существование свойства – сравнением его с undefined :

Также существует специальный оператор «in» для проверки существования свойства в объекте.

Обратите внимание, что слева от оператора in должно быть имя свойства. Обычно это строка в кавычках.

Если мы опускаем кавычки, это значит, что мы указываем переменную, в которой находится имя свойства. Например:

Обычно строгого сравнения «=== undefined» достаточно для проверки наличия свойства. Но есть особый случай, когда оно не подходит, и нужно использовать «in» .

Это когда свойство существует, но содержит значение undefined :

В примере выше свойство obj.test технически существует в объекте. Оператор in сработал правильно.

Подобные ситуации случаются очень редко, так как undefined обычно явно не присваивается. Для «неизвестных» или «пустых» свойств мы используем значение null . Таким образом, оператор in является экзотическим гостем в коде.

Цикл «for…in»

Для перебора всех свойств объекта используется цикл for..in . Этот цикл отличается от изученного ранее цикла for(;;) .

К примеру, давайте выведем все свойства объекта user :

Обратите внимание, что все конструкции «for» позволяют нам объявлять переменную внутри цикла, как, например, let key здесь.

Кроме того, мы могли бы использовать другое имя переменной. Например, часто используется вариант «for (let prop in obj)» .

Упорядочение свойств объекта

Упорядочены ли свойства объекта? Другими словами, если мы будем в цикле перебирать все свойства объекта, получим ли мы их в том же порядке, в котором мы их добавляли? Можем ли мы на это рассчитывать?

Короткий ответ: свойства упорядочены особым образом: свойства с целочисленными ключами сортируются по возрастанию, остальные располагаются в порядке создания. Разберёмся подробнее.

В качестве примера рассмотрим объект с телефонными кодами:

Если мы делаем сайт для немецкой аудитории, то, вероятно, мы хотим, чтобы код 49 был первым.

Но если мы запустим код, мы увидим совершенно другую картину:

  • США (1) идёт первым
  • затем Швейцария (41) и так далее.

Телефонные коды идут в порядке возрастания, потому что они являются целыми числами: 1, 41, 44, 49 .

Термин «целочисленное свойство» означает строку, которая может быть преобразована в целое число и обратно без изменений.

То есть, «49» – это целочисленное имя свойства, потому что если его преобразовать в целое число, а затем обратно в строку, то оно не изменится. А вот свойства «+49» или «1.2» таковыми не являются:

…С другой стороны, если ключи не целочисленные, то они перебираются в порядке создания, например:

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

Теперь код работает так, как мы задумывали.

Копирование по ссылке

Одним из фундаментальных отличий объектов от примитивных типов данных является то, что они хранятся и копируются «по ссылке».

Примитивные типы: строки, числа, логические значения – присваиваются и копируются «по значению».

В результате мы имеем две независимые переменные, каждая из которых хранит строку «Hello!» .

Объекты ведут себя иначе.

Переменная хранит не сам объект, а его «адрес в памяти», другими словами «ссылку» на него.


Сам объект хранится где-то в памяти. А в переменной user лежит «ссылка» на эту область памяти.

Когда переменная объекта копируется – копируется ссылка, сам же объект не дублируется.

Если мы представляем объект как ящик, то переменная – это ключ к нему. Копирование переменной дублирует ключ, но не сам ящик.

Теперь у нас есть две переменные, каждая из которых содержит ссылку на один и тот же объект:

Мы можем использовать любую из переменных для доступа к ящику и изменения его содержимого:

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

Сравнение объектов

Операторы равенства == и строгого равенства === для объектов работают одинаково.

Два объекта равны только в том случае, если это один и тот же объект.

Например, две переменные ссылаются на один и тот же объект, они равны:

В примере ниже два разных объекта не равны, хотя и оба пусты:

Для сравнений типа obj1 > obj2 или для сравнения с примитивом obj == 5 объекты преобразуются в примитивы.

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

Объекты-константы

Объект, объявленный через const , может быть изменён.

Может показаться, что строка (*) должна вызвать ошибку, но нет, здесь всё в порядке. Дело в том, что объявление const защищает от изменений только само значение user . А в нашем случае значение user – это ссылка на объект, и это значение мы не меняем. В строке (*) мы действуем внутри объекта, мы не переназначаем user .

Если же мы попытаемся присвоить user другое значение, то const выдаст ошибку:

…Но что делать, если мы хотим сделать константами свойства объекта? Как сделать так, чтобы попытка изменить user.age = 25 выдавала ошибку? Это тоже возможно. Мы рассмотрим эту тему в главе Флаги и дескрипторы свойств.

Клонирование и объединение объектов, Object.assign

Как мы узнали ранее, при копировании переменной объекта создаётся ещё одна ссылка на тот же самый объект.

Но что, если нам всё же нужно дублировать объект? Создать независимую копию, клон?

Это выполнимо, но немного сложно, так как в JavaScript нет встроенного метода для этого. На самом деле, такая нужда возникает редко. В большинстве случаев нам достаточно копирования по ссылке.

Но если мы действительно этого хотим, то нам нужно создавать новый объект и повторять структуру дублируемого объекта, перебирая его свойства и копируя их.

Кроме того, для этих целей мы можем использовать метод Object.assign.

  • Аргументы dest , и src1, . srcN (может быть столько, сколько нужно) являются объектами.
  • Метод копирует свойства всех объектов src1, . srcN в объект dest . То есть, свойства всех перечисленных объектов, начиная со второго, копируются в первый объект. После копирования метод возвращает объект dest .

Например, объединим несколько объектов в один:

Если принимающий объект ( user ) уже имеет свойство с таким именем, оно будет перезаписано:

Мы также можем использовать Object.assign для простого клонирования:

Все свойства объекта user будут скопированы в пустой объект, и ссылка на этот объект будет в переменной clone . На самом деле, такое клонирование работает так же, как и через цикл, но короче.

До сих пор мы предполагали, что все свойства пользователя примитивны. Но свойства могут быть ссылками на другие объекты. Что с ними делать?

Например, есть объект:

Теперь при клонировании недостаточно просто скопировать clone.sizes = user.sizes , поскольку user.sizes – это объект, он будет скопирован по ссылке. А значит объекты clone и user в своих свойствах sizes будут ссылаться на один и тот же объект:

Чтобы исправить это, мы должны в цикле клонирования делать проверку, не является ли значение user[key] объектом, и если это так – копируем и его структуру тоже. Это называется «глубокое клонирование».

Существует стандартный алгоритм глубокого клонирования, Structured cloning algorithm. Он решает описанную выше задачу, а также более сложные задачи. Чтобы не изобретать велосипед, мы можем использовать реализацию этого алгоритма из JavaScript-библиотеки lodash, метод _.cloneDeep(obj).

Итого

Объекты – это ассоциативные массивы с рядом дополнительных возможностей.

Они хранят свойства (пары ключ-значение), где:


  • Ключи свойств должны быть строками или символами (обычно строками).
  • Значения могут быть любого типа.

Чтобы получить доступ к свойству, мы можем использовать:

  • Запись через точку: obj.property .
  • Квадратные скобки obj[«property»] . Квадратные скобки позволяют взять ключ из переменной, например, obj[varWithKey] .
  • Удаление свойства: delete obj.prop .
  • Проверка существования свойства: «key» in obj .
  • Перебор свойств объекта: цикл for for (let key in obj) .

Объекты присваиваются и копируются по ссылке. Другими словами, переменная хранит не «значение объекта», а «ссылку» (адрес в памяти) на это значение. Поэтому копирование такой переменной или передача её в качестве аргумента функции приводит к копированию этой ссылки, а не самого объекта. Все операции с использованием скопированных ссылок (например, добавление или удаление свойств) выполняются с одним и тем же объектом.

Чтобы сделать «настоящую копию» (клон), мы можем использовать Object.assign или _.cloneDeep(obj).

То, что мы изучали в этой главе, называется «простым объектом» («plain object») или просто Object .

В JavaScript есть много других типов объектов:

  • Array для хранения упорядоченных коллекций данных,
  • Date для хранения информации о дате и времени,
  • Error для хранения информации об ошибке.
  • … и так далее.

У них есть свои особенности, которые мы изучим позже. Иногда люди говорят что-то вроде «тип данных Array» или «тип данных Date», но формально они не являются отдельными типами, а относятся к типу данных Object . Они лишь расширяют его различными способами.

Объекты в JavaScript очень мощные. Здесь мы только немного углубились в действительно огромную тему. Мы будем плотно работать с объектами и узнаем о них больше в следующих частях учебника.

Задачи

Привет, object

Напишите код, выполнив задание из каждого пункта отдельной строкой:

  1. Создайте пустой объект user .
  2. Добавьте свойство name со значением John .
  3. Добавьте свойство surname со значением Smith .
  4. Измените значение свойства name на Pete .
  5. Удалите свойство name из объекта.

решение

Область определения функции

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

Когда отыскивают область определения функции, то часто она совпадает с областью определения выражения, задающего функцию: такая область определения называется естественной. Но бывает и так, что условия задачи накладывают особые ограничения: например, естественная область определения функции от (-8) до 8, но аргумент этой функции – время (или вес). Понятно тогда, что время (как и вес) не может быть отрицательной величиной и тогда естественная область определения такой функции сужается до промежутка (0; 8).
При отыскании области определения функции надо помнить о следующих ограничениях:
1. При извлечении корня четной степени подкоренное выражение обязано быть неотрицательным (что не запрещает ему быть равным нулю). 2. Знаменатель дроби не может быть равным нулю. 3. Выражение, стоящее под знаком логарифма, не может быть отрицательным или равняться нулю. 4. Выражение, стоящее под знаком арксинуса или арккосинуса, не может превышать 1 по модулю
Также надо помнить, что область определения всегда нужно искать для исходной функции, до каких-либо преобразований.
Например, функции и имеют разные области определения: для первой это – вся числовая ось, а вторая не определена в точке 0. То же относится к функциям и – у первой область определения – также вся числовая ось, а у второй – [ )

1. Найдите область определения выражения:

Так как выражение стоит под корнем четной степени, значение его не должно быть отрицательным:
=0″ title=”<1>>>=0″/>
Дробь положительна, если числитель и знаменатель ее одновременно положительны или отрицательны. У нас в числителе положительное число, поэтому знаменатель неотрицателен. Кроме того, знаменатель не может быть равен нулю, поэтому неравенство становится таким:
0″ title=”>0″/>
Получили квадратное неравенство. Находим корни квадратного уравнения, чтобы выяснить точки перемены знака:

Наносим полученные точки на координатную прямую и расставляем знаки. Так как (старший член) – со знаком «плюс», то ветви параболы направлены вверх, на самом правом отрезке ставим знак «плюс», а далее знаки меняются. Точки выкалываем, поскольку неравенство строгое:

Ответ: – круглые скобки показывают, что концы интервалов не входят в ответ.
2. Найдите область определения выражения:

Так как выражение стоит под корнем четной степени, значение его не должно быть отрицательным:
=0″ title=”<-2x^2+5x+2>>=0″/>
Получили квадратное неравенство. Находим корни квадратного уравнения, чтобы выяснить точки перемены знака:

Наносим полученные точки на координатную прямую и расставляем знаки. Так как (старший член) в исходном неравенстве – со знаком «минус», то ветви параболы направлены вниз, на самом правом отрезке ставим знак «минус», а далее знаки меняются. Точки закрашиваем, поскольку неравенство нестрогое.
Ответ: – квадратные скобки показывают, что концы отрезка входят в ответ.

3. Найдите область определения функции:

Очевидно, что область определения функции будет совпадать с областью определения выражения – ищем естественную область определения функции. Данное выражение имеет смысл только при =0″ title=”(2x+3)(x-1)>=0″/> – задача сводится к решению этого неравенства. Определяем точки перемены знака:

Изображаем полученные точки на числовой оси, ставим знаки:

Точки закрашены, концы интервалов входят в решение. Тогда область определения функции: ( ] [ )
4. Найдите область определения функции:
Очевидно, что область определения функции будет совпадать с областью определения выражения – ищем естественную область определения функции. Данное выражение имеет смысл только при =0″ title=”<2x+3>>=0″/> ; =0″ title=”>=0″/> – задача сводится к решению системы неравенств. Определяем точки перемены знака:
=-1,5>=1>>><>” title=”delim<1><=-1,5>=1>>><>”/>
Изображаем полученные точки на числовой оси:

Решение системы неравенств: =1>” title=”=1>”/>
Область определения функции: [ )
5. Найдите область определения функции:
Очевидно, что область определения функции будет совпадать с областью определения выражения
– ищем естественную область определения функции. Данное выражение имеет смысл только при =0″ title=”y=<<3x-2>/>>=0″/> – задача сводится к решению неравенства.
Рассмотрим два случая:
=0>0>>><>” title=”delim<1><<3x-2>=0>0>>><>”/>
=<2>><-2>>>><>” title=”delim<1><=<2>><-2>>>><>”/>
Решение: =<2>” title=”x>=<2>”/>
Или

Решение:
Область определения функции: [ )
6. Найти область определения функции:

7. Найти область определения функции:
Решение:
0″ title=”4^<2x-1>-2^<3x>>0″/>
0″ title=”<1>*8^*2^-8^>0″/>
0″ title=”8^*(<1>*2^-1)>0″/>
0″ title=”2^-4>0″/>
2^2″ title=”2^>2^2″/>
2″ title=”x>2″/>
Ответ:
8. Найти область определения функции:

ДЕТЕКТИРОВАНИЕ ОБЪЕКТОВ НА ИЗОБРАЖЕНИЯХ С ПО-МОЩЬЮ АЛГОРИТМА YOLO

магистрант, кафедра высшей математики ДВГУПС

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

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


В 2013 г. была представлена первая версия алгоритма R-CNN (Region-based Convolutional Neural Networks) [1] на основе методов сегментации изображения и сверточной нейронной сети. В последствии, эти идеи развились в Fast R-CNN и Faster R-CNN. Алгоритм Faster R-CNN – один из самых точных в своем классе, но в нем для достижения высокой точности приходится жертвовать производительностью, что в свою очередь приводит к невозможности работы в режиме реального времени [2].

В конце 2015 г. был представлен алгоритм YOLO (You Only Look Once) [3], который позволяет производить быструю обработку изображений (порядка в 1000 раз быстрее, чем R-CNN и в 100 раз быстрее, чем Fast R-CNN), но с более низкой точностью.

В алгоритмах типа Faster R-CNN определение объектов на изображениях происходит в два этапа. Первый этап представляет собой результаты работы глубокой полносвязной сети (Region Proposal Network, далее RPN), цель которой определить регионы, в которых предположительно находится искомые объекты. Второй этап – это применение детектора Fast R-CNN, который выполняет поиск объектов в предложенных регионах. Таким образом, RPN выбирает области, которые Fast R-CNN далее проверяет на наличие объектов. Однако в данном подходе эти две искусственные нейронные сети (ИНС) тренируются независимо друг от друга.

Система YOLO решает задачу обнаружения, как задачу регрессии. Благодаря большой скорости обработки изображений она подходит для использования в системах реального времени.

Алгоритм YOLO

На выход ИНС, пример которой можно увидеть на рис.2, отдает тензор размера , которого достаточно для построения границ обнаруженных объектов. Здесь – размерность сетки, – количество границ, используемых в оценке для каждой ячейки, – количество классов, которые нейронная сеть способна распознавать.

Алгоритм включает следующие этапы:

1.На изображение накладывается сетка размерностью . Каждой ячейке сетки соответствует вектор размерностью , где число 5 определяет количество показателей каждой границы. Используемые показатели: – координаты центра границы внутри ячейки (принимают значения от 0 до 1 по отношению к размеру ячейки); – ширина и высота найденной границы (имеют значения от 0 до 1 по отношению к ширине и высоте исходного изображения соответственно); – вероятность того, что граница верно определена. Первые значений вектора, соответствующей ячейки, характеризуют именно эти параметры. Оставшиеся значений, в этом векторе показывают вероятности того, что центр объекта находится в этой ячейке. На данный момент эти вероятности не привязаны к границам, для нахождения вероятностей классов для каждой из границ необходимо умножить характеристику границы на эти значений вектора, как показано на рисунке 1.

Рисунок 1 Структура вектора, соответствующий ячейки сетки

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

2.1.Фиксируется какой-либо класс, например «собака», для которого имеется вектор со значением вероятности класса «собака» с каждой из границ.

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

2.3.Сортируем вектор по убыванию.

2.4.Применяем алгоритм (Non maximal suppression) [4]. Работает он по следующему принципу: на входе подается вектор из вероятностей по классу «собака» для всех границ. Выбирается максимальное значение, так как вектор отсортирован, то этот элемент находится на первой позиции, и затем эта граница сравнивается с границами, расположенными правее, у которых вероятность по классу больше нуля. Сравнение происходит по площади пересечения: если площадь пересечения больше 0.5, то для границы с меньшей вероятностью эта вероятность обнуляется. По этому принципу сравниваем остальные границы. А затем фиксируем следующую границу с ненулевой вероятностью и проводим аналогичные операции сравнения. Таким образом, рассматриваются все границы для класса «собака»,

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

Остается только решить какие границы необходимо нанести на исходное изображение. Метод отбора довольно прост: рассматривается каждая граница, берется максимальное значение вероятности по классам и, если оно больше нуля, то граница наносится на исходное изображение, иначе пропускается и рассматривается следующая.

В классическом случае применения алгоритма YOLO строится сетка размерами , для каждой ячейки строится по 2 границы, и сеть обучается на 20 классах. На вход нейронной сети подается трехканальное изображение размером 448×448. Этот тензор пропускается через модифицированную сеть GoogLeNet (20 первых слоев) [5], на выходе которой имеем набор карт признаков пространственной размерностью 14x14x1024. Дальше применяем набор сверток с ReLU (rectified linear unit), который является функцией активации вида [6]:

В результате получаем тензор размером 7x7x1024. На следующем этапе этот набор пропускается через полносвязный слой ReLU размерностью 4096×1, а затем через полносвязный слой, на выходе которого имеем вектор 1470 элементов, который, преобразуется в тензор 7x7x30. Дальше для этого тензора используем модификации, описанные выше.

Рисунок 2 Архитектура YOLO

Особенности алгоритма YOLO v2

Буквально через полгода после публикации YOLO, была представлена на свет улучшенная версия, в которой было реализовано распознавания порядка 9000 категорий (тогда как первая версия в реальном времени могла распознавать порядка 200 классов). Также к существенным улучшениям можно отнести:

  • Пакетная нормализация. Приводит к значительному улучшению сходимости, исключает необходимость использования других форм регуляризации. Прибавка к средней точности распознавания составила 2 %.
  • Классификатор высокого разрешения. Замена основы GoogLeNet на ImageNet, позволила точнее настроить результирующую сеть для обнаружения. Прибавка к средней точности распознавания составила 4 %.
  • Размерные кластеры и Прямое расположение прогнозирование. В первой версии нейронной сети в качестве метрики использовалась оценка площади пересечения, которая хорошо работает только с границами сравнимых размеров. Для решения этой проблемы в качестве метрики, которая одинаково хорошо бы работала с границами разных размеров, была предложена:

Что позволило увеличить точность примерно на 5 %.

Суммарно все эти нововведения позволили повысить точность нейронной сети с 63.4 % до 76.9 %.

Сравнение алгоритмов YOLO и Faster R-CNN

Данные сравнения показателей точности алгоритмов YOLO и FASTER R-CNN приведены в таблице 1. Результаты были получены на обучающих выборках VOC 2007 [7] и VOC 2012 [8].

Таблица 1

Сравнение представленных алгоритмов

Метод

Обучающая выборка

Средняя точность

FPS (Кадров в секунду)

Задача определения объектов на изображении

Пытаюсь разобраться с определением объектов, расположенных на картинке. Например, все, что связано с алкоголем (рюмки, бокалы, бутылки и так далее). За основу взял статью со страницы How to play Quidditch using the TensorFlow Object Detection API

Для решения задачи использую TensorFlow в Google Colaboratory.

Разобрался с картинками, создал датасет. Запустил в Google colaboratory. В итоге ничего не распознается. Подумал, что мало картинок, мало шагов для тренировки. Тогда просто воспроизвел тот самый пример, который по ссылке. Для того, чтобы чужой пример начал распознавать, хватило всего 4000 шагов для тренировки. Я даже чужой пример упростил немного: я перетренировал его всего на 27 картинках. И все равно он отлично распознавал свои объекты после 4000 шагов обучения. Теперь я вместо чужих объектов тренировал на своих. И в результате ничего не распознается. Уже прошел около 20 000 шагов. Результата нет. Все, что сделал, это заменил snitch на рюмки в датасете. Убедился, что аннотации делаю корректно, датасет правильный. Предполагаю, что мало шагов. Или мало картинок. Но почему-то же чужие объекты при точно таких же условиях распознаются же! Я новичок во всем этом и пока еще не знаю, в какую сторону копать. Кто-нибудь может подсказать, на что обратить внимание, что учитывать при тренировке. В каком разрешении должны быть картинки для датасета? Каких размеров? И в процессе тренировки кидается плавающая ошибка:

INFO:tensorflow:Error reported to Coordinator: , mscoco_train.record; Input/output error [[Node: parallel_read/ReaderReadV2_2 = ReaderReadV2[_device=»/job:localhost/replica:0/task:0/device:CPU:0″](parallel_read/TFRecordReaderV2_2, parallel_read/filenames)]] INFO:tensorflow:Error reported to Coordinator: , mscoco_train.record; Input/output error [[Node: parallel_read/ReaderReadV2_2 = ReaderReadV2[_device=»/job:localhost/replica:0/task:0/device:CPU:0″](parallel_read/TFRecordReaderV2_2, parallel_read/filenames)]]

Понятно, что она связана с вводом/выводом, но она же возникает где-то на серверах google. Может банальный таймаут срабатывает и возникает эта ошибка, связанная с дисковыми операциями. Как ее обойти, пока тоже не знаю. Экспортирую текущий граф, а потом продолжаю тренировать. Правильно ли делаю, не знаю. Заранее спасибо за помощь!

1 ответ 1

Как оказалось, пустяковый код по ссылке пример детектирования объектов — рабочий! Только автор того кода использовал картинки для тренировки слегка расплывчатые, а я четкие. Видимо из-за этого для первого распознавания аналогичных объектов в первом случае хватило от 4000 шагов обучения, а в моем случае первое распознавание прошло после 22 000 шагов тренировки (поэтому я начал сомневаться, что что-то не так делаю, раз бьюсь об стену, а результата нет). В обоих случаях картинок катастрофически мало! Поэтому мне еще предстоит во многом разобраться, но самое главное, что я понял — я делаю все верно и в итоге добьюсь хороших результатов. А картинок для тренировки надо не 25 штук а несколько сотен тысяч на самом деле. И для тренировки Google colaborate не очень и подходит — в процессе бросает ошибки. Для тренировки нужны хорошие видеокарты, например, NVidia GTX 1080. В идеале — даже и 4 штуки (видеокарты должны поддерживать объединение между собой, чтобы работали, как единое целое). Для таких видеокарт нужен мощный блок питания. Это все надо для того, чтобы тренировка проходила очень быстро, чтобы не тратить месяцы на банальную тренировку. Нужны десятки гигабайт свободного места на жестком диске, нужно много оперативной памяти и очень много видеопамяти для производительности системы. И, если кратко, то ответ на мой вопрос: все делать, как написано в вышеприведенной ссылке и долго и упорно тренировать. Периодически проверять, как все работает И по поводу картинок — их надо обводить рамками в программе (Windows) labelImg. Мне нужен формат PscalVOC. Так вот, оказалось, что это очень долго, тогда я сделал вот как: 1. Я изначально вырезал картинки определенного класса четко по границам и сохранял каждую в отдельном файле. Очень удобно резать картинки программой HyperSnap. Есть и другие программы, но этой получается быстрее всего вырезать прямо с экрана. 2. Для аннотаций я написал свою собственную прожку на скорую руку. Проверил ее, поправил ошибки. Все работает. Прожка спросит, где картинки лежат (слэш в конце пути не нужен) и название класса и мгновенно сама все сделает. Обводить картинки не надо, главное, чтобы они уже изначально были нужного размера. Прожку сделал на AHK. вот ее код (Gdip_all.ahk надо скачать дополнительно, ссылка на библиотеку внутри исходника):

n, *%xml_file%, UTF-8 FileAppend, %A_Tab% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab% Unknown n, *%xml_file%, UTF-8 FileAppend, %A_Tab% n, *%xml_file%, UTF-8 FileAppend, %A_Tab% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab%%width% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab% %height% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab%3 n, *%xml_file%, UTF-8 FileAppend, %A_Tab% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%0 n, *%xml_file%, UTF-8 FileAppend, %A_Tab% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab%%obj_name% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab%

n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab%1 n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab% 0 n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab%%A_Tab% 0 n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab%%A_Tab%0 n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab%%A_Tab% %width% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab%%A_Tab%%height% n, *%xml_file%, UTF-8 FileAppend, %A_Tab%%A_Tab% n, *%xml_file%, UTF-8 FileAppend, %A_Tab% n, *%xml_file%, UTF-8 FileAppend, n, *%xml_file%, UTF-8 >
else ;MsgBox 111

Илон Маск рекомендует:  Бесплатный курс по SVG
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL