вторник, 13 декабря 2011 г.

Автоматическая выгрузка SMS в Google Docs


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

Поиски в Android Market вывели на две программы.

My Archives


и SMS to Google Docs Archiver

Обе программы имеют минималистичный интерфейс и предельно схожий функционал.

SMS to Google Docs Archiver мне не понравился разделением смс на входящие и исходящие (хотя для кого-то это возможно и плюс), а так же запросом пароля от почты.

MyArchives же для доступа к документам и авторизации использует Android AccountManager, а в качестве приятного бонуса, по тому же принципу что смс, сохраняет ещё и историю звонков.
Имеется недостаток, MMS не выгружаются, но при этом удаляются. То есть мы их теряем. Но у меня их мало и все бесполезные, потому не жалко.
Если вам ММС необходимы, то либо делайте предварительный бэкап другой программой, либо удаляйте смс вручную.




пятница, 25 ноября 2011 г.

Как в Git игнорировать изменение прав у файлов

Работая в среде Cygwin или MSysGit, часто бывает так что права файлов изменяются, либо внешней средой, либо внутренними процессами.
У меня наиболее часто меняется признак исполнимости. И, к сожалению, пока отсутствует время чтобы разобраться в причинах.

Загадочным, для меня, образом некоторым файлам добавляется +x, некоторым -x. И Git уже начинает считает эти файлы изменёнными, которые обязательно надо закоммитить.
Т.к. происходит такое довольно часто, то это вызывает раздражение и пустую трату времени на починку с помощью chmod и/или git reset --hard.

Так, вот, если в вашем проекте не используются системные права, то можно заставить git игнорировать изменение прав у файлов.

Отключением/включением проверки управляет ключ filemode из секции core.
Его значение необходимо установить в false.

Либо прямым редактированием .gitconfig:
[core]
        filemode = false

Либо командой:
$ git config core.filemode false

Приятной разработки!

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

Детерминанты - Тайна Cognos Framework Manager раскрыта


Перевод-пересказ статьи за авторством RALPH BAKER.

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

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


Ситуация

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


Западня

Неприятности всплывают вместе с желанием впихнуть невпихуемое AKA присоединиться к размерности времени не по самому нижнему уровню. Рассмотрим таблицу фактов с месячными прогнозами (monthly forecast fact table); с детализацией "одна строка - один месяц". Связь через month_id будет каждый раз, в зависимости от месяца, возвращать от 28 до 31 записи, и таким образом, портить расчёты и настроение. Детерминанты решают эту проблему.


Запрос SQL

Часто, при моделировании, полезно думать о том, какой код SQL хотелось бы получить на выходе. Без детерминантов день рожденья на праздник непохож, и неправильный SQL выглядит примерно так:
SELECT
F.FORCAST_VALUE,
D.MONTH_ID,
D.MONTH_NAME
FROM SALES_FORECAST F INNER JOIN DATE_DIM D ON
F.MONTH_ID = D.MONTH_ID

Этот код, на каждую запись из прогноза, получит примерно в 30 раз больше записей, чем нужно. Математические функции, вроде Sum и Count, вернут неверный результат. Правильный же запрос, должен сначала вытащить все уникальные месяцы, каждого по одной штуке, и ТОЛЬКО ПОСЛЕ ЭТОГО присоединить факт:
SELECT
F.FORCAST_VALUE,
D1.MONTH_ID,
D1.MONTH_NAME
FROM SALES_FORECAST F INNER JOIN
( SELECT DISTINCT
D.MONTH_ID,
D.MONTH_NAME
FROM DATE_DIM D ) AS D1
ON F.MONTH_ID = D1.MONTH_ID

Как показано выше, трюк заключается в понимании какие колонки в размерности относятся к month_id, и потому уникальны в пределах ключа. Как раз в этом и заключается работа детерминантов.


Разоблачение тайны Framework Manager

Следуя лучшим практикам Cognos, детерминанты необходимо указывать в слое модели, где происходит связывание таблиц.
Ниже приведена размерность времени с 4 уровнями: Year, Quarter, Month и day.





