Analitycs

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

Денежные переводы с сайта Билайн.Деньги в страны ближнего зарубежья

А ребята из RURU времени не теряют ;-)

Билайн и универсальная платежная система RURU реализовали на сайте «Билайн.Деньги» сервис безадресных денежных переводов в страны ближнего зарубежья: Украина, Таджикистан, Армения, Грузия, Молдавия, Киргизия. В планах партнеров расширение географии переводов. Ранее абоненты «Билайн» могли совершать денежные переводы UNISTREAM (ЮНИСТРИМ) в страны СНГ, используя средства мобильного счета абонентов «Билайн», на сайте ruru.ru или при помощи SMS запроса на единый сервисный номер 7878. Также переводы были доступны через мобильное приложение «Платежный мир RURU» для смартфонов на базе Android и iOS. Теперь абоненты «Билайн» могут воспользоваться этой услугой на сайте «Билайн.Деньги» - money.beeline.ru.

Источник

Как переименовать 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

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

Настройка медленного MySQL - о насморках и гильотине

Последнее время часто вижу советы по оптимизации MySQL, в которых авторы сразу (не глядя на ситуацию) сразу рекомендуют - поставить Percona, поставить SSD.

Нет, конечно - варианты обновления софта и железа помогут - но этот как-то... лечить насморк гильотиной - быстро и точно пройдет. ;-) Давайте вспомним стоимость SSD - для компаний как бы пофиг, а для частного вебмастера - сумма в 500$ на дороге не валяется.


Мониторинг - всему голова

Разговор об оптимизации, на мой взгляд совершенно неразумно вести без мониторинга и построения графиков нагрузки по времени - я использую munin, кто-то любит zabbix, есть и другие. Ну да выбор - вопрос в большей степени религиозный, суть-то в следующем - некоторые админы очень любят поднять преждевременную панику при затормозившем сервере - дескать, вот я зашел!! у меня все тормозит !!!! и срочно кидаются все оптимизировать.

Стоять! ;-) Выдыхаем и думаем, теперь вдыхаем и продолжаем думать.

Вот если вы временно заболели насморком - следует ли вам прямо сейчас делать операцию по удалению гайморита? Вот и с сервером - не нужно делать скоропалительных выводов, основываясь на единичном срезе времени. В текущий момент может быть все что угодно - случайный всплеск активности ботов, забытый кем-то cron скрипт бекапа и так далее. "Ширше надо смотреть, товарищи" (с) Так что ставим мониторинг и смотрим как себя машина ведет в течении нескольких суток/недели.

Теперь немного советов для тех, кто не торопится с брутальными методами "а-ля гильотина" (с)

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

Дальше список типовых проблем mysqld

  • мало памяти на индексы (особенно критична нехватка памяти для таблиц InnoDB, MyISAM переживает ее более спокойно). Как косвенный признак - сильная загруженность диска - из-за нехватки памяти mysql отчаянно свапится/пишет tmp таблички на диск
  • много постоянно открытых коннектов к базе - уменьшаем - но опять таки - смотрим по времени - сколько РЕАЛЬНО используется.
  • для PHP - часто рекомендуют включать pconnect, на мой взгляд - оно того не стоит.
  • для InnoDB включаем innodb_table_per_file. Процесс миграции описан тут.
  • СПОРНО - если памяти много - рекомендуют загнать /tmp в RAM -> улучшится скорость работы с таблицами tmp, хотя мое мнение - если памяти хватает лучше просто дать базе памяти побольше - и временные таблички будут не нужны
  • смотрим внимательно на CurrentLockRation в результатах скрипта анализатора
    Current Lock Wait ratio = 1 : 8943
    Чем больше второе число - тем лучше.

Как увеличить Current Lock Wait? 

Тщательно изучать структуру своих таблиц и запросы - если часто идет запись, которая лочит таблицу - переводим на InnoDB, MyISAM оставляем для редко обновляющихся табличек, добавляем индексы и т.д.

