Записки программиста, обо всем и ни о чем. Но, наверное, больше профессионального.

2011-11-30

Silverlight

Говорят, 5-й Silverlight будет последним. Слухи такие. А мы тут, как идиоты, под сильвер аппликухи пытаемся делать. Ужас какой.

engadget.com/2011/11/09/talk-mounts-that-version-5-could-be-silverlights-last-might-on
microsoft.com/silverlight/future
weblogs.asp.net/scottgu/archive/2010/11/04/silverlight-questions
habrahabr.ru/company/microsoft/blog/107582
habrahabr.ru/blogs/silverlight/132298

SQL, аналитика

MySQL, переменные в запросах. Хорошая, годная статья. В красках проиллюстрировано использование выборки «окном», отрицательные стороны индексов, использование переменных в запросах и ваще webew.ru/articles/3923.webew

Доп.материалы по теме
rsdn.ru/article/db/WindowFunctions
olap.ru/home.asp?artId=891
asuxxi.narod.ru/oradoc/ora/ora065
docs.google.com/Doc?id=ddd4649x_4ggr4npc3

2011-11-29

Не надо жадничать

Боюсь, что уже поздно, но ведь лучше поздно чем никогда, правда? 15 ноября была опубликована глава из Руководства Администратора Debian. С целью подтолкнуть сбор средств на благую цель — сделать это руководство бесплатным приложением к дистрибутиву. Глава доступна в виде PDF файла. В ней рассказано про APT-и-компания

raphaelhertzog.com/2011/11/15/20-things-to-learn-with-the-free-chapter-of-the-debian-administrators-handbook

Я залил 10 евро. А вы?


А еще Intel подготовил нам няшку — чипсет с четырехканальной памятью, полоса до 52 гигабайт/секунду. На борту до 64 гигабайт DDR-3 1600 Mhz. Процессоры нынче 6-ти ядерные, в следующем году должны появится 8-ми ядерные на техпроцессе 22 нанометра. А пока этого техпроцесса нет, то 6-ти ядерники выдают тепла до 130 Вт. Короче, к концу следующего года надо планировать апгрейд. Путем замены мамки, камня, памяти. Летать будет — только держись.

tomshardware.com/reviews/core-i7-3960x-x79-performance
wikipedia.org/wiki/Sandy_Bridge#Ivy_Bridge
anandtech.com/show/5091/intel-core-i7-3960x-sandy-bridge-e-review-keeping-the-high-end-alive

2011-11-28

Что за напасть

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

Хитровыебаное падло на МЛ-ке, крякая спецсигналом, пробирается левее пятого ряда. Случившиеся тут-же менты изымают его из потока, короткая стычка, и наглое падло уже лежит еблищем на капоте, два мента надевают на него наручники, третий в целлофановом пакетике радостно тащит какой-то пистолет в багажник..

dalnoboi.livejournal.com/151591


Про обработку заявлений от граждан:
...
Кто-то скажет, что я ничего не добился. Это не так. Больше такого случая не повторится, как минимум пару лет.

flavorchemist.livejournal.com/52736

То ли радоваться успехам, то ли огорчаться податливости пропаганде. Полезнее радоваться, разумеется.

2011-11-26

Вполне электронная

Я приятно удивлен! На сайте госдумы вполне приличный поиск законопроектов, и мало того, к поиску сделан внешний API. И еще БД переехала с Oracle на PostgreSQL. Просто разрыв шаблона — как-то я уже привык полагать, что ничего кроме потемкинских деревень у государевых людей не увидишь. А тут такое.

...
Оптимизация БД позволила снизить время обработки тестовой выборки из 65 тысяч поисковых запросов с 10 часов до 15 минут.
...

habrahabr.ru/blogs/e_gov/133305


а в это время, в цивилизованных странах
androidsecuritytest.com/features/logs-and-services/loggers/carrieriq
xda-developers.com/android/the-rootkit-of-all-evil-ciq
4pda.ru/2011/11/24/50519

2011-11-25

yield

Генераторы — это прекрасная штука. И тут появляется он, йилд:

Для понимания, что делает yield, необходимо понимать, что такое генераторы. Генераторам же предшествуют итераторы
...
Всё, к чему можно применить конструкцию «for… in...», является итерируемым объектом: списки, строки, файлы…
...
Генераторы это тоже итерируемые объекты, но прочитать их можно лишь один раз. Это связано с тем, что они не хранят значения в памяти, а генерируют их на лету
...
Yield это ключевое слово, которое используется примерно как return — отличие в том, что функция вернёт генератор

habrahabr.ru/blogs/python/132554

Я для себя уяснил тему генераторов и йилда после написания такого кусочка кода:

def fib():
    a, b = 0, 1
    while 1:
        yield b # return and continue
        a, b = b, a+b
        if b > 100:
            return

def testYeld():
    """ yeld example (http://www.python.org/dev/peps/pep-0255/) """
    print 'Fibonacci by generator func, aka yeld op: ', list(fib())
    print 'iterate by hand:'
    gen = fib(); ln = ''
    for x in gen:
        ln += str(x) + ', '
    print ln


И немного серебрянки.
Нормальное, кастомизированное контекстное меню (ПКМ) для Silverlight-ных аппликух: c-sharpcorner.com/uploadfile/dpatra/right-click-and-context-menu-in-silverlight-4

2011-11-24

Трудности перевода

Вот вроде и стандарты есть, и POSIX по определению — portable, а все равно, никуда не деться от вот таких няшек:

if (getenv("A_FLAG")) {
...
}
...
А корень зла тут в том, что после putenv() результат getenv() может стать либо NULL, либо "", в зависимости от платформы.

easy-coding.blogspot.com/2011/11/getenv-putenv

Пока есть из чего делать электричество, труд наш бесконечен. И это не может не радовать — без куска хлеба не останемся :(


А вот пхпистам на заметку, годная статья:

Хотел было назвать статью «профессиональное PHP программирование», но по факту — это лишь «заметки бывалого», которые будут полезны начинающим разработчикам, хотя, возможно, привлеку внимание и «старшего» поколения ;)

anton.shevchuk.name/php/about-php

2011-11-23

Сизиф.js

Почему я стараюсь не сочинять текст в окне браузера а копипастить в него:

Бывали ли у вас случаи, когда во время долгого заполнения нудной формы или написания красноречивого и пылкого комментария *внезапно* крашился браузер? Или вы закрывали вкладку, в которой работаете, или отключалось электропитание (а ИБП, по известному закону, нет)?
...
В результате была написана простенькая свистелка, способная хранить данные, вводимые в форму, в Local Storage браузера и при повторной загрузке той же страницы (query params matter) заполнять ими форму. Данные конкретной формы в Local Storage чистятся при её отправке или ресете.

habrahabr.ru/blogs/webdev/131288

Автор пугает — краш браузера, сбой электропитания. Все проще — форму отправляешь, а она не отправляется. Жамкаешь «взад» и получаешь пустую форму. Такое бывает гораздо чаще, чем перечисленные автором пугалки. Отсюда понятно, что функции «свистелки» надо встраивать в браузер. Если уж на сайте хреновая форма и сам сайт хреновый — нужно искать вебмастера а не яваскрипт.

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

Но плагин лучше. А еще лучше обьединить оба метода, когда и браузер набранное сохранит и вебмастер озаботится удобством пользователя.

2011-11-22

Язык

Как же все-таки приятно послушать неравнодушного профессионала, толкующего о своем (и твоем):

Страуструп поступил очень мудро, обеспечив практически полную совместимость своего детища со сверх популярным и тогда, и что более удивительно -- сейчас, Си. Если бы не этот шаг, вряд ли бы плюсы стали бы тем, чем они стали. Но это достоинство языка с каждым днем становится все большим и большим его недостатком, добавляя множество дыр и низкоуровневых проблем в язык вроде как высокоуровневый и современный. Многие до сих пор так толком и не понимаю, что С и C++ это два совершенно разных языка, на которых нужно писать совершенно по-разному. И расхожее сочетание "C/C++" это просто какой-то root of all evil. Мне сплошь и рядом попадаются люди, которые худо-бедно программировали на Си, потом за день выучили ключевое слово "class" и стали считать себя большими гуру в плюсах (к примеру, такой случай). "Специалист" подобного рода узнается слету -- у него в коде вы обязательно найдете любимый printf... Плюсы очень мощный и одновременно довольно сложный инструмент, на овладение и глубокое понимание которого требуется много времени. Без полной перестройки мозгов начать программировать на C++ после С никак не получится, и те, кто этого не понимает, серьезно портят репутацию языка. Когда Линус Торвальдс, ни черта на смыслящий в C++, начинает поучать других на тему, почему плюсы это зло, выглядит это чертовски комично.
...
Лично я не считаю, в отличии от многих, что новый стандарт это революция, и C++11 это совершенно новый язык. Дело в том, что C++98 несет в себе просто нереальное количество недодуманностей, ограничений и откровенных недоработок, поэтому я бы сказал, что новый стандарт разрабатывал Капитан Очевидность и главная задача, которая стояла перед ним -- латание старых дыр и огрех, затянувшееся на непростительные 10+ лет.
Я отношу себя к той категории людей, которым не нужно читать умные толстые книжки о том, чем может быть вам полезно то или иное новшество в языке. Я из тех, кто много много лет в нетерпении ерзал на стуле, ожидая, когда же наконец комитет закроет все эти бесчисленные проблемы в дизайне моего любимого языка...

