Analitycs

суббота, 7 апреля 2012 г.

Немного о РИТ++ 2012

Съездил на РИТ++ 2012...

Если честно - уже лет так как 6-7 на конференции не "ездун", а тут была возможность - решил воспользоваться. Как оказалось - не зря, были достаточно интересные доклады.

 Выкладываю немного фото, не все мне нравятся - ну да и шут с ним.

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




Прелюдия















Обратите внимание  - у коллеги на MacbookAir крутится Windows - достаточно необычное сочетание. К слову сказать, концентрация яблок на квадрадный метр - зашкаливала, ноуты с Бубунтой были редкостью.



Докладчики 



 Почему-то самым фотогеничным из докладчиков оказался финн из PostgreSQL



Аль-Джазира

Badoo



Момент, когда докладчика из Google спалили за использованием iPhone - на что он отмазался - дескать, вот и рабочий Андроид (из другого кармана) - а это подарок любимой жены на Рождество и вообще - фото на iPhone - это доказательство того, что я ДЕЙСТВИТЕЛЬНО читаю  доклад на конференции в России, а не пью с друзьями в ближайшем пабе. ;-) ;-)



Обед

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



А в это время в кулуарах

Интриги, скандалы, расследования ;-)








Доклады

На client-side отделение не ходил (ну не мое ;-) ) - послушал доклады по backend, db, sysadm и немного общего руководства

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

Тезисы всех докладов http://ritconf.ru/2012/abstracts/ 

Развитие темы Skyrim - Peter Hollens & Lindsey Stirling

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

Заинтересовался, увидев в  RSS ленте - новостях одного Скайримовского сайта. Полазил по Ютубу - девушка очень талантлива. 
В результате - получаем отличные видео - Lindsey Stirling выдает смесь хорошей музыки, танца, небольшого сюжета + и зачастую косплея.

Немного накидаю тут ее роликов, чтобы далеко не ходить. ;-)




"She makes my day" (с)

пятница, 30 марта 2012 г.

Webmoney для Mac, а затем - и для iOS?

Сегодня вышел клиент Webmoney для Mac OS X.


Разумеется, ставлю и пробую - Webmoney - одна из тех немногих вещей, ради которых я держу в виртуалке Windows.

В целом, впечатления от этого клиента достаточно необычное - ждал совершенного другого...

Но, видимо, в ближайшее время нужно ждать клиента Вебманей и для iOS - под iPhone/iPad. Как бы интерфейс об этом даже не намекает - он просто кричит во все горло - "потрогай меня" (с). ;-)

Хотя лично мне это скорее напомнило новый мобильный Windows.






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

Посмотрим, как будут развиваться события дальше.

В чем отличие junior от senior developer?

Разработчик-юниор на собеседовании
  • Будет радостно рассказывать про те два проекта, в которых он работал за последние 2 года
  • Назовет кучу методик, которые ПРОСТО НЕОБХОДИМО использовать для достижения блага вселенной в обозримом будущем  (водопад, scrum/agile, канбан и еще туеву хучу умных слов) - желательно наступление светлого будущего примерно через неделю
  • Мучительно ищет - какое еще умное слово или фреймворк написать в своем резюме
  • Напишет две рекомендации с телефонами и именами

Сеньор

  • Нормально расскажет "как это есть сейчас"
  • И скептически расскажет "на какие грабли вы наступите через какое-то время"
  • На вопрос про используемые методологии программирования - улыбнется. Методология разработки "через жопу" - еще всех переживет. ;-)
  • На вопрос о проектах - ответит вопросом на вопрос - "какой именно вас интересует"?
  • Долго перекраивает свое резюме, думая - "чтобы еще отсюда вырезать" ;-)
  • Рекомендации - "по запросу"

четверг, 29 марта 2012 г.

Facebook developer - ... is not a verified user.

Кстати, вы знаете, что принимать участие в разработке приложений для Facebook теперь могут только верифицированные пользователи?

Иначе - при добавлении пользователя даже в группу Тестеры(!) появится сообщение

Ivan Ivanov is not a verified user

И соотвественно, вот и  все - пользователь не добавляется.

Так что увы - нужно привязать телефон...

пятница, 23 марта 2012 г.

Как посмотреть версию прошивки на Samsung Wave 3 (s8600)?

Для того ш-ш-што бы ус-с-снать, а что с-с-собственно, за прош-ш-шивка в телефончике в кармаш-ш-шке, горлум, горлум, набираем с-с-своими скольс-с-скими пальчиками

*#1234#

и радуемс-с-с-я, моя прелес-с-сть.

суббота, 17 марта 2012 г.

MD5 проверка PHP, Python и MySQL

Несколько лет поймал одну особенность - md5 суммы посчитанные в PHP и MySQL отличались(!!!) - но хоть убей не помню на каких версиях.

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

PHP

php -r "echo md5('domains.txt');"
aeae2f628c54f10054e5c70076e1237b

md5sum

# echo -n "domains.txt" | md5sum
aeae2f628c54f10054e5c70076e1237b 

Python

# echo "import md5;print md5.md5(\"domains.txt\").hexdigest()" | python
aeae2f628c54f10054e5c70076e1237b

MySQL

SELECT MD5('domains.txt');

aeae2f628c54f10054e5c70076e1237b

Уф, отпустило ;-) Приступ паранойи навеян вот этой заметкой.

четверг, 15 марта 2012 г.

Logging в Tornado

После большого рефакторинга проекта на Tornado пропало логгирование в stdout. То есть ошибки писались только в stderr, который выводился в лог сидящего уровнем выше сервиса  Supervisord (который за сервисом, собственно говоря, и наблюдал).

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

tornado.options.parse_command_line()

То есть должно быть примерно так

def main(): 
    application = tornado.web.Application([ 
        (r"/", MainHandler), 
    ]) 
    # this line will setup default logging no matter if you use command options 
    tornado.options.parse_command_line()
    logging.info("starting torando web server") 
    http_server = tornado.httpserver.HTTPServer(application) 
    http_server.listen(8888) # hardcoded port 
    tornado.ioloop.IOLoop.instance().start() 

После восстановления строчки-"беглянки" лог торнадовского приложения выглядит как положено


mneradkov@mneradkov-thinkpad:~/workspace/mysuperproject$ ./webapp.py 
[I 120315 16:33:28 mixins:28] [INFO] Directory [/home/mneradkov/workspace/mysuperproject]
[I 120315 16:33:28 mixins:28] [INFO] Connected to MySQL [xx.xx.xx.xx:xxxx]
[I 120315 16:33:28 mixins:28] [INFO] Connected to memcache [127.0.0.1:11211]
[I 120315 16:33:28 mixins:28] [INFO] 
[I 120315 16:33:28 mixins:28] [INFO] Server [My Super Server] version [X.Xalpha] binded to [127.0.0.1:11100]
[I 120315 16:33:28 webapp:37] Starting I/O loop to serve requests...

