воскресенье, 11 декабря 2011 г.

Достоинства и недостатки ОС Linux

В этой статье я хотел бы коротко расписать основные достоинства и, заметьте, недостатки этой замечательной (для меня) ОС. Поехали!

Вначале — достоинства:

1. Open Source. Первое, и, как мне кажется, самое главное отличие и вместе с тем достоинство Linux в сравнении с Windows (другие системы, с вашего позволения, я в расчёт брать не буду — слишком уж мала их популярность на рынке потребителей). Так вот, Open Source в двух словах, а точнее, в одном — это свобода. Свобода программного обеспечения. Что это значит? А это значит то, что ядро любого дистрибутива Linux, модули, различное ПО, заточенное под Linux (и не только) имеет открытый исходный код. Это же, в свою очередь, значит, что любой, абсолютно любой человек, независимо от образования, социального статуса, семейного положения и места проживания может модернизировать и улучшить любую программу или даже само ядро Linux.Причём, улучшить не только для себя, но и предоставить плоды своей работы всему громадному мировому сообществу Линуксоидов. Повторюсь — как по мне, это несомненное преимущество, но вместе с тем одновременно и недостаток, о чём будет написано чуть позже.

2. Безопасность. Тут тоже всё очень интересно. Дело в том, что процентное количество десктопов на Линуксе — около 2%, если не ошибаюсь. (Сервера, коих около 80% от общего количества, а расчёт не берём). Как следствие этого факта — под Линукс практически не пишут вирусы. Не пишут именно по причине ненадобности этого занятия. Всё правильно — зачем морочить себе голову, пытаясь изобрести сложный вирус или троян, если и впарить его, простите, будет некому — ведь всего лишь 2 человека из 100 пользуются Линуксом? Гораздо ведь легче написать простенький троянчик, и подсунуть его наивному чайнику, сидящему под «окошками», верно?

3. Меньше тормозов и различных непонятных науке глюков, присущих «окнам». Этот факт я нормально объяснить пока не в состоянии, но мне кажется, что дело тут в кардинально другом подходе к устройству файловой системы и методам взаимодействия с пользователем. Также роль играет и второй пункт — ведь без антивируса любая ОС будет работать быстрее, верно?

4. «Сделана программистами для программистов». Не помню, чьи слова, но смысл понятен. Для меня, как для программиста, это несомненное преимущество. Все эти консоли, встроенные компиляторы, shell-ы и bash-ы, возможность писать свои собственные скрипты, гибкое устройство выполнения любых команд по расписанию, возможность создания сложных макросов — всё для меня это является несомненным преимуществом.

5. Меньшая потребность в ресурсах. Я не беру в расчёт такие «окноподобные» системы, вроде Ubuntu и иже с ними — в них всё не так просто. А вот во всяких Gentoo, Skackware и подобных это достоинство проявляет себя замечательно. 

6. Относительно простая установка. Здесь, в принципе, говорить нечего. Естественно, установка любого дистрибутива Линукс сложнее, чем установка любой версии Windows, но совсем ненамного. Единственная сложность, как по мне, для любого новичка представляет необходимость ручного создания точек монтирования — хотя, если винт чистый, и на нём будет стоять только одна ОС — то можно вообще ничего не делать, Линукс всё сделает за Вас.

7. Отличная поддержка драйверов любых видов устройств. Тоже очень важное преимущество. Воткнул девайс — пользуйся. Всё просто. Это касается и USB-устройств, и интернета, и различных модемов, и интернета, и другой периферии… Исключения составляют принтеры, о чём будет написано чуть ниже.

8. Замечательный саппорт. Это достоинство я понял, когда начал сталкиваться с проблемами и вопросами, которые уже не мог решить самостоятельно или методом научного тыка (кстати, этот метод совершенно противопоказан в Линуксе, особенно новичкам. Хотя, неновички этим методом пользоваться не будут). Ведь Линукс — это результат труда десятков тысяч замечательных программистов, разработчиков, менеджеров, дизайнеров и тестировщиков по всему миру. Из этого следует, что в мире давно образовалось громадное сообщество, так сказать, коллективный разум, за помощью которого вы сможете прийти в любое время. Абсолютно бесплатно, между прочим.