cdriper-rss.livejournal.com/30406

Сто лет я не писал на С/С++. Но еще помню как радовался обьектности, перейдя с простого С. И как же мне хорошо сейчас, когда я пишу на Python и прочей динамике :)

Что поделать, C'est la vie. Недостатки C++ обусловлены его достоинствами. Это инструмент из разряда тех, которые нельзя давать в руки недоучкам без присмотра. Я имею в виду большие проекты, для мелких поделок неважно чем винтики крутить, толковой отверткой или мультитулом. Вообще, нынче представляется разумным большие проекты писать не на C++ а на чем-нибудь более безопасном. Вроде Java или C#. И не надо сразу кричать про производительность получаемого кода, если очень надо, торомозной код можно и на ассемблере изложить.


А я тут, кстати, декораторами побаловался:
def testDecorators():
 print 'testDecorators...'

 class decorBeforeAfter(object):
  def __init__(self, f):
   print 'decorBeforeAfter init...'
   self.f = f
  def __call__(self, *args, **kws):
   print "before", self.f.__name__
   res = self.f(*args, **kws)
   print "after", self.f.__name__
   return res

 def checkReg(fn, *args, **kwargs):
  print 'checkReg [%s]...' % fn.__name__
  def crFunc(*args, **kwargs):
   print 'crFunc [%s]...' % fn.__name__
   for a in args:
    print '  arg=[%s]' % a
   for k in kwargs:
    print '  kvarg[%s]=[%s]' % (k, kwargs[k])
   res = fn(*args, **kwargs)
   print 'crFunc done'
   return res
  print 'checkReg done'
  return crFunc

 print 'define doWork...'
 # @decorBeforeAfter
 @checkReg
 def doWork(a, b, c='baz', d=''):
  print 'doWork a=[%s], b=[%s], c=[%s], d=[%s]' % (a,b,c,d)
  return 'qux'

 print 'invoke doWork...'
 res = doWork('foo', 'bar', d='oops')
 print 'res = [%s]' % res
#def testDecorators():

Понравилось, но не очень. Код перестает быть прозрачным и безопасным — IMHO, ясен пончик. Хотя если не вдаваться в детали реализации, код читать заметно легче.

artima.com/weblogs/viewpost.jsp?thread=240808
ibm.com/developerworks/linux/library/l-cpdecor
wiki.python.org/moin/PythonDecorators
wiki.python.org/moin/PythonDecoratorLibrary#Singleton
saltycrane.com/blog/2008/01/how-to-use-args-and-kwargs-in-python

2011-11-21

Ringtone

Что-то по вечерам стало так лениво, хоть ложись и глазки закрывай. Для разгона посмотрел Бешеных Псов Тарантиновских. И захотелось мне песенку из саундтрека в телефон закинуть, в качестве рингтона.

Нашел на ютубе ролик, скачал, конвертнул в mp3, отправил в тел по почте (лень было блютуз запускать :). Взял тел, открыл почту, скачал песенку, перебросил ее в папку /sdcard/media/ringtones. Пытаюсь назначить песенку рингтоном — не играет и не назначается. Пытаюсь проиграть стандартным медиаплеером — не играется, говорит, что «данный формат не поддерживается». Вот напасть.

Повторил все телодвижения, только уже с форматом OGG, через блютус попробовал. Также безуспешно.

А засада оказалась в том, что в Андроиде вся эта рингтоновая тряхомудия интегрирована с медиатекой. Файл регистрируется в медиатеке в процессе его скачивания, что через Интернет, что через блютус. Если скачанный файл вручную переместить, медиатека его потеряет. Заголовок есть, файла нет. При этом никто не говорит, что, мол «не могу найти файл». Говорит, что «формат не поддерживается». Кнопки «зарегистрировать в медиатеке» нету, кнопки «переиндексировать хранилище» нету. Справится с этой напастью можно либо перезапустив аппарат, либо перемонтировав карту памяти, через настройки — хранилище.

И вот кому послать горячий привет? Пусть ему станет горячо.

Заклинание получения песенки.ogg из ютубовского ролика:
ffmpeg -i George_Baker_Selection_Little_Green_Bag.flv -ac 2 -f wav lgb.wav
ffmpeg -i lgb.wav -acodec libvorbis -aq 6 lgb.ogg

linuxconfig.org/ffmpeg-audio-format-conversions
en.wikipedia.org/wiki/Vorbis#Technical_details
linuxquestions.org/questions/linux-software-2/ffmpeg-vorbis-vs-libvorbis

2011-11-18

Make

Практика применения тулзы make

Утилита Make вполне гибкая и может отследить точно, что нужно пересобрать, чтобы всё было обновлено, и при этом не пересобирать лишнее. Вот как выглядит правило в Makefile о том, что серверу Джанго нужно:

.PHONY: run
run: bin/django syncdb bin/sass compile_trans
./bin/django runserver 0.0.0.0:8000

habrahabr.ru/blogs/django/132524

Статья может стать хорошим вводным материалом в тему Make. Не могу сказать, что make это лучший выбор для проектов на Джанго, но для общего развития, для начала, вполне годится. Надо же с чего-то начинать? А make это классика.

А Fabric круче. И, главное, на Python :)

2011-11-17

Неделя не задалась

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

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

Но это все не интересно. Интересно вот что:

Антрополог Дуайт Рид (Dwight W. Read) ... полагает, что интеллектуальные способности особенно сильно зависят от объема так называемой рабочей памяти (working memory). Говоря упрощенно, это та часть памяти, в которой хранится и обрабатывается информация, непосредственно необходимая субъекту в данный момент.

По современным представлениям, рабочая память имеет довольно сложную структуру. Центральное место в ней занимает «исполнительный компонент» (central executive component), ... Его главная задача — удерживать внимание на той информации, которая необходима субъекту для решения насущных задач. Сама эта информация может храниться где-то еще. Ее обычно называют кратковременной памятью (short-term memory) и рассматривают как компонент рабочей памяти... Компьютерным аналогом кратковременной памяти (понимаемой как часть рабочей памяти) являются регистры процессора. Кроме того, в состав рабочей памяти входит ряд вспомогательных структур (см. Baddeley's model of working memory).

Ключевое значение имеет объем кратковременной памяти, измеряемый количеством идей или концепций, с которыми «исполнительный компонент» рабочей памяти может работать одновременно. Эту важнейшую характеристику рабочей памяти называют short-term working memory capacity (ST-WMC). Многочисленные эксперименты показали, что у человека ST-WMC ≈ 7 (хотя некоторые исследователи склоняются к более низким оценкам, порядка 4-5). Большинство животных не может обдумывать комплексно, как часть единой логической операции, более одной, максимум двух идей (ST-WMC ≤ 2).
...
Шимпанзе из Таи манипулируют двумя объектами: орехом и камнем, который используется в качестве молотка (см. видео). Наковальней служат элементы рельефа, которыми не нужно манипулировать — например, плоский выход скальных пород или корень дерева. В Таи все взрослые обезьяны умеют колоть орехи. Очевидно, управляться с двумя объектами может научиться любой шимпанзе.

Шимпанзе из Боссу пытаются совладать сразу с тремя объектами, потому что у них принято использовать в качестве наковальни небольшой камень, который нужно выбрать и правильно установить. Обычно наковальня получается шаткая, и ее нужно придерживать. Иногда используется и четвертый объект — камень-клин, которым шимпанзе подпирают наковальню, чтобы не шаталась. Но в этом случае сначала обезьяна возится с двумя объектами (наковальней и клином), а потом с тремя (наковальней, которую всё равно нужно придерживать, орехом и молотом). С четырьмя предметами одновременно никто работать не пытается (клин не придерживают).

Обучение искусству раскалывания орехов протекает долго и мучительно. В возрасте полутора лет обезьяны начинают имитировать отдельные действия, входящие в комплекс (например, стучат по ореху рукой). Примерно в 2,5 года они уже выполняют последовательности из двух действий (например, кладут орех на камень и стучат рукой). Лишь в возрасте 3,5 лет они оказываются в состоянии правильно выполнить всю цепочку операций: найти наковальню, положить орех и стукнуть камнем.

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

elementy.ru/ newsid 430954
dn54.livejournal.com/142540

Получается что? Получается, что те, у кого рабочая память поширше, справляются со сложными задачками легше :)
А уж если кому не дано (в детстве межушную мышцу не прокачали?), те могут и под презрительное «дебил» попасть.

В этом отношении, как мне кажется, в славное племя программистов попадют сливки — людям с относительно небольшой рабочей памятью очень сложно вести серьезные программные проекты. Уж очень много «идей или концепций» надо держать в голове в процессе разработки.

2011-11-16

PhotoRec

Если у вас чудесным (загадочным) образом пропадут фотки с флешки, или какие другие файлы, не приведи Господь, воспользуйтесь восстановительной тулзой. Таких много, но мне понравилась одна конкретная — PhotoRec.