Это означает, что, в зависимости от гранулированности таблиц фактов, представленных в модели, в тематическом запросе можно определить до 4-х детерминантов. Первые три уровня: Year, Quarter, Month должны быть группирующими, т.к. не описывают уникальную строку в таблице; и установка флага "group-by" объясняет Cognos'у, что данные по этому уровню необходимо "схлопнуть" (оставить только одно значение). Другими словами, здесь описываются правила для формирования секции "group by" в запросе SQL (такого как Год или Месяц). Уровень Day - это конечный (Leaf) уровень детализации. С целью однозначного определения любых строк внутри размерности, необходимо установить флаг “Uniquely Identified”. Детерминантов "group by" может быть множество, но детерминант по уникальному ключу, как правило, только один единственный. Детерминант "uniquely identified" по определению содержит все неключевые столбцы как атрибуты, и автоматически создаётся во время импорта таблицы, если получается его обнаружить (т.е. в таблице БД имеется первичный ключ или индексы).
Секция Key содержит колонки, которые однозначно определяют уровень. В идеале, это одна колонка, но иногда требуется больше; например, если Год и Месяц (1-12) находятся в отдельных колонках. Итак, ключ - это любые колонки, которые нужны чтобы однозначно обозначить уровень.
Исходя из размышлений выше, настройки будут выглядеть следующим образом:

Секция Attributes описывает все остальные колонки, которые относятся к уровню. Например на уровне month_id, такими являются: название месяца, дата начала месяца, количество дней в месяце (month name, month starting date, number of days). И, очевидно, что здесь отсутствуют элементы с более низкого уровня, такие как Дата или День недели (date, day-of-week).
Вообще говоря, порядок расположения детерминантов не соотносится с уровнями измерения. Однако, для понимания как строится запрос SQL, очень важно знать, что поиск колонок ведётся сверху-вниз. Если в отчёте используется Год, Квартал и Месяц, то группировка будет сделана по колонкам Year-key, Quarter-key и Month-key. Но если для отчёта нужны только Год и Месяц (без Квартала), то в секции "group by" ключ Quarter-key будет пропущен.


Сколько уровней требуется?

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


Заключение

Следуя этим простым правилам, Cognos создаст следующий запрос SQL. Выделенный кусок кода создан на основе настроек детерминантов. Обратите внимание, каким образом "схлапывается" Month_ID; для обеспечения уникальности значения уровня используется функция min. Cognos-параноик и недостотачно доверяет чистоте входящих данных, чтобы делать просто SELECT DISTINCT. Второе выражение 'group by' это обычное агрегирование, необходимое для отчёта. Так как связь теперь происходит корректно (каждый факт соединён только с одной записью размерности), в отчёт попадают правильные цифры.




Небольшой FAQ по поручительству и ипотеке Сбербанка России

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

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

1. Как статус поручительства влияет на жизнь?
2. Что если поручителей больше одного?
3. Что если поручитель сам захочет взять кредит?
4. Когда снимается статус поручительства?
5. Когда требуется поручительство?
6. Могут ли пенсионеры быть поручителями?
7. Могут ли в качестве поручителя выступать индивидуальные предприниматели (ИП)?
8. Что если застройщик предлагает в качестве бонуса нежилое помещение?
9. Имеется одобрение на ипотеку приобретение квартиры на вторичном рынке недвижимости. Возможно ли, в таком случае, приобрести квартиру в новостройке?

----------------------------------------------------------------------------

1. Как статус поручительства влияет на жизнь?

Ответ: Пока заёмщик платит, то никак. Но если заёмщик платить перестаёт, то поручитель отвечает перед банком в полном объёме. Так же есть ограничения, если поручитель сам захочет взять кредит (см. ниже).

---------------------

2. Что если поручителей больше одного?

Ответ: Оба поручителя "делят" обязательства по долгу на пополам.
Смотрите пример в пункте 3.

---------------------

3. Что если поручитель сам захочет взять кредит?

