Analitycs

понедельник, 31 октября 2011 г.

Как переименовать home directory в MacOS?

Так как я свою текущую систему не очень грамотно восстанавливал из бекапа с TimeCapsule,  то у меня в имени пользователя появился пробел (/Users/michael_xiiii\ 1), в связи с чем я постоянно и ловил проблемы на различных компиляциях. Под конец меня это достало, и я решился мигрировать. Разумеется - перед миграцией необходимо тщательно забекапится.

Теперь - пошаговая инструкция, как переименовать папку пользователя в MacOS.

  1. Включить  root пользователя в MacOS (Надеюсь, что все в курсе - как это сделать?). 
  2. Войти как root. 
  3. Перейти в папку /Users. 
  4. Выберать главную папку с коротким именем, которую вы хотите изменить, и переименовать ее - как необходимо. Имейте в виду, что короткое имя должно быть все в нижнем регистре, без пробелов и содержать только латинские буквы. (прим. нижнее подчеркивание и цифры вроде тоже без особых проблем) 
  5. Использовать Пользователи и группы (Accounts в Mac OS X v10.6.8 или более ранней) в Системных настройках, чтобы создать нового пользователя с именем учетной записи или ником, которое использовалось в предыдущем шаге. 
  6. Нажмите OK, когда появится сообщение что "Такая папка Пользователя уже существует "ВАШ_LOGIN". Хотели бы Вы использовать эту папку для домашней папки для этой учетной записи"?  Примечание: Это исправит права доступа/владения - во избежание проблем.
  7. Выбрать "Выйти" из главного меню Apple. 
  8. Войти в качестве вновь созданного пользователя. 
  9. Вы должны получить доступ ко всем вашим оригинальным файлам (на рабочем столе, в документах и в других папках). Убедившись, что все ваши данные доступны, можно удалить старую учетную запись пользователя. 
  10. Отключить корневого пользователя.
Найдено у Apple.

33

Сабж, собственно.

Вроде недавно 16 отмечал, а уже 33 - и галактика до сих пор полностью не захвачена, к сожалению.

Ну хоть Apertur'у сегодня обновили - к фотографиям своим достучался. Почти праздник ;-)

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

Распространение приложений на twisted

Как выяснилось - nobody cares по поводу фигурок, так что продолжу сношать вам мозг выкладывать технические статьи и старые переводы.

Моя работа — создание различных приложений на Twisted для работы с многочисленными веб-сервисами. В отличие от проектов на TurboGears, которые я распространяю как eggs с помощью easy_install (через setuptools) у меня не было удобного способа «выкатить» проекты на Twisted.

До этого момента.

Twisted преодставляет удобную систему плагинов, которые позволяют приложениям встраиваться в «twistd» стартер.

Только одна проблема — полное отсутствие приличной документации об этом процессе.

Ниже я хочу привести небольшой рассказ о том, как можно собрать простое приложение в пакет twisted. На самом деле — я возьму известный туториал — Twisted finger и допишу шаг №12: «Как создать пакет для finger как приложение Twisted для twistd» (aka «Пропущенный шаг»).

Step 12: How to package the finger service as an installable Twisted application plugin for twistd

Создайте структуру каталогов, как показано ниже

finger
finger/__init__.py
finger/finger.py
MANIFEST.in
setup.py
twisted
twisted/plugins
twisted/plugins/finger_plugin.py

finger/finger.py — приложение finger отсюда. twisted/plugins — структура каталогов, содержит файл finger_plugin.py, который будет описан ниже.

Обратите внимание — никаких файлов __init__.py в каталогах twisted и twisted/plugins — это важно!

 finger_plugin.py реализует интерфейсы IServiceMaker и IPlugin.
# ==== twisted/plugins/finger_plugin.py ====
# - Zope modules -
from zope.interface import implements

# - Twisted modules -
from twisted.python import usage
from twisted.application.service import IServiceMaker
from twisted.plugin import IPlugin

# - Finger modules -
from finger import finger

class Options(usage.Options):
    synopsis = "[options]"
    longdesc = "Make a finger server."
    optParameters = [
        ['file', 'f', '/etc/users'],
        ['templates', 't', '/usr/share/finger/templates'],
        ['ircnick', 'n', 'fingerbot'],
        ['ircserver', None, 'irc.freenode.net'],
        ['pbport', 'p', 8889],
    ]
    
    optFlags = [['ssl', 's']]

class MyServiceMaker(object):
    implements(IServiceMaker, IPlugin)
    
    tapname = "finger"
    description = "Finger server."
    options = Options
    
    def makeService(self, config):
        return finger.makeService(config)

serviceMaker = MyServiceMaker()


setup.py стандартный файл установщика. Обратите внимание на аргументы «packages» и «package_data» в функции setup() и функцию- refresh_plugin_cache(), которая вызывается после того, как полностью отработает setup()s. Последняя вручную сбросит кэш плагинов Twisted (twisted/plugins/dropin.cache).
# ==== twisted/plugins/finger_plugin.py ====
'''setup.py for finger.

This is an extension of the Twisted finger tutorial demonstrating how
to package the Twisted application as an installable Python package and
twistd plugin (consider it "Step 12" if you like).

Uses twisted.python.dist.setup() to make this package installable as
a Twisted Application Plugin.

After installation the application should be manageable as a twistd
command.

For example, to start it in the foreground enter:
$ twistd -n finger

To view the options for finger enter:
$ twistd finger --help
'''

