Bearburger's Nest

Блог Рагимова Романа

Homebrew vs Hackintosh. Часть 2

Я уже писал о проблемах с Homebrew на Hackintosh. Последний апдейт Homebrew сломал предыдущий метод решения проблем – программы отказывались компилироваться, вываливаясь с разными ошибками. Например, вот что выдавалось при попытке собрать node.js

==> Downloading http://nodejs.org/dist/v0.11.11/node-v0.11.11.tar.gz
######################################################################## 100,0%
==> ./configure --prefix=/usr/local/Cellar/node/0.11.11
==> make install
  LINK(target) /private/tmp/node-vOP3/node-v0.11.11/out/Release/mksnapshot.x64: Finished
  LD_LIBRARY_PATH=/private/tmp/node-vOP3/node-v0.11.11/out/Release/lib.host:/private/tmp/node-vOP3/node-v0.11.11/out/Release/lib.target:$LD_LIBRARY_PATH; export LD_LIBRARY_PATH; cd ../deps/v8/tools/gyp; mkdir -p /private/tmp/node-vOP3/node-v0.11.11/out/Release/obj.target/v8_snapshot/geni; "/private/tmp/node-vOP3/node-v0.11.11/out/Release/mksnapshot.x64" --log-snapshot-positions --logfile "/private/tmp/node-vOP3/node-v0.11.11/out/Release/obj.target/v8_snapshot/geni/snapshot.log" "/private/tmp/node-vOP3/node-v0.11.11/out/Release/obj.target/v8_snapshot/geni/snapshot.cc"