понедельник, 12 марта 2012 г.

Как синхронизировать Google c Bada (Samsung Wave 3) ?

Если вы пользователь Google и нужно засинхронизировать ваш аккаунт с телефоном на Bada (в моем случае - это Samsung Wave 3), то необходимо проделать следующие телодвижения.



  • Создаем Exchange ActiveSync аккаунт
  • Вводим имя-логин-пароль, но оставляем поле domain пустым
  • Затем нажимаем далее и после того как проверка будет неуспешной - в поле Server URL вводим m.google.com и выставялем галочку для SSL
  • Заодно выставляем галки синхронизировать и Календарь, Адресную книгу и Задачи. (Кстати - явный баг - при выборе одной галки СРАЗУ начнется синхронизация, в итоге у меня девайс синхрился 4(!) раза ;-) ) 

  • Теперь с этой странной зверюшкой можно как-то жить ;-)

    Вообще забавная платформа - воспринимается как Android без приложений от Google

    Подрезано тут

    четверг, 1 марта 2012 г.

    Как удалить все папки .svn от subversion?

    Есть у subversion (в отличии от git) не очень удобная особенность хранить служебную информацию в скрытых папках .svn. При каких-то манипуляциях с переносом каталога они жутко раздражают. Быстренько их удалить

    find . -name .svn -exec rm -rf {} \;
    

    среда, 29 февраля 2012 г.

    Как правильно деплоить Python сервис запущеный через supervisord?

    Иногда supervisord заглючивает и он неправильно определяет необходимость перекомпиляции pyc файлов при обновлении python файлов, что при деплое новой версии сервиса на Python приводит к забавным, но неприятным эффектам

    Рекомендуемый порядок действия

    # supervisorctl stop my_super_service
    

    Теперь обновляем файлы, затем РУЧКАМИ удаляем pyc

    # find path_to_my_service -type f -name "*.pyc" -delete
    # supervisorctl start my_super_service
    

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

    понедельник, 27 февраля 2012 г.

    Ищу Python developer - Junior, СПб


    Ищу будущих коллег и хороших людей:


    Обязанности:

    Разработка и сопровождение серверной части проекта Омлет.ру (легальный видео-контент);

    Что хотим  от вас?

    • Хороший опыт работы с бекендами сайтов
    • Опыт разработки на Python или устойчивое желание его изучить - при наличии знаний других языков (С#, PHP, Perl , Ruby);
    • Знание MySQL;
    • Аналитический склад ума,
    • Коммуникабельность,
    • Знание основ ООП,
    • Самообучение и саморазвитие,
    • Чувство юмора и адекватность - обязательно.

    Вы кандидат нашей мечты, если...

    • уже работали с Python
    • есть опыт работы с no-SQL решениями,
    • есть опыт работы с высоконагруженными веб-сервисами/сайтами - не стесняйтесь показывать портфолио - нам это интересно;
    • владеете хорошей математической базой;
    • знаете и применяете различные языки программирования, новейшие технологии,
    •  владеете английским языком
    Если есть практический опыт Tornado/Twisted - вам большой такой плюс, перекрывающий многие минусы.

    Что мы предлагаем?

    • Возможность забросить PHP - вам еще не надоело? 
    • Работу в большом и интересном проекте
    • Офис - ст. метро Василеостровская + 5 минут ходьбы - и то прогулочным шагом 
    • Неординарные задачи
    • Полностью белое оформление и ЗП
    • Повышенный отпуск - как компенсация за ненормированный рабочий день
    • Корпоративную симку для связи
    •  После испытательного срока - ДМС

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

    Omlet.ru HD в Android Market

    Вот собственно - релиз приложения Omlet.ru для Android планшетов.

    Ставим и смотрим фильмы в хорошем качестве на таблетках.

    суббота, 25 февраля 2012 г.

    Studio XIII - resin garage kits, figures & scale models

    Пять лет назад, 24 февраля 2007 года (как потом выяснилось - в самый холодный день той зимы ) мы поженились с Татьяной “Ведьмой” - мое второй половинкой.

    До этого, а затем и - после этого мы сделали много совместных “проектов” - начиная от дочки Киры и заканчивая большим количеством фигур и моделей и парой книг. Так как мы до сих пор не прибили друг друга за уже почти 10 лет знакомства, то думаю - дальше будет уже проще...

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

    Блог Studio XIII - фигурки аниме на заказ, модели, resin garage kits

    Мы не видим смысла копировать туда статьи со ScaleModels.ru - поэтому будем выкладывать туда просто краткие анонсы наших работ. Сейчас там далеко не все, что сделано за эти годы, так что - заносите блог в закладки и подписывайтесь на RSS ленту.

    Но как всегда - не бывает радостных событий без ложки дегтя. Если честно - мы не очень хорошо владеем графическим дизайном (аэрограф и кисточка как-то привычней ), поэтому - в честь пятилетия нашей свадьбы и открытия нашего блога мы хотим объявить небольшой конкурс на создание логотипа нашей студии.

    Принять участие в этом конкурсе может любой зарегестрированный участник ScaleModels.ru

    Требования и личные пожелания к логотипу

    краткость-лаконичность, мы не очень любим чрезвычайно сложные логотипы с 1000 мелких разноцветных "деталюшек" немногоцветность (2-3 цвета не больше) желательно - логотип должен отражать то, чем мы занимаемся, то есть - фигуры и модели.

    Участие в конкурсе


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

    Призы

    В качестве моральной компенсации за столь тяжелую психофизическую нагрузку призер-победитель получает от наc следующие "плюшки":

    • плакат и сумку с фотографиями нашей работы Alita Rebirth 
    • cсылку на свой сайт/блог с нашего блога и самого ScaleModels.ru (разумеется - если только автор не занимается всякими запретными в приличном обществе вещами) 
    • большое человеческое спасибо, почет и уважение. 
    • ну и на выбор - либо скидка 30% на один заказ нашей работы, либо подарок - один garage kit нашего производства - Kakashi-sensei или Hidden position


    Что за второй garage kit? Он будет объявлен немного позже, нам осталось доделать совсем немного

    Заранее спасибо за участие!

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

    Анонс на ScaleModels.ru

    Яндекс-Директ - консультации от сотрудников Яндекса

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

    Вот и в этот раз.

    Яндекс-Директ открыл помощь вебмастерам по адресу advice@partner.yandex.ru, написал туда.

    Очень вежливо отписали и посоветовали, в принципе ту вещь над которой я давно задумывался, так что применил - раз уж такое подтверждение пришло.

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

    Источник

    пятница, 24 февраля 2012 г.

    Tornado AsyncHTTPTestCase: AssertionError: Async operation timed out after 5 seconds

    Тестирование в Торнадо (особенно асинхронных сервисов) имеет много неочевидных нюансов.

    Ситуация

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

    class MyAsyncHandler(tornado.web.RequestHandler):
    
        @tornado.web.asynchronous
        def get(self, *args, **kwargs):
            try:
                # тут чего то берем с внешнего сервера
                self.auth_request({})
            except Exception, ex:
                self.error('Async - %s'%ex)
                self.reply(None)
    
    
        def auth_request(self, params, callback=None):
            url = self.application.settings['external_service'] + '?' + urlencode(params)
    
            if not callback:
                callback = self._on_load
    
            http = httpclient.AsyncHTTPClient()
            http.fetch(url, callback, validate_cert=False)
    
        def _on_load(self, response):
            # обрабатываем полученные результат        
            pass
    

    То при написании юнит-тестов через AsyncHTTPTestCase в подобном ключе по официальной документации(!!!)

    class MyTestServer(AsyncHTTPTestCase):
        def get_host(self):
            return 'http://%s:%d'%(SERVER['host'], SERVER['port'])
        
        def get_app(self):
            myserver = MyServer()
            myserver.run(SERVER['host'], SERVER['port'])        
    
            return myserver.app # приложение Tornado
        
        def get_response_obj(self, url, **kwargs):
            if len(kwargs) > 0:
                url += '?' + urllib.urlencode(kwargs)
            
            logging.info('Request [%s]'%url)
    
            self.http_client.fetch(url, self.stop)
            response = self.wait()
            
            print response
    
            if response.body: 
                return response.body
            
            return None
    

    При запуске тестов начинаем ловить потрясающие спецэффекты,

    Traceback (most recent call last): 
      File "/home/xxxx/test_wait.py", line 9, in test_1 
        self.wait(timeout = 5) 
      File "/xxxxx/site-packages/tornado/ 
    testing.py", line 169, in timeout_func 
        timeout) 
    AssertionError: Async operation timed out after 5 seconds 
    
    
    Лечится это добавлением в класс теста переопределенного метода get_new_ioloop

    class MyTestServer(AsyncHTTPTestCase):
        ....
        
        def get_new_ioloop(self): 
            return ioloop.IOLoop.instance()  

    Такие дела...

    Тема в гуглогруппеGist с примером

    среда, 22 февраля 2012 г.

    Vanessa Paradis+M "La Seine" (Монстр в Париже)

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

    Сам мультик тоже очень достойный. В-общем - "it make my day" (c)

    суббота, 18 февраля 2012 г.

    ASUS Eee PC 901 - Нетбук для графомана

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

    Проверка, можно ли работать с текстом на Asus Eee PC 901 в полевых условиях. Несколько непривычно, но все таки можно — теперь, гуляя с мелкой, видимо буду не только читать книжки про покраску фигурок, но и что-то набирать. Прежде всего — эта машинка бралась именно как мелкий помощник, который можно всегда носить с собой.

    К сожалению, как читалка книг нетбук оправдал себя не полностью — да, читать PDF на нем все-таки МОЖНО (в отличии от коммуникаторов на PocketPC) но в местах, где много людей (например, в метро) — практически невозможно.

    1. устройство все таки слишком большое, чтобы держать его в одной руке 
    2. тука непривычная, в отличие от телефона и привлекает излишнее внимание окружающих
    3. Перелистывание страницы присходит по нажатию Fn+курсорные стрелки, а это требует держать устройство двумя руками 
    4. Под стандартный Xandros пока не нашел программы разворота экрана — думаю деражать его в книжном развороте все таки удобней


    Так что пока применене следующее - выкатил коляску с «маленькой человекой» на улицу, сел на скамеечку — и можно графоманствовать.

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

    Клавиатура — это да, больное место, но в принципе — можно приноровится. Честно говоря, думал - будет хуже. На мой взгляд — для записи «потока сознания» для последующей обработке на большом брате - вариант вполне удачный. Несколько неудобно смещение цифровых клавиш на 1 влево, так что систематически промахиваюсь. Кстати, нужно посмотреть — есть ли у него возможность подключить какую нибудь раскладную клавиатуру? типа как Belkin для PocketPC

    Что понравилось — так это время жизни аккумулятора. 4-5 часов держит совершенно спокойно при выключенных беспроводных интерфейсах.

    Многие вещи после Мака вызывают недоумение — бешеное количество различных индикаторов и лампочек, маленький и неудобный тачпад, отсутсвие подсветки клавиатуры, интерфейс некоторых программ производит ощущуение воспаленного мозга — например «Рисуем с пингвином» - я надеюсь мой ребенок никогда не увидит этого ужаса. Видимо, изменения в мозгу «поциента» после использования Mac действительно необратимы ;-)

    Firefox'а вполне хватает для чтения почты и новостей, но при одновременно запущеном Gmail и Google Reader в режиме энергосбережения субноут(или все-таки нетбук?) немного подтормаживает, стоит проверить этот нюанс на высокой производительности.

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

    При подготовке этого текста ни одного ребенка не пострадало.

    пятница, 17 февраля 2012 г.

    Blogger - Sorry, dynamic views aren't available for this blog.

    В динамическом режиме показа блога на Blogger.com выводится сообщение

    Sorry, dynamic views aren't available for this blog. 
    

    Это возможно в трех случаях:

    1. Если блог приватный. 
    2. Если на блоге нет RSS лент. 
    3. Если на блоге в лентах показываются обрезанные сообщения (short feeds).
    Так что не включаем обрезание постов, только что накололся на этом.

    вторник, 14 февраля 2012 г.

    Cicero Valentine Card

    Единственная валентика, которая понравилась ;-)

    Sanguine is red
    Dead lips are blue
    The last victim suffers
    And so will you

    И да, я басурманских праздников не отмечаю - кроме Св. Патрика ;-)

    понедельник, 13 февраля 2012 г.

    Отстрелялись с серией Tsukasa Bullet

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

    суббота, 11 февраля 2012 г.

    Как проверить string ли переменная в Python? - isinstance(val, basestring)

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

    Все ли помнят что строки в питоне разные? (например, str и  unicode), так что для общей проверки нужно использовать isinstance(val, basestring):

     Например

    $ python
    Python 2.7.1 (r271:86832, Jul 31 2011, 19:30:53) 
    [GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
    Type "help", "copyright", "credits" or "license" for more information.
    
    >>> isinstance('abcd', str)
    True
    >>> isinstance('abcd', basestring)
    True
    >>> isinstance(u'abcd', str)
    False
    >>> isinstance(u'abcd', basestring)
    True
    

    пятница, 10 февраля 2012 г.

    Как запускать периодические задачи на Tornado? PeriodicCallback!

    Продолжая тему периодических задач в Twisted, в Tornado это делается немного по другому - с помощью специального tornado.ioloop.PeriodicCallback.

    Примерчик - если кому пригодится

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    
    import tornado.web
    import tornado.httpserver
    import tornado.ioloop
    
    PERIOD = 30 # в минутах
    
    class MyApplication(tornado.web.Application):
    
      def period_run(self):
        # чего-то тут делаем
        pass
    
    ...
    
    app = MyApplication(handlers=urls, **settings)
    
    http_server = tornado.httpserver.HTTPServer(app, xheaders=True)
     
    loop = tornado.ioloop.IOLoop.instance()
    period_cbk = tornado.ioloop.PeriodicCallback(app.period_run, 1000*60*PERIOD, loop)
    
    period_cbk.start()
    
    loop.start()
    

    вторник, 7 февраля 2012 г.

    Как сделать hard-reset на LG Optimus Black?

    Шаманство с зажатием Volume Down + Power + Home при включении не прокатило, может граната у меня не той системы?

    В итоге - hard-reset через коды

    dial 3845#*970#

    Разумеется - все данные похерятся.


    понедельник, 6 февраля 2012 г.

    Сервер боевой или production? - или лингвистические особенности

    Забавный лингвистический факт.

    Сервера, на которых крутятся сайты/сервисы для клиентов:

    • в английском языке они всегда называются production server - PRODUCTION, то есть производственные. 
    • в русском же языке сплошь и рядом - БОЕВЫЕ сервера. То есть - те, на которые идешь в бой, соответсвенно - либо победишь, либо проиграешь.

    Ох, не спроста имеется эта разница в национальных названиях... ох не спроста ;-) ;-)

    пятница, 3 февраля 2012 г.

    Как перезапустить демонизированный процесс в Supervisord?

    Если в supervisord запущено несколько процессов и один из них отвалился, не нужно перезапускать демон целиком - есть консольная утилитка supervisorctl.

    # supervisorctl
    api-test-data                    RUNNING    pid 22443, uptime 1 day, 16:52:01
    api-test-empty                   FATAL      Exited too quickly (process log may have details)
    auth-service                     RUNNING    pid 22444, uptime 1 day, 16:52:01
    

    Ага, вот процесс-виновник - перезапускаем халявщика

    supervisor> start api-test-empty
    api-test-empty: started
    
    supervisor> status
    api-test-data                    RUNNING    pid 22443, uptime 1 day, 16:52:29
    api-test-empty                   RUNNING    pid 27360, uptime 0:00:13
    auth-service                     RUNNING    pid 22444, uptime 1 day, 16:52:29
    supervisor> 
    

    Все ОК - "13 секунд, полёт нормальный. Хьюстон, у нас НЕТ проблемы" (с)

    вторник, 31 января 2012 г.

    Python/PHP - запятая - казнить нельзя помиловать

    Сегодня ловлю баг в сервисе - в JSON-результате вместо поля с integer  выдается список элементов-integer, то есть вместо

    data : {
      'id' : 1
    }
    

    упорно получаю

    data : {
      'id' : [1]
    }
    

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

    Через несколько минут доходит - начинаю истерически хохотать

    def bla-bla(self, args): 
        data = {
          'bla-bla' : bla_bla,
          'name' : name,
          'id' : temp_id,
        }
      return data
    
    

    Правлю один символ - все работает. После хохота начинаю вспоминать хорошего PHP team-leader, с которым работал много-много лет назад.

    Он был большим аккуратистом в плане чистоты форматирования кода и железнобетонно приучил меня расставлять меня запятые в ассоциативных массивах в КАЖДОМ элементе, включая последний.  Так как в случае необходимости быстро переставить элементы в коде - не пришлось бы искать потенциальную ошибку c пропущенной запятой.

    А для Python - это собственно - сокращенный формат списка-последовательности.

    Так что вот вам прекрасный пример того, что старые привычки часто вредят, а иногда - вредят ОЧЕНЬ сильно. "Казнить нельзя помиловать" (с)   ;-)

    Ну и верный вариант - БЕЗ запятой ;-)

    def bla-bla(self, args): 
        data = {
          'bla-bla' : bla_bla,
          'name' : name,
          'id' : temp_id
        }
      return data
    
    

    понедельник, 30 января 2012 г.

    Javascript+Flash мультизагрузчики картинок (SWFUpload, Uploadify) и Error #2038

    Иногда мультизагрузчики изображений с использованием Flash (SWFUpload, Uploadify и т.д) дают ошибку #2038 при загрузке на случайных картинках без всяких видимых причин.

    Как выяснилось - может быть целая куча разномастных серверных проблем - причем проблем преимущественно backend'овских.

    TODO-list
    • обновляем Flash загрузчик до последней версии;
    • проверяем, что POST приходит на сервер в скрипт загрузки нормально - без всяких HTTP авторизаций, сессии нормально передаются, пользователь распознается залогиненным и т.д.;
    • и внимание - ЭПИЧНАЯ ОШИБКА: Размер разрешенных вложений должен быть <= размеру upload_max_filesize в php.ini;

    И только потом лезем в настройки сервера - для nginx решение

    Открываем nginx.conf и в http секцию добавляем директиву

    client_max_body_size 500m;  

    И удаляем из конфига директиву keepalive_timeout

    Через некоторое время, когда у пользователей обновится кеш браузера - начинает все работать

    пятница, 27 января 2012 г.

    Python implode/join - TypeError: sequence item 0: expected string, int found

    Одна из частых функций в PHP проектах - implode/explode.

    На Python (по идее/по мануалу) это делается так

    tmp = [1,2,3,4,5]
    ','.join( tmp )

    Но в результате - получаем ошибку TypeError: sequence item 0: expected string, int found

    Проблема - в том, что у нас числа, а не строки

     В итоге - нужно так

    ','.join( map( str, tmp ) )
    '1,2,3,4,5'
    

    Но вот пресловутое неявное приведение типов-то в PHP как помогает, а? ;-)

    четверг, 26 января 2012 г.

    Google Adsense/Adwords + Translate

    Сегодня увидел то, что заставило глубоко задуматься...
    Смотрим первое объявление... и видим ничто иное - как использование автоматического перевода Google Translate для показа рекламного объявления с ЯПОНСКОГО языка для показа на РУССКОМ сайте.

    Интересно - давно ли это внедрено? Как бы раньше такого - не замечал, информации в публичном доступе не проскакивало

    Какой плюс для рекламодателей, однако.

    Update: как указали в комментах на Хабре: Это не автомат, а ручной режим, но действительно с помощью GoogleTranslate

    "Действительно ручной перевод объявлений на другой язык — это распространенное явление: http://adwords.blogspot.com/2009/10/translate-your-adwords-campaigns-with.html "

    А жаль, идея автоматического перевода объявления "под сайт" была бы интересной.

    И да, конечно же (разумеется) - там заметку загнали в минуса, что как бы намекает ;-)

    среда, 25 января 2012 г.

    Как узнать установленную версию Apache?

    Для Red Hat дистрибутивов От рута
    # httpd -v
    Server version: Apache/2.2.17 (Unix)
    Server built:   Oct 19 2010 16:27:47
    
    От простого смертного
    # ps aux | grep httpd
    web     1152  1.6  0.7 314296 62168 ?        S    00:42   0:03 /usr/sbin/httpd
    
    # /usr/sbin/httpd -v
    Server version: Apache/2.2.17 (Unix)
    Server built:   Oct 19 2010 16:27:47
    
    Либо
    # rpm -qa|grep httpd
    httpd-2.2.17-1.el5
    httpd-tools-2.2.17-1.el5
    
    Для debian-based, понятное дело - httpd заменить на apache2.

    вторник, 24 января 2012 г.

    От Arena до Skyrim - Заглавные темы из всех Elder Scrolls

    Услышав характерные напевы старпёристые старые геймеры пускают скупую крокодилью слезу, молодое поколение - недоумевает...
    Я, пожалуй, отношусь к старому поколению - начинал с Arena, но уже был Daggerfall - и он поглотил меня надолго, как и Morrowind.

    К Oblivion отнесся гораздо спокойней, но все таки прошел, теперь закончил и Skyrim. Хорошо, но мало - ждем до едрени фени разных DLC.

    Если кто не в курсе...
    • 00:00 The Elder Scrolls I: Arena 
    • 00:31 The Elder Scrolls II: Daggerfall 
    • 01:22 The Elder Scrolls III: Morrowind 
    • 02:28 The Elder Scrolls IV: Oblivion 
    • 03:09 The Elder Scrolls V: Skyrim

    пятница, 20 января 2012 г.

    Как полноценно включить UTF-8 для MySQL?

    Что нужно добавить в /etc/my.cnf для полноценной поддержки UTF-8 в MySQL, включая вывод данных в консоли mysql


    [mysqld]
    default-character-set=utf8
    default-collation=utf8_general_ci
    character-set-server=utf8
    collation-server=utf8_general_ci
    init-connect='SET NAMES utf8'
     
    [client]
    default-character-set=utf8
     
    [client]
    default-character-set=utf8
    

    четверг, 19 января 2012 г.

    Python PIP не работает под MacOS X 10.7 Lion - pkg_resources.DistributionNotFound: pip==1.0.2

    На новой машинке чудеса с PIP и MacPorts следующего вида - система не видит установленного PIP через MacPorts

    Диагноз

    $ pip
    Traceback (most recent call last):
      File "/usr/local/bin/pip", line 5, in 
        from pkg_resources import load_entry_point
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 2603, in 
        working_set.require(__requires__)
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 666, in require
        needed = self.resolve(parse_requirements(requirements))
      File "/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python/pkg_resources.py", line 565, in resolve
        raise DistributionNotFound(req)  # XXX put more info here
    pkg_resources.DistributionNotFound: pip==1.0.2

    Самолечение

    Не совсем грамотно, но вроде помогло - установка PIP через easy_install
    curl -O http://python-distribute.org/distribute_setup.py
    sudo python distribute_setup.py
    sudo easy_install pip
    

    среда, 18 января 2012 г.

    mysqldump: Got error: 1449: The user specified as a definer ('user'@'x.x.x.x') does not exist when using LOCK TABLES

    Диагноз

    При попытке сдампить базу MySQL получаем ошибку

    mysqldump: Got error: 1449: The user specified as a definer ('user'@'x.x.x.x') does not exist when using LOCK TABLES
    

    Причина - отсутсвует пользователь который прописан в хранимых процедурах/триггерах.

    Похоже, что эта ошибка возникает, когда исходный/изначальный дамп MYSQL импортируется в сервер с ключем "force" (-f - который игнорирует ошибки), а потом его пытаются сохранить с этой машины.

    Лечение

    Вариант 1

    Правим хранимую процедуру и дампим заново

    use mysql;
    select * from proc;
    

    Вариант 2

    1. Создаем пользователя

    GRANT ALL PRIVILEGES ON *.* TO 'misseduser@*' IDENTIFIED BY 'some_pass' WITH GRANT OPTION
    

    2. Дампим базу

    3. Правим в дампе куски с отсутсвующими пользователями на CURRENT_USER Ищем что-то типа

    /*!50013 DEFINER=`missed user`@`some_host` SQL SECURITY DEFINER */
    

    и

    DEFINER=`some_user`@`some_host`
    

    заменяется на

    DEFINER=CURRENT_USER
    

    По мотивам этой заметки.

    вторник, 17 января 2012 г.

    Email от PHPBB падает в spam

    Диагноз и причина

    Оповещения от русской версии PHPBB падают в спам.

    X-Amavis-Alert: BAD HEADER SECTION, Non-encoded 8-bit data (char D3 hex): 
       Subject: 323342345344356354353345355350345 356341 
       356[...] 
    X-Spam-Flag: NO 
    X-Spam-Score: 4.301 
    X-Spam-Level: **** 
    X-Spam-Status: No, score=4.301 tagged_above=-10 required=5 
       tests=[BAYES_50=0.8, RCVD_IN_DNSWL_NONE=-0.0001, 
       SUBJECT_NEEDS_ENCODING=0.049, SUBJ_ILLEGAL_CHARS=1.518, 
       TO_NO_BRKTS_MSFT=1.934] autolearn=no
    

    subject уходит с сервера в iso-8859-1/quoted. В этой кодировке русских букв нет.

    Subject: 
       =?iso-8859-1?Q?=D3=E2=E5=E4=EE=EC=EB=E5=ED=E8=E5_=EE=E1_=EE=F2=E2?= 
       =?iso-8859-1?Q?=E5=F2=E5_=E2_=F2=E5=EC=E5_-_=D7=F2=EE_=ED=E5_=ED=F0=E0=E2?= 
       =?iso-8859-1?Q?=E8=F2=F1=FF_=ED=E0_=F1=E0=E9=F2=E5?=

    Хотя тело сообщения - нормально в Windows-1251

    MIME-Version: 1.0
    Content-type: text/plain; charset=windows-1251 
    Content-transfer-encoding: 8bit 
    

    Лечение


    Нужно изменить кодировку Subject на необходимую с русскими буквами(win1251, utf8, koi8r).

    файл

    PHPBB_DIR/include/emailer.php

    после строчки

    $this->subject = (($this->subject != '') ? $this->subject : 'No Subject');
    

    Добавляется

    $this->subject = '=?'.trim($lang['ENCODING']).'?B?'.base64_encode($this->subject).'?=';
    

    И после - вуаля

    X-Spam-Flag: NO 
    X-Spam-Score: 0.034 
    X-Spam-Level: 
    X-Spam-Status: No, score=0.034 tagged_above=-10 required=4 
       tests=[BAYES_00=-1.9, RCVD_IN_DNSWL_NONE=-0.0001, 
       TO_NO_BRKTS_MSFT=1.934] autolearn=no
    
    
    По материалам этой темы, спасибо коллеге BW4ever за баг-репорт

    пятница, 13 января 2012 г.

    Установка Ubuntu с помощью Wubi - редкостное гуано

    Мое знакомство с десктопными Linux (в отличие от серверных) обычно происходило достаточно эпизодически - поставил-настроил-поигрался-забыл.

    Еще в 90 годы несколько раз пытался полноценно мигрировать на Linux различных версий - BlackCat, RedHat и т.д. обычно эти попытки заканчивались тем, что потрахавшись с настройкой Иксов, модема и прочего - я настраивал все что можно, успешно выходил в интернет через модем и через пару недель возвращался обратно в Windows, а Линукс тихонько гнил на своем разделе.

    Уже в 2000 было примерно тоже самое с Mandrake, Fedora и Ubuntu, потом я пересел на Mac и ставил Ubuntu как десктоп исключительно на рабочих машинах - когда не было возможности получить привычную среду.

    Поэтому, получив ноутбук Lenovo T420s с Windows 7 на борту я честно (но без особого успеха) попытался работать на нем пару недель в чуждой среде, но сдался и решил воткнуть туда Ubuntu... Увы - первая установка сдохла при попытке установить пакет с Compiz.

    Вторую установку я решил сделать через  Wubi - никогда им не пользоватся -  посмотрел, идея вроде интересная - "поставить Никсы прямо из Винды" - удобно.

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

    Сегодня получаю дамп базы с production-сервера (большо-о-о-ой, вкусный такой дамп ;-) ), начинаю его разаархивировать - и машина умирает. LA 3 с хвостиком, консоль реагирует с задержкой в несколько десятков секунд.

    Непонятненько, ну да ладно, подождем.

    Затем начинаю вкатывать дамп в базу - и машина умирает снова - LA до 4, все приложения реагируют с огромной задержкой, в топе висит mysql и какой-то процесс префикс_не_помню.ntfs. Я в непонятках - какое, казалось бы, ntfs отношение имеет к mysql?

    Отключаю все подключенные виндовые диски - не помогает. Подумав с коллегами - решаем его кильнуть - этот странный мифический процесс

    sudo kill xxxx.ntfs
    

    Через 2 секунды - kernel panic... У меня ступор - начинаю думать, перегружаюсь, и что-то мне начинает не нравится - я начинаю подозревать неладное.

    Вообщем, немного поковырялся - и мы все начали истерически ржать.

    Выяснилось, что эта хрень под названием Wubi создает раздел на NTFS как файл и монтирует его как ext3 через FUSE!!! В результате все это работает... даже не скажу - во сколько десятков раз медленней, чем обычно, и разумеется - вкатывание дампа на много-много ..байт приводит к полным тормозам.

    Итог
    1) "убить упрямую тварь" (с) и ставить Бубунту обычным путем. Не уверен - удастся ли нормально мигрировать ЭТО хотя бы в виртуалку VirtualBox
    2) ВНИМАТЕЛЬНО читать - чего пишет незнакомые софтинки, особенно - мелким шрифтом ;-)

    среда, 11 января 2012 г.

    Проблемы у Lenovo T420s под Ubuntu с подключением 2го монитора

    Столкнулся с забавной проблемой  - Lenovo T420s на док-станции под Ubuntu не видит внешнего монитора через HDMI порт.

    Кстати, через VGA у дока - тоже оказалось не все гладко, ибо тогда включается либо зеркальное отображение (одинаковая картинка и там и там), либо - на втором мониторе пустой рабочий стол, и окошки туда не перетащить (можно поменять местами по Fn+F7). Ну и заодно - разрешение и там и там одинаковое, что привело к размытому изображению на внешнем мониторе

    Найдено простое GUI решение.

    Устанавливается ARandR


    И через него - спокойно меняются разрешения, и что самое интересное - нормально таскаются окошки.

    Не иначе - как какое-то "злобное колдунство" (с). Вопрос с HDMI пока остается открытым.

    понедельник, 9 января 2012 г.

    Как подключить Яндекс-Спеллер (Yandex-Speller) к PHPBB?

    Есть у Яндекс одна хорошая штука, до которой у меня долго не доходили руки...  а именно - проверка орфографии в формочках ввода - Яндекс-Спеллер. Оказалось, что зря откладывал - не так сложно.

    Как подключить к форуму PHPBB2 (как модуль на RunCMS)? По идее - в чистом PHPBB2/3 не должно сильно отличаться, разве что файлы  будут другие, скорей всего...

    1) Разместить на сайте папку с самим спеллером в /class/xoopsform/yandex_speller/ Затем

    2) файл include/viewtopic_quickreply.php
     
    $addon_html = '
    <script type="text/javascript" src="'.XOOPS_URL.'/class/xoopsform/yandex_speller/spell.js"></script>
    
    // YandexSpeller 
    
    var speller = 
    
    new Speller({ url:"/class/xoopsform/yandex_speller", lang:"ru", options:Speller.IGNORE_URLS });
    // Настройка параметров проверки http://api.yandex.ru/speller/doc/dg/reference/speller-js.xml  
    
    <button name="cmdSpell_message" onclick="speller.check([document.getElementById(\'message\')])" type="button">'._CORE_CHECK_ORPHO.'</button>
    ';
    
    $template->assign_vars(array(
      'U_POST_SQR_TOPIC' => 'javascript:sqr_show_hide();',
      'SQR_IMG' => $images['quickreply'],
      'L_POST_SQR_TOPIC' => $lang['Show_hide_quick_reply_form'],
    
      'L_EMPTY_MESSAGE' => $lang['Empty_message'],
      'L_QUICK_REPLY' => $lang['Quick_Reply'],
      'L_USERNAME' => $lang['Username'],
      'L_NO_TEXT_SELECTED' => $lang['Qreply_no_text_selected'],
      'L_SUBJECT' => $lang['Subject'],
      'L_MESSAGE_BODY' => $lang['Message_body'],
      'L_PREVIEW' => $lang['Preview'],
      'L_SUBMIT' => $lang['Submit'],
      'S_POST_ACTION' => append_sid("posting.php"),
      'S_HIDDEN_FORM_FIELDS' => $hidden_form_fields,
      'ADDON_HTML' => $addon_html,
      )
    );
    

    где _CORE_CHECK_ORPHO - наш новый языковой дефайн, 'ADDON_HTML' => $addon_html, - добавленная строчка в код и шаблон.

    3) правим шаблон

    Особо расписывать не вижу смысла - все просто как грабли.


    Как подключить спеллер к формам - читать тут.
    Полное API
    Навеяно вот этим хаком

    суббота, 7 января 2012 г.

    Что за user-agent Apple-PubSub?

    В статистике увидел незнакомый User Agent - Apple-PubSub.



    Просмотры страницы по браузерам

    Apple-PubSub 170 (36%)
    Firefox 92 (19%)
    Internet Explorer 64 (13%)
    Opera 58 (12%)
    Chrome 35 (7%)
    Safari 28 (5%)
    NS8 8 (1%)
    Qt 8 (1%)
    Mobile 2 (<1%)
    Mobile Safari 2 (<1%)

    Как оказалось - это стандартная RSS утилита для MacOS, работающая через библиотеку/утилитку PubSub (например, RSS в скринсейвере). Подробности тут.

    Кстати, удивлен сравнительно приличным количеством просмотров на Internet Explorer - казалось бы - этим-то что на моем блоге делать? ;-)

    пятница, 6 января 2012 г.

    Как оптимизировать RunCMS? или Оптимизация CMS для начинающих

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

    RunCMS - достаточно неплохая система, дружественная для новичка в Web, которая позволяет худо-бедно, но решить большинство типовых задач для небольшого сайта одним приемом - «из коробки». Однако сайты имеют свойство либо умирать, либо развиваться, и в случае когда ваш ресурс выходит из категории «homepage про меня и моего хомячка Вову» (c) - начинаются проблемы с производительностью. Ситуация осложняется тем, что большие и серьезные CMS (такие как Drupal или Joomla) давно прошли этот этап «детских болезней» и способы решения подобных проблем для них давно известны и доступны. К сожалению, крупных проектов на RunCMS встречается не много, и информации о ней очень мало. На правах бывшего coreteam разработчика RunCMS я хочу рассказать о способах увеличения ее производительности.

    Данная статья не предназначена для полных новичков - подразумевается, что вы в состоянии отличить PHP от Perl, способны разбираться в чужом коде, и примерно представляете архитектуру RunCMS (или XOOPS-like систем). Желательно, чтобы вы знали что такое my.cnf и где его искать ;-)

    Есть два варианта хостинга - обычный и VPS/VDS.

    Обычный хостинг

    В плане оптимизаций - это жопа (если вкратце). Особенно если у вас провайдер, который не хочет ставить дополнительный софт и его настраивать. Начиная этак от 500 уников в день - готовьтесь к прессингу с его стороны - «давайте-ка переедем на выделенный сервер» (с) Один мой прошлый хостер на просьбу установить поддержку mbstring на свой шаред-хостинг спросил - «А зачем он вам нужен?» Но в принципе, мигрировать на свой сервер - это логичный вариант.

    Что можно сделать для оптимизации RunCMS непосредственно в ней самой на SHARED хостинге?

    MySQL таблицы для сессий

    Находим MySQL таблицу sessions и конвертируем ее в тип MEMORY (если стоит PHPBB - то такая судьба должна постигнуть и phpbb_session) Этим мы выиграем небольшое количество скорости - но на КАЖДОЙ страницы сайта. Единственный минус - после перезагрузки сервера всем пользователям прийдется перелогиниваться, но результат того стоит.

    Кэш страниц для гостей-анонимусов

    Включаем кэширование страниц для гостей на как можно большее время - однако учитывайте, что для этого нужно хотя бы 50-100 мб свободного места на диске?

    Включаем кэширование MySQL средствами класса DB

    class/database/mysql.php

    <?php
    
        var $file_cache = true;
    
    ?>
    
    

    Это то, что можно было сделать нормальными ШТАТНЫМИ способами RunCMS, а теперь начинаем экспериментировать

    Файл-кэш SELECT запросов

    Изучаем код сайта и модулей, добавляя для тяжелых запросов кэширование через метод

    <?php
    
    $db->query($sql, false, false, ‘имя_файла’,  время_кэширования)
    
    ?>
    
    

    ставя подходящие значения. Учитывайте только то, что кэш отрабатает только в том случае если результат запроса будет прогнан через fetch_row или fetch_array , а вот fetch_object в текущей версии не кэшируется?

    Скомпилированное ядро

    Включаем экспериментальное компилированное ядро (класс RCCoreApi) файл class/core.php

    <?php
    
    var $compiling = true;
    
    ?>
    
    
    Данное «ядро» была введено мной в версии 1.6.1 - оно позволяет сэкономить примерно 6 SQL запросов на каждой странице, но несколько повысит нагрузку на PHP.

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

    Вообще если вы любознательны и способны экспериментировать и разбираться с чужим кодом - внимательно изучайте стандартные классы RunCMS 1.6.1 и 1.6.2.

    Немного яда и кидания какашек

    Несмотря на то, что netshark просто вышвырнул меня из разработки RunCMS и вычеркнул из списка живых team, а впоследствии - передал код в лапы Farsus, который ее успешно и угробил :-) - в коде осталось много экспериментальных неофициальных настроек для увеличения производительности сайта

    Например -

    Кэш деревьев

    Установить в классе xoopstree.php

    <?php
    
    define('RC_TREE_CACHE', 1); 
    
    ?>
    
    
    это сильно поможет при работе с большими деревьями категорий - в таких модулях, как news, например

    Кэширование блоков

    Если внимательно посмотреть на табличку newblocks - вы увидите поле cache_time. При установке его в целое положительное значение N, блок будет закэширован на N минут. Обратите внимание - кэшировать имеет смысл только те блоки, которые выглядят ОДИНАКОВО для всех пользователей - если содержимое блока будет разным, то возможен конфликт.

    RCCache и RCCachedPage

    Использование классов RCCache и RCCachedPage, написанных совместно с Shurik2k5. В репозитории RunLiveCMS можно найти версии этих классов не только для файлового кэша (как в RunCMS), так и в базу MySQL и Memcache - что предпочтительней, с (или без) serializing данных

    Настройка выделенного сервера (VPS/VDS)

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

    Ниже только ОБЩИЕ рекомендации, куда стоит смотреть
    • Имеет смысл поставить PHP акселератор - на моем сервере стоит Zend Optimizer + eAccelerator. 
    • Тщательно настроить сервер MySQL - не забывайте про кэш запросов самого сервера и ограничение по времени медленных запросов
    • После настройки Apache - отключите access логи на картинках, оставив для них только error
    • Имеет смысл избавиться от .htaccess файлов, снеся все редиректы и настройки непосредственно в httpd.conf
    • Повесить на front-end (перед Apache) nginx и настройте его на отдачу статических файлов (таких как картинки, CSS, JS) - либо вообще отказаться в пользу Nginx + PHP-FASTCGI.
    • Используйте RAM-диск для критичных файловых кэшей - в моем случае туда сохраняется файловый кэш класса DB, compiled_kernel, блоки и кэши некоторых страниц
    • Обязательно используйте программы top, mtop и apachetop для мониторинга своей системы - ведь лучше вас ее не знает никто

    По настройке выделенных серверов написано достаточно много, в частности тут - про Nginx, PHP, Memcache и тут про MySQL и насморки.


    В моем случае - самый сильный выигрыш был от введения (по порядку важности)
    • Гостевое кэширование
    • Nginx
    • настройка MySQL
    • RAM диски на кэши кусков страниц, блоков и темплейтов форума /modules/forum(ну или phpBB2)/cache (всего около 200МБ RAM) - у меня форум, статьи и главная страница - основная нагрузка
    • eAccelerator
    • Таблицы сессии в MySQL MEMORY

    Все остальное, честно говоря - из разряда "экономить на спичках" - не помешает, но без этого можно обойтись

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

    Изначально было опубликовано тут.

    четверг, 5 января 2012 г.

    Как исправить Permissions 0644 for '/Users/xxx/.ssh/id_dsa' are too open.


    При миграции на новый комп после переноса SSH ключей через флешку при коннекте к удаленной машине появляется следующая ошибка

    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    
    @         WARNING: UNPROTECTED PRIVATE KEY FILE!          @
    
    @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
    
    Permissions 0644 for '/Users/xxx/.ssh/id_dsa' are too open.
    
    It is recommended that your private key files are NOT accessible by others.
    
    This private key will be ignored.
    
    bad permissions: ignore key: /Users/xxx/.ssh/id_dsa
    

    Лечится это следующим - нужно выставить права 700

    cd ~/.ssh
    chmod 700 id_rsa
    

    среда, 4 января 2012 г.

    Стартапы: Одевайте штаны по вашему размеру (Нецензурно)


    Еще один перевод... далее неполиткорректно и вообще - с матом (из песни слов не выкинешь) ;-) Так что нервных и беременных женщин прошу не читать.

    Я работал с большим количеством инженеров из Силиконовой долины - некоторые из которых были ДЕЙСТВИТЕЛЬНО гениальны, а некоторые - эту гениальность просто хорошо подделывали. И одна из тенденций, которые я заметил - что большое количество действительно хороших инженеров замечены в том, что они любят меряться членами - когда дело доходит до практических реализаций.

    Вы начинаете проект с одним из подобных парней, и первая проблема, которую вам нужно решить - это то, что MySQL не собирается нормально масштабироваться... А в результате - нужно понять - как именно вы ВООБЩЕ  будете писать свою собственную систему хранения данных.

    После того, как этот вопрос "устаканится" - вам понадобится собственный объектно-реляционный маппер - и, заодно, вы можете также сделать и свой собственный веб-язык шаблонов... не - просто потому что это КРУТО, и он хорошо впишется в вашу архитектуру.

    Это, господа - мерянье членами, и это для стартапа - самая колоссальная трата времени.

    Сейчас в Северной Калифорнии хорошо известен факт - что я величайший программист, который когда-либо жил, но я даже стал жертвой этого явления. На моем последнем стартапе мы были абсолютно уверены, что мы загнали себя себя в угол, используя MySQL - поэтому мы написали наши собственные хранилища данных. Это начиналось как обертка RPC вокруг некоторого волшебного key/value хранилища на Erlang (параллелизм, ебать его), и в конечном итоге - закончилось как различные обертки вокруг RPC BerkeleyDB. В общем, это это хранилище прошло через три крупных переписывания, а конечный продукт был тем, для разработки чего потребовалось всего несколько месяцев - и он упадет при сравнительно умеренной нагрузке.

    Но стойте, ведь это была ДЕЙСТВИТЕЛЬНО прикольная архитектура.

    Как еще один небольшой пример - опять же на последнем стартапе в один прекрасный день  я потратил несколько часов на написание упреждающей нейронной сети на Java - просто, чтобы попробовать свои силы в реализации алгоритма. Опять же - небольшая трата времени, но на самом деле - наибольшей проблемой было мое отношение к ней, что означало более серьезную проблему: Я хотел посмотреть, насколько я крут (ответ: довольно-таки охуенно крут).

    И жертвами подобного становятся не только стартапы в квартирах. Kosmix, хорошо финансируемый научный проект, который обманул сам себя, думая, что он  может быть основным игроком в поиске, написал собственное хранилище данных на C++. Это был в основном клон GFS Google, потому что - "эй, если Google делает это, то мы должны тоже", не так ли?

    Кто знает, сколько времени, сил и денег было потрачено на это мерянье детородными органами? И ведь все это - время, деньги и энергия, которые могли бы пойти в создание своего конечного продукта - и это уже не шутка.

    Kosmix был поражен другим - он хорошо финансировался и предположил, что у них есть все свободное время мира. Может быть, серьезный инвестор и покупает у Вас ваше время, но когда вы проводите все это время за создание новой файловой системы (что не является основной задачей для вашего продукта), вы начинаете говорить с ним про следующий раунд финансирования, потом еще один - серии С, серии D, и так далее.

    К счастью, многие высокоуровневые инженеры не подверженны подобному распылению и мерянью. Или - к сожалению?

    В моем текущем стартапе у нас есть бизнес-ориентированное руководство. У нас есть хорошая команда, техники, и мы не позволяем нашему высокомерию высосать из нас лучшее. Среди стартапов есть очень немного случаев, когда ДЕЙСТВИТЕЛЬНО  нужно будет написать что-то свое - вроде новой файловой системы, и мы явно не один из них.

    Как предприниматель, вы должны быть горды вашей идеей, но теперь вы оцените - насколько велик член у вашего компилятора?

    Весьма вольный перевод вот этой заметки. Спасибо автору.

    Как адекватно перевести в данном dick-swinging - я так и не понял. Решил остановиться на варианте "мерянья детородными органами"