__author__ = 'Chris Miles'


import sys

try:
    import twisted
except ImportError:
    raise SystemExit("twisted not found.  Make sure you "
                     "have installed the Twisted core package.")

from distutils.core import setup

def refresh_plugin_cache():
    from twisted.plugin import IPlugin, getPlugins
    list(getPlugins(IPlugin))

if __name__ == '__main__':
    
    if sys.version_info[:2] >= (2, 4):
        extraMeta = dict(
            classifiers=[
                "Development Status :: 4 - Beta",
                "Environment :: No Input/Output (Daemon)",
                "Programming Language :: Python",
            ])
    else:
        extraMeta = {}

    setup(
        name="finger",
        version='0.1',
        description="Finger server.",
        author=__author__,
        author_email="you@email.address",
        url="http://twistedmatrix.com/projects/core/documentation/howto/tutorial/index.html",
        packages=[
            "finger",
            "twisted.plugins",
        ],
        package_data={
            'twisted': ['plugins/finger_plugin.py'],
        },
        **extraMeta)
    
    refresh_plugin_cache()

MANIFEST.in содержит одну строчку, которая, как я полагаю, указывает distutils изменить существующий пакет Twisted (для установки twisted/plugin/finger_plugin.py) и нечто наподобие. graft twisted Это все для того, чтобы можно было начать установку пакета обычным способом:

$ python setup.py install

После этого нужно запустить twistd — чтобы убедится, чтто приложение установилось нормально и доступно. Посмотрите на опции twistd:

$ twistd --help

Usage: twistd [options]

 ...

Commands:
 athena-widget Create a service which starts a NevowSite with a single
 page with a single widget.
 ftp An FTP server.
 telnet A simple, telnet-based remote debugging service.
 socks A SOCKSv4 proxy service.
 manhole-old An interactive remote debugger service.
 portforward A simple port-forwarder.
 web A general-purpose web server which can serve from a
 filesystem or application resource.
 inetd An inetd(8) replacement.
 vencoderd Locayta Media Farm vencoderd video encoding server.
 news A news server.
 words A modern words server
 toc An AIM TOC service.
 finger Finger server.
 dns A domain name server.
 mail An email service
 manhole An interactive remote debugger service accessible via
 telnet and ssh and providing syntax coloring and basic
 line editing functionality.
 conch A Conch SSH service.


Посмотрим опции нашего сервера finger в плагине:

$ twistd finger --help
Usage: twistd [options] finger [options]

Options:

 -s, --ssl 
 -f, --file= [default: /etc/users]
 -t, --templates= [default: /usr/share/finger/templates]
 -n, --ircnick= [default: fingerbot]
 --ircserver= [default: irc.freenode.net]
 -p, --pbport= [default: 8889]
 --version 
 --help Display this help and exit.

Make a finger server.


Запустим сервер finger в консоли:

$ sudo twistd -n finger --file=users

2007/12/23 22:12 +1100 [-] Log opened.
2007/12/23 22:12 +1100 [-] twistd 2.5.0 (/Library/Frameworks/Python.framework/
Versions/2.5/Resources/Python.app/Contents/MacOS/Python 2.5.0) starting up
2007/12/23 22:12 +1100 [-] reactor class: 
2007/12/23 22:12 +1100 [-] finger.finger.FingerFactoryFromService starting on 79
2007/12/23 22:12 +1100 [-] Starting factory 
2007/12/23 22:12 +1100 [-] twisted.web.server.Site starting on 8000
2007/12/23 22:12 +1100 [-] Starting factory 
2007/12/23 22:12 +1100 [-] twisted.spread.pb.PBServerFactory starting on 8889
2007/12/23 22:12 +1100 [-] Starting factory 
2007/12/23 22:12 +1100 [-] Starting factory 

twistd предоставляет многочисленные полезные возможности — такие как запуск демона, указания расположения лог и pid файлов и т.д…

К сожалению Twisted и setuptools не очень хорошо взаимодействуют вместе, так что я не смог упаковать мое приложение Twisted как egg, нужно повозится с системой разрешения зависимостей setuptools, или установить используя easy_install.

Ссылки



Источник, хабра

четверг, 27 октября 2011 г.

FG2241 Rei Ayanami Ballgown on Knees (anime Evangelion)

"Что это мы? все без молока и без молока.... так и помереть можно..." Кот Матроскин
"Чувствуешь запах? Это Mr.Surfacer, сынок. Больше ничто в мире не пахнет так." (с)

Чтобы у новых читателей блога не сложилось ощущения, что я сугубо технический человек, упёртый только в код и конфиги, разбавлю рабочие заметки моей "тёмной стороной" - очередным законченным заказом. Люблю я, знаете ли, запах грунта и краски по утрам... ;-)

Больше фото и подробностей тут.