cgsecurity.org/wiki/PhotoRec_Step_By_Step
cgsecurity.org/wiki/TestDisk_Download
blog.mypapit.net/2007/10/how-to-recover-photo-files-from-sd-card-mmc-with-photorec

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

Рекомендую.

Правда мне не помогла :) вся чудесность тулзы, ибо восстанавливать было нечего. Редиски флешку почистили. Собственно, первое правило восстановления — если что, немедленно перевести девайс в режим «только чтение» и тут же снять посекторный образ. Восстанавливать файло можно и с образа.
А может это была не та флешка — не знаю. Приключения могли быть всякие, я со свечкой не стоял. Мотороллер не мой...

2011-11-15

flac to mp3

Рецепт, как превратить один огромный файл FLAC с разметкой треков в файле CUE во  много небольших файлов mp3, по трекам. С сохранением тегов. Части рецепта не мои, моя компиляция и проверка в бою :)

На примере альбома Blake – Together

Установить софт
aptitude install cuetools shntool
aptitude install flac wavpack
и еще вот это: packages.debian.org/squeeze/kid3

Разбить большой файл на маленькие
cuebreakpoints Blake\ -\ Together.cue | shnsplit -o flac Blake\ -\ Together.flac
cuetag Blake\ -\ Together.cue split-track*.flac

Перекодировать маленькие флаки в mp3. Скриптом
#!/bin/bash
# name flac2mp3.sh
OUT_DIR="./mp3"
[ ! -d ${OUT_DIR} ] && mkdir -p ${OUT_DIR}
# modify the lame options to your
# preference
lame_opts=" --vbr-new -V 2 -B 256 "
for x in "${@}"
do
FLAC=${x}
MP3="${FLAC%.flac}.mp3"
[ -r "$FLAC" ] || { echo can not read file \"$FLAC\" >&1 ; exit 1 ; } ;
metaflac --export-tags-to=- "$FLAC" | sed 's/=\(.*\)/="\1"/' > tmp.tmp
. ./tmp.tmp
rm tmp.tmp
echo "Converting ${FLAC} to MP3 format"
flac -c -d "$FLAC" | lame ${lame_opts} \
--tt "$TITLE" \
--tn "$TRACKNUMBER" \
--tg "$GENRE" \
--ty "$DATE" \
--tc "$COMMENT" \
--ta "$ARTIST" \
--tl "$ALBUM" \
--add-id3v2 \
- ${OUT_DIR}/"$MP3"
done

bash ../flac2mp3.sh split-track*.flac

После чего остается только пакетом переименовать полученные mp3-файлы в нечто более внятное, исходя из содержимого тегов. Хотя можно и скрипт чутка поправить, чтобы мп3-шки сразу создавались с нужными именами. Но мне проще применить kid3.


Немного про «with» в Python tony.su/2011/11/11/python-context-managers коротко и внятно о важном.

2011-11-14

Masked shell input

Грех жаловатся на память, все-таки вспомнил, что надо сказать «Б» сказавши «А». Как в MS Windows в командной строке замаскировать звездочками ввод пароля, я написал. А вот как это сделать в Linux:
stty_orig=`stty -g`
stty -echo
read secret
stty $stty_orig
tech-recipes.com/rx/278/hide-password-entry-in-bournebash-shell-script

Правда, тут будет без звездочек. Зато «из коробки».


Какие бывают двойные смыслы.

В эпизоде «Captain Cook» сериала Blackadder Goes Forth есть момент, когда генерал интересуется у Блекаддера, знает ли он журнал (забыл название, что-то вроде Страна и Король). На что тот отвечает, что да, знает, прекрасная бумага — мягкая, прочная и отлично абсорбирует :)
А генерал говорит -
top-hole, Blackadder I thought it would be right up your alley.

Сперва я пару минут втыкал, о чем это он. Даже на паузу поставил. Так и не докумекал, отложил на потом. И вот, узнал о чем речь.
На первом уровне сказанное означает примерно следующее:
превосходно, я подумал, что вы с этим прекрасно справитесь (подразумевается, что он выдает Блекаддеру некое задание).
А на втором, я полагаю, нечто похожее на:
(отсыл к «дырке»), я так и думал, что вы чистите им проход (clean up — right up).
forum.wordreference.com/showthread.php?t=424007

Обратите внимание, дословный перевод вообще смысла не имеет. Сплошные фразеологизмы.

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

Сериал, кстати, превосходный (некоторым нравится даже в переводе на русский). Жалко, скоро кончится :(

2011-11-12

Extend root partition

Намедни я наступил на грабельки, заботливо заныканные в визарде разбиения диска, том, что в установщике Debian Squeeze.

При установке Дебиана, рутовый раздел получился размером в 300 мегабайт с хвостиком (это мне досталось от авторазбивателя, экономный, собака). И мне этого не хватило, потому как у меня одновременно живут два ядра - из бекпортов и обычное. Все место на рутовом разделе сожрали ядра и их модули, все в папке /lib

Как временное решение, одно ядро я снес
aptitude purge linux-image-2.6.32-5-amd64
aptitude autoclean
После чего появилось время подумать о расширении рутового раздела или его переносе. Под эту задачу я провел эксперимент (сразу скажу - удачный) на виртмашине. Трудности возникли только на этапе переконфигурации граба, и то только потому, что я не знал, как его переконфигурить.

Итак, для переноса раздела я стартовал машину с liveCD GParted gparted.sourceforge.net/livecd

Потом проделал следующие операции с разделами:
уменьшил раздел /home (чтобы что-то продать ненужное, сначала надо что-то ненужное купить);
уменьшил раздел primary, в котором появилось свободное место (это sda2);
копипастом перенес рутовый раздел на освобожденное место;
расширил новый раздел (это получился sda3) до максимума, 10 гигов;
установил у него флаг бутовости;
удалил старый рутовый раздел sda1 (эту жопу никому не могу рекомендовать, не делайте этого!).

На этом операции с разделами закончены. Перезапустил машину и увидел
grub rescue>
Потыркался немного и пошел читать help.ubuntu.com/community/Grub2#Rescue_Mode grub_rescue Booting

Почитав, сгенерировал такие команды:
set prefix=(hd0,3)/boot/grub
set root=hd0,3
insmod normal
normal

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

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

2011-11-11

Глупости какие

Шесть единичек — 11 год, 11 месяц, 11 день. Прикольно.

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

Так вот, заглянул. Говорю — а дайте талончик открепительный. Отвечает тетя — да бери, только заявление напиши, вот и бланк тебе. Вписал я в бланк ФИО, место прописки и прочие мелочи, вроде «почему я не могу явиться на свой участок голосования». Настал момент, когда надо выяснить, а какой у меня номер участка. Вот тут моя инициатива и накрылась сами-знаете-чем. Патамучта нельзя быть красивой такой получить открепительный талон где попало. Его можно получить только по месту прописки. Вот.
Забрал я заяву, попрощался и с чистой совестью покинул скорбное заведение.

В связи с этим проишествием, у меня риторический вопрос — а нахуя, граждане? В смысле, зачем нужна такая процедура, если ее суть извращена. Суть ведь в том, что человек не может (не хочет) посещать контору в местах прописки (отмененной, кстати, теоретически). А по факту, эту контору один бес, посетить надо.

И ваще, где «электронная Россия»? Что интернетов не хватает? Не могут в день выборов мой паспорт пробить по центральной БД на предмет — голосовал/не голосовал/может/не может? Чтобы дать мне возможность зайти и голоснуть на любом участке? Я уж не говорю о «электронных выборах», модель которых умные люди разработали уж много лет назад, взяв за основу принципы криптографии с открытым ключом.

Фигня какая-то.


Чтобы не было дурного послевкусия, вот симпатичное/полезное. Про конечные автоматы:

Конечные автоматы и т.н. автоматное программирование -- вещи, с которыми программисты часто сталкиваются при решение задач лексического и синтаксического разбора, при описании поведения объектов в играх, при реализации всевозможных протоколов связи.
По сути дела, Finite State Machine (FSM) это некий объект, у которого есть состояние, описываемое конечным множеством значений, плюс есть некое конечное множество событий, которые могут быть поданы на вход такому объекту. Самый простой пример FSM это, например, выключатель. Объект с двумя состояниями "вкл" и "выкл" и двумя событиями -- "включить" и "выключить".
Другой простой пример -- автоматическая дверь с датчиком контроля состояния
С точки зрения программы FSM описывается фактически как таблица, где по горизонтали идут события, а по вертикали идут состояния. Каждая ячейка этой таблицы, расположенная на пересечении конкретного события и конкретного состояния, есть указатель на некий код, который должен быть выполнен, когда на вход объекту, находящемуся в указанном состоянии, подается указанное событие.

cdriper-rss.livejournal.com/29555

Наш человек.

2011-11-10

Справочник

Мне сайт пригодился в качестве справочника, а вообще там залежи полезной информации. Годный ресурс.

Я HTML верстки и прочих CSS чураюсь, а тут понадобилось вспомнить, в чем разница между display: none и visibility: hidden
Так на сайте мгновенно нашелся ответ со 100% релевантностью webdesign.about.com/od/css/f/blfaqhidden


Почти в том же стиле, Python Tips, Tricks, and Hacks, с частичным переводом на русский habrahabr.ru/blogs/python/85238, хотя, в принципе, для понимания достаточно заголовков и кода к ним :)

