Analitycs

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

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

пятница, 30 декабря 2011 г.

Samsung GT-C3322 Duos + Mac + Kies + долгая телефонная история в довесок

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

неБОЛЬШАЯ предыстория

Я никогда не пользовался iPhone в течении долгого времени.

Изначально - как большой любитель Palm, пользовался их КПКшниками и отдельно мобильниками, потом достаточно долго - PocketPC (простыми и с телефонными модулями). Когда я заинтересовался Маками - у меня вовсю работал Asus 750 - достаточно неплохой по тем временам агрегат, который меня вполне устраивал.


Через несколько лет он начал издыхать, но проблема в том, что моем мозгу стоит какая-то черта - телефон более чем за 700$ должен еще как минимум стирать носки, выводить гулять ребенка, раздавать торренты и делать еще много каких полезных вещей. Моя же зеленая пресноводная жаба не понимает, что в случае iPhone за 30к ты получаешь все тоже самое, что и за 10, просто чуть лучше. Причем именно покупки Маков у нее приступов не вызывают, а вот на телефоны она почему-то она начинает меня душить, причем сильно-сильно.

В итоге, после того как мой Asus издох - плюнув и матюгнувшись я пошел и спонтанно взял один из самых дешевых Samsung - GT-E1175T за (как сейчас помню - 1390 рублей). На удивление - телефон умел не только звонить, принимать SMS, хранить контакты и играть радио, но и оказался достаточно крепкой электронной штучкой. Причем он доказал это работоспособностью в условиях эксплуатации в чрезвычайно агрессивной среде - квартире с мелким (и очень непоседливым) ребенком. В итоге - его (телефон) неоднократно роняли, грызли, кидали и есть подозрение - даже играли им в футбол.


 Отдельной скупой мужской слезы удостоился пункт меню ИГРА. Вы просекли фишку? Не "Игры", не "программы" - а именно ИГРА. Вдобавок хочу добавить, что аккумулятор живет что-то около недели до сих пор - спустя уже больше полутора лет от начала работы.

Единственный критичный для меня минус - полное отсутствие синхронизации контактов

В итоге - не телефон, а просто мега-девайс за смешную цену. Причем им было очень хорошо троллить пытавшихся меня подколоть адроидоводов - у многих из них был разрыв шаблона при виде любителя Apple с ТАКИМ телефоном.

Нет, за это время, конечно же было желание обновиться - и я решил попробовать именно  iPhone.

С ним у меня отношения странные, совсем не как у Apple fanboy - я почему-то именно к нему сравнительно равнодушен, в отличие от iPad и Маков.