Ответ: Максимальная сумма кредита, которая рассчитывается из дохода, будет меньше, т.к. из дохода поручителя отнимается сумма его обязательств по поручительству, как если бы он сам платил эту сумму.
К примеру, заёмщик платит 20000 в месяц, доход поручителя 50000р.
Догда максимальная сумма будет рассчитываться из дохода 30 т.р (50 - 20).
Если поручителей два, то рассматриваемый поручитель предъявяляет доход как 40т.р (50 - 20/2).
Точные рассчёты до копееек посчитают в отделении банка, но идея такая.

---------------------

4. Когда снимается статус поручительства?

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

---------------------

5. Когда требуется поручительство?

Ответ: Всё зависит от того как налажены у банка связи с застройщиком, насколько банк ему доверяет.
В общем случае, действует такое правило, если дом готов меньше чем на 70%, то поручители требуются, если больше, то нет.
Есть небольшой, но каверзный нюанс: если одобрение было получено в одном отделении, а стройка аккредитована в другом, то есть риск, что понадобиться подавать документы заново в то отделение, которое аккредитовало стройку.
Например, я подавал документы в Царицынском отделении и мне было отказано в приобретении квартир в новостройках Подольска, т.к. все стройки были аккредитованы только Подольским отделением банка и с Царицынским они "не дружат".
Уж не знаю почему, но, опять же, это чувствовалось по интонации, когда я в одном отделении задавал вопросы про другое.
Вообще, за годы общения с банком, у меня сложилось впечатление что это не единая монолитная структура, а множество мелких феодальных анклавов, работающих по франшизе, примерно как Макдональдс.

---------------------

6. Могут ли пенсионеры быть поручителями?

Ответ: могут, если пенсия уже оформлена и возраст поручителя до 75 лет (для мужчин).
Для женщин как-то не подумал спросить, поэтому, к сожалению, не могу сказать.
Как только уточню этот вопрос, то обновлю здесь.

---------------------

7. Могут ли в качестве поручителя выступать индивидуальные предприниматели (ИП)?

Ответ: могут, если занимаются своим бизнесом больше года и подавали в этом году налоговую декларацию. Но лучше, если деклараций подавались регулярно без пропусков на протяжении всей деятельности.

---------------------

8. Что если застройщик предлагает в качестве бонуса нежилое помещение?

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


---------------------


9. Имеется одобрение на ипотеку приобретение квартиры на вторичном рынке недвижимости. Возможно ли, в таком случае, приобрести квартиру в новостройке? И, наоборот.

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

суббота, 30 июля 2011 г.

Регистрация в Apple developer Program с помощью виртуальной карты

При регистрации в Apple developer Program на каком-то шаге нам сообщают: "извините, Вы не из тех стран, жителям которых мы не желаем геморроя и потому разрешаем платить карточкой через онлайн".
Отсюда, возникают пара проблем.

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

Вторая проблема, в этой форме в открытом виде необходимо передать реквизиты карточки, включая номер, дату истечения и код CVV.
Заходи кто хочешь! Бери сколько унесёшь! Я сегодня добрый, э-э-х гуляй, душа праздника просит...
Итак, что я сделал.
С некоторых пор, Яндекс, совместно с Интеркоммерц банком предлагают услугу "Виртуальная карта MasterCard Prepaid".
Через Евросеть, т.к. у них без процентов, пополняем Яндекс кошелёк на 99 долларов + небольшой запас, т.к. существует комиссия за конверсию из рублей в баксы и плюс 1.99 от номинала.

Идём на страницу покупки карты. Если вы залогинены, то увидите следующую картинку.


Соглашаемся с условиями и нажимаем "Купить карту".
Опция "уведомление по смс", в данном случае, нужна только собственного для успокоения, чтобы знать когда с карты снимут деньги. Никаких данных для подтверждения транзакции не приходило.