2011-11-09

SDF to text

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

py.fdo-3.6.0_5104.zip - Python bindings for FDO, compiled Python wrapper for FDO 3.6. Platform Windows 2003, x86. К пакету прилагается скрипт экспорта (дамп) данных из файлов SDF. Решил выложить пакет здесь, ибо убедился в том, что найти готовые бинарники вместе с враппером нелегко. Пришлось собирать самому. Заодно и свой дампер из SDF в текст добавил.

sites.google.com/site/vasnake

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

Метод борьбы с несовместимостью очевиден, делай раз — переливай данные в удобный для обработки формат; делай два — адаптируй данные под целевую платформу. Шаг первый я фактически сделал, нарисовав сегодня за полдня скрипт (см. в пакете disasm.py) выдающий содержимое SDF-файла в виде текста. Почти WKT. Шаг второй у каждого свой и, часто, тривиален.

Чуть не забыл, скрипт мой не протестирован на всем разнообразии вышеупомянутых фишек. Так что дотачивать будете сами (ну или меня попрОсите).


Откуда ноги растут
fdo.osgeo.org/documentation
fdo.osgeo.org/content/fdo-360-downloads
trac.osgeo.org/fdo/browser/trunk/Fdo/Python
trac.osgeo.org/fdo/wiki

2011-11-08

FDO

Бобер, выдыхай!
Я таки скомпилял обертку к FDO для Python. Потратил не меньше трех дней, мазафака. То ли кризис так влияет, то ли у Автодеска всё так нынче делается, но просто (без затей) собрать релиз из исходников не вышло. И это релиз, не альфа и не бета. Отягощает сборку еще тот факт, что под MS Windows все очень плохо с инструментарием — в сравнении с Linux, конечно.

В целом, чтобы собрать из исходников FDO, надо строго выполнить инструкции, записанные в файлике OpenSourceBuild__README.txt и сделать поправки на следующее:
* MS Visual Studio нужно не абы какую, а строго 2008 (она же 9.0) в комплектации C#, C++ профессиональную (или в какую там входят MFC, ATL). Express не пойдет, ибо этих мфц и атл там нету. Мазохисты, вроде меня, могут собрать и экспрессом.
* Python надо строго 2.4, о как.
* Понадобится внести правки в некоторые исходники.
* Понадобится копировать недостающие библиотеки в нужные места руками, в зависимости от ошибок компиляции.
* Надо быть готовым, что соберется не все а только основное :)

В связи с последним замечанием, есть шанс, что сборка не будет работать так хорошо, как хотелось бы (это я буду завтра заценивать, насколько хорошо она работает).

Какие у меня (постфактум) получились изменения в исходниках:

--- C:/d/sdf/fdo/orig/OpenSource_FDO/setenvironment.bat Fri Nov 19 19:44:26 2010
+++ C:/d/sdf/fdo/OpenSource_FDO/setenvironment.bat Mon Nov 07 21:33:02 2011
@@ -1,6 +1,6 @@
-@echo off
+@echo on

 rem
 rem Copyright (C) 2004-2006  Autodesk, Inc.
 rem
 rem This library is free software; you can redistribute it and/or
@@ -27,12 +28,12 @@
 if "%1" == "x86_amd64" goto setvcvarsall
 if "%1" == "x86_ia64"  goto setvcvarsall
 goto usage

 :setvcvarsall
-SET ACTIVENAMECHECK="Microsoft Visual Studio 9"
-SET ACTIVEPATHCHECK="C:\Program Files\Microsoft Visual Studio 9.0\VC"
+SET ACTIVENAMECHECK="Microsoft Visual Studio 10"
+SET ACTIVEPATHCHECK="c:\Program Files\Microsoft Visual Studio 10.0\VC"
 if exist %ACTIVEPATHCHECK% goto VSExist
 SET ACTIVEPATHCHECK="C:\Program Files (x86)\Microsoft Visual Studio 9.0\VC"
 if exist %ACTIVEPATHCHECK% goto VSExist

 :VSExist
@@ -98,11 +99,11 @@
 if not exist "%SDEHOME%" SET SDEHOME=
 if exist "%SDEHOME%\bin\sde.dll" SET SDEVER_ARCUNITTEST=92
 if exist "%SDEHOME%\bin\sde91.dll" SET SDEVER_ARCUNITTEST=91

 SET ACTIVENAMECHECK="7-Zip"
-SET ACTIVEPATHCHECK="C:\Program Files\7-Zip"
+SET ACTIVEPATHCHECK="d:\app\7-Zip"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%

 SET ACTIVENAMECHECK="Graphviz"
 SET ACTIVEPATHCHECK="C:\Program Files\ATT\Graphviz\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
@@ -112,23 +113,23 @@
 SET ACTIVEPATHCHECK="C:\Program Files\doxygen\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% documentation package not recognized in the Windows PATH. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="GnuWin32 Bison/Sed"
-SET ACTIVEPATHCHECK="c:\Program Files\GnuWin32\bin"
+SET ACTIVEPATHCHECK="c:\d\GnuWin32\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not recognized in the Windows PATH. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="Python 2.4"
-SET ACTIVEPATHCHECK=C:\progra~1\Python24
-if exist %ACTIVEPATHCHECK% SET PYTHON_HOME=C:\progra~1\Python24
+SET ACTIVEPATHCHECK=C:\Python24
+if exist %ACTIVEPATHCHECK% SET PYTHON_HOME=%ACTIVEPATHCHECK%
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not found. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="SWIG 1.3.31"
-SET ACTIVEPATHCHECK=C:\progra~1\swigwin-1.3.31
-if exist %ACTIVEPATHCHECK% SET SWIG_HOME=C:\progra~1\swigwin-1.3.31
+SET ACTIVEPATHCHECK=c:\d\swigwin-1.3.31
+if exist %ACTIVEPATHCHECK% SET SWIG_HOME=%ACTIVEPATHCHECK%
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not found. Update the setenvironment.bat script file with the correct path

 goto end

--- C:/d/sdf/fdo/orig/OpenSource_FDO/setenvironmentVS10.bat    Tue Mar 30 01:20:03 2010
+++ C:/d/sdf/fdo/OpenSource_FDO/setenvironmentVS10.bat Mon Nov 07 22:35:13 2011
@@ -1,6 +1,6 @@
-@echo off
+@echo on

 rem
 rem Copyright (C) 2004-2006  Autodesk, Inc.
 rem
 rem This library is free software; you can redistribute it and/or
@@ -75,11 +75,11 @@
 if not exist "%FDOGDAL%" SET FDOGDAL=%FDOTHIRDPARTY%\gdal
 if not exist "%FDOGDAL%" echo OPTIONAL FDO environment variable FDOGDAL is not set
 if not exist "%FDOGDAL%" SET FDOGDAL=

 SET ACTIVENAMECHECK="7-Zip"
-SET ACTIVEPATHCHECK="C:\Program Files\7-Zip"
+SET ACTIVEPATHCHECK=d:\app\7-Zip
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%

 SET ACTIVENAMECHECK="Graphviz"
 SET ACTIVEPATHCHECK="C:\Program Files\ATT\Graphviz\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
@@ -89,23 +89,23 @@
 SET ACTIVEPATHCHECK="C:\Program Files\doxygen\bin"
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% documentation package not recognized in the Windows PATH. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="GnuWin32 Bison/Sed"
-SET ACTIVEPATHCHECK="c:\Program Files\GnuWin32\bin"
+SET ACTIVEPATHCHECK=c:\d\GnuWin32\bin
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not recognized in the Windows PATH. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="Python 2.4"
-SET ACTIVEPATHCHECK=C:\progra~1\Python24
-if exist %ACTIVEPATHCHECK% SET PYTHON_HOME=C:\progra~1\Python24
+SET ACTIVEPATHCHECK=C:\Python24
+if exist %ACTIVEPATHCHECK% SET PYTHON_HOME=%ACTIVEPATHCHECK%
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not found. Update the setenvironment.bat script file with the correct path

 SET ACTIVENAMECHECK="SWIG 1.3.31"
-SET ACTIVEPATHCHECK=C:\progra~1\swigwin-1.3.31
-if exist %ACTIVEPATHCHECK% SET SWIG_HOME=C:\progra~1\swigwin-1.3.31
+SET ACTIVEPATHCHECK=c:\d\swigwin-1.3.31
+if exist %ACTIVEPATHCHECK% SET SWIG_HOME=%ACTIVEPATHCHECK%
 if exist %ACTIVEPATHCHECK% set PATH=%PATH%;%ACTIVEPATHCHECK%
 if not exist %ACTIVEPATHCHECK% echo OPTIONAL %ACTIVENAMECHECK% package not found. Update the setenvironment.bat script file with the correct path

 goto end

--- C:/d/sdf/fdo/orig/OpenSource_FDO/Fdo/Python/Resource/FdoWrapper.rc Wed Feb 16 18:43:18 2011
+++ C:/d/sdf/fdo/OpenSource_FDO/Fdo/Python/Resource/FdoWrapper.rc  Mon Nov 07 22:37:54 2011
@@ -5,11 +5,12 @@
 #define APSTUDIO_READONLY_SYMBOLS
 /////////////////////////////////////////////////////////////////////////////
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+//#include "afxres.h"
+#include "winresrc.h"

 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS

 /////////////////////////////////////////////////////////////////////////////