Медленные запросы SQL

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

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

Через некоторое время сервер начал загибаться. При просмотре запросов к базе у меня зашевелились волосы на всех участках тела - там было что-то в стиле  JOIN ... GROUP BY CONCAT(SUBSTR(), SUBSTR())  и т.д. - уже сейчас точно не вспомню. 

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

Ну и пришлось переписывать код самому - с помошью нескольких простых запросов и мемкеша.

Итог

  • Мониторинг по времени
  • Изучение
  • И только потом - оптимизация


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

Как демонизировать(daemon) проект на Twisted?

Есть три способа демонизировать проект на Twisted.

1) использование родного демона twistd. По идее - это более "методически грамотный" способ, но в свое время что-то не завелся у меня "в лоб", по этому до сих пор применяю второй.

2) скрестить старый работающий демон с реактором Twisted

#!/usr/bin/python                                                                                               
import sys
import src.daemon
import procname

class YourServer(twisted.web.server.Site):
    pass

class YourDaemon(Daemon):
    name   = 'yourserverd'
    site   = None
    server = None

    #--------------------------------------------------------------------------
    def __init__(self):
        self.server = YourServer()
        Daemon.__init__(self, pidfile='/var/run/%s.pid' % (self.name.lower()) )
        procname.setprocname(self.name)

    #--------------------------------------------------------------------------
    def run(self):
        self.server = YourServer()
        reactor.listenTCP(self.server.port, self.server)
        reactor.run()

if __name__ == '__main__':
      daemon = YourDaemon()
      daemon.processAction(sys.argv)

Да, procname служит для переименования процесса, о чем писал тут.


3) есть еще правда и python-daemon (PEP-3143), надо бы повнимательней изучить, но думаю что родной twistd оптимальней.

Вопрос Python+Mac+Qt+MySQL+py2app

Джентельмены (ну и дамы, разумеется), а никто на Python под Мак/кросплатформенно, да еще и с особыми извращениями (Qt+MySQL) не пишет случайно? Да еще и все это извращение в приложения .app не собирает, случаем?

Есть проблемка, а спросить не у кого, приходится на StackOverflow постить вопросы.

Заранее спасибо!

Да, "мсье знает толк..." (с)

среда, 19 октября 2011 г.

Как настроить Nginx + php-fastcgi для Wordpress?

По просьбе Олега "TheAppleGeek" выкладываю рабочий конфиг Ngnix с php-fastcgi для Wordpress c включенным плагином W3 Total Cache
server {
    listen 80;
    server_name host.ru;
    index index.php;
    root /var/www/vhosts/host.ru/httpdocs;

    location ~ \.php$ {
                limit_conn three 20; 
                include         /etc/nginx/include.d/default_fastcgi_params.conf;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass    php;
    }

    location ~ /\.ht {
        deny all;
    }

    if (!-e $request_filename) {
        rewrite ^(.+)$  /index.php   last;
    }
}

и общий для всех хостов на машине /etc/nginx/include.d/default_fastcgi_params.conf
fastcgi_param  QUERY_STRING       $query_string;
fastcgi_param  REQUEST_METHOD     $request_method;
fastcgi_param  CONTENT_TYPE       $content_type;
fastcgi_param  CONTENT_LENGTH     $content_length;

fastcgi_param  SCRIPT_NAME        $fastcgi_script_name;
fastcgi_param  REQUEST_URI        $request_uri;
fastcgi_param  DOCUMENT_URI       $document_uri;
fastcgi_param  DOCUMENT_ROOT      $document_root;
fastcgi_param  SERVER_PROTOCOL    $server_protocol;

fastcgi_param  GATEWAY_INTERFACE  CGI/1.1;
fastcgi_param  SERVER_SOFTWARE    nginx/$nginx_version;

