Wednesday, November 25, 2009

iTunes and VMware ThinApp

Попытайтесь представить себе, что вы смотрите как отражается свет от поверхности HDD platter:

66 KB

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

иэ... иэ... иэ... ыыыээаАПЧХИи.

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

Именно так, мне кажется, поступает с диском боготворимая iTunes--по крайней мере, та ее версия что работает (huh?) под Windows.

Старательность и тщательность, с какой iTunes загаживает систему в случайных местах, напоминает усердие жл^H^H провинциала, гребущего себе домой кретиноскоп размером с гаражные ворота, хрусталь и картину "Вечер у березы" в венецианской смальтовой раме с мозаикой.

Можно, разумеется, ставить iTunes в VM, но есть еще один способ дополнительно не засорять вашу неуютную Windows.

Application Virtualization

У VMware, например, есть ThinApp, на выходе из которого можно получить завернутый в 2 файла iTunes package, который:

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

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

Выглядит интересующий нас каталог вот так:

14 KB

Где 6 сотен мегабайт в файле Bonjour.dat + 3 мегабайта iTunes.exe составляют все что нужно конечному пользователю. Каталог Bonjour--это виртуальная файловая система (и единственное место, куда разрешено писать), что рождается после 1-го запуска iTunes.exe.

cmd.exe, iexplore.exe и regedit.exe нужны только для debugging; если пустить, например, cmd.exe тогда можно смотреть на свою реальную файловую систему, на которую "наложена" виртуальная: какой вид есть то, как себе представляет ситуацию в текущий момент аппликация подготовленная ThinApp'ом.

Например, из такого специального cmd.exe:

c:\>dir "c:\Program Files\iTunes"
 Том в устройстве C не имеет метки.
 Серийный номер тома: DC4B-8921

 Содержимое папки c:\Program Files\iTunes

11/24/2009  11:17 AM    <DIR>          .
11/24/2009  11:17 AM    <DIR>          ..
11/12/2009  04:32 PM            59,083 Acknowledgements.rtf
11/24/2009  11:17 AM    <DIR>          CD Configuration
11/12/2009  04:33 PM           722,160 CDDBControlApple.dll
11/12/2009  04:33 PM           648,480 iPodUpdaterExt.dll
11/12/2009  04:33 PM           111,912 ITDetector.ocx
11/12/2009  04:33 PM        14,769,448 iTunes.dll
11/12/2009  04:33 PM        10,358,048 iTunes.exe
11/24/2009  11:17 AM    <DIR>          iTunes.Resources
11/12/2009  04:33 PM           384,800 iTunesAdmin.dll
11/12/2009  04:33 PM           211,232 iTunesHelper.dll
11/12/2009  04:33 PM           141,600 iTunesHelper.exe
11/24/2009  11:17 AM    <DIR>          iTunesHelper.Resources
11/12/2009  04:33 PM           124,192 iTunesMiniPlayer.dll
11/24/2009  11:17 AM    <DIR>          iTunesMiniPlayer.Resources
11/12/2009  04:33 PM           294,688 iTunesOutlookAddIn.dll
11/12/2009  04:33 PM           292,640 iTunesPhotoProcessor.exe
11/24/2009  11:17 AM    <DIR>          Mozilla Plugins
                              12 файлов     28,118,283 байт
                               7 папок  13,800,427,520 байт свободно

То же, но из "настоящего" cmd:

c:\>dir "c:\Program Files\iTunes"
 Том в устройстве C имеет метку Vista
 Серийный номер тома: 9832-7A28

 Содержимое папки c:\Program Files

Файл не найден

How to create an iTunes package

  1. Выбираете OC, под которую предполагается использовать созданный package и делаете clean install ее в VMware Workstation или еще где.

    iTunes здесь имеет особенность: сделанный package в виртуальной XP потом отказался работать на Vista. Приблизительно такой же эффект можно получить, если накатить на XP (с установленным iTunes) Vista и запустить потом iTunes, которая тяжело ругнется и нагло потребует repair.

    (Btw, собранный package под Windows 7 счастливо заработал на Vista.)

  2. Добавляете в VM виртуальный диск, который не зависит от снапшотов (persistent). То есть у вас VM должен иметь 2 диска: на 1-м сидит Windows, а 2-й пока пустой.

  3. Ставите в виртуальную машину ThinApp. Выключаете VM. Создаете Snapshot.

  4. Включаете VM и запускаете утилиту ThinApp Setup Capture.

  5. Сканируете ей систему.

  6. Ставите iTunes. Setup Capture продолжает висеть в памяти, записывая (на 2-й диск VM, который persistent) весь непростительный harm, который вы наносите этой установкой.

  7. Опять сканируете систему с помощью Setup Capture--уже после инсталляции iTunes.

  8. Делаете Revert to Snapshot.

  9. Build'ите package.

  10. Тестируете его и радуетесь. Если что не работает, идете в п.3 (чаще п.8) и так до просветления.

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