Но я честно предпринял попытку - мне привезли джейлбрекнутый американский аппарат, который проработал у меня примерно 2 часа - ровно столько нужно чтобы вставить симку, немного поиграться, сделать пару тестовых звонков и обновить прошивку через iTunes... ;-( А фигли - я же привык к iPad. Ну и в итоге, разумеется, я получил характерный кирпич с яблочком на спине.

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

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

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

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

Но тут, зайдя в питерский магазин я увидел вполне себе приличный телефончик от Samsung - GT-C3322 Duos, который еще и умел две симки одновременно и стоил порядка 3500р. Я возбудился - и подумал - "была не была" (с), возможно - это то что нужно. Взял не отходя от кассы, и вечером начал с ним разбираться.

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

Теперь, собственно - история

Прихожу домой, начинаю эксперименты - по Bluetooth только работа с файлам, синхрится не хочет. Хорошо, будем по официальному - скачиваю с официального сайта Samsung Kies, немного улыбаюсь - "iTunes - как ты изменилась" (с) и подрубаю телефон.

Поскрипев пару минут шайтан-программа заявила - "ваше устройство не поддерживается". Штирлиц удивился еще раз заглянул в меню телефона - "синхронизировать с Kies". Минутная пауза - еще попытка. Тоже самое - вид сбоку. У меня тихая паника - "не работает, хотя должно".

Хорошо, ищу альтернативы - качаю всяческие MissedSync, FoneSync, SyncMate и иже с ними. Ни один из них этот агрегат не видит. "Моя в панике" (с), в мозгу - "stack overflow"  - ибо написано русским по белому - "Синхрить с Kies", но - не работает.

Немного почитав и подумав - решил проверить на Windows. Раскопал на одном из внешних винтов виртуалку с Виндой, сдул с нее пыль и согнал тараканов, запускаю, ставлю Kies для Windows - телефон увиделся! Ок, ладно, начинаю перепрошить... не получается, вам не хватает 3000 Мб свободного места для обновления прошивки. Лааадно, даю образу жесткого диска побольше, перезапускаю - то же самое. То есть - обновить прошивку из виртуалки НЕЛЬЗЯ.

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

Отлично, в Kies есть синхронизация с Google - логинюсь, но после 3 минут обработки - заявление - у вас дескать СЛИШКОМ МНОГО КОНТАКТОВ. В моем мозгу уже полный разрыв шаблона, но я нахожу альтернативный вариант - в Google Contacts я создаю группу людей с мобильными телефонами (поиск по  "+7 (9" )  и сохраняю ее в CSV файл.

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

Я от души выматерился и ушел спать. На все про все вчера было потрачено более 3 часов.

Итог

  • Не нужно хотеть сильно много от девайса Samsung за 3500 рублей. Лучше им - просто звонить.
  • Долгое  общение с техникой Apple наносит непоправимую психологическую травму -  настраивает на то, что все должно работать так, как заявлено. Или, хотя бы - стремиться это делать

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

Итоги 2011 года

Этот год был примечателен тем, что впервые за много-много лет я устроил себе отдых - не работал и занимался преимущественно моделями почти 3 месяца. Никогда себе такого долгого отпуска не позволял, но накопилось...


Работу оставлю за кадром, кому нужно - те знают ;-)

По технологиям - занимался десктопными приложениями для MacOS на Python+Qt, написанием различных плагинов для хостинг-систем (типа ISPManager), распределенными системами для этого же хостинга, ну и самые разные веб-сервисы - эти как обычно.

Занялся этим блогом - потихоньку пишу/перевожу. Вроде  кто-то читает... и даже есть посетители из Мексики ;-)

Модельные итоги
Самолёты - 3 штуки
Еще Ил-10, отдельной статьей не выкладывал


ВИМ/солдатики - суммарно около 10 фигур, половина - заказные.

 


Аниме и фантастика - 13 штук. Тут многое сделано вместе с женой, - преимущественно -  все на заказ старым и новым клиентам-коллекционерам фигурок.






Сложно сказать, сколько именно моего - допустим 50% от гараж китов, мелкие - все мои целиком.

БТТ - 1 танчик


Ну и вышла еще одна книжка - но уже в соавторстве с коллегами.

Что потом? Как обычно - работать - кодить и пилить ;-)

вторник, 27 декабря 2011 г.

Twisted или Tornado - без разницы - все идиоты

Внимание - Важное сообщение для блоггеров-питонистов!


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

Похоже, что уже всем стало ясно что "матч века" - Twisted.web против Tornado от Friendfeed показал, что ни одна из сторон не особо победила, но и не особо проиграла - и в тоже время стопудово - что обе стороны выглядят достаточно глупо.


Во-первых, Twisted. Сейчас моя компания использует его за небольшую часть функциональности, потому что ТОГДА - это был самый простой способ, что мы нашли для отправки трафика через различные сетевые интерфейсы на Linux машинах. Мы никогда не имели с ним никаких проблем. Единственная причина, по которой мне необходимо его когда-нибудь тронуть - это чтобы увидеть, как что работает.

Тем не менее, Twisted, вероятно, самая запарная программная библиотека. Каждый раз, когда я открываю этот код, я чувствую, что я забрел в ночной бар на берегу Джерси, где все пьяные в хлам и уже давно сорвали свои рубашки. Twisted классная библиотека, но в тоже время - НЕДОСТАТОЧНО классная, чтобы действительно называться "Twisted". Это Python- программистская версия одежды и бейсболок Ed Hardy, которая все еще висит в стороне (модная вещь, которая не используется). Когда я копался в этом коде и мои коллеги спрашивают меня, что случилось, единственным адекватным ответом было я "НЕ СЕЙЧАС, шеф - я запускаю этот хренов реактор ".