fastcgi_param  REMOTE_ADDR        $remote_addr;
fastcgi_param  REMOTE_PORT        $remote_port;
fastcgi_param  SERVER_ADDR        $server_addr;
fastcgi_param  SERVER_PORT        $server_port;
fastcgi_param  SERVER_NAME        $server_name;

# PHP only, required if PHP was built with --enable-force-cgi-redirect
fastcgi_param  REDIRECT_STATUS    200;

fastcgi_connect_timeout 60;
fastcgi_send_timeout 60;
fastcgi_read_timeout 60;

Aperture 3.2 падает после обновления случайным образом

Нет, определенно -  после моего отъезда Apple распоясалась - сегодня очередное подтверждение.

После обновления Aperture 3.2 случайным образом падает в самопроизвольных местах - да так, что работа напоминает хождение по минному полю - рванёт в любую секунду.

На форуме Apple уже 6 страниц гневных посланий и баг идентифицировали - если у вас старая машина с CoreDuo (не Core2Duo - это первые серии машин с Intel, 2006 год) и RAW файлы - вы почти обречены.

Пока единственный вариант - НЕ ОБНОВЛЯТЬСЯ на 3.2, оставаясь на Aperture 3.1.3

 - либо уже если поторопились и обновились - то спасет только восстановление из бекапа TimeMachine. Но при мысле о восстановлении 25 Гб лично мне как-то становится грустно.

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

Нет, Apple определенно уже не торт...  "Грусть-печаль" (с) ;-( 

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

py2app собирает .app с Qt4 без MySQL (libqsqlmysql.dylib)

Все чудесатей и чудесатей - сказала Алиса.
Все чудестраньше и чудестраньше

Мало того что, в Qt4 по умолчанию отсутствует поддержка MySQL - приходится докомпилировать  плагин из исходников, так еще и выяснилось, что при сборке .app пакета приложения py2app честно включает туда библиотеки Qt,  но забывает положить ее же plugins.

Лечение

$ macdeployqt ./dist/YourSuperPuperApplication.app


После непродолжительной ругани в консоли в .app появляется папка PlugIns - обратите внимание на большую I в центре названия.

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


$ cp -R /Developer/Applications/Qt/plugins/sqldrivers ./distYourSuperPuperApplication.app/Content/PlugIns/

После чего приложение вроде бы подхватило MySQL и попыталось взлететь... но, к сожалению -  грохнулось на взлёте по другой причине.

Но это, уже как говорится - другая история... ;-)

Одно не понимаю - толи лыжи не едут, то ли я... чего то не понимаю - почему такие сложности на каждом шагу? ЧЯДН?

locate/updatedb в MacOS

Когда постоянно переключаешься между системами - их мелкие различия (такие, как отличия в сервисах и командах) начинают безумно раздражать.

Например, всегда раздражает не работающий locate/updatedb в MacOS по умолчанию "из коробки.

Но если locate дает явную подсказку - чего и как запускать, чтобы заработало, до updatedb - просто отсутствует как класс.

# updatedn
sh: updatedb: command not found

Лечение

# sudo ln -s /usr/libexec/locate.updatedb /usr/bin/updatedb

# sudo updatedb
И теперь наслаждаемся нормально работающим locate. ;-)

Найдено тут

воскресенье, 16 октября 2011 г.

Как обновить MacPorts на MacOS X?

Вкратце - для тех кто не знаком, представляю MacPorts - система полноценных портов для красноглазиков любителей true-unix-way в MacOs.

Собственно - после их установки работаем как с обычным FreeBSD

# /opt/local/bin/port install py2app

Время от времени нужно делать обновление самих портов

# /opt/local/bin/port selfupdate

Но самый страшный вопрос - это как обновить MacPorts?

Отвечаю... примерно так



# port upgrade outdated

И можно идти курить, есть, спать... и все такое прочее ;-)

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

Python py2app: AttributeError: 'module' object has no attribute 'TickCount'

