Впечатления от «Схизматрицы»

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

Поэтому, просто скажу, что она мне не понравилась совершенно.

Не знаю, честно говоря, зачем я её дочитывал, может быть надеялся что ближе к середине она раскочегарится. Такие позывы были, но исчезли так же быстро как и появились. Единственное что осталось в осадке — ощущение скомканности.

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

Персонажи в Схизматрице совершенно не обладают характерами. Да, они что-то говорят, делают, но представить какие они, как бы они поступили в той или иной ситуации, что движет их поступками — не получается. Такое бывает, когда автор концентрируется целиком на истории, но здесь нет и её, а только некое подобие в виде разрозненных кусков мыслей, которые показались Стерлингу занимательными.

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

Почему Ministro нежизнеспособен

Напомню, что Ministro это программа, которая занимается управлением Qt библиотеками на Android. Скачивает нужные, обновляет, устанавливает. Есть ощущение, что эта затея кажется бредовой только мне, потому что периодически читаю множество хвалебных отзывов. Да и вообще факт её появления сам по себе забавное событие.

На мой взгляд решение сделать такую программу было сделано по одной причине, а именно конский размер Qt библиотек и как результат apk файла не очень обрадует будущего пользователя потенциальной программы. А с Ministro получается что вроде как прога маленькая и качается быстро, но:

1. Представьте себя на месте пользователя, который скачал приложение, а оно ему такое: «Дружок, установи ка ещё одно, а?». Такое обычные юзеры не очень понимают;
2. Даже если он установил, то Ministro желает скачать несколько мегабайт библиотек. Что, кто-то будет ждать что ли? Если только программа исключительная и аналогов нет. А сейчас это большаааая редкость;
3. Автоматическое обновление библиотек потенциально может привести к тому, что программа будет неработоспособна. Я не знаю как тщательно проверяется совместимость в Qt, но теоретическая возможность есть;
4. Программа всё равно загружает гигантских размеров библиотеки в память.

С точки зрения программиста Ministro это довольно красивое решение. Когда Necessitas избавится от over 100500 глюков, то возможно даже приживётся в корпоративном сегменте. Но по хорошему развитие должно идти по пути дробления Qt, уменьшения размеров библиотек и т.п.

Итог аутсорсинга в Египет

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

Неладное я заподозрил когда парень из Египта убеждал меня что надо заменить библиотеки во Flex SDK, иначе, ничего не получится. Видимо он не добрался до настроек проекта, ну да ладно.

Затем он по неизвестной мне причине отключил в проекте RSL и теперь на выходе это была здоровенная флеха под 2 мегабайта.

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

А теперь зацените реализацию паттерна «фабрика» по-египетски. В оригинале этой функции не было вообще. Класс инстанциировался, выполнял вызов к серверу и умирал.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class DataService extends BaseService {
    private static var _instance :Array;
       
    public static function getInstance(number:String,showBusyCursor :Boolean = false, resultHandler :Function = null, faultHandler :Function = null) :DataService {
        if (_instance == null) {
            _instance = new Array();
        }
        if(_instance[number]==null)
        {
            _instance[number]=new DataService(showBusyCursor,resultHandler,faultHandler);
        }
        else
        {
            _instance[number]._resultHandler=resultHandler;
            _instance[number]._faultHandler=faultHandler;
        }
        return _instance[number];
    }
}

Теперь, внимание, использование класса:

1
2
3
4
5
6
try{
    DataService.getInstance("ffq0r4",true, function(value:Boolean):void {
        checkBox_disvideo.selected = !value;
    }).getVideo();
}
catch(e:Error){Alert.show((e.message)+"53trfg");}

«ffq0r4» это просто случайный набор букв. Ручной хеш так сказать. Также, внимания заслуживает способ отлова ошибок в коде. Это где к сообщению об ошибке добавляется тот же хенд-мейд хеш, наверное, для удобства поиска.

А ещё main обёрнут в try/catch.

Ну и самое интересное нас поджидает в коде сервера. В PHP есть переменная $_SESSION, которая хранит данные текущей сессии. Там у меня хранились некоторые данные вроде id текущей комнаты. Выглядело это примерно так:

1
$_SESSION['currentRoomId'] = 12345;

А стало выглядеть вот так:

1
$_SESSION['currentRoomId'.$clientLogin] = 12345;

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

How to update System.Data.SQLite

When i’ve tried to use latest version of System.Data.SQLite i’ve ran into some problems and there was no working solution at the english and russian articles. So i’ve decided to create two language version of my solution.

System.Data.SQLite is most powerful library to work with sqlite from .NET. This is ADO.NET provider so we have support of the Entity Framework and other modern features. First versions of the library (due to 1.0.66.0) have been developed by this company. Next versions developed here. Latest version is 1.0.77.0.

At the latest version installer does not add SQLite data provider to the data providers list so we cannot use models auto generating for the Entity Framework. I don’t know why this decision has been made but my goal is to fix this issue. We cannot use 1.0.66.0 version because it is obsolete.

All actions performed on .NET Framework 4 and MSVS 2010.

1. Install 1.0.66.0 version;
2. Install 1.0.77.0 version. I recommend sqlite-netFx40-setup-bundle-x86-2010-1.0.77.0.exe. If installer would not work then use sqlite-netFx40-binary-bundle-Win32-2010-1.0.77.0.zip and install libraries to the GAC manually;
3. Create new app;
4. Add App.Config file to the project with such content:

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.77.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
</configuration>