--- C:/d/sdf/fdo/orig/OpenSource_FDO/Fdo/Python/Swig/Fdo/FdoIncludes.i Wed Jan 06 04:06:08 2010
+++ C:/d/sdf/fdo/OpenSource_FDO/Fdo/Python/Swig/Fdo/FdoIncludes.i  Mon Nov 07 22:57:32 2011
@@ -432,11 +432,14 @@

 %include "Fdo/Schema/SchemaException.h"
 %include "Fdo/Schema/ClassDefinition.h"
 %include "Fdo/Schema/AutogenerationException.h"
 %include "Fdo/Schema/Class.h"
+
+%ignore FdoClassCapabilities::Set;
 %include "Fdo/Schema/ClassCapabilities.h"
+
 %include "Fdo/Schema/ClassCollection.h"
 %include "Fdo/Schema/ClassType.h"
 %include "Fdo/Schema/DataPropertyDefinition.h"
 %include "Fdo/Schema/DataPropertyDefinitionCollection.h"
 %include "Fdo/Schema/DataType.h"
--- C:/d/sdf/fdo/orig/OpenSource_FDO/Thirdparty/apache/xalan/projects/Win32/Res/AllInOne/AllInOne.rc   Wed Mar 24 22:43:20 2010
+++ C:/d/sdf/fdo/OpenSource_FDO/Thirdparty/apache/xalan/projects/Win32/Res/AllInOne/AllInOne.rc    Mon Nov 07 22:37:54 2011
@@ -5,11 +5,12 @@
 #define APSTUDIO_READONLY_SYMBOLS
 /////////////////////////////////////////////////////////////////////////////
 //
 // Generated from the TEXTINCLUDE 2 resource.
 //
-#include "afxres.h"
+//#include "afxres.h"
+#include "winresrc.h"


 /////////////////////////////////////////////////////////////////////////////
 #undef APSTUDIO_READONLY_SYMBOLS


И скрипт сборки:
@echo off
chcp 1251 > nul
set wd=%~dp0
pushd "%wd%"
set NLS_LANG=AMERICAN_CIS.UTF8
set PYTHONPATH=
@cls

set INCLUDE=c:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\include;%INCLUDE%
set LIBPATH=c:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\lib;%LIBPATH%
set LIB=c:\Program Files\Microsoft Visual Studio 10.0\VC\atlmfc\lib;%LIB%
set SWIG_HOME=c:\d\swigwin-1.3.31
set PYTHON_HOME=c:\Python24
set PYTHON_INCLUDE=%PYTHON_HOME%\include
set PYTHON_LIB=%PYTHON_HOME%\libs\python24.lib
set FDO=c:\d\sdf\fdo\OpenSource_FDO
set FDOTHIRDPARTY=%FDO%\Thirdparty
SET FDOUTILITIES=%FDO%\Utilities
SET XALANROOT=%FDOTHIRDPARTY%\apache\xalan
SET XERCESCROOT=%FDOTHIRDPARTY%\apache\xerces
SET NLSDIR=%FDOTHIRDPARTY%\apache\xalan\src\xalanc\NLS
SET ACTIVEPATHCHECK=d:\app\7-Zip

set path=%path%;c:\WINDOWS\Microsoft.NET\Framework\v3.5;c:\d\GnuWin32\bin;c:\Python24;c:\d\swigwin-1.3.31;c:\d\Microsoft SDKs\Windows\v7.1\Bin

@REM ~ goto TEST

call setenvironmentVS10.bat x86>nul
set
@REM ~ call build_thirdparty.bat -w sdf -w fdo
call build_thirdparty.bat -a clean
set
@REM ~ call build.bat -py=build
call build.bat -a clean
exit

:TEST
set FDO=c:\d\sdf\fdo\OpenSource_FDO\fdo
set path=c:\d\sdf\fdo\OpenSource_FDO\Utilities\ExpressionEngine\Bin\Win32\Release;%path%
pushd Fdo\Python\UnitTest
call UnitTests.cmd
popd
exit


C:\d\sdf\fdo\OpenSource_FDO\Fdo\Python\UnitTest>python Src/main.py
Testing ApplySchemaTest...
Testing CapabilitiesTest:Capabilities...
Testing ClientServicesTest:ClientServices...
Testing ClientServicesTest:ConnectionCreation...
Testing CommandTest:ApplySchemaCommandCreation...
Testing CommandTest:InsertCommandCreation...
Testing CommandTest:SelectCommandCreation...
Testing LOBTest...
Testing StringBufferTest...
Testing TypeMapTest:Enumerations...
Testing TypeMapTest:Exceptions...
Testing TypeMapTest:PrimitiveArrays...
Testing TypeMapTest:Primitives...
----------------------------------------------------------------------
Ran 13 tests in 0.070s
OK


Видно, что я пытался использовать MS Visual Studio 10 (это была одна из попыток), но пусть это никого не смущает. Использование Студии 2008 жестко зашито в конфигах FDO и компиляла реально Студия 2008 Express.

Послевкусие после сборки фдо довольно гнусное. Как то я не ожидал, что сборка free проекта потребует наличия сильно небесплатной Студии (да еще и конкретной, старой версии!), плюс еще и неслабой правки вручную. Нехорошо это.

Ненавижу Автодеск :)

sgillies.net/blog/400/fdo-and-python

2011-11-06

Vietcong

Сегодня открылась страшная тайна!
Я узнал причину (и, что важнее, устранил ее) по которой было невозможно стартовать сервер игрухи, для мочилова по локальной сети.

Раньше был комп с WinXP и на нем, в незапамятные времена, установили Vietcong. Играли периодически, до недавнего времени. Но вот настал срок и старый комп ушел. Пришел новый, с Win7. И на новом компе Vietcong работать не захотел.

Одну из причин нашли довольно быстро - если воткнуть в микрофонный вход звуковухи хоть микрофон, хоть наушники - начинает играть (вот такой странный Вьетконг, да).

С другой было сложнее. Запускаем Vietcong в режиме сервера, чтобы в локальной сети поиграть, а он сообщает "connection timed out". Забарывали по разному, по всякому — неудачно. И вот, сегодня, в голову постучалось: вместе с компом был закуплен новый, хороший роутер. Как только мы сменили роутер обратно на старый, о боги! Оно заработало :)

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

А свой старый роутер я никому не отдам, вот.

2011-11-05

Альтернатива

Коммуникационная библиотека libpurple и GUI от Мозиллы — XUL. Получился приличный мессенджер без заморочек. Легко установить, легко использовать. Можно носить на флешке. Море плагинов, ибо их легко делать. Когда мне надоест Pidgin, поставлю себе Instantbirg IM:

Увидел свет релиз многоплатформенного открытого клиента для мгновенного обмена сообщениями Instantbird 1.1, развиваемого на основе технологий Mozilla. Интерфейс Instantbird написан с использованием языка XUL и базируется на web-движке Gecko, в приложении активно используются вкладки (табы), поддерживается установка дополнений. С точки зрения поддержки протоколов и базовых возможностей, Instantbird близок к Pidgin, так как использует библиотеку libpurple. Организация стилевого оформления сообщений напоминает Adium. Код программы распространяется в рамках лицензии GPLv2, бинарные сборки доступны для Windows, Mac OS X и Linux. Продукт локализован и поддерживает русский язык.
...
В настоящий момент для Instantbird уже подготовлено около 300 дополнений
...
Плагины с реализацией поддержки новых протоколов могут создаваться на JavaScript

opennet.ru/opennews/art 32074


Q. How do I install Instantbird on Linux?
A. Extract the content of the downloaded archive, and launch the file named "instantbird". If a popup dialog asks you if you want to edit or launch the file, select "launch".

Q. Is Instantbird portable (usable from a USB stick)?
A. If you start Instantbird from a USB stick, it will, by default, store your user profile on the hard disk.
You can tell Instantbird to store your user profile on the USB stick by using the -profile command line argument.
To do this, right click on the instantbird.exe file and select "Create Shortcut", then on the properties of the shortcut, edit the target and append -profile ./foldername to it.

instantbird.com/faq installlinux
instantbird.org

2011-11-04

В следующий раз поставлю Linux

Было у меня желание, раз уж приходится мудохаться с напильником вокруг Вин7, то чего бы не поставить Дебианчик и дотачивать его. Все пользы больше. Но не поддался слабости, доточил свой movieshell (исходники прилагаются) под Windows7. Узнал много нового, что полезно. Но в следующий раз наверняка поставлю Linux.

К чему это я? Это я про то, как программулина, написанная на Python + Tkinter и отлаженная на Windows XP, оказалась практически неработоспособна на Windows7. Потому как злые люди поменяли поведение виндовых подсистем. Раньше работало так, а теперь иначе.

Короче, доточил. А главное, я решил вопрос с максимизацией окна! Облазил полтырнету, нигде нет рабочего рецепта «как вызвать maximize у окна нарисованного Tkinter». Пришлось сперва использовать конструкцию вида:
w, h = tk.winfo_screenwidth(), tk.winfo_screenheight()
tk.geometry("%dx%d+0+0" % (w-100, h-100))
Что нехорошо, ибо на экране полно всяких панелек, сокращающих доступную окну площадь.

