Android: Integer vs int

Паскальное детство даёт о себе знать. Так уж получилось, что Паскаль у меня был первым осмысленным языком программирования. И единственным на целый год. Потому что через год, перейдя на C, я стал смотреть на Паскаль как на нечто несерьёзное. И сейчас считаю Паскаль и его диалекты навроде Delphi, который с некоторых пор официально называется именно “язык Delphi”, а не “Object Pascal”, детскими игрушками не для серьёзного применения. И вопли о том, что дескать Скайп или еще какая-нибудь широко распространённая приблуда на нём написаны меня не волнуют.

Так вот, написав предыдущий пост я задумался, а почему я там пишу Integer, а не int, который я тоже видел в листингах программ для Андроида. Полез в документацию – оказалось, что Integer – это класс-оболочка для int. Это означает, что если нужна переменная целочисленного типа, принимающая значения в известных пределах, то можно использовать и int, вот только у Integer есть неоспоримое преимущество в наличии нескольких весьма полезных публичных методов – те же parseInt или toString, которые я чувствую придётся применять довольно часто.

Android: SharedPreferences

Полдня потратил, чтобы врубиться в класс SharedPreferences для Андроида.
Вот что пишут везде.

Во-первых в Activity нужна public static final константа, характеризующая набор настроек (которых может быть много разных):
public static final String MY_PREFERENCES = "MyPrefs";

Для сохранения общих настроек приложения нужен вот такой код:
SharedPreferences settings = getSharedPreferences(MY_PREFERENCES,0);
SharedPreferences.Editor prefEditor = settings.edit();
prefEditor.putString("FirstString", "abcdefg");
prefEditor.putInt("SecondString", 55);
prefEditor.commit();

В данном коде производится сохранение в общих настройках двух переменных – типа String и типа Integer. Вообще, класс SharedPreferences – это офигенно удобно, во всяком случае с первого взгляда. Настройки сохраняются, программа закрывается, открывается, настройки загружаются. Не надо думать куда же они сохраняются – Android берет это на себя.

Для загрузки их же при старте приложения (или конкретного Activity, чьи настройки нужны) в методе onCreate прописывать надо:
SharedPreferences settings = getSharedPreferences(MY_PREFERENCES,0);
String str1;
Integer i2;

if(settings.contains("FirstString")){
str1 = settings.getString("FirstString", "");
}else
{
str1 = "";
}

if(settings.contains("SecondString")){
i2 = settings.getInt("SecondString", 0);
}
else
{
i2 = 0;
}

Вроде бы всё работает. Вот только сохранять в настройки фиксированные значения неинтересно и не нужно никогда. А поэтому нужно использовать преобразования типов. Вот такие:

Чтобы преобразовать из Integer в String:

Integer a;
String str;
str = Integer.toString(a)

Преобразовать из String в Integer:

Integer a;
String str;
a = Integer.parseInt(str);

Интересная особенность контролов в Java: чтобы к примеру взять строку из контрола EditText и преобразовать её в Integer нужно сделать следующее:

Integer i;
EditText text;
text = (EditText) findViewById(R.id.editText1);
i = Integer.parseInt(text.getText().toString());

Забавно здесь то, что метод getText() у EditText’а возвращает нифига не String, а объект класса android.text.Editable – чтобы получить из него String и нужен вызов метода toString().

App Inventor: впечатления

На секунду смалодушничал и попробовал написать программу под Андроид на Google App Inventor. Ну, “написать” это громко сказано, потому что эта среда разработки просто квинтэссенция визуального проектирования. В прямом смысле – код не пишется, он рисуется визуальными блоками. Непривычно и забавно. Но ощущение гадливое, как будто делаешь что-то неприличное. Для вау-эффекта для простейших приложений сгодится, но писать там что-то достаточно серьёзное практически нереально – внимание рассеивается на эти визуальности. Из глюков нашёл только невозможность копи-паста в редакторе блоков – в моём случае на системе с неустановленной раскладкой я не мог создать текстовую переменную на китайском. Из плюсов – офигенная скорость работы плюс возможность подключить телефон и в прямом эфире наблюдать и пробовать на нём всё, что рисуется на компе.

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