Теперь вы можете понять, почему появилась и существует такая хрень, как Tornado.

Хотя я постоянно не рекомендую делать такие вещи как Tornado - Friendfeed все-таки ее сделали. Из тех графиков, которые я видел, Tornado просто незначительно быстрее, чем Twisted на обслуживании большого количества одновременных запросов. НЕЗНАЧИТЕЛЬНО. Очевидно, в Friendfeed полагали, что достаточно небольшая разница в скорости была достаточным основанием тратить свое время и что-то переписывать заново- что обычно и делает каждый разработчик, которому становится скучно на работе. Веб-фреймворк на Python? О боже - как это оригинально! Я думаю, что это один из последних уроков книжки "Изучи Python за 24 часа".

В Friendfeed потратили много времени, пытаясь оптимизировать количество запросов в секунду, отображаемого на графике, но, возможно, им следовало бы тратить больше времени на оптимизацию ВОТ ЭТОГО графика - вместо первого:

Во всяком случае, когда речь идет о выборе Twisted vs Торнадо для веб-фреймворка, я использую Django. Почему? Потому что это работает, и мое время ценно.

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

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

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

Как избавиться от залипающих клавиш в VmWare vSphere Console для Linux Guest?

Возможно, вам знакома эта проблема...

Вы залогинены в vSphere клиент, у вас открыта Linux консоль виртуалки и когда вы что-то печатаете в ней - вместо одного символа появляются несколько одинаковых. Если честно - безумно раздражает, особенно когда нужно что-то сделать БЫСТРО на удаленной машине.

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

Вот тут рецепт как это сделать, правя .vmx файл, но я предпочитаю делать это прямо в клиенте vSphere.
  • Входим в клиент и "застреливаем гостя" (с) ;-)  "Shut Down Guest" (прости, друг ;-) )
  • Клик на "Edit Settings"
  • Выбираем вкладку "Options"
  • В списке под "Advanced" выбираем "General"
  • Справа нажимаем кнопку "Configuration Parameters"
  • Клик на "Add Row"
  • Вписываем имя новой переменной "keyboard.typematicMinDelay" и значение "2000000"
  • Перезагружаем виртуалку

Теперь вы сможете Войти как "root", вместо "rrrroooooott". ;-)

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

воскресенье, 25 декабря 2011 г.

Как оптимизировать сервер? - реальные данные - теория без практики мертва

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

Итак, график LI

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


Трафик, прокачанный через firewall - разумеется, вырос, причем - значительно



Процессы и потоки - увеличились



MySQL немного изменился в пределах погрешности; коннекты - не изменились.





Memcache немного подрос, но незначительно


А самое главное - ЦПУ и Load Average практически не изменились

Вывод

nginx с кешом HTML страниц сильно спасает от резких скачков нагрузки от незарегестрированных пользователей.

Рискну предположить, что создатели многих супер-пупер-мега-стартапов, постоянно падающих от пресловутого великого и ужасного Хабраэффекта, об этом не знают ;-)

З.Ы. Люблю, когда теоретические выкладки подтверждаются практическими данными.


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

Как настроить сервер? или оптимизация сайтов на PHP (Nginx, PHP, MySQL, Memcache)

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

Если же вы еще и не профессиональный HighLoad Linux-админ, а, например, разработчик (как я), то в процессе настройки прийдется ловить много-много граблей...  ;-)

Хочу немного улучшить состояние вашего лба, рассказав про те шишки, что набивал самостоятельно или с помощью более "администых" друзей. Специальные оптимизации на уровне правок PHP-кода не рассматриваю, это отдельная тема, сейчас - только сервер, консоль и вы, ну может где пару PHP скриптов немного поправить понадобится - буду считать, что свою CMS вы чуть-чуть знаете.

Ниже рассматривается достаточно часто встречаемая комбинация для сайтов: nginx + php (nginx+apache c php немного отличается - вместо fastcgi_xxx будет proxy_xxx).

Да, и считаем, что сейчас все компоненты вашей системы (nginx, php, mysql, memcache) крутятся на одной машине - как оно обычно и бывает на частных ресурсах.

