Гибридный самолет-дирижабль успешно прошел первые испытания


Американская компания Aeros заявила об успешном первом летном испытании своего гибридного самолета-дирижабля Aeroscraft. Воздушное судно в длину 64 метра. Оно продемонстрировало функцию вертикального взлета и посадки, а также способность развивать скорость 222 км/ч. Согласно прогнозам специалистов, новый самолет-дирижабль может быть введен в эксплуатацию в течение ближайших нескольких лет. Использовать его планируется в качестве воздушного круизного лайнера – конструкция Aeroscraft позволяет орудовать большое количество комфортабельных кают для пассажиров и не только. Впрочем, создатели самолета-дирижабля не исключают и других вариантов его использования. В частности, в их планы входит создания грузовой версии Aeroscraft, достигающей в длину 137 метров и способной перевозить до 60 тонн грузов.

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

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

Об успешном завершении испытаний заявил Игорь Пастернак, глава и основатель компании Aeros. В кабине пилота находился Мунир Джоджо-Вердже, инженер компании и руководитель испытаний. По его словам, беспокойство создателей дирижабля вызывает способность аппарата противостоять сильным ветрам.

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

«Золотым веком» классических дирижаблей стали 20-е и первая половина 30-х гг. прошлого века. При большой грузоподъемности и экономичности они имели два серьезных недостатка — горючий газ водород, способный уничтожить аппарат за несколько секунд, и необходимость сложных манипуляций с балластом во время погрузочно-разгрузочный работ.

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

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

Компания Aeros была основана в 1987 г. на Украине Игорем Пастернаком. После развала СССР предприниматель перевел предприятие в США. Сейчас Aeros, которая является крупнейшим производителем дирижаблей в мире, лидирует в конкурсе на создание транспортного гибридного летательного аппарата для Пентагона. На сайте компании сообщается о том, что полноразмерный «Аэроскрафт» сможет поднимать на борт до 500 т груза.

Источник www.aeroscraft.com/

ссылка на оригинал статьи http://habrahabr.ru/post/167833/

Yandex Map Kit for Android. Поворот карты

Здравствуйте!
В этом сообщении опишу включение функции вращения карты в приложении использующем Yandex Map Kit for Android. Сообщение написано по мотивам Issue #99, которое осталось без решения.



Маленькое отступление. Начать работать с картой по описанию в разделе Wiki «Как начать работу» не удалось. Приложение падало при старте с ошибкой «Caused by: android.view.InflateException: Binary XML file line #7: Error inflating class ru.yandex.yandexmapkit.MapView». Помогло подключение к проекту classes.jar, располагается в yandexmapkit-library\libs.

Как и у автора Issue #99 метод МapController setRotateAnimtionTo повернул карту, но вместо тайлов карты получил тайлы с надписью «Для этого участка нет данных».

Воспользовавшись подсказкой поддержки

По вращение оно делалось для моего место положения и как бы представляет внутрений функционал.
Проблема у Вас в повороте это то что не выставлена точка центра вращение. Но все эти АПИ пока увы закрыты

исследовал класс MyLocationOverlay(байт код можно посмотреть в Eclipse), были найдены следующие строчки

    223  aload_0 [this]     224  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.f() : boolean [168]     227  ifeq 258     230  aload_0 [this]     231  getfield ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.y : al [78]     234  aload_0 [this]     235  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.getMyLocationItem() : ru.yandex.yandexmapkit.overlay.location.MyLocationItem [171]     238  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationItem.getBearing() : float [154]     241  invokevirtual al.a(float) : void [79]     244  aload_0 [this]     245  getfield ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.y : al [78]     248  aload_0 [this]     249  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.getMyLocationItem() : ru.yandex.yandexmapkit.overlay.location.MyLocationItem [171]     252  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationItem.getPoint() : cp [156]     255  invokevirtual al.a(cp) : void [80]     258  aload_0 [this]     259  invokevirtual ru.yandex.yandexmapkit.overlay.location.MyLocationOverlay.getMapController() : ru.yandex.yandexmapkit.MapController [170]     262  invokevirtual ru.yandex.yandexmapkit.MapController.notifyRepaint() : void [140]

