• Коты и Маки, продолжение

    У меня есть три увлечения - Маки, Скалолазанье и Коты. О первом вы читаете здесь, о втором можно почитать на сайте "Команда Траверс и её друзья", а вот третье и постоянное увлечение остаётся неосвещённым. Поэтому объединю две такие похожие темы о Котах и о Маках в этой статье, ведь первые так любят греться на вторых.
    Эту тему очень хорошо описала Arwen в статье "Коты и Маки". Я же просто приведу картинки с Flickr без комментариев. Авторство можно посмотреть, перейдя по ссылке на каждой фотографии.


  • Как заставить работать симлинки в Dropbox

    До обновления до Snow Leopard я активно использовал символические ссылки (симлинки или же symlinks) для того, чтобы синхронизировать файлы и каталоги, находящиеся вне иерархии Dropbox, например каталог проектов или базу данных паролей 1Password. Когда перешёл на Snow Leopard, то почему-то симлинки у меня перестали работать.

    Также эту проблему озвучил @umputun в первом подкасте после выхода Snow Leopard, так что я был не одинок.

    Поясню - я обычно делал относительные симлинки:

    ole-mac:~ ctrld$ cd ~
    ole-mac:~ ctrld$ date > test1.txt
    ole-mac:~ ctrld$ ls -al test1.txt
    -rw-r--r-- 1 ctrld staff 30 Sep 23 23:31 test1.txt
    ole-mac:~ ctrld$ ln -s test1.txt Dropbox/Public/
    ole-mac:~ ctrld$ ls -al Dropbox/Public/test1.txt
    lrwxr-xr-x 1 ctrld staff 9 Sep 23 23:31 Dropbox/Public/test1.txt -> test1.txt
    

    Dropbox 0.6.559 вообще не реагировал на создание симлинка (не было активности на значке в menubar) и ничего не синхронизировал, в версии 0.7.24 активность появлялась, но никогда не заканчивалась (отображался статус "Indexing 1 file...").

    В Интернет я рапортов о проблеме с симлинками не нашёл, и решил написать разработчикам. Rian H. среагировал почти мгновенно - я написал ночью, и утром уже был ответ:

    hi oleg i believe you are using the "ln" command incorrectly. the command you want to execute is:

    $ ln -s $PWD/test1.txt Dropbox/Public/
    

    the reason is that symlink sources are used verbatim by the kernel. meaning if you try to access test1.txt in your Dropbox/Public folder, it's looking for test1.txt in the same folder (a recursive symlink). You need to either a full path or a relative path from Dropbox/Public

    Моя ошибка была "от ума" - я привык создавать относительные симлинки, а нужно было создавать абсолютные:

    Вместо

    $ ln -s test1.txt Dropbox/Public/
    

    Нужно делать так:

    $ ln -s $PWD/test1.txt Dropbox/Public/
    

    Как только я так сделал, симлинки стали синхронизироваться.

    Примечание 1. Я использую Experimental Build, но должно работать и на стабильном.

    Примечание 2. После такого простого решения я задумался о том, что возможно под 10.5 я создавал абсолютные симлинки, а на 10.6 стал создавать относительные. Но по крайней мере теперь ясно, как делать правильно.


  • Слежение за изменениями файловой системы

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

    fslogger

    В книге "Mac OS X Internals. A System Approach" была описана командно-строковая утилита fslogger, написанная автором, позволяющая отслеживать различные изменения файловой системы, например:

    • создание файлов и каталогов;
    • удаление файлов и каталогов;
    • изменения структуры stat (например, изменение разрешений);
    • переименование файлов и каталогов;
    • изменение содержимого;
    • обмен содержимым между двумя файлами (это функция HFS+);
    • изменение информации Finder;
    • изменение владельца.

    Пример работы утилиты:

    ole-mac:~ ctrld$ sudo fslogger
    Password:
    fsevents device cloned (fd 4)
    fslogger ready
    => received 654 bytes
    # Event
      type           = FSE_CREATE_FILE
      pid            = 193 (iChatAgent)
      # Details
        # type           len  data
        FSE_ARG_STRING    66  string = /Users/ctrld/Library/Caches/com.apple.iChat/Pictures/.dat00c1.055
        FSE_ARG_DEV        4  dev    = 0xe000002 (major 14, minor 2)
        FSE_ARG_INO        4  ino    = 2766443
        FSE_ARG_MODE       4  mode   = -rw-r--r--  (0x0081a4, vnode type VREG)
        FSE_ARG_UID        4  uid    = 501 (ctrld)
        FSE_ARG_GID        4  gid    = 20 (staff)
        FSE_ARG_INT64      8  tstamp = 8200465994289
        FSE_ARG_DONE (0xb33f)
    # Event
      type           = FSE_CONTENT_MODIFIED
      pid            = 193 (iChatAgent)
      # Details
        # type           len  data
        FSE_ARG_STRING    66  string = /Users/ctrld/Library/Caches/com.apple.iChat/Pictures/.dat00c1.055
        FSE_ARG_DEV        4  dev    = 0xe000002 (major 14, minor 2)
        FSE_ARG_INO        4  ino    = 2766443
        FSE_ARG_MODE       4  mode   = -rw-r--r--  (0x0081a4, vnode type VREG)
        FSE_ARG_UID        4  uid    = 501 (ctrld)
        FSE_ARG_GID        4  gid    = 20 (staff)
        FSE_ARG_INT64      8  tstamp = 8200466392596
        FSE_ARG_DONE (0xb33f)
    

    fseventer

    Компания fernLightning на основании идеи fslogger создала программу fseventer, которая в графическом виде показывает файловую активность. Программа бесплатная, но предлагает сделать добровольное пожертвование разработчикам. Функциональность видна по двум скриншотам:


  • Удаление фантомного письма в Mail/Exchange

    Неоднократно сталкивался с тем, что при использовании Exchange EWS в Mail.app постоянно остаётся “неудаляемым” одно письмо. Пересоздавал учётную запись - ничего не помогало, “неудаляемым” становилось другое письмо.

    <p style="clear: both">При попытке удаления выдаётся следующее сообщение:</p><p style="clear: both">Начал искать решение, нашёл большое обсуждение на сайте Apple “Exchange issue: send/receive mail fine - can’t delete or move messages”. Одна из первых рекомендаций мне помогла - нужно отключить сохранение удаляемых писем на сервере:</p><p style="clear: both">Затем удалить “мистическое” письмо, а потом снова включить при необходимости эту опцию.</p>

  • Доступ к паролям 1Password через браузер (1Password anywhere)

    00_1pass<p>Когда после установки Snow Leopard я обновлял 1Password до версии 3.0 beta, мне попалось упоминание о новой функции “1Password anywhere”, позволяющей иметь доступ к своим паролям не только со своего Mac’а, но и с Windows, Linux, etc. Эта функция меня чрезвычайно заинтересовала, так как я вынужден продолжать использовать кроссплатформенную систему хранения паролей Keepass, которая под MacOS X (KeepassX), ведь только она запускалась под всеми операционными системами, которыми я пользуюсь. Были жалкие попытки переписать Keepass под Cocoa, но дальше анонсов сторонних разработчиков не пошло. И вот я решил разобраться, что же такое “1Password anywhere” и наконец-то уйти от Keepass.</p>

    Идея была описана в статье разработчиков 1Password "1Password 3 Feature Spotlight: 1PasswordAnywhere". Возможно функция будет работать и в 1Password версии 2, я не испытывал.

    Read on →

  • Система web-статистики Woopra и исследование её сетевой активности при помощи Wireshark

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

    Дальше я использовал всяческие кнопки рейтингов со сбором статистики, но их наличие вступало в притиворечие с моим чувством прекрасного, и я быстро от них избавился. И наконец-то (на самом деле все методы я пробовал параллельно) я остановился на службах Google Analytics, Яндекс.Метрика и Woopra. Последняя система меня покорила всерьёз и надолго - в отличие от других систем она не только показывает активность посетителей в режиме реального времени (а у того же Google Analytics задержка на сутки), но и имеет красивый desktop-клиент, написанный на Java, что даёт возможность его запускать под Windows, MacOS и Linux.

    Описывать Woopra я не буду - посмотреть её функциональность можно на сайте. Покажу свой скриншот закладки Dashboard:

    Системой я пользуюсь давно и с удовольствием, но вчера @andy_shev обратил моё внимание на то, что при открытии этого блога в Opera раз в несколько секунд идёт странная сетевая активность, будто бы делается обновление страницы. Конечно же, как только зашла речь об исследовании сетевой активности, я привычно применил Wireshark, установку которого описал в статье "Готовимся анализировать сетевой трафик при помощи Wireshark".

    Открываю сайт http://theapplegeek.ru. Запускаю Terminal.app, затем консольную утилиту tshark:

    sudo tshark -i en1 -R 'http.request.method == "GET"' \
      -T fields -e frame.time -e http.host -e http.request.uri
    
    • sudo Для захвата трафика требуются права администратора, sudo даёт их, запрашивая пользовательский пароль. Обратите внимание, что пользователь должен иметь права на администрирование компьютера (это выставляется в настройках учётной записи), иначе sudo выдаст сообщение "username is not in the sudoers file. This incident will be reported".
    • -i en1 Указывается интерфейс, который нужно прослушивать. Обычно en0 - ethernet, en1 - AirPort, но можно уточнить, запустив команду ifconfig. К сожалению мета-интерфейс "any", позволяющий слушать трафик по всем интерфейсам, под MacOS не срабатывает.
    • -R ... Read (display) filter, определяет, что захватывать нужно только трафик, удовлетворяющий критерию.
    • http.request.method == "GET" Критерий отбора - HTTP-запросы GET, стандартные обращения к web-серверам.
    • -T fields Выводить поля из пакетов, перечисленные далее в параметрах "-e".
    • -e frame.time Время прихода пакета.
    • -e http.host Имя хоста (поле Host: после запроса "GET /uri HTTP/1.1).
    • -e http.request.uri URI.

    Название полей можно найти в "Display Filter Reference", например в описании полей протокола HTTP. Второй вариант - можно захватить трафик в Wireshark, затем выделить интересующее поле, тогда в левой нижней части экрана на статус-баре будет отображено имя поля. Для того, чтобы появилась возможность захвата трафика в Wireshark, самый простой способ - его нужно запустить из Terminal.app командой "sudo wireshark".

    Вернёмся к Woopra. Отсеяв трафик других программ (dropbox, facebook и т.д.), получаем такие такие запросы:

    Sep 19, 2009 19:08:19	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=0&ra=1XMYR9XSLF7RF0HND2BDK1QBEH3CZ4LT
    Sep 19, 2009 19:08:39	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=0&ra=PVXARGWAEXFQ25WAIEF4VJYEMKX65WBW
    Sep 19, 2009 19:08:41	theapplegeek.ru.woopra-ns.com		/ping/cookie=ZO50TUOUOY37S133MNWTOB42QVKN3DE9&ra=IHN8DUX5C8ZAF5S4VV1AOBA4Y8ZDF643
    Sep 19, 2009 19:08:50	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=0&ra=C2A88WBRW8S41PZFU9LLYZHTSCGP31C4
    Sep 19, 2009 19:08:52	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=0&ra=DF1OD4USZAHPQKWOO65JZTL30LMLDZL4
    Sep 19, 2009 19:09:06	theapplegeek.ru.woopra-ns.com		/ping/cookie=ZO50TUOUOY37S133MNWTOB42QVKN3DE9&ra=BPE9FX2TKVLEQUZ01ZXTADRI2WSDJVJ0
    Sep 19, 2009 19:09:11	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=0&ra=5ENUMAPTVGCFTYTVYE5BUPJ8RDD5V0RV
    Sep 19, 2009 19:09:23	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=0&ra=93RKHH6CEI6EZ42K7O70DHSOM6R90JJD
    Sep 19, 2009 19:09:24	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=0&ra=Y16BXDE2TY94LSQD00JY9YOUMBU28FKB
    Sep 19, 2009 19:09:31	theapplegeek.ru.woopra-ns.com		/ping/cookie=ZO50TUOUOY37S133MNWTOB42QVKN3DE9&ra=N08KNNMAQGODTJMP6U2M3LBW5HZZA8QZ
    Sep 19, 2009 19:09:44	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=0&ra=LDM2WTP08FQAIKXGGAS4OEUQR9I9F9BG
    Sep 19, 2009 19:09:55	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=24&ra=QB20A1LXW26Q3D65RCC4O7ZDYGE7LA8N
    Sep 19, 2009 19:09:57	theapplegeek.ru.woopra-ns.com		/ping/cookie=ZO50TUOUOY37S133MNWTOB42QVKN3DE9&ra=6YM6J00Q88JJPPYASVS37H7KJSZLDL6L
    Sep 19, 2009 19:09:57	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=36&ra=3VFUBJWJ9YYJEKZJ9IKLGKX05V6T4FLF
    Sep 19, 2009 19:10:16	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=37&ra=0U415OZXXXU576SV69RZ05KQNEBO2N85
    Sep 19, 2009 19:10:22	theapplegeek.ru.woopra-ns.com		/ping/cookie=ZO50TUOUOY37S133MNWTOB42QVKN3DE9&ra=V4O1MR9G6069857YPHMIRVB02SSPVEDZ
    Sep 19, 2009 19:10:28	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=57&ra=8L8WI1IPX8JKXUF6JSX9906Z13X0WOB2
    Sep 19, 2009 19:10:30	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=68&ra=57QDITV9DPDW8SORHAE27OXBW08PU0W7
    Sep 19, 2009 19:10:47	theapplegeek.ru.woopra-ns.com		/ping/cookie=ZO50TUOUOY37S133MNWTOB42QVKN3DE9&ra=0CDQK2WA823UIX2IQID5SR9WVTBOJI7A
    Sep 19, 2009 19:10:49	woopra.com.woopra-ns.com	/ping/cookie=DQHSOKCE25U9U37JYSOPC9FXNR3FPOEM&idle=0&ra=U03MO0VLYO3TWJJUE9VZKCW0H59A8J48
    

    Т.е. видим, что при открытии сайта с установленной статистикой Woopra из браузера посетителя идут регулярные обращения на сервера статистики Woopra. Размер каждого пакета 256 байт, в минуту имеем порядка 4-8 запросов или же 1-2 KB трафика. Конечно же, это немного, но если посетитель заходит через дорогой GRPS, то подобные системы статистики могут нагнать достаточно много трафика.

    Что же это за обращения? Ответ прост - Woopra отслеживает, находится ли посетитель на сайте, или уже ушёл с него путём регулярной отсылки "keepalive ping". Именно так реализована функция "With Woopra, you get live track of visitors coming and going and moving through your site".

    Однако нужно признать - Woopra система хорошая и отслеживать посетилей "real-time" иначе невозможно. Детали о реализации функции можно прочитать в блоге Woopra в статье "Long Time Visitors in Woopra Are Not Really “Stuck”, They’re Just Idle". Каждый владелец сайта сам принимает решение, использовать такую систему, или нет. Но теперь мы благодаря Wireshark знаем об этой особенности Woopra. И, продолжая анализировать сетевую активность, будем знать и о поведении других программ.


  • Готовимся анализировать сетевой трафик при помощи Wireshark

    Одним из полезнейших инструментов для исследования сетевого трафика является Wireshark. Это кроссплатформенная программа, доступная для MacOS X в частности и для Unix в общем, для Windows. Консольную часть я даже видел на сетевом оборудовании под управлением какого-то проприетарного диалекта Unix. Кроссплатформенность - это огромное достоинство, но для MacOS оно же является и недостатком - для запуска GUI требуется X Window (я его ставлю всегда, но некоторым придётся доставать диски с дистрибутивом MacOS X и его доставлять), и интерфейс программы вызывает отнюдь не самые тёплые эмоции (с внешним видом можно смириться, но есть проблемы с копированием, отработкой клавиатурных комбинаций и прочие мелочи, не дающие нормально работать). Поэтому для MacOS (да и для других Unix) я использую консольную часть, в основном это tshark.

    Read on →

  • Требуется менеджер окон

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

    Остаток пути я размышлял об оконных менеджерах Gnome, KDE, Enlightenment в сравнении с Apple. А потом вспомнил о полезной программе "SizeUp", которую недавно купил, устав от ручной максимизации на весь экран окон в MacOS. Учитывая функциональность, её также можно назвать "менеджером окон". Используя настраиваемые клавиатурные комбинации, можно всячески менять раположение и размер активного окна:

    Read on →

  • Отладка файловой активности процессов с помощью DTrace, или как написать деинсталлятор

    Предупреждение: я не претендую на полноту изложения и с точки зрения опытного системного программиста под MacOS X часть статьи может выглядеть бредом :-) Но мой метод работает, и его можно рассматривать как взгляд системного администратора на MacOS X.

    Недавно мне попалась на глаза новость об обновлении деинсталлятора "Yank - Your Mac's Uninstaller". Он отрабатывает самые сложные случаи - когда программа устанавливается не только перетаскиванием в Applications, но и с помощью инсталлятора, когда достаточно много файлов записывается в разные каталоги. Краткое описание программы есть на DeepApple. Yank следит за файловой активностью инсталлятора и записывает в отдельный файл перечень устанавливаемых файлов, а далее, используя этот файл, может всё чисто деинсталлировать. Также есть онлайн-сервис, который содержит файлы для удаления более 150 программ, т.е. можно удалять программы, которые были установлены до начала использования Yank.

    Yank - это пример программы, которая выстроена вокруг нескольких команд в shell. Я хочу продемонстрировать принцип, по которому она работает, а заодно продемонстрировать очень мощную технику отладки - DTrace.

    Read on →

  • Творческое применение Dropbox для списывания торрентов

    Бывает, что прочитаешь статью и говоришь себе: "Вау! Какая идея! Мне этого очень не хватало". Как раз такую статью я прочитал вчера на Lifehacker.

    Я периодически качаю торренты (да, таким образом я списываю дистрибутивы Linux ;-). Но удобнее и дешевле всего это делать с машины, подключенного в Интернет по безлимитному тарифу (я использую два подключения в Интернет - один безлимитный, другой с оплатой по трафику, так сложилось). У меня есть слабый компьютер, находящийся где-то в районе кладовки, на нём стоит Linux, и там запущен консольный клиент rtorrent, наблюдающий за появлением torrent-файлов в каталоге watch, и автоматически их закачивающий. Под Mac то же самое может делать Transmission (самая нижняя опция "Auto add: watch for torrent files in..."):

    Раньше процесс добавления торрента был мучителен - сначала на ноутбуке или на рабочей станции я списывал torrent-файл, а дальше через scp (бывало, что через два промежуточных хоста) копировал его на машину с rtorrent. Долго и неудобно.

    И вот вчерашняя статья открыла мне глаза на элегантное решение. Скажу одно-единственное слово: "Dropbox". И всё становится понятным.

    Создаём на сервере каталог ~/Dropbox/Private/Watch (конечно же, Dropbox должен быть установлен и настроен), настраиваем rtorrent или Transmission на автоподхватывание из этого каталога файлов, Dropbox синхронизируется на всех компьютерах. И теперь в этот каталог можно забросить torrent-файл на любом рабочем месте, и torrent начнёт закачиваться. Приходим домой, а файлы скачаны.

    Можно пойти ещё немного дальше. В описанном сценарии нужно ложить файлы вручную. А можно поставить Hazel, и в нём настроить автоперенос torrent-файлов из каталога ~/Downloads (куда списываются все файлы из браузера) в наш ~/Dropbox/Private/Watch.

    Если вы ещё не используете Dropbox, вы просто обязаны его посмотреть, базово этот сервис бесплатен. А если будете регистрироваться, то можете сделать мне приятное - зарегистрируйтесь по моей реферальной ссылке, и я получу лишние 250 MB бонуса :-)