Документация у ThinApp достаточно приличная, так что упомяну только ключевые моменты.

  • Будьте внимательны к тому, куда пойдут файлы Virtual File System: в каталог с package или куда-то в c:\users\bob\thinapp. Тут дело вкуса.
  • File System Access ставьте в WriteCopy. С режимом Full плюгавый iTunes не разговаривает.
  • Перед сборкой найдите все файлы ##Attributes.ini, в которых есть строчка DirectoryIsolationMode=Merged и поменяйте ее на DirectoryIsolationMode=WriteCopy (таких файлов будет 3 штуки).

FAQ

Q00:

Package у меня выдает при запуске, что "The registry settings used by iTunes for importing and burning CDs and DVDs are missing". Что делать?

A:Если вы пишите DVD посредством iTunes (зачем?)--расстраивайтесь, иначе--игнорируйте.
Q01:

iTunes запускается через пень-колоду: один раз нормально, а в во второй, процесс itunes.exe набирает в рот памяти и больше ничего не хочет делать.

A:ThinApp имеет утилиту dll_dump.exe, которая покажет PID'ы всех процессов от старых запусков iTunes. Грохните их.

Saturday, November 21, 2009

FreeBSD 8.0 and VMWare Workstation

(For newcomers: есть предыдущие серии.)

Lots of refactoring and cleanup in the code, о которых пишут в news://gmane.comp.emulators.vmware.tools.announce, говорит, с одной стороны, о том что работа кипит, а с другой стороны, как испаряется, вместе с монотонным понижением температуры на улице, мое терпение к open-vm-tools.

Current status

VMware Workstation 6.5.2.
open-vm-tools: 2009.11.17-210370.
% uname -v
FreeBSD 8.0-RC3 #0: Tue Nov 10 07:50:36 UTC 2009 root@almeida.cse.buffalo.edu:/usr/obj/usr/src/sys/GENERIC

Не работает:

  • hgfs (ядерный модуль, как всегда, вводит guest в панику при попытке монтирования). Это значит, что shared folders не работают.
  • Drag-and-Drop. Несмотря, на его полу-работающее состояние в прошлых open-vm-tools, ничего путного от текущей версии добиться не получилось.

В конце-концов я решил собрать свой вариант порта open-vm-tools, в котором выкинут неработающий мусор и сборка происходит с минимальными dependencies.

В принципе, можно конечно менерно не обновляться (как в FreeBSD 7.2 у меня до сих пор висят open-vm-tools-154848_2 от марта с.г.), но у vmtoolsd в старых версиях, например, течет память и он постепенно пухнет, опухает, тяжело ворочается и становиться неуклюжим.

Что полезного в порту

  • Мелкие утилиты (vmware-toolbox, vmware-rpctool, etc).
  • демон vmtoolsd с plugin'ом для синхронизации времени host<-guest (в комплект входит rc.subr).
  • vmware-user для copy & paste между host и guest. Кроме того, ему запрещено изменять screen resolution в guest (потому что это меня дико раздражало).

Все остальное выкусано. Для сборки нужен только Gtk 2.16. vmware-user должен запускаться где-то в районе ~/.xinitrc.

Скачать порт можно вот тут. Собирать, как обычно, а) распаковав архив куда глаза глядят и б) набрав:

# cd open-vm-tools-minimum
# make install clean

А по окончанию инсталляции, добавить в /etc/rc.conf:

vmware_vmtoolsd_enable=YES

и запустить демон vmtoolsd:

# /usr/local/etc/rc.d/vmware_vmtoolsd start

Btw, если у вас установлены проприетарные vmware tools или версия open-vm-tools из официальных портов FreeBSD, тогда удалите их сперва перед установкой этого порта и вычистите память от загруженных старых ядерных модулей и демонов.

Xorg 7.4

Т.к. драйверы мыши и видеокарты для VMware давно идут вместе c Xorg и есть в портах FreeBSD (x11-drivers/xf86-input-vmmouse и x11-drivers/xf86-video-vmware), все что тут можно посоветовать это:

  1. не давайте свежим иксам говорить с HAL касательно мыши--добавьте в /etc/X11/xorg.conf в секцию ServerLayout:

    Option   "AutoAddDevices" "false"
    

    и в секцию InputDevice для мыши:

    Driver   "vmmouse"
    

    и в /etc/rc.conf:

    moused_port=/dev/psm0
    moused_type=auto
    moused_enable=YES
    moused_flags="-r high"
    

    (после чего наберите:

    # /etc/rc.d/moused restart
    

    в cons25 у вас должен появится работающий курсор, иначе иксы без HAL не поймут где ваша мышь)

    Если вы этого не сделаете--ожидайте хаотчески скачущего курсора и паршивого настроения.

  2. убедитесь, что в секции Device в /etc/X11/xorg.conf стоит правильный драйвер:

    Driver   "vmware"
    
  3. если screen resolution в вашего лэптопа 1280x800, добавьте в секцию Monitor в /etc/X11/xorg.conf:

    HorizSync    1-10000
    VertRefresh  1-10000
    Modeline     "1280x800"  70.00   1280 1312 1344 1376  800 801 804 850
    
  4. поглядеть на минимальный готовый xorg.conf для Xorg 7.4 под FreeBSD 8 можно вот здесь.