Теперь распечатанную форму заполняем реквизитами вновь полученной виртуальной карты.
Т.к. карта неименная, то в имени и фамилии может быть написано, хоть Питэр с Марса.
Но с Apple лучше так не шутить, пишите своё настоящее имя по-латински.
Оптимальный вариант - переписать из загран-паспорта. В любом случае, имя и фамилия должны быть похожи (но не обязательно совпадать до буквы) на те, что вы указываете в качестве разработчика.
Моя фамилия, например, может быть написана в пяти вариациях, и официальный вариант из загран-паспорта не совпадает с тем, что я привык писать в различных формах.
В этот раз я вписал вариант фамилии, которую нашёл в закоулках настроек Яндекс.Денег (кстати, я полагаю, что компании стоило бы предлагать его по умолчанию в момент заказа карты).

Закончили с реквизитами карты?

Не забудьте поставить свою роспись.

У меня сканера не оказалось, поэтому сфотографировал заполненную форму на фотоаппарат.
Сконвертировал в PDF.

И отправил через сервис бесплатных факсов GotFreeFax.com.

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

На этот раз я отправил два факса через GotFreeFax.com и два через FaxZero.com.
Это были выходные.
Но факсовая спам-атака сработала. Через пару дней в мобиле появилась смс, что карту обчистили на 99 баксов.
А ещё через 5 часов пришло письмо: "Дорогой ты наш, сэр (не такой дорогой как разработчики под большой Мак, платящие 200 баксов за год, но уж какой есть), спасибо и велком в наш чудный дивный мир".

вторник, 7 июня 2011 г.

Как в Git вывести файл из под версионного контроля

Что делать, если вы когда-то взяли файл под версионный контроль, а теперь поняли что он не нужен?
И что делать, если файл, который находится под контролем вы меняете локально, и эти изменения нельзя коммитить?
В обоих случаях .gitignore не работает. А действовать надо так:
$ git rm --cached <file>
Данная команда выведет файл из под версионного контроля при следующем коммите, но оставит его живым в рабочем каталоге.

понедельник, 25 апреля 2011 г.

Redmine готовый к развёртыванию на серверах приложений

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

Итак, качаем файл (за основу был взят Redmine 1.1.2-devel).

Внутри находиться схема с таблицами, которую необходимо воссоздать в базе.
redmine-VERSION.war\WEB-INF\config\redmine_default_data.sql
Реквизиты для первого входа стандартные для Redmine: admin/admin.
Сейчас схема только на русском, но планируется и английская версия.

Теперь, необходимо указать реквизиты для соединения.
redmine-VERSION.war\WEB-INF\config\database.yml
# MySQL (default setup).
production:
  adapter: jdbc
  url: jdbc:mysql://YOURSERVER.com:3306/DBNAME
  driver: com.mysql.jdbc.Driver
  username: YOURNAME
  password: YOURPASSWORD
  encoding: utf8
Последний по списку, но не по значимости, шаг. Настройка безопасности.
Необходимо сгенерировать уникальный ключ.
redmine-VERSION.war\WEB-INF\config\initializers\session_store.rb
# This file was generated by 'rake config/initializers/session_store.rb',
# and should not be made visible to public.
# If you have a load-balancing Redmine cluster, you will need to use the
# same version of this file on each machine. And be sure to restart your
# server when you modify this file.
 
# Your secret key for verifying cookie session data integrity. If you
# change this key, all old sessions will become invalid! Make sure the
# secret is at least 30 characters and all random, no regular words or
# you'll be exposed to dictionary attacks.
ActionController::Base.session = {
  :key => '_redmine_session',
  #
  # Uncomment and edit the :session_path below if are hosting your Redmine
  # at a suburi and don't want the top level path to access the cookies
  #
  # See: http://www.redmine.org/issues/3968
  #
  # :session_path => '/url_path_to/your/redmine/',
  :secret => '30e7cb1c1f4342cf1a3c42023a4d8ebf363792f63e711e3682b0a69ec42defd8d936c3a8aa556b40'
}

Можно использовать онлайновый HEX-генератор (только уберите пробелы и переносы).