Перебрав с два десятка вариантов, я нашел рабочий. Вот:
def doWork(self):
  print 'listMovies.doWork'
  self.tk.iconify()
  self.tk.update()
  self.tk.deiconify()
  self.tk.after(500, self.maximizeWindow)
  self.tk.mainloop()

def maximizeWindow(self):
''' use winapi
SendMessage(hwnd, WM_SYSCOMMAND, SC_MAXIMIZE, 0);
PostMessage - is async wersion of SendMessage
'''
  print 'listMovies.maximizeWindow'
  try:
    import string, win32con, win32gui
    w = self.tk
    sh = w.wm_frame() # var type [<type 'str'>], var value ['0x180116']
    h = string.atoi(sh, 0)
    win32gui.PostMessage(h, win32con.WM_SYSCOMMAND, win32con.SC_MAXIMIZE, 0)
  except Exception, e:
    if type(e).__name__ == 'COMError': print 'COM Error, msg [%s]' % e
  else:
    print "can't maximize window"
    import traceback
    traceback.print_exc(file=sys.stderr)
Применяемый в коде self.tk это не что иное, как результат вызова Tkinter.Tk(), что обычно в примерах называют root. Вызов «tk.after» нужен для срабатывания максимайза после завершения инициализации окна. И еще, при использовании SendMessage оно тоже работает, но только не в Вин7. В семерке необходимо использовать асинхрон — PostMessage.


Сцылки по теме
vasnake.blogspot.com/2010/12/magnate
sites.google.com/site/vasnake
vasnake.blogspot.com/2010/12/blog-post_29
vasnake.blogspot.com/2011/10/blog-post_24
vasnake.blogspot.com/2011/10/getlogicaldrives

2011-11-03

Орешек

Орех, это который NUT.
Пришлось мне на днях конфигурить бережное выключение станции, снабженной ИБП. На компе, понятное дело :) установлен Debian Squeeze, UPS я взял от Powercom, модель Smart King Pro 700 (сразу скажу — неудачно закупился, дефектный упс оказался, что-то с егойным контроллером. Если посмотреть на цену девайса и сравнить с ценой приличных моделей аналогичной функциональности, удивляться не приходится).

Проблема была сформулирована так: если пропадает питание, станция должна аккуратно гасить виртмашины, крутящиеся на ней с помощью VirtualBox.

Итого, при исчезновении питания, задача упс-ного софта — заслать команду выключения станции и подождать, пока все процессы аккуратно завершатся. Задача скриптов выключения — сделать виртмашинам savestate (аналог гибернации) в нужное время. Получается куча скриптов и конфигов.

Что самое сложное в процессе отладки скриптов выключения компа? Самое сложное, это пережить задротство с выключением-включением системы каждый раз, как вызывается проверка. Я это пережил, систему вроде отладил, сохраняю результат (как советовал добрый человек — лучший бекап, это выложить файл в Интернет, пусть его люди сами раскопируют :). Чуть не забыл, в моем конфиге используется концепция «пропало питание и не поднялось через 2 секунды — гаси машину». Обычно используется концепция «пропало питание — тяни на батареях пока они не высохнут, потом быстренько гаси машину».

Поехали.

Конспект выданных с консоли команд (все от рута, ясен пончик) при настройке системы:
# создание и включение скрипта гашения виртмашин:
nano /etc/default/virtualbox
nano /etc/init.d/rc.vbox

chmod 755 /etc/init.d/rc.vbox
update-rc.d rc.vbox remove
update-rc.d rc.vbox defaults

# установка софта для UPS:
aptitude install nut
aptitude install sysv-rc-conf

# редактирование конфигов UPS:
nano /etc/default/nut
nano /etc/nut/nut.conf
nano /etc/nut/ups.conf
nano /etc/nut/upsd.conf
nano /etc/nut/upsd.users
nano /etc/nut/upsmon.conf
nano /etc/nut/upssched.conf
nano /root/upssched-cmd

# размещение скрипта, вызываемого при переходе на батареи:
chmod +x /root/upssched-cmd
chown nut:nut /root/upssched-cmd
mv /root/upssched-cmd /sbin/

# доп.телодвижения, необходимые для работы конфига:
mkdir /var/run/nut/upssched
chown -R nut:nut /var/run/nut
touch /var/log/test.log

# запуск, проверка и прочее:
/etc/init.d/nut start
sysv-rc-conf

upsdrvctl start
upsc pcmskp
upsd
upsd -c reload
upscmd -l
upscmd -l pcmskp

После (вернее, в процессе) конфигурирования мне понадобилось пару раз перезапустить машину, чтобы софт правильно прихватил порт USB с упсом.

Теперь содержимое вышеуказанных скриптов и конфигов. Из текста выброшены почти все каменты (копирайты оставил):

cat /etc/default/virtualbox
# юзер, под которым работают виртмашины (он их запускает)
SHUTDOWN_USERS="valik"
# что делать с виртмашинами
SHUTDOWN=savestate


cat /etc/init.d/rc.vbox
#!/bin/sh
### BEGIN INIT INFO
# Provides:          vboxcontrol
# Required-Start:    vboxdrv $network $local_fs
# Required-Stop:     ssh $network $local_fs
# Should-Start:      samba
# Should-Stop:       samba
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       VirtualBox VM Control
### END INIT INFO
# ко мне скрипт пришел чере «испорченный телефон», да и я его местами подкрутил,
# alas.
# This version is Vbox4, v1.0 by David Fuchs Based on:
# Version 20090301 by Kevin Swanson based on:
# Version 2008051100 by Jochem Kossen
# http://farfewertoes.com
#
# Released in the public domain
#
# This file came with a README file containing the instructions on how
# to use this script.
#
PATH=/sbin:/bin:/usr/sbin:/usr/bin:$PATH
DEVICE=/dev/vboxdrv
LOG="/var/log/vbox-install.log"
NOLSB=
DEBIAN=yes
MODPROBE=/sbin/modprobe

if $MODPROBE -c | grep -q '^allow_unsupported_modules  *0'; then
  MODPROBE="$MODPROBE --allow-unsupported-modules"
fi

[ -f /lib/lsb/init-functions ] || NOLSB=yes
[ -f /etc/vbox/vbox.cfg ] && . /etc/vbox/vbox.cfg

if [ -n "$INSTALL_DIR" ]; then
    VBOXMANAGE="$INSTALL_DIR/VBoxManage"
    DODKMS="$INSTALL_DIR/src/vboxhost/do_dkms"
    BUILDVBOXDRV="$INSTALL_DIR/src/vboxhost/vboxdrv/build_in_tmp"
    BUILDVBOXNETFLT="$INSTALL_DIR/src/vboxhost/vboxnetflt/build_in_tmp"
    BUILDVBOXNETADP="$INSTALL_DIR/src/vboxhost/vboxnetadp/build_in_tmp"
else
    VBOXMANAGE="/usr/lib/virtualbox/VBoxManage"
    DODKMS="/usr/share/virtualbox/src/vboxhost/do_dkms"
    BUILDVBOXDRV="/usr/share/virtualbox/src/vboxhost/vboxdrv/build_in_tmp"
    BUILDVBOXNETFLT="/usr/share/virtualbox/src/vboxhost/vboxnetflt/build_in_tmp"
    BUILDVBOXNETADP="/usr/share/virtualbox/src/vboxhost/vboxnetadp/build_in_tmp"
fi

[ -z "$DEBIAN" -o -x $VBOXMANAGE -a -x $BUILDVBOXDRV ] || exit 0

if [ -n "$NOLSB" ]; then
    if [ -f /etc/redhat-release ]; then
        system=redhat
    elif [ -f /etc/SuSE-release ]; then
        system=suse
    elif [ -f /etc/gentoo-release ]; then
        system=gentoo
    fi
fi

[ -r /etc/default/virtualbox ] && . /etc/default/virtualbox

if [ -z "$NOLSB" ]; then
    . /lib/lsb/init-functions
    fail_msg() {
        echo ""
        log_failure_msg "$1"
    }
    succ_msg() {
        log_end_msg 0
    }
    begin_msg() {
        log_daemon_msg "$@"
    }
else
    if [ "$system" = "redhat" ]; then
        . /etc/init.d/functions
        fail_msg() {
            echo -n " "
            echo_failure
            echo
            echo "  ($1)"
        }
        succ_msg() {
            echo -n " "
            echo_success
            echo
        }
    elif [ "$system" = "suse" ]; then
        . /etc/rc.status
        fail_msg() {
            rc_failed 1
            rc_status -v
            echo "  ($1)"
        }
        succ_msg() {
            rc_reset
            rc_status -v
        }
    elif [ "$system" = "gentoo" ]; then
        if [ -f /sbin/functions.sh ]; then
            . /sbin/functions.sh
        elif [ -f /etc/init.d/functions.sh ]; then
            . /etc/init.d/functions.sh
        fi
        fail_msg() {
            eerror "$1"
        }
        succ_msg() {
            eend "$?"
        }
        begin_msg() {
            ebegin "$1"
        }
        if [ "`which $0`" = "/sbin/rc" ]; then
            shift
        fi
    else
        fail_msg() {
            echo " ...failed!"
            echo "  ($1)"
        }
        succ_msg() {
            echo " ...done."
        }
    fi
    if [ "$system" != "gentoo" ]; then
        begin_msg() {
            [ -z "${1:-}" ] && return 1
            if [ -z "${2:-}" ]; then
                echo -n "$1"
            else
                echo -n "$1: $2"
            fi
        }
    fi