где al — это то, что возвращает метод MapController getMapRotator(). MyLocationItem — расширение OverlayItem, метод getPoint() которого наследуется в MyLocationItem (потребуется для получения недоступного экземпляра класса cp). Увидев все это, нетрудно догадаться, что метод класса al a(cp point) задает координаты оси вокруг которой вращается карта, а al.a(float bearing) угол поворота. У класса al (напомню, что экземпляр получен методом getMapRotator() класса MapController ) есть еще один метод a(boolean enableRotation) относительно которого была догадка, что он разрешает вращение карты, которая впоследствии подтвердилась.

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

        GeoPoint geoPoint = mMapController.getMapCenter(); //получает географические координаты центра карты         OverlayItem overlayItem = new OverlayItem(geoPoint, null); // необходимо для получения недоступного экземпляра класса cp,  представляет внутренние координаты центра карты библиотеки         mMapController.getMapRotator().a(bearing); //задаем угол поворота         mMapController.getMapRotator().a(overlayItem.getPoint()); //задаем точку относительно которой производится вращение 

где

        MapController mMapController;         MapView mMapView;          mMapView = (MapView) findViewById(R.id.map);         mMapController = mMapView.getMapController();         mMapController.getMapRotator().a(true); // разрешаем вращение 

Результат

ссылка на оригинал статьи http://habrahabr.ru/post/167807/

Отдельный сервер для БД MySQL — как сэкономить трафик и ускорить приложение

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

На картинке изображен наглядный пример графика нагрузки сети. До 18:00 сжатие было отключено, в 18:00 — включено.

cacti network load graph

На mysqlperformanceblog описан бенчмарк на примере Sphinx.

В PHP при использовании mysql_connect включается флагом «MYSQL_CLIENT_COMPRESS».

ссылка на оригинал статьи http://habrahabr.ru/company/centosadmin/blog/167823/

Разработка игр для Windows 8 с использованием MonoGame: поддержка сенсорных экранов

В предыдущей заметке было рассказано о основных моментах связанных с разработкой игр для Windows 8 и MonoGame. Несмотря на то что игра уже запускается, в ней не хватает важных функций которые необходимы при реализации приложения для Windows 8. Это поддержка прикосновений и обязательный экран privacy policy.

Реализация поддержки прикосновений

ОС Windows 8 может запускаться на самом различном спектре устройств, в том числе на планшетах у которых отсутствует клавиатура. Наша игра является классическим платформером, для управления персонажем в игре реализована только поддержка геймпада и клавиатуры. Для поддержки устройств без клавиатуры но с сенсорным экраном необходимы дополнения в коде.