С достоинствами всё. Теперь кратко пробежимся по недостаткам.

1. Сложность в освоении. Да, Линукс действительно тяжелее осваивать, что не говори. В этом её кардинальное отличие от «окон». Все эти консоли, правки конфигурационных файлов, маны, команды ну никак не способствуют продвижению Линукс в мире десктопов.

2. Необходимость работы с консолью. Этот недостаток выплывает из первого. Нужно будет частенько заходить в консоль. Ну, или в Терминал, кому как больше нравится. Конечно же, многие мне могут возразить, что уже, в новейших дистрибутивах надобность в консоли отпадает, и можно работать исключительно с графическим интерфейсом… На что я вам скажу, что вы не совсем правы. Работать-то исключительно с графическим интерфейсом можно, но когда пределы вашей работы за компьютером выйдут за определённые границы — посиделки в сети, общения в аьсках/скайпах, редактировании документиков, прослушивание музыки и просмотр фильмов — вот тогда в консоль залазить время от времени придётся, уж поверьте.

3. Много лишних «телодвижений». Этот недостаток связан с предыдущим, точнее, является его продолжением. Что я хочу сказать — дело в том, что на тривиальные с первого взгляда вещи в Линуксе с непривычки и при отсутствие практики приходится тратить много времени и мозговых ресурсов — что не есть хорошо.

4. Сложность в настройке принтеров. Да, в Линуксе хорошо настраивается всё, кроме принтеров. Хотя, сейчас эта проблема уже практически решена, и сценарий подключения принтера становится похожий на стандартный сценарий подключения любого устройства — «Воткнул? Работай!». Но есть ещё немало моделей принтеров, подключить которые удастся только нетривиальным и немного извращённым способом.

5. Права доступа. Мелкий недостаток, но он есть. Вам придётся с этим сталкиваться. С этими гадкими правами доступа. Но это плата за безопасность.

6. Отсутствие игр. Ммм, вот мы и подошли к самому «смачному» недостатку Линукса — отсутствие нормальных игрушек. Точнее, игры под Линукс есть, но лучше бы Вам не видеть этих игр… Ну, за исключением, быть может, пары-тройки нормальных игрулек. Но этот недостаток можно оправдать — Линукс создавался не для игр. И не для геймеров. Линукс создавался для работы, «программистами для программистов». А если Вы — геймер, или просто захотели скоротать пару часиков за качественной игрушкой — прямая дорога Вам в Windows.

7. Сильное отличие от Винды. Как я уже понял, это тоже является недостатком. Ведь сейчас всё чаще на Линукс переходят с Винды (я, кстати, не оказался исключением). Чистых, так сказать, линуксовидов сейчас очень мало, и они давно уже наверное занесены в Красную Книгу. А вот людям, которые с уютных окошек решили перейти в суровый Линукс, с его конфигами, консолью и правами доступа — будет очень непривычен стандартный Линуксовский интерфейс.

MySQL Cluster (NDB) — что это на самом деле?

Посмотрел недавно видео с HighLoad++, в частности доклад Григория Рубцова «Архитектура MySQL Cluster»

Краткие тезисы:
— Таблицы хранятся по нодам построчно (по ключу auto_increment).
— Данные дублируются на нескольких нодах одновременно
— Индексы тоже хранятся на нодах в виде таблиц со всем вытекающими: распределение между нодами построчно.

Что вытекает из этого? Что бы выполнить полноценный запрос sql с JOIN или несколькими условиями будут выполнены следующие действия:
— по ключу будет найдена нода, хранящая доп. условие;
— на данной ноде будет найдена необходимая запись.

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

Т.е. при одном дополнительном условии (к поиску по автоинкрементному ключу) будет выполнено вместо одного запроса три. При двух дополнительных условиях — пять запросов и т.д. Что косвенно подтверждается народом на форумах: производительность кластера из 4-х нод примерно соответствует одному классическому серверу MySQL.

Что ж это за решение, воскликните вы?!

Но давайте посмотрим с другой стороны. Будем, как говориться, смотреть на плюсы, а не минусы.