(2009-11-22 Update)

Как оказалось, бегемот vmware-user кое как разрешает работать в Unity Mode (a feature that allows seamless integration of applications with the host desktop), ежели у вас имеется Workstation 6.5+. В порт добавилась 1 опция WITH_UNITY. Значит, набирая:

# make WITH_UNITY=1 install clean

можно (запустив vmware-user в иксах) кликнуть в меню Workstation View->Unity и наблюдать чудеса.

Правда, при таком режиме сборки порта, придется забыть про выковыривания из vmware-user пакости в виде измененияя screen resolution в guest, так что мой совет: соберайте без Unity--работает оно в связке Vista <-> FreeLSD 8 отвратительно медленно. Но выглядит, конечно, солидно. Но все-таки медленно. Но зато солидно.

Network and Sound

Тут новостей нет. Без всяких твиков с .vmx-файлами, FreeBSD в Workstation 6.5+ сразу видит сетевую карту как эмо, то есть я хочу сказать, как em0:

% ifconfig em0
em0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=9b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM>
        ether 00:0c:29:a0:8d:b7
        inet 192.168.8.133 netmask 0xffffff00 broadcast 192.168.8.255
        media: Ethernet autoselect (1000baseT <full-duplex>)
        status: active

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

Звук, как и раньше, включается посредством:

# kldload snd_es137x

Пожалуй, на сегодня таки все.

Saturday, November 7, 2009

Quotes from Apprenticeship of Patterns

The book contains 35 apprenticeship patterns (see below), mostly suited for young and/or inexperienced programmers. 8 of them appears to be more or less useful for me, or speaking by the card, 8 of 35 patterns that are worth reading.

N.B.

An apprenticeship pattern attempts to offer guidance to someone working with the craft model on the ways in which they can improve the progress of their career.

Expose Your Ignorance

Show the people who are depending on you that the learning process is part of delivering software. Let them see you grow.

[...]

Software craftsmen build their reputations through strong relationships with their clients and colleagues. Conceding to unspoken pressures and telling people what they want to hear is not a good way to build strong relationships. Tell people the truth. Let them know that you're starting to understand what they want and you're in the process of learning how to give it to them. If you reassure them, reassure them with your ability to learn, not by pretending to know something you don't. In this way, your reputation will be built upon your learning ability rather than what you already know.

The Deep End

Jump in at the deep end. Waiting until you're ready can become a recipe for never doing a thing. So when you're offered a high-profile role or a difficult problem, grasp it with both hands. Growth only happens by taking on the scary jobs and doing things that stretch you.

A Different Road

[...] Ade's mentor [...] described how he went off to a Greek island for six months to become a windsurfing instructor after his first IT job. He found that he liked teaching windsurfing, but it wasn't entirely satisfying because he never got to use his brain. Afterward, it was hard for him to get back into the industry because "most HR people in big companies didn't like it."

Be the Worst

Surround yourself with developers who are better than you. Find a stronger team where you are the weakest member and have room to grow.

[...] as the weakest member of the team, you should be working harder than anyone else. This is because the goal is not to stay the weakest, but to start at the bottom and work your way up.

Reflect As You Work

[...] it is quite easy to repeat the same year of experience 10 times without making significant progress in your abilities. In fact, this sometimes can turn into anti-experience: the phenomenon where every additional year or experience merely reinforces the bad habits you have picked up. This is why your goal should be to become skilled rather than experienced.

Record What You Learn

Try to avoid falling into the trap of just writing down your lessons and forgetting them. Your notebook, blog, or wiki should be a nursery, not a graveyard lessons should be born from this record, rather than going there to die.

Create Feedback Loops

[...] the less skilled you are, the worse you are at assessing the skills of yourself and others.

Dig Deeper

One thing you will learn from trying to apply this pattern is that gaining deep knowledge is hard. This is why most people's knowledge of the computer science that supports software development is a mile wide and an inch thick. It is easier and often more profitable to depend on other people's knowledge of the fundamentals than to spend the extra effort to acquire it yourself. You can tell yourself that you can always learn it when you need it; however, when that day comes you'll need to know everything by the end of the week, but it will take a month just to learn all the prerequisites.