5. Add System.Data.SQLite.Linq.dll to the References.

Обновление System.Data.SQLite

В .NET для работы с SQLite в качестве одного из решений используется библиотека System.Data.SQLite, которая выступает в роли ADO.NET адаптера и обеспечивает поддержку всех новомодных штук (Entity Framework, например). Первоначально разрабатывалась она вот этой вот фирмой и выросла до версии 1.0.66.0. Затем, разработка перетекла вот сюда и последняя версия на данный момент 1.0.77.0.

Однако, в последней версии установщик не добавляет SQLite Data Provider в общий список, что в частности делает невозможным автоматическую генерацию модели для Entity Framework. По каким причинам данную функциональность решено убрать я не знаю, но это неудобство нам надо как-то исправить. Остаться на версии 1.0.66.0 тоже возможности нет, т.к. она несколько устарела.

Конечно, можно попробовать поколдовать с SQLite.Designer и installer из исходников, но я предпочёл решение топорней.

Все манипуляции проводятся на .NET Framework 4.0 и MSVS 2010.

1. Установить версию 1.0.66.0;
2. Установить версию 1.0.77.0. Я советую использовать sqlite-netFx40-setup-bundle-x86-2010-1.0.77.0.exe Если установщик не работает, то скачайте sqlite-netFx40-binary-bundle-Win32-2010-1.0.77.0.zip и установите библиотеки в GAC вручную;
3. Создайте новое приложение;
4. Добавьте в проект файл App.Config следующего содержания:

1
2
3
4
5
6
7
8
9
<?xml version="1.0"?>
<configuration>
  <system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite" />
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description=".Net Framework Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.77.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </DbProviderFactories>
  </system.data>
</configuration>

5. Добавьте в References проекта System.Data.SQLite.Linq.dll.

Necessitas

Порт Qt на Android раньше назывался Lighthouse, а теперь Necessitas. Чёрт подери, кто придумывал это название, я его не могу не то что набрать, а даже запомнить, особенно в 4 часа утра. Копипастю из статьи с другой вкладки, ну и автодополнение браузера помогает.

Как театр начинается с вешалки, так и программа начинается с установщика. Здесь он сделан типа как в большом брате в виде online installer. Всё бы ничего, но с первой страницы я столкнулся с некоторого рода интересным отказом, а именно инсталлятор просто вылетал.

Эмпирическим путём было выяснено, что делает он это если при вводе пути для установки в текстовом поле нажать Enter, а для корректного продолжения нужно тыкать мышкой на Next.

Установка прошла, впрочем, нормально.

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

После попытки компиляции получаем, конечно же, обломс. Неужели, вы думаете, что сие произведение просто так даст вам что нибудь запустить. Оказалось, что JAVA_HOME была прописана неверно и должна указывать на JDK, а не JRE. О чём, конечно же, меня сигнализировало информативное сообщение об ошибке, типа «ant.exe завершился с кодом -1».

Потом, наконец то, всё скомпилировалось и запустилось.

Теперь, наконец, про недостатки самого фреймфорка. Для начала вкратце расскажу как он работает.

Чтобы программа на фреймворке-с-глупым-названием заработала мы должны сначала установить другую программу, Ministro. Qt-шные библиотеки имеют конский размер: QtCore — 20 Мб, QtGui — 90 Мб и так далее, поэтому деплоить напрямую с приложением довольно накладно. Ministro занимается тем, что скачивает из интернета эти библиотеки по мере надобности, обновляет их и т.п.

Вообще на мой взгляд, это глупая затея. Ну не будет обычный пользователь, после того как установил прогу ставить ещё что-то сверху. Не работают тут PC-шные подходы.

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

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

А ещё если приложение закрыть и открыть снова, то оно просто зависает.

Ещё вот тут можно почитать.

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

Imran Nazar: Эмуляция GameBoy на JavaScript: Ввод

Перевод шестой статьи про эмуляцию GameBoy на JavaScript. Оригинал здесь. Далее авторский текст.

Это шестая часть серии статей об эмуляции в JavaScript. Десять частей уже доступно, позже будут ещё.

Читать далее »

Imran Nazar: Эмуляция GameBoy на JavaScript: Интеграция

Перевод пятой статьи про эмуляцию GameBoy на JavaScript. Оригинал здесь. Далее авторский текст.

Это пятая часть серии статей об эмуляции в JavaScript. Десять частей уже доступно, позже будут ещё.

Читать далее »

Реализация освещения на ActionScript 3

Итак, давно обещанный пост про реализацию освещения в My Little Princess. Сперва я рассмотрю пробные варианты, ну и в конце будет тот, который вошёл в релиз. Вполне возможно, что я где-то повернул в неправильную сторону, так что обсуждение приветствуется. Да, использовался движок Flixel, но описываемые техники не содержат жёсткой привязки к нему.
Читать далее »

Imran Nazar: Эмуляция GameBoy на JavaScript: Графика

Перевод четвёртой статьи про эмуляцию GameBoy на JavaScript. Оригинал здесь. Далее авторский текст.

Это четвёртая часть серии статей об эмуляции в JavaScript. Десять частей уже доступно, позже будут ещё.

Читать далее »