Текущая реализация MonoGame для Windows 8 позволяет опрашивать состояние сенсора экрана с помощью класса TouchPanel из области видимости Xna.Framework.Input.Touch. Поддерживаются жесты, и комбинированное взаимодействие с мышью. В простейшем случае, для того чтобы выяснить, есть ли нажатие на экран достаточно вызвать метод GetState() который вернет список точек к которым на данный момент осуществлено касание:

            foreach (TouchLocation location in TouchPanel.GetState())             {                 switch (location.State)                 {                     case TouchLocationState.Moved:                         // location.Position.X;                         // location.Position.Y;                         // location.Pressure                         // location.Id                         break;                     case TouchLocationState.Pressed:                         break;                     case TouchLocationState.Released:                         break;                     case TouchLocationState.Invalid:                         break;                 }             } 

Возвращаемый обьект TouchLocation содержит данные о типе, координатах касания, его порядковом номере (стандартно поддерживается до пяти одновременных точек) и силе нажатия.

Для поддержки касаний мы реализуем стандартный, принятый во многих играх подход – просто будем рисовать на экране изображение клавиш курсора и кнопку прыжка. Далее останется только вычислить координаты областей касаний, и опрашивать их на факт нажатия.

В самой игре CastleX обработка событий управления реализована двумя способами. Основное меню обратабывает события с помощью класса InputState в каждом методе Update() (перед вызовом Draw). При этом класс InputState помнит о предыдущем состоянии нажатия клавиш. Дополнительно, для управления игроком используется прямой опрос состояния клавиатуры. Эти стандартные обработчики требуется модифицировать.

Первое что нам нужно сделать это создать изображения курсорных клавиш и кнопки прыжка. Используя Paint.NET были созданы два PNG файла с прозрачностью:

Далее эти файлы нужно поместить в каталог Assets/GameContent. В принципе у нас даже нет необходимости создавать XNB файл, подсистема контента в MonoGame может прочитать файлы PNG напрямую.

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

Загружаем файл текстуры в методе LoadContent():

arrowkeys_texture = Content.Load<Texture2D>(@"transparent_arrow_keys"); 

И отображаем на экране в методе Draw()

              SpriteBatch.Begin();               SpriteBatch.Draw(arrowkeys_texture, drawPos, new Color(0, 0, 0));               SpriteBatch.End();  

При этом будет учтен альфаканал в PNG файле и в результате на экране отобразятся полупрозрачные изображения курсорных клавиш и кнопки:

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

Для этого будет использоваться простой способ – просто зададим координаты области нажатия и будем проверять эту координату на состояние TouchLocationState.Moved

Так же хотелось бы сохранить текущую инфраструктуру обработки событий от клавиатуры и геймпада реализованную в классе InputState.

В специальном методе AddTouchKey(Keys key, Rectangle rect) будет задаваться координата ассоциированная с клавишей, и помимо опроса состояния клавиатуры так же будет вызван метод UpdateTouchKeys()

        internal bool UpdateTouchPos(Dictionary<Keys, bool> key_states )         {             bool touched = false;              foreach (Keys key in _touchKeys.Keys)                 key_states.Add(key,false);              foreach (TouchLocation location in TouchPanel.GetState())             {                 touched = true;                 foreach (var k in _touchKeys.Keys)                 {                     if (location.State == TouchLocationState.Moved)                     {                         if (_touchKeys[k].Contains((int)location.Position.X, (int)location.Position.Y))                         {                             key_states[k] = true;                         }                     }                 }             }              return touched;          } 

Этот метод опрашивает все нажатые координаты, и если они входят в список областей нажатия ассоциированных с клавишами, эта кнопка вносится в список нажатых клавиш для дальнейшего использования в методах IsKeyDown() и IsKeyUp()

        public bool IsKeyDown(Keys key)         {             if (touchKeys.ContainsKey(key) && isTouched)                 return touchKeys[key];             else                 return orig_key_state.IsKeyDown(key);         } 

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

     Input.AddTouchKey(Keys.Down, hitPosDown);      Input.AddTouchKey(Keys.Up, hitPosUp);      Input.AddTouchKey(Keys.Left, hitPosLeft);      Input.AddTouchKey(Keys.Right, hitPosRight);        Input.Update();  

Добавляем в игру соглашение о приватности

Одним из важных условий прохождения сертификации при публикации приложений является наличие соглашение о приватности (privacy policy).

Для приложений на MonoGame такой экран реализуется простым способом, в методе Init основгого класса игры производится подписка на события вызова свойств приложения и задается обработчик:

        protected override void Initialize()         {              base.Initialize();              SettingsPane.GetForCurrentView().CommandsRequested += PaneRequest;         }          void PaneRequest(SettingsPane sender, SettingsPaneCommandsRequestedEventArgs args)         {             UICommandInvokedHandler handler = new UICommandInvokedHandler(onPrivacyPolicyCommand);              var privPolicyCmd = new SettingsCommand("PrivacyPolicyId", "Privacy Policy", handler);              args.Request.ApplicationCommands.Add(privPolicyCmd);         }          void onPrivacyPolicyCommand(IUICommand command)         {             Launcher.LaunchUriAsync(new Uri("http://wincommunity.ru/baller/privacy.html"));         }  

Загрузить исходный проект этими изменениями вы можете по адресу aka.ms/cgt2fr

ссылка на оригинал статьи http://habrahabr.ru/company/microsoft/blog/167815/