Симптомы

После запуска собранного с помощью py2app пакета для MacOS на другой машине получаем падение с ошибкой

AttributeError: 'module' object has no attribute 'TickCount'

Лечение

В файле setup.py отключить argv_emulation, то есть - поставить в False

APP = ['MyApp.py']
OPTIONS = { 
   'argv_emulation': False,
   ...
}

setup(
    app=APP,
    options={'py2app': OPTIONS},
    setup_requires=['py2app'],
)


Подробности тут

среда, 12 октября 2011 г.

PayPal в России заработал!

Не прошло и многих лет, как с сегодняшнего дня PayPal начал принимать платежи в Россию.

Это действительно - очень хорошие новости, но как водится - не бывает меда без дегтя -  пока вывести их можно только на счет в АМЕРИКАНСКОМ банке.  Думаю для 99.99% из нас означает, что вывод невозможен в принципе... но для нас, старых интернет-шопоголиков, это не принципиально. Как говорится - "Easy come - easy go" (с)

Вообщем, если кому нравится ScaleModels.ru, этот блог (хотя он вообщем-то - просто записная книжка по работе) и вообще то, что я делаю - могут теперь выразить благодарность более материально.

PayPal

Заранее большое спасибо!

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

Как узнать из какого каталога Python использует библиотеку? (import xxx)


$ python

Python 2.6.7 (r267:88850, Oct  8 2011, 08:42:47)
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.

>>> import PyQt4
>>> PyQt4

<module 'PyQt4' from '/Users/michael_xiii/Envs/py26/lib/python2.6/site-packages/PyQt4/__init__.py'>

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

Python - RuntimeError: maximum recursion depth exceeded while getting the str of an object

При активном использовании рекурсивных функций в Питоне начинает вываливаться ошибка RuntimeError: maximum recursion depth exceeded while getting the str of an object

Лечение быстрое, но не оптимальное

import sys
sys.setrecursionlimit(XXX)

Где XXX число, подбираемое экспериментально, основываясь на вашей программе. Но лучше, конечно, обходится без рекурсии. ;-)

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

Ошибка - Невозможно подключиться к базе данных QMYSQL (Mac, Python, Qt)

Симптомы

При запуске Qt приложения с MySQL ошибка "Невозможно подключиться к базе данных QMYSQL".

Причина

Отсутствие драйвера MySQL "из коробки" в каких-то вариантах Qt. Почему-то по умолчанию включают только SQLite.

Как лечить?

Скомпилировать драйвер самостоятельно, для чего умные люди написали вот такой скриптик.

Разумеется, не забываем поправить необходимую версию Qt и проверить, чтобы в путях не было пробелов. (У меня в username есть пробел, из-за чего время от времени ловлю различные проблемы с компиляторами)

PyQT на MacOS - Error: Unable to create the C++ code.

При сборке PyQt на MacOS вот по этому мануалу на команде

python configure.py

упорно вылезает ошибка

Error: Unable to create the C++ code.

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

Теперь сижу, курю - жду пока соберется. ;-)

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

3 дня отсутствия = iPhone(+), Steve Jobs(-)

Стоит только уехать на три дня как начинаются авралы
  • iPhone выпускают такой неполноценный, который, "панимаешь" (с) умеет звонить и работать, а не умеет думать за пользователя и причёсывать его собачку, заодно массажируя дистанционно соседа. Ну, короче - какашка, а не телефон.
  • Потом Стив Джобс помирает...
Они что там, совсем нюх потеряли и расслабились? Опять звонить, ругаться?

Ну а если серьезно - просто оставлю это тут.

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

Как бекапить проекты с помощью rsync, sshpass, scp?

Как известно, "админы делятся на две категории - те кто не делает backup, и те, кто его УЖЕ делает". (с)

Ежедневный бэкап

Как кому удобно - я делаю mysqldump базы на продакшене и потом rsync синхронизирую httpdocs и дамп на удаленную машину. Для авторизации - используются ключи.