И на этом всё, вы готовы к развёртыванию в сервере приложений.
Я проверял этот файл в Tomcat 6.0.26 на локальной машине, и в сервисе Cloudbees.com.
Везде работает великолепно.
Выше были перечислены только минимально-необходимые для успешного старта шаги. Теперь, когда и у вас развёртывание завершено, приступайте настройке остальных параметров, если есть такая необходимость:
redmine-VERSION.war\WEB-INF\config
Надеюсь кому-то это окажется полезным и сэкономит время.

Redmine 1.1.2 devel deploy ready WAR file

If you want to deploy Redmine to servlet container such as Tomcat, then you have two ways:
- download redmine source codes, read a lot of instructions, and spent about day or two to resolve all conflicts;
- or you just download my war-file, edit few settings, and you're done in 15 minutes.

Here's the file.

In the war-file you should find initial table scheme and run it on your database.
redmine-VERSION.war\WEB-INF\config\redmine_default_data.sql

Sorry guys, in this file it is on Russian, but I can make in English one, if you request me.

After that you should correct
redmine-VERSION.war\WEB-INF\config\database.yml

And the last step but not least is security. You should generate your own unique secret key.
redmine-VERSION.war\WEB-INF\config\initializers\session_store.rb

# This file was generated by 'rake config/initializers/session_store.rb',
# and should not be made visible to public.
# If you have a load-balancing Redmine cluster, you will need to use the
# same version of this file on each machine. And be sure to restart your
# server when you modify this file.

# Your secret key for verifying cookie session data integrity. If you
# change this key, all old sessions will become invalid! Make sure the
# secret is at least 30 characters and all random, no regular words or
# you'll be exposed to dictionary attacks.
ActionController::Base.session = {
:key => '_redmine_session',
#
# Uncomment and edit the :session_path below if are hosting your Redmine
# at a suburi and don't want the top level path to access the cookies
#
# See: http://www.redmine.org/issues/3968
#
# :session_path => '/url_path_to/your/redmine/',
:secret => '116315a0b6f594fa95bf163fce376b36de6bc53936327c4577f3f64f8e4c15af60eda37e4ff9562d'
}

You may use this online hex generator, for example (just remove the spaces).

And that's all, you're ready to deploy.
I've tested this file on the local machine and on Cloudbees.com service.
It works just fine on both.

воскресенье, 10 апреля 2011 г.

Удалённая проверка источника питания на MacBook

Бывают разные случаи, когда полезно проверить подключен ли ноутбук к электросети.
Первый вариант, через VNC или Apple Remote Desktop загрузиться и посмотреть состояние в графическом режиме.
Но есть способ автоматизировать процесс.
В комплекте с MacOS идёт консольная утилита system_profiler.
Если её запустить просто так, то будет выдана куча системной информации.
Чтобы выделить только нужное, существует набор фильтров.
С полным списком можно ознакомиться командой:
$ system_profiler -listDataTypes
Available Datatypes:
SPHardwareDataType
SPNetworkDataType
SPSoftwareDataType
SPParallelATADataType
SPAudioDataType
SPBluetoothDataType
SPCardReaderDataType
SPDiagnosticsDataType
SPDiscBurningDataType
SPEthernetDataType
SPFibreChannelDataType
SPFireWireDataType
SPDisplaysDataType
SPHardwareRAIDDataType
SPMemoryDataType
SPPCIDataType
SPParallelSCSIDataType
SPPowerDataType
SPPrintersDataType
SPSASDataType
SPSerialATADataType
SPUSBDataType
SPAirPortDataType
SPFirewallDataType
SPNetworkLocationDataType
SPModemDataType
SPNetworkVolumeDataType
SPWWANDataType
SPApplicationsDataType
SPDeveloperToolsDataType
SPExtensionsDataType
SPFontsDataType
SPFrameworksDataType
SPLogsDataType
SPManagedClientDataType
SPPrefPaneDataType
SPStartupItemDataType
SPSyncServicesDataType
SPUniversalAccessDataType
Нас интересует только подсистема питания SPPowerDataType.
Выполняем:
$ system_profiler SPPowerDataType
Power:

    Battery Information:

      Model Information:
          Serial Number: 9G951015R4M1A
          Manufacturer: DP
          Device name: bq20z951
          Pack Lot Code: 0000
          PCB Lot Code: 0000
          Firmware Version: 0042
          Hardware Revision: 0001
          Cell Revision: 0122
      Charge Information:
          Charge remaining (mAh): 8346
          Fully charged: No
          Charging: No
          Full charge capacity (mAh): 11999
      Health Information:
          Cycle count: 99
          Condition: Normal
      Battery Installed: Yes
      Amperage (mA): -3316
      Voltage (mV): 7665

    System Power Settings:

      AC Power:
          System Sleep Timer (Minutes): 60
          Disk Sleep Timer (Minutes): 0
          Display Sleep Timer (Minutes): 60
          Automatic Restart On Power Loss: No
          Wake On AC Change: No
          Wake On Clamshell Open: Yes
          Wake On LAN: Yes
          Display Sleep Uses Dim: Yes
          GPUSwitch: 2
      Battery Power:
          System Sleep Timer (Minutes): 10
          Disk Sleep Timer (Minutes): 0
          Display Sleep Timer (Minutes): 7
          Wake On AC Change: No
          Wake On Clamshell Open: Yes
          Current Power Source: Yes
          Display Sleep Uses Dim: Yes
          GPUSwitch: 2
          Reduce Brightness: Yes

    Hardware Configuration:

      UPS Installed: No

    AC Charger Information:

      Connected: No
      Charging: No