И вообще - стоит ли тут давать анонсы подобных вещей - или "мухи - отдельно, котлеты - отдельно?" (с) и никому это неинтересно?

вторник, 25 октября 2011 г.

Сравнение нагрузки PyCurl vs HTTPClientFactory+Deferred в сервисе на Twisted

Решил перевыложить с хабры свое небольшое старое исследование по поводу производительности Twisted при использовании  PyCurl и HTTPClientFactory - пусть лежит все в одном месте, раз уж начал активно писать в блог.

В процессе разработки одного проекта на Python+Twisted (распределителя запросов между несколькими СМС гейтами Kannel) пришлось переписать вызов URL различных сервисов с разных серверов c блокирующего вызова через PyCurl на неблокирующий (client.HTTPClientFactory + deferred). Чтобы иметь перед глазами реальные данные о нагрузке, решил дать много запросов и посмотреть на результаты

Описание теста

Использовался Jakarta/Apache Jmeter - очень полезная софтинка, к сожалению, почему-то применяют ее для тестов достаточно редко (может, просто не знают о ее существовании?), но мне она весьма нравится - ибо возможности у нее большие и даже краткое описание наврядли влезет в несколько постов - если кому интересно, могу потом пробежаться по ней вкратце.
В 200 потоков прогнано 100 запросов на один и тот же сервер, но со случайными данными (чтобы исключить кэширование). Прогонялось на обыкновенной рабочей машине с GUI под Ubunta — так, для примерной оценки.

Результаты теста

Одна ошибка — не справилась база, так что погрешностью можно пренебречь.

Графики распределения

Блокирующий (PyCurl)
Неблокирующий (deferred)

Итоги

Как видно из результата теста — при одинаковой нагрузке при использовании defered минимальное значение отклика сервера почти в 2.5 раза меньше (из-за отказа базы), а максимальное — меньше в два раза, чем у блокирующего. Среднее значение - также меньше в 2 раза.

Америку я, конечно, не открыл, но по-крайней мере — теперь на руках конкретные цифры по производительности. Надеюсь, кому-нибудь они пригодятся.

понедельник, 24 октября 2011 г.

Как включить MySQL innodb_file_per_table?

В продолжение темы насморков и гильотины оптимизации MySQL привожу рецепт по включению такой полезной функции как innodb_file_per_table.

Зачем это нужно?

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

Что нужно сделать?

  1. Прежде всего - отрубаем нагрузку, выключаем связь сервер с внешним миром  - php и прочее беспокоить вас не должны - процесс не быстрый
  2. Теперь тщательно делаем ПОЛНЫЙ бекап всех баз данных и конфига
  3. Удаляем все таблицы из БД
  4. Выключаем mysqld
  5. В /etc/my.cnf удаляем старое значение innodb_data_file_path
    и добавляем

    innodb_data_file_path=ibdata1:10M:autoextend
    innodb_file_per_table=1

  6. удалаем cледующие файлы
    • /var/lib/ibdata1
    • /var/lib/ib_logfile0
    • /var/lib/ib_logfile1
    или сколько там файлов ibdata - оставлять старые logfile нельзя!!
  7. запускаем mysqld
  8. вкатываем таблицы обратно
  9. проверяем наличие свежесозданных файликов *.ibd
  10. PROFIT!!
Да, разумеется - операция опасная по сути, поэтому - бекап, бекап и еще раз бекап.

суббота, 22 октября 2011 г.

Немного о сборке программ с dylib в MacOS

Узнать, какие зависимости у файла к библиотекам

$ otool -L yourFile

На примере злополучной библиотеки MySQL для Qt

$ otool -L /Developer/Applications/Qt/plugins/sqldrivers/libqsqlmysql.dylib
/Developer/Applications/Qt/plugins/sqldrivers/libqsqlmysql.dylib:
 libqsqlmysql.dylib (compatibility version 0.0.0, current version 0.0.0)
 /opt/local/lib/mysql5/mysql/libmysqlclient_r.16.dylib (compatibility version 17.0.0, current version 17.0.0)
 QtSql.framework/Versions/4/QtSql (compatibility version 4.6.0, current version 4.6.2)
 QtCore.framework/Versions/4/QtCore (compatibility version 4.6.0, current version 4.6.2)
 /usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.9.0)
 /usr/lib/libgcc_s.1.dylib (compatibility version 1.0.0, current version 438.0.0)
 /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.2.11)

Включить показ динамически загружаемых библиотек runtime

# export DYLD_PRINT_LIBRARIES=1

В результате

$ nano dylib.log
dyld: loaded: /usr/bin/nano
dyld: loaded: /usr/lib/libncurses.5.4.dylib
dyld: loaded: /usr/lib/libSystem.B.dylib
dyld: loaded: /usr/lib/system/libmathCommon.A.dylib

Потом, разумеется, не забываем выключить в 0.

Изменить путь линкуемой библиотеки

$ install_name_tool -change /Developer/Applications/Qt/plugins/sqldrivers/libqsqlmysql.dylib @executable_path/libqsqlmysql.dylib ./dist/MyApp.app/Contents/MacOS/MyApp



Спасибо MikhailEdoshin