PHP


  • Пускаем как fastcgi через сокет
  • Pconnect к базе - спорно
  • Не забываем акселератор (моя юзает eAccelerator) - хотя тоже есть спорные моменты

eAccelerator


Только для production машин можно отключить проверку Modified time - это абсолютно не подходит, если на сервере идет отладка скриптов - иначе будете ловить постоянные глюки и проблемы - включать только после того как сайт стал стабилен.

eaccelerator.enable="1"
eaccelerator.optimizer="1"
eaccelerator.check_mtime="0"
eaccelerator.shm_only="1"

Временые диски

tmpfs для /tmp и сессий PHP - все это сносится в память, если ее достаточно. В /etc/fstab добавляем

tmpfs                   /tmp                    tmpfs   defaults        0 0
tmpfs /var/lib/php tmpfs size=200M,nr_inodes=1m,nosuid 0 0

MySQL

  • Проверяем, включен ли query кэш
  • Также используем сокет
  • Если в вашей CMS используется таблица сессий - ставим для них тип MEMORY (если нет текстовых полей) - это приведет к сбросу всех залогиненных пользователей при перезагрузке сервера, но добавит немного скорости. Ну или если это неприемлемо - то надеюсь, она уже переведена в InnoDB? ;-)
  • Определяем оптимальное количество коннектов - статистика хотя бы за месяц (я юзаю munin). Ставим в 1.5-2 раза больше среднего.
Более подробно про оптимизацию MySQL можно прочитать тут.

Memcache

Если вся солянка крутится на одной машине - то также используем коннект через сокеты (по умолчанию не используется - стоит ip адрес). В таком варианте работы memcache возможны проблемы с некоторыми средствами мониторинга memcache (которые работают также по IP).

Не забываем в PHP использовать сжатие при работе с MEMCACHE.

Nginx

Ограничиваем число коннектов и запросов, особенно на ресурсоемкие скрипты
http {
...
    limit_req_zone $binary_remote_addr zone=one:10m rate=5r/s;
    limit_zone three $binary_remote_addr 10m;

Включаем кэширование для неавторизованных гостей

http {
...
fastcgi_cache_path /var/cache/nginx levels=1:2 keys_zone=wholepage:50m inactive=15d max_size=5000m;
        location ~ .*\.php$ {
            limit_conn three 20;
            include         /etc/nginx/fastcgi.conf;
            fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_pass    unix:/var/run/php-fastcgi/php.socket;
            #access_log  /var/log/nginx/domain.access.log  my_combined;
            fastcgi_cache wholepage_guest;
            fastcgi_cache_valid 301 302 304 10m;
            fastcgi_cache_valid 200 360m;
            fastcgi_cache_valid 404 5s;
            fastcgi_cache_key "$request_method|$host|$request_uri";
            fastcgi_pass_header "Set-Cookie";
            fastcgi_ignore_headers "Cache-Control" "Expires";
            fastcgi_cache_bypass $cookie_phpbb_session $arg_nocache $arg_PHPSESSID;
            fastcgi_no_cache $cookie_phpbb_session $arg_nocache $arg_PHPSESSID;
    }
Где phpbb_session - имя куки по которой идет авторизация

Все запросы с ?nocache=1 и PHPSESSID попадают на PHP-бэкенд сразу без кэша не забываем открыть скрипт, по которому идет авторизация (в том числе и всякие капчи - их можно переписать на ?nocache=1) - тут возможно прийдется немного поковыряться и в коде CMS тоже.

        location /register.php {
                limit_conn three 20;
                include         /etc/nginx/fastcgi.conf;
                fastcgi_param   SCRIPT_FILENAME $document_root$fastcgi_script_name;
                fastcgi_pass    unix:/var/run/php-fastcgi/php.socket;
        }

Nginx - общие рекомендации

Очень нежелательно использовать location с регекспами - только простые префиксы вида
location /mymodule {}
Если от регекспов никак не избавится - то лучше их обрамлять простым location (Причина - сложноуловимые перехлесты в логике парсинга URL - кто за кем будет следовать)
location /mymodule {
  location ~ \/mymodule\/(.*)\.php$ {
    чего-то
  }

}

Отрубаем access лог для картинок

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