fi
case "$1" in
start)
;;
stop)
    echo "Run rc.vbox stop" >> /var/log/test.log
    wait=0
    log_daemon_msg "Stopping vms..."
    for i in $SHUTDOWN_USERS; do
        # don't create the ipcd directory with wrong permissions!
        if [ -d /tmp/.vbox-$i-ipc ]; then
            export VBOX_IPC_SOCKETID="$i"
            VMS=`$VBOXMANAGE --nologo list runningvms | sed -e 's/^".*".*{\(.*\)}/\1/' 2>/dev/null`
            if [ -n "$VMS" ]; then
                if [ "$SHUTDOWN" = "poweroff" ]; then
                    begin_msg "Powering off remaining VMs"
                    for v in $VMS; do
                        $VBOXMANAGE --nologo controlvm $v poweroff
                    done
                    succ_msg
                elif [ "$SHUTDOWN" = "acpibutton" ]; then
                    begin_msg "Sending ACPI power button event to remaining VMs"
                    for v in $VMS; do
                        $VBOXMANAGE --nologo controlvm $v acpipowerbutton
                        wait=30
                    done
                    succ_msg
                elif [ "$SHUTDOWN" = "savestate" ]; then
                    begin_msg "Saving state of remaining VMs"
                    for v in $VMS; do
                        $VBOXMANAGE --nologo controlvm $v savestate
                    done
                    succ_msg
                fi
            fi
        fi
    done
    # wait for some seconds when doing ACPI shutdown
    if [ "$wait" -ne 0 ]; then
        begin_msg "Waiting for $wait seconds for VM shutdown"
        sleep $wait
        succ_msg
    fi
;;
*)
echo "Usage: $0 {stop}"
    exit 1
;;
esac
exit 0


cat /etc/default/nut
START_UPSD=yes
START_UPSMON=yes


cat /etc/nut/nut.conf
MODE=standalone


cat /etc/nut/ups.conf
[pcmskp]
    driver = usbhid-ups
    port = auto
    desc = "sqz on powercom smart king pro 700"


cat /etc/nut/upsd.conf
LISTEN 127.0.0.1
LISTEN ::1


cat /etc/nut/upsd.users
[local_mon]
    password = 12345678
    actions = SET
    instcmds = ALL
    upsmon master


cat /etc/nut/upsmon.conf
MONITOR pcmskp@localhost 1 local_mon 12345678 master
# RUN_AS_USER nutmon
# говорят, это ужасная дыра в безопасности
RUN_AS_USER root
MINSUPPLIES 1
SHUTDOWNCMD "/sbin/shutdown -h +0"
NOTIFYCMD /sbin/upssched
POLLFREQ 5
POLLFREQALERT 5
HOSTSYNC 15
DEADTIME 15
POWERDOWNFLAG /etc/killpower
NOTIFYMSG ONLINE "UPS %s on line power"
NOTIFYMSG ONBATT "UPS %s on battery"
NOTIFYFLAG ONLINE SYSLOG+WALL+EXEC
NOTIFYFLAG ONBATT SYSLOG+WALL+EXEC
RBWARNTIME 43200
NOCOMMWARNTIME 300
FINALDELAY 5


cat /etc/nut/upssched.conf
CMDSCRIPT /sbin/upssched-cmd
PIPEFN /var/run/nut/upssched/upssched.pipe
LOCKFN /var/run/nut/upssched/upssched.lock
AT ONBATT * START-TIMER nopower 2
AT ONLINE * CANCEL-TIMER nopower


cat /sbin/upssched-cmd
#!/bin/bash
# nopower timer from /etc/nut/upssched.conf
# я почикал оригинальный скрипт, надеюсь, Paul не в претензии.
##
#   upssched-cmd: Notification script for use with Network UPS tools (NUT)
#   1.0
#
#   Copyright (C) 2005  Paul J. Lucas
#
#   This program is free software; you can redistribute it and/or modify
#   it under the terms of the GNU General Public License as published by
#   the Free Software Foundation; either version 2 of the License, or
#   (at your option) any later version.
#
#   This program is distributed in the hope that it will be useful,
#   but WITHOUT ANY WARRANTY; without even the implied warranty of
#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#   GNU General Public License for more details.
#
#   You should have received a copy of the GNU General Public License
#   along with this program; if not, write to the Free Software
#   Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
##
MAIL=/usr/bin/mail
EMAIL=root
[ -z "$PAGER" ] && PAGER=$EMAIL
notify() {
    echo $2 | $MAIL -s "$3" $1
    echo $2 >> /var/log/test.log
    echo $2 | wall
}
case $1 in
nopower)
 notify $PAGER $1 "UPS on battery now, timer nopower done"
 shutdown -h +0 powerevent
 /sbin/upsmon -c fsd ;;
COMMBAD)    notify $PAGER $1 "UPS communications lost" ;;
COMMOK)     notify $PAGER $1 "UPS communications established" ;;
FSD)        notify $EMAIL $1 "UPS being shut down by master" ;;
LOWBATT)    notify $EMAIL $1 "UPS has a low battery" ;;
NOCOMM)     notify $PAGER $1 "UPS unavailable" ;;
ONBATT)     notify $PAGER $1 "UPS on battery power" ;;
ONLINE)     notify $PAGER $1 "UPS on line power" ;;
REPLBATT)   notify $EMAIL $1 "UPS battery needs replacement" ;;
SHUTDOWN)   notify $EMAIL $1 "NUT shutting system down" ;;
esac

Вот так. У меня работает.

Некоторые использованные источники:
networkupstools.org/documentation
networkupstools.org/stable-hcl — проверьте перед покупкой ИБП!
blasterspike.it/2011/03/28/how-to-install-nut-on-ubuntu-10-10-maverick-meerkat
blog.shadypixel.com/monitoring-a-ups-with-nut-on-debian-or-ubuntu-linux/#comment-1549
smilecouple.org/2011/05/27/install-virtual-box-4-on-ubuntu-with-phpvirtualbox4
code.google.com/p/phpvirtualbox/wiki/vboxwebServiceConfigLinux
rogerprice.org/NUT.html#UPSSCHED-CMD
homepage.mac.com/pauljlucas/personal/macmini/ups

Напоследок посоветую посвятить выбору производителя и модели UPS не менее пары часов времени. Сэкономите время же и деньги. Понравившуюся модель проверяйте на совместимость с софтом и количество параметров под управлением софта. Как я заметил, народ рекомендует MGE. А я денег пожалел на упс. oops :(

2011-11-02

Примета времени



В воскресенье, 23 октября, в США скончался Джон Маккарти (John McCarthy), создатель языка программирования Lisp и один из главных теоретиков искусственного интеллекта.
citforum.ru/news/27229

Еще один из столпов. Время летит, маманегорюй. О ком из нынешних двигателей IT, лет эдак через 40-50 будет повод погрустить?

2011-11-01

CyanogenMod

Говорила мне мама — ты же программист, сынок, ты же знаешь — работает, не трогай. Да кто же слушает мам?

Был (его железная часть и сейчас есть, вот операционке — вечная память) у меня толковый смартфон, всем меня устраивал (кроме, разве, невозможности флеш-ролики глядеть). И вот, захотелось мне странного и перепрошил я в Булыжник свежую версию Андроида. Порадовался мелким улучшениям. А потом, потом я обнаружил страшное — аппарат жутко (по сравнению с тем, что было) тормозит и лагает, аж до пропуска управляющих команд; браузер может сожрать батарею за несколько часов, вися в фоне. На днях у меня лопнуло терпение — пару раз батарея села в ноль пока я спал. То ли МТС шалит, то ли сам аппарат, поди разберись. И я решил — все, кватит накуй, прошью более другого Андроида. Цианоген тут как раз рекомендовали.

Пацан сказал, пацан сделал. Вторые сутки у меня в Булыжнике сидит обцианогененный Андроид. Я пока доволен.

Вот отчет о перепрошивке.

Пара слов о сути процесса. Проведя нынешнюю прошивку, я прочувствовал, в чем фокус (в предыдущий раз не разобрался). Фокус в том, что заливка новой системы проводится в два этапа (если тел целочка в смысле прошивок). Сначала на тел заливается так называемый «рекавери», фактически организуется дуал-бутовая система, где рядом со штатной осью располагается вспомогательная. Если Андроид это минилинукс, то эта вспомогательная будет микролинукс (рекавери ее зовут, что странно — скажите поручик, расстегай это рыба или мясо? Расстегай — это команда). И после того, как у вас появляется возможность в любой момент загрузится в микролинукс, вы получаете изячный и примитивный способ заменить минилинукс на что угодно. И в любое желаемое время.

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

Итак, сперва я зафиксировал список используемых мною аппликух, чтоб потом не вспоминать мучительно, что из маркета качать:

AccuWeather quick
Adobe flash player 11
Advanced task killer
amoeba
barcode scanner
beamreader PDF viewer
blink flash led in your way (уже не надо, в цианогене есть)
bluetooth file transfer
colordict dictionary translate
colornote notepad notes
digital clock + widget
fbreader
fring
ghost commander file manager
handy locator lite
keepassdroid
moon+ reader
navy clock II
paragon keyboard (уже не надо, в цианогене есть)
qr droid
quickpic
skype
yandex.maps

Потом внимательно изучил доступные материалы, начав отсюда:
wiki.cyanogenmod.com/wiki/Unofficial_Ports#Motorola_Milestone
Освежил память о предыдущем своем опыте:
vasnake.blogspot.com/2011/07/froyo

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

Потом делал как рекомендовано, попутно записывая, что шло не так, получилась улучшенная и поправленная инструкция по прошивке CyanogenMod на Motorola Milestone:

A) First install the USB drivers from Motorola (Motorola_Mobile_Drivers_4.7.1_MotoConnect_1.1.31.exe).