Предпоследняя строчка
Connected: Yes
показывает, что подключен внешний источник питания.
И, наоборот,
Connected: No
говорит, что в настоящее время ноутбук работает от батареи.
А показатель
Charge remaining (mAh): 5893
уведомляет об оставшемся заряде. Зная
Full charge capacity (mAh): 12008
можно посчитать процент заряда.
Все необходимые нам индикаторы не составляет особого труда вычленить с помощью grep/awk, или, указав ключ -xml, распарсить результат с помощью Scala/Groovy.
Можно использовать Automator, в нём имеется встроенный компонент "Профиль системы" с аналогичным функционалом.
Теперь, с помощью cron, того же Automator и т.п. можно настроить, чтобы при падении заряда ниже какого-то уровня, отправлялось смс, почта и другие уведомления для принятия мер: воткнуть вилку в розетку или усыпить машину, если невозможно первое.

суббота, 9 апреля 2011 г.

Eclipse, Android: ошибка "Conversion to Dalvik format failed with error 2"

Оптимизировал я какое-то время назад работу Eclipse. Начитался разных форумов. Написал кучу разных опций в eclipse.ini. Полкучи потом выкинул. Файл принял вид:

-startup
../../../plugins/org.eclipse.equinox.launcher_1.1.1.R36x_v20101122_1400.jar
--launcher.library
../../../plugins/org.eclipse.equinox.launcher.cocoa.macosx_1.1.2.R36x_v20101019_1345
-server
-nosplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms1024m
-Xmx1024m
-XX:PermSize
512m
-XX:MaxPermSize
512m
-XX:+UseParallelGC
-XX:+AggressiveOpts

Всё было хорошо. Всё работало быстро и я забыл про это подкручивание.

Потом какое-то время работал в Intellij Idea (рефакторинг у них непревзойдённый, конечно).

А тут мне понадобился удобный эклипсовский плагин от Questoid для доступа к SQLite-базе прямо из DDMS.
Запускаю среду, а оно мне выдаёт на любой проект.
Conversion to Dalvik format failed with error 2

Раз в Intellij Idea собирается нормально, то проблема явно локально-эклипсовая.
Два часа блуждал по сети, перепробовал кучу способов, пока не наткнулся на
http://code.google.com/p/android/issues/detail?id=9883

Убрал из конфига
-XX:+AggressiveOpts

Работает, зараза!

Мораль, излишняя оптимизация - зло.