MySQL Cluster умеет хорошо делать:
— выборку по первичному ключу;
— резервирование (размазывание с избыточностью данных по нодам);
— отказоустойчивость (менеджер отслеживает состояния нод и реаигрует тем или иным образом).

Но разве это не сервер NoSQL, умеющий балансировку, избыточность и отказоустойчивость «из коробки»?

Правда для такой роли необходимо существенно переписывать софт (по крайней мере ту его часть, которая отвечает за работу с БД).

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

Получается MySQL кластер не так уж плох, если его использовать под нужным углом, главное вовремя осознать его NoSQL-сущность?

Парсинг JNG изображений

Вы наверно помните, что Mozilla убрала поддержку MNG и JNG из Firefox еще в 2003 г. Чтобы увидеть их (только через тег embed) нужен плагин. Из-за того, что поддержки JNG нигде нету, нельзя встретить JPEG с альфа-каналом. А ведь как было бы здорово…

Но я расскажу как восстановить JNG изображения на своей странице.



Начнем


Перед началом нам нужны такие функции, как загрузка бинарного кода, crc32 и желательно deferred. Все эти немаловажные функции можно взять с apng-canvas. Но я их несколько улучшил, убрал все лишнее, добавил несколько функций, например CReader. Заранее приготовил все необходимые инструменты.

Сигнатура


Сигнатура JNG несколько отличается от сигнатуры PNG двумя первыми байтами. Сигнатура — это важная часть JNG, именно от него зависит, парсить JNG или нет.

Чанки


JNG, как и PNG, устроен из чанков, но отличается тем, что хранит JPEG изображение, и альфа-канал в виде PNG данных или в том же JPEG.

JHDR

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

JDAT

Нам достаточно собрать все части из JDAT и мы сможем получить JPEG изображение.

IDAT

Это чанк альфа-канала, но он нам доставляет больше проблем. Вы знаете, что PNG состоит как минимум из IHDR, IDAT и IEND. Причем IHDR мы должны сами построить, необходимые байты придется брать из JHDR. Цветовой тип всегда будет равняться нулю у JNG альфа-канала.

JDAA

Этот чанк встречается крайне редко, но с ним нужно поступать также как с JDAT, но определять надо как альфа-канал.

IEND

Не нужно ничего объяснять, это конечный чанк у JNG.

Я ничего не понимаю, а можно скрипт?


Перейдите на страницу jnglike.site40.net/ и там вы увидите ссылку на скачивание скрипта.

суббота, 26 ноября 2011 г.

Flash Player умер? Но мы ведь нет

В последние дни в рядах флеш-разработчиков идет активное брожение. Разумеется это коснулось и меня. Что-ж, Adobe послала нам месседж, глупо его игнорировать. Для себя я сделал такой вывод: флеш плеер может умереть, может не умирать и активно развиваться еще долгие и долгие годы, но лично мне не хочется зависеть от каких-то там дядек из Adobe, которые могут одним осенним утром прикрыть свое детище и мне останется лишь выжимать из умирающей платфомы последние соки в последние 2-3 года ее агонии. Немного поразмыслив я вспомнил про Haxe. Побродив по интернетам я убедился что этот язык может дать мне то, чего я хочу. 

Почему:
  • Haxe это тот же ActionScript3 и еще даже лучше. Флеш-разработчику перейти на него не составляет особых проблем.
  • Кроссплатформенность. Многие сейчас пытаются изобрести “золотую пулю”, и конечно же у такого рода решений куча недостатков, в отличие от того, что вы можете получить используя для платформ их “родные” языки. Но, тем не менее, в использовании Haxe плюсов для меня больше — я могу быстро, на “родном” мне языке, используя знакомые мне инструменты создавать кроссплатформенные приложения. И это не так уж и медленно будет работать:gamehaxe.com/2011/06/16/multi-language-bench. Я думаю, что побыстрее чем AIR. И я еще не говорил о том что на одном и том же языке можно разрабатывать и клиент и сервер (php, node.js и neko).
  • Я никуда не ухожу с флеш платформы. Используя Haxe, я все еще остаюсь флеш-разработчиком и могу использовать весь свой накопленный опыт и базу кода. К тому же Haxe компилятор для флеша выдает реально более быстрый код чем от Adobe. Просто у меня расширяются возможности. Еще есть такая штука как www.haxenme.org которая позволяет использовать флешевые апи для разработки на куче платформ. И у них в showcase вполне неплохие примеры игр. Результаты компиляции флешеподобного кода из этого примера www.joshuagranick.com/blog/2011/09/21/nme-3-flash-c-and-now-html5 меня приятно порадовали. Я пишу практически один и тот же код что год и два назад, а получаю гораздо больше.