B) Then install the RSD Lite Tool (RSD_Lite_4.9.rar)

C) Use RSD Lite to flash the Recovery-Only SBF (vulnerable_recovery_only_RAMDLD90_78.zip)
Detailed Instructions for Step C ->
Start the RSD Lite, select the SBF file
1. Plug in your phone (while it's off)
2. Go into the Bootloader Mode by holding UP (on the hardware keyboard) and press Power-On for 2-3 seconds (if UP doesn't work try pressing X) — Этот пункт реально не пошел, пришлось загрузить тел в штатный режим, в надежде, что прошивальщик сам разберется. Разобрался.
3. Now select your phone which should be now visible in the RSD Lite tool
4. Press Start — первая попытка не удалась, пришлось повторить, сразу после старта зажав (и удерживая до окончания процесса) на аппаратной клаве тела кнопу «стрелка вверх». И все срослось.
5. The phone will reboot 1-3 times during the downgrade process. DO NOT unplug it!

D) Install Androidiani OpenRecovery
Detailed instructions for Step D-> Installing OpenRecovery:
1. Download Open Recovery (any will do,but Androidiani is recommended) (OpenRecovery-3_3.zip) — и распакуйте, будет папка и файл update.zip
2. Copy the update.zip file to the root of your SD — либо загрузив тел в штатный режим и подключив его как флеш-диск, либо загрузив в рекавери и подключив его там как юсб-драйв.
3. Copy the OpenRecovery folder to the root of your SD.
Reboot your phone into recovery menu — см.ниже инструкцию захода в рекавери
NOTE: If you get an error about "EOCD Marker" at this point, that means you did not flash the vulnerable recovery properly. Go back to previous section, re-flash vulnerable recovery with RSD Lite and hold the up key during the whole operation until RSD Lite finishes.
4. Apply the update.zip — в рекавери будет соответствующий пункт меню
You are now in Open Recovery. You can now root the phone, do Nandroid backup/restore etc; You can now install Cyanogen for Milestone.

E) Lastly follow the steps for installing Cyanogen for Milestone and Google Apps
If you are already rooted/have an OpenRecovery installed on your Milestone:
1. Put Google Apps (gapps-gb-20111029-signed.zip) and the latest Cyanogen zip file (update-cm-7.1.0.2-Milestone-KANG-signed.zip) in the Openrecovery/updates folder — должно быть уже всем понятно, что указанные файлы надо положить в нужное место на карте памяти уже понятным способом. Интересно, что будет с системой, если не ставить Гугл Аппс?
2. Factory Reset / Wipe Cache Partition AND Dalvik Cache — в меню рекавери в самом конце списка будут такие пункты меню, их надо выполнить
3. Flash the Cyanogen update.zip file — тоже, в меню рекавери через соотв.пункты меню
4. Flash the Google Apps zip file

F) (if applicable) -> Make sure to install the correct baseband for you phone
from the Androidiani menu if you are not using European 3G frequencies on your network — менять частоту для радио мне не понадобилось. Но можно :)

Перезагрузиться (я еще раз хардресет не сделал, но некоторые рекомендуют).

После загрузки в штатный режим сразу сделать важное — переустановить язык, лучше на аглицкий, ибо бага: Market FC: "Go to Settings/Language & Keyboard/Select Language. Select English even if already selected."
code.google.com/p/cyanogenmod4milestone/issues/detail?id=651#c10

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


Как попасть в рекавери (микролинукс) и потом сделать хардресет (© не мой):

1. Выключить телефон
2. Нажать кнопку Х на хардверной клавиатуре и держать не отпуская
3. Нажать кнопку питания и держать до появления моторольского логотипа (буква М в белом круге)
4. Отпустить питание и продолжаю держать кнопку Х на хардверной клавиатуре до появления треугольника с восклицательным знаком внутри (с момента появления моторольского логотипа до появления треугольника проходит секунд 15)
5. Отпустить кнопку Х на хардверной клавиатуре
6. Нажать громкость вверх и держать
7. Коротко нажать кнопку камеры (именно камеры, а не Х) - появляется меню синими буквами. Все - вы в меню рекавери. Кнопки можно отпустить.

8. Выбираем Wipe data/factory reset — ПОДУМАВ сперва, хотите ли вы этого!


Где, что:
www.droid-developers.org/wiki/CyanogenMod_4_Milestone_FAQ
wiki.cyanogenmod.com/wiki/Unofficial_Ports#Motorola_Milestone
forum.xda-developers.com/showthread.php?t=941346
code.google.com/p/androidiani-openrecovery/downloads/list
android.doshaska.net/cm7
github.com/nadlabak/android/downloads

Применявшиеся файлы, слева md5sum:
6e92d69286de1665d9d9264c29481663 Motorola_Mobile_Drivers_4.7.1_MotoConnect_1.1.31.exe
e0ad8bc0537216ad0db5e4a5554dbac9 RSD_Lite_4.9.rar
b075353a6e18ef3b515ed3d73d03e484 vulnerable_recovery_only_RAMDLD90_78.zip
827a26ac602a4ada4338743ef77b38dc OpenRecovery-3_3.zip
4c8748db820475c455e1f0a0322afc37 gapps-gb-20111029-signed.zip
8cfe40ddbc346d24742cc28d57d0961d update-cm-7.1.0.2-Milestone-KANG-signed.zip

Архив блога

Ярлыки

linux (241) python (191) citation (186) web-develop (170) gov.ru (159) video (124) бытовуха (115) sysadm (100) GIS (97) Zope(Plone) (88) бурчалки (84) Book (83) programming (82) грабли (77) Fun (76) development (73) windsurfing (72) Microsoft (64) hiload (62) internet provider (57) opensource (57) security (57) опыт (55) movie (52) Wisdom (51) ML (47) driving (45) hardware (45) language (45) money (42) JS (41) curse (40) bigdata (39) DBMS (38) ArcGIS (34) history (31) PDA (30) howto (30) holyday (29) Google (27) Oracle (27) tourism (27) virtbox (27) health (26) vacation (24) AI (23) Autodesk (23) SQL (23) Java (22) humor (22) knowledge (22) translate (20) CSS (19) cheatsheet (19) hack (19) Apache (16) Manager (15) web-browser (15) Никонов (15) functional programming (14) happiness (14) music (14) todo (14) PHP (13) course (13) scala (13) weapon (13) HTTP. Apache (12) Klaipeda (12) SSH (12) frameworks (12) hero (12) im (12) settings (12) HTML (11) SciTE (11) USA (11) crypto (11) game (11) map (11) HTTPD (9) ODF (9) купи/продай (9) Photo (8) benchmark (8) documentation (8) 3D (7) CS (7) DNS (7) NoSQL (7) cloud (7) django (7) gun (7) matroska (7) telephony (7) Microsoft Office (6) VCS (6) bluetooth (6) pidgin (6) proxy (6) Donald Knuth (5) ETL (5) NVIDIA (5) Palanga (5) REST (5) bash (5) flash (5) keyboard (5) price (5) samba (5) CGI (4) LISP (4) RoR (4) cache (4) car (4) display (4) holywar (4) nginx (4) pistol (4) spark (4) xml (4) Лебедев (4) IDE (3) IE8 (3) J2EE (3) NTFS (3) RDP (3) holiday (3) mount (3) Гоблин (3) кухня (3) урюк (3) AMQP (2) ERP (2) IE7 (2) NAS (2) Naudoc (2) PDF (2) address (2) air (2) british (2) coffee (2) fitness (2) font (2) ftp (2) fuckup (2) messaging (2) notify (2) sharepoint (2) ssl/tls (2) stardict (2) tests (2) tunnel (2) udev (2) APT (1) CRUD (1) Canyonlands (1) Cyprus (1) DVDShrink (1) Jabber (1) K9Copy (1) Matlab (1) Portugal (1) VBA (1) WD My Book (1) autoit (1) bike (1) cannabis (1) chat (1) concurrent (1) dbf (1) ext4 (1) idioten (1) join (1) krusader (1) license (1) life (1) migration (1) mindmap (1) navitel (1) pneumatic weapon (1) quiz (1) regexp (1) robot (1) science (1) serialization (1) spatial (1) tie (1) vim (1) Науру (1) крысы (1) налоги (1) пианино (1)