Android SDK

Вот честно, я думал, что подобные проблемы остались где-то в далёком прошлом. Что я могу ставить программу в любую директорию и не думать о том есть ли пробелы в пути. Но нет. Поставил свежий Eclipse, поставил Android SDK – всё поставил в рекомендуемые папки, не стал ничего выдумывать. Сижу, разбираюсь с программированием под Андроид, пытаюсь запустить в эмуляторе откомпилированную программу и что же я вижу в консоли?

invalid command-line parameter: Files.

Думаю, что ж за фигня-то? Открываю Android SDK and AVD Manager и что же я вижу там в разделе Installed Packages? Правильно.

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

Забавности в повседневном САПР

В P-CAD PCB, где мы разводим платы, в меню File есть две подменюшки. Одна – Close, другая – Clear. PCB – это MDI-приложение, но с одной особенностью – всегда должен быть открыт документ, пусть даже и Untitled :)
Отличие File->Close от File->Clear вот так сразу и не видны. Когда в приложении открыт только один файл они совершенно равнозначны. Понятие MDI-приложения подразумевает возможность открытия нескольких файлов в одном окне приложения. И, если честно, за фанатичное следование парадигме MDI следовало бы отрубать руки и делать лоботомию программисту. Потому что, например, Excel (из 2003-го Офиса) определяет наличие себя в памяти при запуске (уж не знаю как – атом ставит или просто перебирает по именам) и открывает файл внутри уже запущенной копии. При этом на панели задач всё-равно _не_ одна кнопка, но развернуть один лист на полный экран на одном мониторе, а другой – на другом при этом становится невозможно. Но это я отвлёкся.
Если в P-CAD PCB открыто несколько дизайнов плат, то File->Close закрывает текущий, а File->Clear еще и открывает вместо него новый дизайн. Причём, сохраняет при этом расположение и размеры окна. Не знаю где это может пригодиться, но почему бы и нет. Лично я предпочитаю открывать дизайны плат каждый в своей копии PCB, благо на это действие никаких хуков не стоит.

DDoS для контроллера

Забавный эффект получили. Есть устройство, которое управляется по шине магистрального канала обмена (MIL-STD-1553B). Протокол обмена в упрощённом виде выглядит так:

(1) Посылка данных -> (2) Ожидание векторного слова, сигнализирующего о готовности квитанции о выполнении в подадресе -> (3) Запрос квитанции -> (4) Посылка запроса о телеметрии -> (5) Ожидание векторного слова, сигнализирующего о готовности телеметрии в подадресе -> (6) Забор телеметрии из подадреса.

Так получилось, что выставлять флаг занятости на время обработки данных нам нельзя, следовательно контроллер принимает все без исключения посылки от МКО. Контроллер CISC (IP-ядро 8051 в ПЛИСе), работает на пониженных частотах – около 5 МГц. Скорость передачи по шине МКО – 1Мбит/с. В итоге получается, что вместо обработки данных пунктов (1) и (4) все процессорное время тратится на обработку запросов (2) и (5). Самый настоящий DDoS 😀

DSP&VSTi?..

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

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

Нотный тренер и генератор

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

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

Вчера вечером за пару часов на PHP изобразил генератор картинки с нотами и веб-приложение-игрушку, использующее её. Адрес: http://piano.shengsu.org.

А также генератор нотной последовательности. Адрес: http://piano.shengsu.org/gen.php

Это всё еще планирую допилить, чтобы было чуть поинтересней и покрасивше. Но старт уже дан, я разобрался в некоторых конструкциях PHP и понял в общих чертах общую парадигму языка.