Все это звучит очень хорошо, но куда же без минусов:

  • IDE. Самым продвинутым вариантом пока остается FlashDevelop. Он динамично развивается и на нем можно писать серьезные приложения. На маке его реально запустить из Parallels Desktop, хотя это уже из области танцев с бубном. Плагин для FDT плавно перешел в бету в мае этого года, темпы его разработки пока не радуют. Intelij Idea — моя любимая IDE. Плагина нет, но есть новостиgithub.com/fkorotkov/haXe-plugin Очень верю что будет. Еще можно упомянуть проwww.eclihx.org/home, до него руки пока еще не дошли.
  • Flex. Что говорить — флекса тут нет. Тему UI фреймворков для Haxe я изучил мало. Вроде что-то есть, но далеко конечно не флекс. Так что придется пользоваться тем что есть. Ну или портировать флекс что ли в конце-то-концов.
  • Все это развивается силами энтузиастов. За Haxe пока нет такой силы как Adobe. Может это и к лучшему. Но и колесящих по миру евангелистов, и кучи книг с обширной документацией и примерами тут тоже пока не видать.


Собственно зачем я это все написал. Сила Haxe в его комьюнити. Чем больше людей будет его использовать тем быстрее он будет развиваться. И мне кажется что за такими вещами какwww.haxenme.org действительно есть перспектива. Следующий свой проект я буду делать на Haxe. Ну а вы решайте сами.

Ссылки:

Открытие файла на диске через сайт


Постановка задачи


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

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


Решение задачи


Решением в лоб является любая реализация технологии COMET, но все они чреваты трудностями и затратами на сервер. Вдохновением для моего решение была одна неприятная особенность работы скайпа: если его установить до IIS, то скайп начинал слушать 80-ый порт. Соответственно схема работы получилось очень простой:
  • пользователь нажимает на кнопку на сайте
  • браузер делает http запрос к localhost
  • клиент, слушающий соответствующий порт, открывает файл


В клиенте добавляем любую реализацию http сервера и вешаем слушателя на какой-нибудь порт (в нашем случае 7000).

На странице добавляем небольшую функцию:

function doSomethingOnDisk(){
$.getJSON(
                "http://127.0.0.1:7000?jsoncallback=?",
                { command: commandname [, optional params] },
                function (data) {
                   //do something
                }
            );
}

Нужно быть внимательным, т.к. в данном случае происходит кроссдоменный ajax запрос. Поэтому не забываем про «jsoncallback=?» и обернуть ответ в клиенте в соответствующую обертку (придет в параметре jsoncallback).

Плюсы

  • Просто
  • Быстро
  • Никакого лишнего трафика

Минусы

  • Порт может быть занят или закрыт
  • Если есть брандмауер, то windows попросит разрешения для приложения и пользователь может отказать


П.С. как не трудно заметить, данная реализация позволяет давать с сайта любые команды клиенту.

jQuery.getJSON
http server для C#

понедельник, 21 ноября 2011 г.

Получение S.M.A.R.T. параметров жестких дисков по сети

Для считывания S.M.A.R.T. параметров жестких дисков локального компьютера существует множество программ. Описывать их я не буду, потому что ни одна из них не позволяет считать S.M.A.R.T. удаленно по сети, имея права администратора домена. Поиск по просторам интернета ничего путного и бесплатного мне не дал, поэтому мне пришлось подумать как эту задачу решить самому. 

Недавно мне на глаза попалась небольшая консольная программка smartctl из комплекта smartmontools. Для того, чтобы запустить её на удаленном компьютере понадобится программа psexec, входящая в пакетPsTools от SysInternals.
Для работы я написал 2 скрипта: 
net_smart.bat:

