В данной статье рассматривается проблема плагиата исходного кода программ. Приводится классификация способов заимствования, используемая в литературе и некоторые подходы к поиску заимствований. Как основная область применения рассматривается поиск плагиата среди решений задач на соревнованиях по программированию.
Введение Подход «Copy-and-Paste Programming» широко распространён при разработке программного обеспечения и применяется по целому ряду причин, основными из которых являются:
— обеспечение повторного использования кода, для сокращения времени разработки и/или тестирования программного обеспечения;
— повышение производительности ПО (подход актуален в случаях, когда используемый компилятор не реализует соответствующие оптимизации);
— недостатка времени на переработку исходного кода или недостаточным количеством знаний о разрабатываемой системе у программиста;
— намеренный плагиат и присвоение интеллектуальной собственности.
Подобное дублирование кода, вносимое безосновательно, может привести к различным негативным последствиям, самым очевидным из которых является увеличение объёма и уменьшение связности исходного кода, усложняющие его поддержку.
ВСЁ ПРО CERTILOGO И CLG КОД!
Не менее актуальной проблемой является применение «Copy-and-Paste Programming» при обучении программированию: неправильное применение этого подхода может привести к недостаточному пониманию предмета изучения, препятствовать развитию навыков разработки новых самостоятельных решений и имеет риск войти в привычку из-за простоты в применении; однако анализ студенческих работ по курсу разработки компиляторов, в течение трёх лет проводимый исследователями из Китая показал, что плагиату в той или иной мере подвержено до 82% проверяемого программного кода [ 21↓]. Проблема плагиата решений актуальна и при проведении соревнований по программированию – использование готовых фрагментов исходного кода на многих соревнованиях считается неспортивным и явно запрещается их правилами.
По этим причинам становится актуальной проблема определения идентичных или мало отличающихся участков программного кода в автоматическом режиме, что может производиться как часть процесса автоматической проверки решений системой тестирования (пример используемых сейчас систем тестирования можно найти, например, в [ 7↓, 8↓]). При этом как сам программный код, тестируемый такими системами, так и потребности организационного процесса контрольных или соревновательных мероприятий вносят свои изменения в поставку задачи поиска клонов и, следовательно, возможные подходы к её решению. Основными особенностями программ, проверяемых при проведении подобных мероприятий, является их простота (отсутствие внешних модулей, логики их синхронизации и взаимодействия) и малый объём; при этом на соревнованиях зачастую используется несколько языков (обычно Java и C++), мало различающихся с точки зрения написания решений для простых и средних задач, а следовательно, возникает потребность проверки идентичности решений, написанных на разных языках программирования.
Как сделать текст уникальным за 5 минут
1. Определение степени идентичности программного кода в литературе Разные авторы по-разному подходят к проблемам определения степени идентичности программного кода и используют несколько различную классификацию клонов исходного кода.
1.1. Классификация Bellon, 2007 Классификация клонов исходного кода, приведённая в [ 2↓], описывает подход к выделению клонов без учёта форматирования программного кода и разделяет дубликаты на следующие типы:
— тип I, идентичные фрагменты программного кода:
int gcd ( int a, int b ) { // non neg
return gcd ( b, a % b ) ;
int gcd ( int a, int b )
if ( b == 0 ) { return a ; }
return gcd ( b, a % b ) ; }
— тип II, фрагменты программного кода типа I, также содержащие изменения имён, типов и значений переменных и констант:
int gcd ( int l, int r ) { // non neg
return gcd ( r, l % r ) ;
int gcd ( long a, long b )
if ( b == 0L ) { return a ; }
return gcd ( b, a % b ) ; }
— тип III, фрагменты программного кода типа II, имеющие небольшие различия, например, добавление или удаление отдельных операторов:
int gcd ( int l, int r ) { // non neg
if ( l == 0 ) return r ; // <- added
if ( r == 0 ) return l ;
return gcd ( r, l % r ) ;
int gcd ( long a, long b )
if ( b == 0L ) { return a ; }
return gcd ( b, a % b ) ; }
1.2. Классификация Roy, 2009 Одна из наиболее полных на данный момент классификаций приводится в [ 3↓, 4↓] и используется во многих других работах. Данная классификация основывается на типах 1-3 классификации Ballon, 2007 , вводя для них общий надтип «синтаксической близости», а также четвёртый, семантический, тип клонов:
— синтаксически близкие фрагменты, типы I – III по классификации Ballon, 2007 ;
— семантически близкие фрагменты, тип IV: семантически эквивалентный код, представленный различными синтаксическими конструкциями:
int gcd ( int l, int r ) { // non neg
while ( b ! = 0 ) {
int gcd ( long a, long b )
if ( b == 0L ) { return a ; }
return gcd ( b, a % b ) ; }
1.3. Классификация Зельцер, 2013 Классификация, вводимая в [ 5↓], также не учитывает форматирование исходного кода, и выделяет такие типы клонов, как:
• точные клоны, эквивалент типа I описанных выше классификаций;
• клоны 2-го типа, в которых переменные (и, возможно, константы) в теле дубликата могут быть заменены на вычисляемые выражения;
• клоны 3-го типа, в которых отдельные выражения в теле дубликата могут быть заменены на другие выражения.
1.4. Сопоставление классификаций
Bellon, 2007 | Roy, 2009 | Зельцер, 2013 |
Тип I | Тип I | Точные клоны |
Тип II | Тип II | Клоны II типа |
Тип III | Тип III | |
Клоны III типа | ||
— | Тип IV | — |
Как отмечается в [ 3↓], тип IV (семантические клоны) классификации Roy кардинально отличается от остальных трёх типов (и соответствующих им), как в плане используемых подходов, так и решаемых задач, и поэтому не принимается во внимание в большинстве работ по определению дублирования кода. Также в [3↓] можно найти сопоставление предлагаемой классификации Roy, 2009 с некоторыми другими.
1.5. Клоны в коде решений задач по программированию Используя классификацию Roy, 2009 , определим, какие типы клонов необходимо определять при проверке решений задач по программированию на предмет возможных заимствований:
— обнаружение клонов типов I и II в программном коде решения задач свидетельствуют о вероятном заимствовании;
— обнаружение клонов типа III в решениях вполне возможно и при отсутствии реальных зависимостей в случаях решения участниками достаточно типовых алгоритмических задач;
— обнаружение клонов типа IV лишь показывает, что выбранные программы решают одну и ту же задачу, что и так известно тестирующей системе и организатору; такие клоны нас не интересуют.
2. Подходы и инструменты поиска идентичного кода
2.1. Строковые алгоритмы Первая рассматриваемая группа алгоритмов поиска клонов в программном коде – строковые алгоритмы. Их принцип работы прост: из анализируемого кода исключаются лишние пробельные символы и комментарии, (например, регулярным выражением), после чего с помощью алгоритмов хеширования или суффиксного дерева ищутся повторяющиеся подстроки достаточной длины.
Пример такого алгоритма описывается в [ 9↓]. Подобные алгоритмы способны найти только клоны типа I, и поэтому практически не используются на практике. В качестве плюса этого подхода можно выделить его независимость от языка анализируемой программы.
2.2. Алгоритмы с применением лексического анализа Алгоритмы поиска клонов на основе лексического анализа работают схоже со строковыми, но в них программный код перед поиском клонов преобразуется в последовательность токенов с учётом рассматриваемого языка программирования; при этом токены, отвечающие за различные идентификаторы и константы, могут как различаться (для поиска клонов типа I), так и совпадать (для поиска клонов типа II). Известными примерами анализаторов дублирования кода, работающих по таким принципам, являются Dup [ 10↓] и CCFinder [ 11↓]; также существует утилита JPlag, задачей которой является поиск заимствований между программами на языке Java [ 12↓].
2.3. Алгоритмы с применением синтаксических деревьев Существует также подход к поиску клонов программного кода при помощи построения абстрактных синтаксических деревьев (AST, Abstract Syntax Tree) и поиска в них схожих поддеревьев. Этот подход и использующий его анализатор дублирования кода описывается в [ 1↓]. Описанный инструмент полезен при поиске дублирования кода, но может оказаться недостаточно эффективным при поиске намеренных заимствований в случае их видоизменений, например, при перестановке строк или операндов местами. Преимуществом подхода можно назвать его независимость от языка программирования на этапе работы с AST, что может позволить анализировать взаимную идентичность программ на разных языках.
2.4. Алгоритмы на основе графов зависимостей Подходы на основе статического анализа (графов потока управления и потока данных) и профилирования предоставляют сложный в реализации, но потенциально мощный инструмент для анализа дублирования кода. Применение этих инструментов для поиска клонов описывается в [ 13↓, 14↓, 20↓].
Инструменты, использующие профилирование, могут быть достаточно сложны в использовании в промышленных системах по причинам сложности самого программного обеспечения и необходимости ввода некоторых данных для его работы при профилировании; использование же таких инструментов при автоматической проверке решений задач по программированию в значительной мере упрощается по причине использования готовых входных данных для проверки корректности решений – таким образом, при интеграции в систему проверки решений анализатора уникальности кода, организаторам соревновательных и контрольных мероприятий не потребуется добавлять какие-либо дополнительные входные данные для проверки решений на уникальность. Необходимо отметить, что использование графов зависимостей для анализа заимствований напрямую может дать большое количество ложных срабатываний на простых и средних по сложности реализации алгоритмах, особенно классических и известных. Аналогично подходу с AST, на этапе анализа графов не зависит от языка программирования.
2.5. Алгоритмы на основе метрик Также некоторые исследователи применяли задачу поиска дублирования программного кода путём подсчёта различных метрик исходного кода: количества строк, количества вызовов функций, количества уровней вложенности блоков, количества используемых аргументов функции и/или локальных переменных, и т.д. Пример такого анализа можно найти в [ 15↓, 16↓]; при этом описанный подход основывается на обработке отдельных функций, в то время, как в программном коде решений задач заимствованный фрагмент может располагаться в любом месте, быть поделен на части, и т.д., что сильно уменьшает количество верных распознаваний плагиата программного кода [ 21↓].
2.6. Комбинированные подходы Рассмотренные выше подходы часто комбинируются, например, как описывается в [ 17-19↓]; так, многие алгоритмы совмещают в себе этапы лексического анализа или построения графовой модели и подсчёта метрик. Одним из относительно новых подходов к финальной обработке полученных описанными выше алгоритмами данных является применение нейронных сетей: в [ 18↓] блоки исходного кода обрабатывались с помощью нейронной сети с целью поиска повторяющихся шаблонов; в [ 22↓] было применено обучение нейронной сети распознаванию автора кода по его «стилю программирования» и дальнейшая проверка авторства программного кода этой нейронной сетью; но такой подход может быть слабо применим к классическим олимпиадам по программированию и контролю задач по коротким учебным курсам, при контроле которых у организатора скорее всего не будет достаточного количества данных для обучения нейросети.
Литература 1. ↑ Baxter I. D. et al. Clone detection using abstract syntax trees // Software Maintenance, 1998. Proceedings., International Conference on. – IEEE, 1998. – С. 368-377.
2. ↑ Bellon S. et al. Comparison and evaluation of clone detection tools // IEEE Transactions on software engineering. – 2007. – Т. 33. – №. 9.
3. ↑ Roy C. K., Cordy J. R. survey on software clone detection research // Queen’s School of Computing TR. – 2007. – Т. 541. – №. 115.
4. ↑ Roy C. K., Cordy J. R., Koschke R. Comparison and evaluation of code clone detection techniques and tools: A qualitative approach // Science of computer programming. – 2009. – Т. 74. – №. 7. – С. 470-495.
5. ↑ Зельцер Н. Г. Поиск повторяющихся фрагментов исходного кода при автоматическом рефакторинге // Труды Института системного программирования РАН. – 2013. – Т. 25.
6. Ахин М. Х., Ицыксон В. М. Слайсинг над деревьями: метод обнаружения разорванных и переплетенных клонов в исходном коде программного обеспечения // Моделирование и анализ информационных систем. – 2015. – Т. 19. – №. 6. – С. 69-78.
7. ↑ Корнеев Г. А., Елизаров Р. А. Автоматическое тестирование решений на соревнованиях по программированию // Телекоммуникации и информатизация образования. – 2003. – №. 1. – С. 61-73.
8. ↑ Станкевич А. С. Методология и технические решения для проведения олимпиад по информатике и программированию // Парфенов-СПб. – 2011.
9. ↑ Johnson J. H. Identifying redundancy in source code using fingerprints // Proceedings of the 1993 conference of the Centre for Advanced Studies on Collaborative research: software engineering-Volume 1. – IBM Press, 1993. – С. 171-183.
10. ↑ Baker B. S. On finding duplication and near-duplication in large software systems // Reverse Engineering, 1995., Proceedings of 2nd Working Conference on. – IEEE, 1995. – С. 86-95.
11. ↑ Kamiya T., Kusumoto S., Inoue K. CCFinder: a multilinguistic token-based code clone detection system for large scale source code // IEEE Transactions on Software Engineering. – 2002. – Т. 28. – №. 7. – С. 654-670.
12. ↑ Prechelt L., Malpohl G., Philippsen M. Finding plagiarisms among a set of programs with JPlag // J. UCS. – 2002. – Т. 8. – №. 11. – С. 1016.
13. ↑ Komondoor R., Horwitz S. Using slicing to identify duplication in source code // International static analysis symposium. – Springer, Berlin, Heidelberg, 2001. – С. 40-56.
14. ↑ Ахин М. Х., Ицыксон В. М. Слайсинг над деревьями: метод обнаружения разорванных и переплетенных клонов в исходном коде программного обеспечения // Моделирование и анализ информационных систем. – 2015. – Т. 19. – №. 6. – С. 69-78
15. ↑ Mayrand J., Leblanc C., Merlo E. Experiment on the Automatic Detection of Function Clones in a Software System Using Metrics // icsm. – 1996. – Т. 96. – С. 244.
16. ↑ Kontogiannis K. A. et al. Pattern matching for clone and concept detection // Automated Software Engineering. – 1996. – Т. 3. – №. 1-2. – С. 77-108.
17. ↑ Balazinska M. et al. Measuring clone based reengineering opportunities // Software Metrics Symposium, 1999. Proceedings. Sixth International. – IEEE, 1999. – С. 292-303.
18. ↑ Davey N. et al. The development of a software clone detector // International Journal of Applied Software Technology. – 1995.
19. ↑ Малышев Е. В., Смелов В. В. Алгоритм распознавания плагиатов кодов программ // Труды БГТУ – 2018 – № 1 – С. 135-138.
20. ↑ Prado B., Bispo K. A., Andrade R. X9: An Obfuscation Resilient Approach for Source Code Plagiarism Detection in Virtual Learning Environments // ICEIS (1). – 2018. – С. 517-524.
21. ↑ Jiang Y., Xu C. Needle: Detecting Code Plagiarism on Student Submissions // TURC 2018 – 2018.
22. ↑ Bandara U., Wijayarathna G. A machine learning based tool for source code plagiarism detection // International Journal of Machine Learning and Computing. – 2011. – Т. 1. – №. 4. – С. 337.
Источник: annimon.com
МЕТОДЫ ПРОВЕРКИ УНИКАЛЬНОСТИ ПРОГРАММНОГО КОДА Текст научной статьи по специальности «Компьютерные и информационные науки»
Аннотация научной статьи по компьютерным и информационным наукам, автор научной работы — Смирнова Ю.В.
В статье раскрывается понятие плагиата в сфере программирования. Рассматриваются методы создания программного кода при помощи копипаста и способы изменения программы, использование которых означает наличие плагиата. Делается вывод об эффективности и сложности методов проверки программного кода на его уникальность.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Похожие темы научных работ по компьютерным и информационным наукам , автор научной работы — Смирнова Ю.В.
Применение метода токенизации для поиска схожих фрагментов кода в студенческих работах
Алгоритм распознавания плагиатов кодов программ
Анализ алгоритмов поиска плагиата в исходных кодах программ
Использование различных способов выявления плагиата исходных кодов в учебном процессе
Увеличение стойкости метода токенизации к внесению изменений при обнаружении плагиата в исходном коде
i Не можете найти то, что вам нужно? Попробуйте сервис подбора литературы.
i Надоели баннеры? Вы всегда можете отключить рекламу.
Текст научной работы на тему «МЕТОДЫ ПРОВЕРКИ УНИКАЛЬНОСТИ ПРОГРАММНОГО КОДА»
МЕТОДЫ ПРОВЕРКИ УНИКАЛЬНОСТИ ПРОГРАММНОГО КОДА
В статье раскрывается понятие плагиата в сфере программирования. Рассматриваются методы создания программного кода при помощи копипаста и способы изменения программы, использование которых означает наличие плагиата. Делается вывод об эффективности и сложности методов проверки программного кода на его уникальность.
Ключевые слова: атрибутные и структурные методы, синтаксическое дерево, анализ исходного кода, сокрытие плагиата.
На сегодняшний день в системе образования остро стоит проблема умышленной выдачи чужих материалов или работ за результат собственного творчества. Заимствование чужих мыслей, копирование готовых произведений, присвоение авторства чужих работ, всё это можно назвать одним словом — плагиат. Ученик или студент, сдавая скаченную, купленную или взятую у друга работу, не получает никаких полезных знаний, не набирается опыта и в итоге получает незаслуженную оценку. С точки зрения преподавания получается пустая трата времени и без специальных средств проверки работ на уникальность учащиеся могут свободно «воровать» чужие знания.
В различных институтах, где готовят 1Т-специалистов, от студентов требуется выполнения большого количества работ, связанных с написанием программного кода, созданием компонентов программы и анализом структуры создаваемых проектов. Многие студенты предпочитают использовать уже готовый материал, взятый у одногруппников или купленный в Интернете, вносят незначительные поправки и получают практически ни с чем не схожую на первый взгляд работу. Такое задание проверить на самостоятельность выполнения гораздо труднее, чем скаченную курсовую работу или купленное в Интернете решение, так как с помощью нескольких методов можно изменить код практически до неузнаваемости, не прилагая особых усилий, но при этом алгоритм выполнения останется полностью заимствованным.
Помимо известных методов изменения кода, также существуют методы проверки кода на уникальность. В данной статье будут проанализированы существующие методы проверки, выявлены особенности заимствования кода и будут сделаны выводы о разработанных информационных системах для проверки уникальности.
Понятие плагиат в сфере программирования определяется как непосредственное использование чужого исходного кода программы. Программа может считаться плагиатом другой программы, если она была получена путём изменений исходного кода, которые не затронули логику и алгоритм первоначальной программы. К таким изменениям относятся:
•изменение или удаление комментариев;
•добавление или удаление знаков форматирования;
•изменение имён идентификаторов;
•изменение расположения блоков программы;
•добавление операций, не изменяющих результат программы.
Все изменения трудно выявить при обычном просмотре кода, и большинство сервисов, предназначенных для проверки на уникальность, не смогут обнаружить и половины таких изменений.
Методы модификации программного кода
Для выявления изменений в программном коде, которые никак не сказываются на алгоритме программы, но которые визуально меняют исходный код практически до неузнаваемости, существуют методы модификации программного кода. Все эти методы не всегда дадут стопроцентный результат, но некоторые из них помогут преподавателю при сравнении кодов узнать, какая программа является плагиатом.
Представление программы в виде элемента п-мерного пространства
Код программы представляется в виде точки в п-мерном пространстве натуральных чисел. Каждая 1-ая координата данной точки — это количественная характеристика какого-либо признака кода программы. К таким признакам относится: количество переменных, операндов и операций, средняя длина строк в коде,
Научный руководитель: Якубович Анатолий Николаевич — доктор технических наук, профессор, Московский автомобильно-дорожный государственный технический университет, Россия.
Вестник магистратуры. 2019. № 4-2(91)
количество процедур и функций и средняя длина имён переменных. После определения значения координат точка располагается в определённом месте пространства. Далее происходит сравнение местоположения двух точек, принадлежащих сравниваемым программам. Если точки расположены на небольшом расстоянии друг от друга, то считается, что одна программа является плагиатом другой программы.
Построчное сравнение исходного кода
Исходный код рассматривается как текстовое представление. Происходит построчное сравнение, при котором отбрасываются любые значения операндов. Такой метод работает как обычный поисковый сервис, предназначенный для проверки текстовых документов на уникальность. Любое незначительное переименование методов или имён переменных и функций будет означать отсутствие схожести между двумя программами, что делает этот метод наиболее неэффективным при обнаружении плагиата в программном коде.
Создание синтаксического дерева по коду программы
Автоматизированный рефакторинг
Быстрая и безопасная проверка уникальности кода. Повышение качества кода.
Попробовать Узнать больше
Как AppRefactoring может помочь создать профессиональный код?
Избежание банов от Google Play и App Store
Помощь в обнаружении недобросовестных разработчиков, фрилансеров, подрядчиков
Возможность поддержки удобных форматов файлов и языков программирования
Быстрое и качественное изменение одного и того же кода (рефакторинг, обфускация) и работа с шаблонными приложениями
Экономия ресурсов
Защита от теневого индексирования
Как работать с AppRefactoring?
Загрузите ваш код
Загрузите ваш код
Вы можете загрузить код различными способами, как вам удобно. Быстро и легко!
Автоматический анализ
Автоматический анализ
Получите детальный отчет
Получите детальный отчет
Подождите несколько минут, программа сравнит ваш код с исходным и со всей базой данных, используя алгоритмы для сравнения структуры и синтаксиса одного проекта с другим. В результате, вы получите детальный отчет по структуре вашего кода и совпадениям с другими проектами.
Сделайте свой код уникальным
Сделайте свой код уникальным
С помощью полученного отчета сделать проект уникальным станет намного легче. На основе данных сервиса вы сможете с легкостью исправить баги и улучшить качество кода без полного изменения функционала проекта.
Технологии программирования
Отзывы
Потратил немало своего драгоценного времени на анализ заимствованных фрагментов кода в моем проекте. AppRefactoring помог мне решить эту задачу. И все это онлайн и в автоматическом режиме.
Стеффан Лоусон
Back — end Разработчик
Использую инструмент AppRefactoring для общего анализа проектов нашей компании. Инструмент помогает легко определить степень уникальности написанного кода.
Артур Уиллиамс
CTO
Мой хороший помошник
Сервис AppRefactoring стал моим «настольным» приложением помогает мне с анализом структуры моего кода в онлайн режиме. Рекомендую к использованию.
Владимир Береза
Ios Разработчик
Использование инструмента помогает сделать исходный код более структурированным и понятным и выгружать его в собственный проект на GitHub.
Никита Королев
Team Lead
Разработчики AppRefactoring подарили нам множество полезных функций. Этот инструмент значительно ускоряет анализ исходного кода и может быть полезным как новичкам, так и опытным разработчикам
Владислав Пак
Android Разработчик
Спасибо за тулзу!
Анализ и сравнение своих проектов в AppRefactoring помогло в определении не уникальных фрагментов кода. Таких фрагментов оказалось намного больше, чем я ожидал. Пришлось многое править. Спасибо за тулзу.
Брэндон Смит
Java Разработчик
Лучше, чем вручную.
Инструмент AppRefactoring отлично помогает мне с анализом качества моего Java кода, с тем, чтобы реорганизовать и уменьшить сложность исходного кода. Это избавляет от нудного ручного труда.
Суркова Мария
Back — end Разработчик
Автоматический анализ исходного кода и детальные отчеты инструмента AppRefactoring упрощают уникализацию разрабатываемых приложений. А это сейчас очень важно при регистрации приложения в Google Play Market и App Store.
Хизер Джоунс
CTO
Превосходный анализатор кода.
Превосходный онлайн анализатор кода! Постоянно использую его возможности для анализа моих исходников в автоматическом режиме. Отлично справляется с поиском идентичных фрагментов кода.
Дмитрий Петров
IOS Разработчик
Практически ни один программист не пишет каждый свой проект полностью с нуля. В итоге, может получится множество дублей участков кода по файлам, классам и строкам. Инструмент AppRefactoring помогает в автоматическом режиме определить эти участки.
Мэй Браун
Team Lead
Работаю с инструментом уже более 4 месяцев, загрузили более 15 проектов моих учеников — джунов. Здесь проще анализировать их исходные коды и следить за копипастами.
Ксения Андреева
Android Разработчик
Беру на вооружение!
Отличный сервис для программистов. Инструмент очень прост в использовании и имеет множество полезных функций, таких как проверка кода на совпадения. Протестировал его работу на своем проекте. Беру на вооружение!
Милдред Баллард
Java Разработчик
Тулза может помочь с тем, чтобы сделать свой код проще и легче, сравнивать программные файлы в своих проектах в онлайн режиме. Спасибо разработчикам!
Дэйл Джонсон
Java Разработчик
В последнее время все чаще приходится иметь дело с легаси кодом. AppRefactoring помогает с анализом и рекомендациями на модернизацию. Разрабы инструмента постоянно добавляют новые плюшечки. Рекомендую взять на вооружение.
Эмир Смирнов
CTO
В системе уже более 10-ка моих Swift проектов. Каждый новый проект анализируется и сравнивается со структурой и синтаксисом имеющихся в базе проектов. Все это автоматически и в онлайн режиме. Для меня это лучшее решение.
Омаров Абилай
IOS Разработчик
Наши Партнеры
Получите от наших коллег подробную статистику по каждому приложению и подробный отчет о рекламных креативах.
PIRATE CPA — источник знаний в области арбитража трафика и партнерского маркетинга
Универсальный инструмент для партнерского и перфоманс-маркетинга. Без файлов cookie и в полном соответствии с GDPR, CCPA и PECR. Используйте собственную инфраструктуру для защиты ваших данных
Источник: apprefactoring.com