#!/bin/bash                                                                                                      
DESTINATION=/var/www/vhosts/xxx/httpdocs                                                              
KEY="ssh -i /home/user/.ssh/scm_dsa -l xxx"                                                          
ORIG_HOST=user@xxxx                                                                                              
rsync -a -e "$KEY" --delete --exclude="${DESTINATION}/cache/*" $ORIG_HOST:${DESTINATION}/* ${DESTINATION}/

Недельный бэкап

Уже на удаленной машине архивирую засинхронизированную папку несколько раз и через несколько дней заливаю архив на backup-space. К сожалению, доступ в backup-машинам - только по ftp, поэтому приходится немного извращаться, используя для авторизации sshpass.

#!/bin/bash

VHOSTS_DIR=/var/www/vhosts
TMP_DIR=/mnt/backup
BACKUP_DIR=FTP_USER@XXXXX.XXX.XX:/

/usr/local/bin/sshpass -pFTP_PASSWORD scp ${TMP_DIR}/* ${BACKUP_DIR}scp -Cp ${TMP_DIR}/* ${BACKUP_DIR}

/etc/crontab

Да, разумеется - лучше всего делать эти процедуры тогда, когда народу на сайтах поменьше.

0 3 * * * root /home/user/bin/backup.sh >> /home/user/logs/backup.log
7 1 * * 0 root /home/user/bin/backup_weekly.sh >> /home/user/logs/backup_weekly.log

Как просмотреть битовые поля(bit fields) в MySQL?

Когда вы используете в таблицах MySQL битовые поля,  то стандартный консольный клиент их не показывает в результатах запросов.

mysql> select deleted from shopping_cart where id > 1000 and deleted = 0 limit 3;
+---------+
| deleted |
+---------+
|         | 
|         | 
|         | 
+---------+
3 rows in set (0.00 sec)

mysql> select deleted from shopping_cart where id > 1000 and deleted = 1 limit 3;
+---------+
| deleted |
+---------+
|        | 
|        | 
|        | 
+---------+
3 rows in set (0.00 sec)

Внимательный человек заметит, что у результатов команды отличается отступ.

Для того чтоб значение поля было показано явно, нужно в запросе либо добавить +0 к имени поля, либо вызвать функцию bin, как показано ниже.

mysql> select deleted+0 from shopping_cart where id > 1000 and deleted = 0 limit 3;
+-----------+
| deleted+0 |
+-----------+
|         0 | 
|         0 | 
|         0 | 
+-----------+
3 rows in set (0.36 sec)

mysql> select deleted+0 from shopping_cart where id > 1000 and deleted = 1 limit 3;
+-----------+
| deleted+0 |
+-----------+
|         1 | 
|         1 | 
|         1 | 
+-----------+
3 rows in set (0.01 sec)

mysql> select bin(deleted) from shopping_cart where id > 1000 and deleted = 1 limit 3;
+--------------+
| bin(deleted) |
+--------------+
|            1 | 
|            1 | 
|            1 | 
+--------------+
3 rows in set (0.01 sec)

mysql> select id,bin(deleted) from shopping_cart where id > 2000 and deleted = 0 limit 3;
+------+--------------+
| id   | bin(deleted) |
+------+--------------+
| 2001 | 0            | 
| 2002 | 0            | 
| 2003 | 0            | 
+------+--------------+
3 rows in set (0.00 sec)

Ну очень вольный перевод вот этого мана

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

Несколько аккаунтов Google - Не можете войти в Docs, Reager, Calendar?

У меня сейчас было такое.

Предыстория  - имеется несколько связанных аккаутнов Google - личный и рабочий на Google Apps.

После удаления аккаунта из Google Apps - не мог войти в личные Google Reader, Docs, Plus, причем Gmail работал отлично.

Лечится полной чисткой cookies и кеша браузера.