/bin/sh: line 1: 23298 Illegal instruction: 4  "/private/tmp/node-vOP3/node-v0.11.11/out/Release/mksnapshot.x64" --log-snapshot-positions --logfile "/private/tmp/node-vOP3/node-v0.11.11/out/Release/obj.target/v8_snapshot/geni/snapshot.log" "/private/tmp/node-vOP3/node-v0.11.11/out/Release/obj.target/v8_snapshot/geni/snapshot.cc"
make[1]: *** [/private/tmp/node-vOP3/node-v0.11.11/out/Release/obj.target/v8_snapshot/geni/snapshot.cc] Error 132
make: *** [node] Error 2
READ THIS: https://github.com/Homebrew/homebrew/wiki/troubleshooting
These open issues may also help:
node: add test (https://github.com/Homebrew/homebrew/pull/26419)
node dependencies (https://github.com/Homebrew/homebrew/issues/17680)
node 0.4.8 (https://github.com/Homebrew/homebrew/issues/5722)
Install npm bash completion with node (if with-npm) (https://github.com/Homebrew/homebrew/pull/26483)
node install node failed to build on 10.8.5 (https://github.com/Homebrew/homebrew/issues/23360)
node failed to build on 10.9 (https://github.com/Homebrew/homebrew/issues/24465)
node 0.10.24 (https://github.com/Homebrew/homebrew/pull/25336)

Решение состоит в очередном изменении /usr/local/Library/ENV/4.3/cc. Нужно заменить блок

when /^-g\d?/, /^-gstabs\d+/, '-gstabs+', /^-ggdb\d?/, '-gdwarf-2',
    /^-march=.+/, /^-mtune=.+/, /^-mcpu=.+/, '-m64',
    /^-O[0-9zs]?$/, '-fast', '-no-cpp-precomp',
    '-pedantic', '-pedantic-errors'
when '-fopenmp', '-lgomp'
    # clang doesn't support OpenMP
    args << arg if not tool =~ /^clang/

на

when /^-g\d?/, /^-gstabs\d+/, '-gstabs+', /^-ggdb\d?/, '-gdwarf-2',
    /^-march=.+/, /^-mtune=.+/, /^-mcpu=.+/, '-m64',
    /^-O[0-9zs]?$/, '-fast', '-no-cpp-precomp',
    '-pedantic', '-pedantic-errors'
    args << '-march=core2' if tool =~ /clang/
when '-fopenmp', '-lgomp'
    # clang doesn't support OpenMP
    args << arg if not tool =~ /^clang/

Теперь программы прекрасно компилируются даже в виртуалке.

Admins-Mac:~ admin$ brew install node --devel
==> Downloading http://nodejs.org/dist/v0.11.11/node-v0.11.11.tar.gz
Already downloaded: /Library/Caches/Homebrew/node-0.11.11.tar.gz
==> ./configure --prefix=/usr/local/Cellar/node/0.11.11
==> make install
==> Caveats
Bash completion has been installed to:
  /usr/local/etc/bash_completion.d
==> Summary
🍺  /usr/local/Cellar/node/0.11.11: 1123 files, 18M, built in 5.3 minutes
Admins-Mac:~ admin$ 

AspenStream

Главное окно AspenStream

Вчера, после полугода разработки и фикса багов, я выпустил AspenStream – приложение во многом аналогичное TorrentStream/ACEStream, но предназначенное исключительно для воспроизведения торрентов. Из нижеследующего вы можете узнать о ключевых функциях данного приложения и отличиях от конкурентов.

Полная кроссплатформенность

В отличие от TorrentStream, AspenStream работает не только под Windows, но и под Mac. Товарищи из TorrentStream объясняют отсутствие поддержки Mac необходимостью собрать проигрыватель под эти платформы. С моей же точки зрения стоило бы выпустить хотя бы сам движок, с объяснением, как это все использовать в обычном проигрывателе. Хотя, возможно, я упускаю какие-то моменты в реализации TS, делающие невозможным подобное.

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

Свобода в выборе плеера

TS поставляется с измененной сборкой VLC. Признавая универсальность VLC в качестве кроссплатформенного плеера поддерживающего сотни кодеков и способного читать даже “битые” файлы, стоит заметить, что его интерфейс уступает в удобстве “родным” проигрывателям. Лично меня бесит отсутствие возможности убрать рамку окна, дабы не занимать кучу экранного пространства.

В AspenStream эта проблема решена кардинально – программа вообще не знает о существовании проигрывателей. Вы можете установить в настройках любой, который предпочитаете сами. Главное условие – он должен поддерживать воспроизведение из HTTP потока.

Из того, что я протестировал, можно выделить следующие программы.

Для Windows

Daum PotPlayer – форк The KMPlayer, пока что чистый от рекламы и поддерживающий bordreless режим. Из особенностей стоит отметить странные дефолтные настройки, но это решается парой кликов мышки. На данный момент я использую именно его.

VLC – поддерживает все, что можно представить, но имеет недостатки в виде слабой системы кэширования, которая не позволяет загрузить весь ролик для последующего offline-просмотра.

The KMPlayer – погрязший в рекламе корейский проигрыватель, который, тем не менее, поддерживает нормальное кэширование. Запомнился глюками с воспроизведением MP4 с vk.com.

Для Mac

MPlayerX – не являясь постоянным пользователем MacOS, тем не менее предпочитаю данный плеер, поскольку он, в отличие от VLC, поддерживает borderless-режим.

VLC – полностью аналогичен Windows версии.

Для работы под Windows следует просто указать путь до исполняемого файла проигрывателя. К примеру, для PotPlayer это c:\Program Files (x86)\Daum\PotPlayer\PotPlayerMini.exe.

Под Mac все немного сложнее, поскольку у плееров разные подходы к оформлению параметров вызова из командной строки. Поэтому Mac версия на данный момент поддерживает только VLC и MPlayerX. Если у вас есть любимый проигрыватель под Mac, который теоретически может работать с AspenStream, сообщите о нем в группе AspenStream.

Сохраняйте просмотренные файлы и поддерживайте раздачи

Не знаю как с этим обстоит дело в текущей версии TS, но в прошлых, все, что было доступно пользователю после окончания загрузки, это папка с “кэшем”, в котором хранились непонятные и с виду бесполезные файлы. Также оставалось загадкой – может ли TS оставаться на раздаче после окончания скачивания?

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

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

Смотрите на любом компьютере локальной сети

Поскольку AspenStream по своей природе является сервером, вы можете получить доступ к потоку с любого компьютера в локальной сети. Адрес потока <your_ip>:62342.

Пользователям Windows для доступа к потоку придется открыть порты в Windows Firewall. Это можно сделать следующим скриптом, который нужно запустить от администратора.

aspen_win7.bat
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
@echo off

:: BatchGotAdmin
:-------------------------------------
REM  --> Check for permissions
>nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"

REM --> If error flag set, we do not have admin.
if '%errorlevel%' NEQ '0' (
    echo Requesting administrative privileges...
    goto UACPrompt
) else ( goto gotAdmin )

:UACPrompt
    echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
    set params = %*:"=""
    echo UAC.ShellExecute "%~s0", "%params%", "", "runas", 1 >> "%temp%\getadmin.vbs"

    "%temp%\getadmin.vbs"
    exit /B

:gotAdmin
    if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
    pushd "%CD%"
    CD /D "%~dp0"
:--------------------------------------

netsh advfirewall firewall add rule name="AspenStream Stream In Port" dir=in action=allow protocol=TCP localport=62342
netsh advfirewall firewall add rule name="AspenStream Stream Out Port" dir=out action=allow protocol=TCP localport=62342

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

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

Поддержка AspenWeb

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

Поиск по трекерам и видеохранилищам

Программа в полностью автоматическом режиме обходит несколько трекеров и видеохранилищ, фильтрует результаты и выдает их в общей форме. На данный момент поддерживаются сайты: rutracker.org, rutor.org, kinozal.tv, vk.com и seasonvar.ru. Обход всех пяти ресурсов в среднем занимает 10-15 секунд.

Подписчики AspenWeb Premium также получают доступ к прокси серверам, позволяющим обходить блокировки торрент-трекеров на территории РФ и Украины.

Следите за выходом серий любимых сериалов

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

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

Ищите фильмы

Кроме обычного поиска по называнию, AspenWeb включает в себя мощную систему фильтров, позволяющую искать картины по следующим параметрам:

  • год выхода
  • жанр
  • страна производитель
  • задействованные актеры, режиссеры, композиторы и т.п.
  • оценки и количество голосов на Kinopoisk и IMDb
  • статус фильма

Смотрите фильмы которые понравятся именно вам

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

Web-интерфейс

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

Вместо резюме

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


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

Простой парсинг POST запросов из AngularJS в Slim Framework

По умолчанию, параметры, передаваемые POST запросом из AngularJS, недоступны в Slim через $app->request->post('key'). Причина в том, что AngularJS отправляет POST не в виде form-data, а в виде body запроса с Content-type: application/json. Разработчики Slim советуют использовать middleware ContentTypes. Выглядит это примерно так

1
2
3
4
5
6
7
8
9
$app = new \Slim\Slim();
$app->add(new \Slim\Middleware\ContentTypes());

$app->post('/post', function() use ($app){
  $postData = $app->request->getBody();
  if(isset($postData['key'])) {
    echo $postData['key'];
  }
});

К сожалению, у данного решения есть несколько проблем:

  • Приходится проверять на существование ключа
  • Если вы работаете с обычными API клиентами (CURL и ему подобные), придется дописывать еще и работу с $app->request->post('key')

Мне же лениво заниматься и тем и другим, поэтому я написал наследника от Slim\Http\Request, умеющего разбирать данные переданные в формате application/json. Подключение и работа выглядит так

1
2
3
4
5
6
7
8
9
$app = new \Slim\Slim();

$app->container->singleton('request', function ($app) {
    return new AngularRequest(\Slim\Environment::getInstance());
});

$app->post('/post', function() use ($app){
  echo $app->request->post('key');
});

Если параметр 'key' не существует, вернется null, как и в случае обычного запроса к $app->request->post()

Ниже представлен исходный код класса AngularRequest

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
class AngularRequest extends \Slim\Http\Request {
    public function post($key = null) {
        if (!isset($this->env['slim.input'])) {
            throw new \RuntimeException('Missing slim.input in environment variables');
        }
        if (!isset($this->env['slim.request.form_hash'])) {
            $this->env['slim.request.form_hash'] = array();
            if ($this->isFormData() && is_string($this->env['slim.input'])) {
                $output = array();
                if (function_exists('mb_parse_str') && !isset($this->env['slim.tests.ignore_multibyte'])) {
                    mb_parse_str($this->env['slim.input'], $output);
                } else {
                    parse_str($this->env['slim.input'], $output);
                }
                $this->env['slim.request.form_hash'] = \Slim\Http\Util::stripSlashesIfMagicQuotes($output);
            } else {
                $this->env['slim.request.form_hash'] = \Slim\Http\Util::stripSlashesIfMagicQuotes($_POST);
            }
        } else if (empty($this->env['slim.request.form_hash']) && ($this->getMediaType() == 'application/json') && !empty($this->env['slim.input'])) {
            $this->env['slim.request.form_hash'] = \Slim\Http\Util::stripSlashesIfMagicQuotes(json_decode($this->env['slim.input'], true));
        }
        if ($key) {
            if (isset($this->env['slim.request.form_hash'][$key])) {
                return $this->env['slim.request.form_hash'][$key];
            } else {
                return null;
            }
        } else {
            return $this->env['slim.request.form_hash'];
        }
    }
}

Основная часть, это новое условие

1
2
3
else if (empty($this->env['slim.request.form_hash']) && ($this->getMediaType() == 'application/json') && !empty($this->env['slim.input'])) {
    $this->env['slim.request.form_hash'] = \Slim\Http\Util::stripSlashesIfMagicQuotes(json_decode($this->env['slim.input'], true));
}

Т.е. если обычные данные формы пусты, а тип контента установлен в application/json и буфер не пуст, мы парсим буфер и складываем полученные данные для доступа через post(). Все достаточно просто и быстро.

Homebrew + Hackintosh = Illegal Instruction: 4

Информация в данном посте устарела! Для новой версии Homebrew используйте способ из статьи Homebrew vs Hackintosh. Часть 2

Для повседневной работы мне Mac не требуется, но некоторые вещи просто необходимо тестировать на “живом” пациенте. Для этих целей я использую установленный на USB хард Hackintosh. Основное преимущество перед виртуалкой – скорость работы. Поскольку Mac это *nix система, хотелось иметь сопутствующие утилиты, не входящие в основную поставку Mac. Почитав специалистов, пришел к выводу, что лучше всего для установки оных подойдет Homebrew.

Установка менеджера прошла как по маслу, но вот с дальнейшим использованием возникли проблемы. В качестве первой программы я попытался установить Midnight Commander. brew install mc выполнился без ошибок, но при попытке запустить программу она все время падала с сообщением Illegal instruction: 4. Решив, что причина в битом рецепте, я попробовал установить PHP. Тут компиляция упала с ошибкой, касавшейся PHAR.

Поиск в гугле аналогичных проблем не дал ничего. Только в каком-то из issues на GitHub обнаружился ответ от разработчика Homebrew о том, что в данный момент отсутствует поддержка Hackintosh систем, поскольку скрипт не в состоянии определить тип используемого процессора, а от этого зависят опции компилятора. Поскольку опции компилятора – дело наживное, я полез смотреть исходники Homebrew. Решение обнаружилось в файле /usr/local/Library/ENV/4.3/cc. Находим строку

args << '-march=native' if tool =~ /clang/

и меняем её на

args << '-march=core2' if tool =~ /clang/

После этого абсолютно без проблем компилируются и выполняются любые Homebrew рецепты.

Toptal.com

Очень навязчивая оказалась биржа. Впервые всплыла месяца полтора назад на Хабре. Пост создал товарищ, который за 6 часов до этого получил туда доступ и сразу написал пост о прекрасной бирже TopTal, на которой нет индусов, все программисты квалифицированнее дальше некуда, разговаривают на идеальном английском, а сами заказчики, ну просто душки, жаждущие озолотить программистов, попутно предлагая интереснейшие задачи. В итоге, после 14-16 часов обсуждения, пост был удален “за рекламу”, а автор был отправлен в read-only.

Тем не менее, в процессе обсуждения всплыли интересные моменты:

  1. Бирже три года, но зарегистрировано на ней всего 500 разработчиков.
  2. Точное количество заказчиков осталось неизвестным, но для товарища со списком специализаций “C++/C#/PHP”, биржа выдала 57 предложений.
  3. Договор с разработчиком недоступен публично. Зато есть список “требований”. Они достаточно веселы. К примеру, ожидается, что разработчик должен “работать во временной зоне заказчика” и “в нерабочее время отвечать/реагировать в течение 3 часов”. Как верно заметил один из комментаторов, это больше похоже на добровольное рабство, чем на фриланс.
  4. Точная почасовая ставка так и осталась загадкой. Что-то вроде 20 долларов в час, но не точно. При этом рабочая неделя практически не бывает меньше 40 часов.

Сама же биржа отличается полным отсутствием отзывов, как в рунете, так и у западных фрилансеров. Все “отзывы”, что на RSDN, что на DOU.UA, отправлены фактически от одного и того же товарища, некоего Дмитрия Павлова. Единственный “живой” работник (бывший) обнаружился на хабре и описал работу на бирже примерно так

Знаком с ними больше года. Хочу поделиться впечатлениями. Первое, что понравилось — уровень тестирования, сразу дали понять, что нужны знания, а больше логика мышления.

Проект дали интересный, з/п достойная, политика компании и работы на уровне.
Через год ребята подросли, ожирели и в течении месяца-двух кормили «мы ищем клиента, как только, так сразу», потом основатель Тасо предложил поработать над toptal.com, в назначенное время был в сети, но не отвечал и далее в течении месяца морозился, как и его коллеги. Может обиделись. Такое поведение довольно странное, учитывая прошлое этих ребят. По итогу послал их.

От чего я вспомнил про сию биржу сейчас? Не далее как час назад ко мне в скайп постучался этот самый Дмитрий Павлов и начал усиленно убеждать меня в том, что мне надо бросить все и идти к ним. Причем убеждал теми же фразами, что и на других ресурсах. Самое удивительное, что даже после того, что я выразил свою незаинтересованность в их услугах, товарищ продолжил нести пургу про чуть ли не рай на земле для разработчика. Я думал, что так настойчиво пиарятся только “Свидетели Иеговы”, но, судя по всему, есть еще и фрилансерские биржи, пытающиеся привлечь к себе внимание аналогичными методами. Короче говоря, товарища пришлось добавить в черный список, а сюда написать статью, чтобы выдача поисковиков была разбавлена каким-никаким, а отзывом.

Я не утверждаю, что биржа является каким-то разводом, но методы по привлечению “свежего мяса” стоило бы поменять, так как, лично мне, они кажутся подозрительными.

Релизы: AspenPlayerFX-M для Android, инсталлятор AspenPlayerFX для Windows и Linux, AspenWeb

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

AspenPlayerFX-M

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

В ролике жутко выглядит процесс поиска источников. В реальности это несколько менее сумбурно, но факт остается фактом – “моргания” экрана имеют место быть, т.к. запускаются отдельные приложения.

На aspen.unrar.me доступны плагины для трех сайтов, но я готов рассмотреть варианты еще нескольких. Некоторые моменты, вроде биографий и описаний эпизодов, доступны всегда доступны, ввиду отсутствия информации в базе. Я над этим работаю.

Инсталлятор для AspenPlayerFX

Это было даже хуже, чем жара.

Под Windows было очень просто – в наличии несколько приложений, позволяющих создавать лаунчеры для .jar файлов + куча программ создающих инсталляторы на любой вкус. Даже первая версия десктопной программы распространялась в виде инсталлятора.

С Linux получилось сложнее, в основном из-за отсутствия вменяемых приложений, способных собрать кучку .jar в один пакет. После некоторых поисков нашлась программа jar2sh, которую, несмотря на некоторую примитивность, вполне можно использовать для моих целей. К счастью, в процессе борьбы с Mac версией, у меня в руках оказался еще более интересный вариант.

Mac… ОС для людей, мать её. Приключения начались с того, что не обнаружилось программ способных конвертировать .jar для седьмой версии JRE в маковское приложение. Да, есть Jar Bundler, кажется даже от самой эппл, но он для 6 версии, а мое приложение требует версию 7 с поддержкой JavaFX 2. В поисках решения я провел около 5 часов. В результате была найдена программа install4j, которая якобы умеет создавать лаунчеры для Маков использующих Oracle JRE, а не Apple JRE. Я даже обрадовался.

Как выяснилось – рано. Сперва инсталлятор жаловался на отсутствие нужной версии Java. Пришлось лезть в консоль, прописывать переменные окружения, менять какие-то пути, короче, заниматься привычными для пользователей *nix делами. Помогло. Инсталлятор запустился и даже установил собранный лаунчер. И вот тут пришел окончательный и бесповоротный ******! Вместо запуска, приложение вешало систему и помогала только перезагрузка. Чтение логов в общем-то ничего не дало, да к тому времени и желание общаться с этой хипсеросью куда-то пропало.

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

AspenWeb

Находится это дело по адресу aspen.unrar.me.

Основной задачей было организовать место выдачи ключей синхронизации. С первой версией я прокололся – никто не знал, где их брать и зачем вообще они нужны. Но, чтобы не держать что-то совсем примитивное, к “пункту выдачи” были приделаны страничка с клиентами и своего рода “книга отзывов и предложений”.

В общем как-то так.

AspenPlayerFX

Итак, спустя 6 месяцев я готов показать рабочую версию полностью переписанного приложения. Большая часть функций уже вполне работоспособна, но баги тоже присутствуют.

Что поменялось в программе?

Adobe AIR выброшен в топку вместе с ограничениями., теперь программа полностью работает на Java. Интерфейс написан на JavaFX, которая вполне себе может заменить Flex.
Из минусов этого перехода можно отметить только “растолстевший” дистрибутив – 60Мб. С другой стороны, если вы смотрите видео онлайн, не думаю, что подобный объем для вас проблема.

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

Гарантированно работают: VLC, GomPlayer, KMPlayer. Media Player Classic не работает, т.к. не поддерживает HTTP стримы. Жаль, конечно, но ничего не поделаешь. Для тех, кто не хочет разбираться с кастомными плейерами, вы дистрибутив включен SPlayer – минималистичный проигрыватель, киллер фичей которого является, скажем так, borderless-режим – отсутствуют кнопки управления окном, что позволяет сэкономить место, если вы привыкли “смотреть” (скорее слушать) фильмы в углу экрана, параллельно с работой.

Вконтакте больше не является единственным источником при поиске видео. В дефолтную поставку, кроме него, входят плагины для Filmix.net и Seasonvar.ru. Пилится плагин для Ex.ua. Качество поиска для VK пока может быть немного хуже чем в версии на Flex, но я просто не занимался оптимизацией этого плагина.

Что поменялось в сервисе?

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

Для тех же, кто зарегистрирован и отмечает фильмы и сериалы, добавлена система рекомендаций. Пока она сыровата и нуждается в тестировании, но надо же с чего-то начинать?

Что пока не реализовано?

Версии под Mac и Lin. Обе будут, но чуть позже, а пока только Win.

Фильтрация по разным параметрам (жанрам, странам и т.п.) пока не готова. На сервисе она полностью работоспособна, но в приложение пока не интегрирована.

Пока нет синхронизации в стиле “на чем остановились”, по причине использования внешнего проигрывателя. К счастью, SPlayer идет с открытым исходным кодом, так что, вероятнее всего, удастся вернуть эту возможность.

Мобильной версии пока нет, но она будет в ближайшее время, т.к. объем изменений там небольшой.

Где скачать?

Скачать версию 0.13.0530 можно тут. Пароль на установку phoenix. Работоспособность проверена на WinXP SP3 и Win7 SP1 x64. Возможно, потребуется вот этот пакет от MS.

Поддержка данной программы прекращена. Функционал данной программы частично воспроизведен в AspenStream

Заморозка проекта

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

Решение есть, но его невозможно реализовать в Adobe AIR, т.к. требуется прямой доступ к HTTP запросам, который AIR предоставить не может (заголовки должны быть строго оформлены, а у FP свой взгляд на эту проблему и желание добавить к ним всякую фигню). Пробовал AS3HTTPClient, но там багована работа по https в результате на выходе получаем бан. Финальным аккордом был бан моего собственного тестового аккаунта на трое суток, как попавшего в руки злоумышленников.

Сейчас смотрю на альтернативы (Java?). Если у кого-то есть предложения, с удовольствием выслушаю.

P.S. Три месяца разработки новой версии псу под хвост. Сказать, что я расстроен – не сказать ничего.

Баны VK.com

Последние дня четыре наблюдается какая-то странность с VK.com. Как минимум я и еще один пользователь получили баны за якобы рассылку спама. Баны не перманентные, но все равно неприятно. Есть мнение, что это как-то связано с использованием десктоп версии Aspen Player. Подробностей пока нет, но я отслеживаю ситуацию.

Также добавлю, что приложение никакого спама не рассылает и использует только методы video.search + пару групповых, когда идет доступ к группам. Неверующие могут скомпилировать его из исходников или пропустить трафик через Fiddler/Wireshark/etc.

Примеры разных scaleType для Android ImageView

Итак, исходный код ImageView в layout.xml

layout.xml
1
2
3
4
5
6
7
8
9
10
  <ImageView
      android:id="@+id/image"
      android:layout_width="65dip"
      android:layout_height="65dip"
      android:paddingRight="5dp"
      android:maxHeight="65dip"
      android:maxWidth="65dip"
      android:adjustViewBounds="true"
      android:contentDescription="@string/favorite_cover"
      android:scaleType="???"/>

Результаты

Android ImageView.ScaleType CENTER_INSIDE

Android ImageView.ScaleType FIT_END

Android ImageView.ScaleType FIT_START

Android ImageView.ScaleType FIT_CENTER

Android ImageView.ScaleType CENTER_CROP

Android ImageView.ScaleType FIT_XY

Android ImageView.ScaleType CENTER