@echo on
del netlist.txt
net view >> netlist.txt
for /F "eol=K skip=3 tokens=1" %%i in (netlist.txt) do (
for %%j in (smartctl.*) do copy %%j %%i\admin$
psexec -s %%i smartctl.bat )


и smartctl.bat:

@Echo on
Set $DST=\\server\share\smart
md "%$DST%\%COMPUTERNAME%"
del smartctl.txt
smartctl.exe --scan >> smartctl.txt
for /F "tokens=1" %%i in (smartctl.txt) do smartctl.exe -a %%i >> "%$DST%\%COMPUTERNAME%\%DATE:~-4%-%DATE:~3,2%-%DATE:~0,2%_%TIME:~0,2%-%TIME:~3,2%.txt"


Файл net_smart.bat сканирует сеть, сохраняет список компьютеров в файл netlist.txt (предварительно его очистив) и затем поочередно на каждый компьютер копирует файлы smartctl.bat и smartctl.exe и при помощи программы psexec. Там, удаленно, запускает файл smartctl.bat, который считывает количество и имена установленных жестких дисков в smartctl.txt, затем последовательно считывается S.M.A.R.T. c каждого установленного в системе жесткого диска и складывает в папку в виде текстовых файлов, указанную в строке: 
Set $DST=\\server\share\smart
файла smartctl.bat.
Хочу обратить внимание на то, что в строке 
for /F "eol=K skip=3 tokens=1" %%i in (netlist.txt) do (
файла net_smart.bat символ К в параметре eol=K русский и должен быть в ДОС кодировке.

Flex HelloWorld для Android на Adobe AIR за 5 минут

В сети ведется активное обсуждение, того что компания Adobe прекратила разработку Flash-плеера для мобильных устройств, в связи с этим хочу поделиться с вами, как используя технологию Adobe AIR написать HelloWorld, который запустится на Android смартфоне/планшете за 5 минут.

Процесс :


Для написания нам потребуется :

  • Flash Builder 4.5 (4.5.1 для iOS систем)
  • Поверхностное знание ActionScript 3.0 и FLEX
  • Телефон/планшет с Andoid

Для проверки возможностей AIR на мобильных платформах, нас интересуют следующие функции приложения :

  • Проигрывание FLV видео
  • Воспроизведение MP3 файла
  • Отображение нескольких картинок

Разработка

Создадим проект Flex Mobile Project
Выбираем мобильные платформы и основной класс приложения:
  1. Blank spark.Application (базовой контейнер без доп.элементов)
  2. View-Based Application spark.ViewNavigatorApplication (расширенный контейнер без доп.элементов)
  3. Tabbed Application spark.TabbedViewNavigatorApplication (расширенный контейнер с табами)
О различиях контейнеров, рекомендую почитать самим. В нашем случае я остановился на View-Based Application, он даст достаточно функциональности для написания без излишеств.

Во вкладке Permissions , в случае с Android (iOS будет каждый раз запрашивать или предложит сохранить настройку) выбираем необходимый набор функций для доступа к телефону.

Приступим к написанию кода :

Для начала создадим еще несколько компонентов:
videoView, audioView, pictureView
Так-же скопируем несколько файлов для теста:
/assets/1.flv, /assets/1.mp3, /assets/1.png
Сам код :

mobileHelloWorldHomeView.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
  xmlns:s="library://ns.adobe.com/flex/spark" title="Hello World">
 <fx:Declarations>
  <!-- Place non-visual elements (e.g., services, value objects) here -->
 </fx:Declarations>
 <s:Button id="videoButton" label="Video" click="navigator.pushView(videoView)" x="{(this.width - videoButton.width) / 2}" y="{videoButton.height}"/>
 <s:Button id="soundButton" label="Sound" click="navigator.pushView(soundView)" x="{(this.width - soundButton.width) / 2}" y="{videoButton.y + videoButton.height + 2}"/>
 <s:Button id="pictureButton" label="Picture" click="navigator.pushView(pictureView)" x="{(this.width - pictureButton.width) / 2}" y="{soundButton.y + soundButton.height + 2}"/>
 <s:Button id="exitButton" label="Exit" click="NativeApplication.nativeApplication.exit()" x="{(this.width - exitButton.width) / 2}" y="{pictureButton.y + pictureButton.height + 2}"/>
</s:View>

videoView.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
  xmlns:s="library://ns.adobe.com/flex/spark" title="Video"
  creationComplete="playVideo(event)" >
 <fx:Script>
  <![CDATA[
   import mx.core.UIComponent;
   
   [Embed(source="/assets/1.flv",mimeType="application/octet-stream")]
   private var VideoClass : Class;
   
   private var netConnection:NetConnection;
   private var netStream:NetStream;

   import mx.events.FlexEvent;
   private function playVideo(e:FlexEvent):void
   {
    netConnection = new NetConnection();
    netConnection.connect(null);
    
    netStream = new NetStream(netConnection);
    netStream.client = {};
    netStream.play(null);
    
    var videoObject:Video = new Video(videoCt.width , videoCt.height);
    videoObject.attachNetStream(netStream);   
    
    var ui:UIComponent = new UIComponent();
    ui.addChild(videoObject);
    ui.width = videoObject.width;
    ui.height = videoObject.height;

    videoCt.addElement(ui);
    
    var videoBytes:ByteArray = new VideoClass() as ByteArray;
    netStream.appendBytes(videoBytes);
   }
   private function stopVideo(e:Event = null):void
   {
    netStream.close();
    netConnection.close();    
    videoCt.removeAllElements();   
    navigator.pushView(mobileHelloWorldHomeView);
   }
  ]]>
 </fx:Script>
 <s:Group id="videoCt" x="{(this.width - videoCt.width) / 2}" y="{backButton.height}"/>
 <s:Button id="backButton" label="Back" click="stopVideo(event)" x="{(this.width - backButton.width)/2}"/>
</s:View>

soundView.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
  xmlns:s="library://ns.adobe.com/flex/spark" title="Sound"
  creationComplete="playAudio(event)" >
 <fx:Script>
  <![CDATA[
   import mx.events.FlexEvent;
   
   [Embed(source="/assets/1.mp3")]
   private var AudioClass : Class;
   
   private var soundChannel:SoundChannel;
   
   private function playAudio(e:FlexEvent):void
   {
    var sound:Sound = new AudioClass() as Sound;
    soundChannel = sound.play();
   }
   private function stopAudio(e:Event = null):void
   { 
    soundChannel.stop();
    navigator.pushView(mobileHelloWorldHomeView);
   }
  ]]>
 </fx:Script>
 <s:Button id="backButton" label="Back" click="stopAudio(event)" x="{(this.width - backButton.width)/2}"/>
</s:View>


pictureView.mxml

<?xml version="1.0" encoding="utf-8"?>
<s:View xmlns:fx="http://ns.adobe.com/mxml/2009" 
  xmlns:s="library://ns.adobe.com/flex/spark" title="Picture">
<s:Image id="picture" x="{(this.width - picture.width) / 2}" y="{backButton.height}" source="@Embed(source='/assets/1.png')" />
<s:Button id="backButton" label="Back" click="navigator.pushView(mobileHelloWorldHomeView)" x="{(this.width - backButton.width)/2}"/>
</s:View>


После нам необходимо добавить сертификат:
Заходим в настройки проекта Properties->Flex Build Packing->Google Andriod

Для того, чтобы создать его нажмем Create

Этот сертификат позволит нам вести debug, но не выкладывать приложение в Andriod.Market (для этого можно искать информацию в другой статье)

Запуск :

У нас есть два варианта запустить приложение Properties->Run/Debug Settings->New->Mobile Application:
  1. На эмуляторе Launch Method: On desktop
  2. На устройстве Launch Method: On device (для этого подключите устройство и включите в настройках usb-debugging)
Additions :
  1. На большинстве Android устройствах вам потребуется установить Adobe AIR для запуска
  2. Для создания приложения для iOS устройств, вам потребуется оплаченный аккаунт Apple Developer(99$/year) и несколько более сложных операций по созданию сертификата.