Молоток.ру и забота о пользователях

В последнее время я достаточно щепетильно отношусь к своему почтовому ящику. Я начал это делать, после того как понял, что мне в день приходит более сотни левых писем о всяких акциях, скидках, конкурсах и прочие дайджест рассылки. Я отписался от 90% сервисов которые не представляют для меня интереса и жизнь вроде наладилась, дышать стало свободнее. Только остаются некоторые уебищные сервисы, отписаться от которых - дикий квест. Молоток.ру один из таких. Не помню по какому роковому стечению обстоятельств лет 8 назад я случайно завел там аккаунт, но точно помню, что с тех пор я его больше не посещал, а вот письма со всякой херней они продолжают слать мне до сих пор.

У вас кстати есть карточка от много.ру? Я ее случайно лет 10 назад завел. Прошло лет 9 как я ее потерял, но письма они продолжают слать, у них видимо не хватает мозгов додумать, что аккаунты которые не подавали активности последние 10 лет можно считать не валидными.

Так вот, возвращаясь к молотку. Как меня бесит, что нельзя отписаться от рассылки в один клик. Чтобы отписаться от рассылки, нужно пройти на их сайт, войти в свой аккаунт и там настроить систему уведомлений.

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

trololo

Главной мыслью этой заметки является обращение к веб мастерам. Пожалуйста, делайте то, что нужно пользователям, а не то, чем вы занимаетесь.


mail, spam      

Nginx detect mobile browser

Регулярка для Nginx

set $mobile_rewrite do_not_perform;

if ($http_user_agent ~* "android.+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge|maemo|midp|mmp|netfront|opera m(ob|in)i|palm(os)?|phone|p(ixi|re)\/|plucker|pocket|psp|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino") {
  set $mobile_rewrite perform;
}

if ($http_user_agent ~* "^(1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-||_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac(|\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(di|rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-)") {
  set $mobile_rewrite perform;
}

if ($mobile_rewrite = perform) {
  rewrite ^ http://m.site.com/ redirect;
  break;
}

Ну и собственно вот тут собранные подобные рецепты для различных языков и сервисов.


mobile, ngixn      

7000 rps на Nginx - Achievement unlocked

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

Для тех кто не в теме, у меня тут еще живет сайт и форум группы CENTR, а вчера в Питере проходил концерт HipHop All Stars 2012. Организаторы повели себя достаточно круто и предложили всем заинтересованным смотреть прямую трансляцию с концерта. Мы стали одним из проектов, которые на главной странице разместили флеш плеер, по которому велась трансляция. Что бы людям не было скучно, подключил еще и комментарии от Вконтакте.

Респект Вконтакту, в пиковые моменты комментарии в прямом эфире появлялись со скоростью 3-4 штуки в секунду. Всего за день на странице появилось примерно 15 000 комментариев.

Когда я вечером зашел посмотреть модные графики, то был приятно удивлен. Пиковая нагрузка на MySQL была примерно 3000 rpm, на Nginx \~8000 rps.

mysql

Cудя по логам, ни одного slow request не было, как и не было 404 и 50x страниц.

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


centr, mysql, nginx      

PHP Memoize

Вчера ради интереса пересматривал pecl каталог модулей для php, наткнулся на интересный модуль memoize. Вспомнил, что сам делал его реализацию на уровне php+memcached.

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

Так же нужно понимать, что код будет выполнен только один раз, поэтому использование, например, sql запросов в ф-ции не допустимо. Недопустимо использование global и его аналогов ( Static::\$data ), недопустимо использование ветвлений в зависимости от времени или окружения.

function my_expensive_function($x) {
    sleep(10);
    return $x . 'bar';
}

memoize('my_expensive_function');

// now calls to my_expensive_function() are cached by their arguments

echo my_expensive_function('foo'); // returns "foobar" in 10s
echo my_expensive_function('foo'); // returns "foobar" in 0.0001s

В общем идея понятна, на уникальность никак не претендует, но свою нишу может занять. Зачем использовать свой велосипед? Модуль на GitHub Модули в Pecl


memcached, memoize, php      

В уме

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

v-ume

В следующий раз, когда вы пройдете очередное обновление Angry Birds и полезете в AppStore в поисках новой убивалки времени, то вместо игрушек, поставьте себе это приложение. «В уме» — это сборник математических задач на устный счет. Задачи действительно интересные. И больше всего меня радует сам форм-фактор, да, это именно та игрушка с которой удобно работать, например, в транспорте. Нет нужды постоянно фокусироваться на экране, тут ничего не зависит от твоей ловкости и координации, только полезная разминка для мозгов.

v-ume

v-ume

Ссылка в AppStore.


app, iphone      

Варианты загрузки

Меня добивает на некоторых сайтах страницы загрузки софта. Сегодня с утра скачивал новый релиз PhpStorm, обратите внимание на список.

phpstorm-download

Windows, Mac OS X, Unix, ZIP. ZIP бля. Вот что там внутри? Под какую это платформу?

phpstorm-download

Внутри там, кстати, бинарники для windows


design, phpstorm      

Вернемся к этому позже

Внезапно понял какой фичи мне не хватает в Gmail.

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

Некоторые решают эту проблему с помощью хитрой системы ярлыков, другие держат под рукой evernote или remember the milk, а мне лень отвлекаться и делать столько действий, просто чтобы не забыть, уж лучше запомнить, реально.

Мне нужна простая кнопка, которая позволяет отметить письмо как прочитанное, а через 6 или 12 часов сделает его снова не прочитанным, а потом я смогу еще раз ее нажать и в итоге я не буду отвлекаться на новые письма, никогда не потеряю их в груде других вещей и отреагирую, когда будет время или посчитаю это нужным.

Реально, эта фича спасла бы мир.


gmail, работа      

Хорошие вещи случаются

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

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

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

Кстати еще из приятных мелочей, у меня от метро до дома, пешеходная дорожка примерно километр и на ней нет урн. Как-то раз, я начал ругаться на это, ну не приятно мне выкидывать бычки себе под ноги или на обочину, но и нести их с собой 10 минут мне тоже не хочется, почему нельзя урны поставить? Ну и, чтобы вы думали? Бувкально через неделю через каждые 200-300 метров появились урны. Учитывая, что мусора стало меньше, а урны полные, видимо я  не один такой.

И еще один момент касательно этой дорожки, на ее протяжение, есть возможность перейти на другую сторону, которую отделяет газон и проезжая часть. С другой стороны есть заасфальтированная дорожка с лестницей, но чтобы к ней подойти, надо преодолеть поле из грязи и говна с первой стороны. Точно так же, в один момент, я начал ругаться на это и посылать лучи этого поля нашему ЖКХ или кто там этим занимается. Собственно, буквально через пару дней, заасфальтировали и с нашей стороны.

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

А  еще на Варшавке, от Тульской до Каширки отбойники ставят. Тоже молодцы, там без отбойников страшно.


жизнь, сервер      

Failed to validate oauth signature and token

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

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

Тихо и не спеша, я просрал на это дело около трех вечеров, по 1-2 часа вечером выделяю на проекты. Что самое странное, апи то работало, то не работало и уловить динамику появления ошибки у меня не получалось.

А решение, как обычно было рядом, проблема была в том, что я захлопывал крушку ноутбука :D Точнее так, сервисы я стараюсь сразу делать в родной среде, тобишь на линуксе, для этих делов, у меня есть virtualbox, в котором живут виртуалки с линуксом. Пока я работаю над одним сервисом, выключать виртуалки не приходится. Я их просто перетащил на другой рабочий стол и сижу себе спокойно по ssh, делаю tail -f на лог ошибок. Собственно, паттерн работы с ноутбуком, подразумевает что выключать его приходится редко, а засыпать часто. Ну и вот, после просыпания, в виртуалках время не синхронизировалось, а оставалось тем, в какой момент ноутбук засыпал. Из-за этого, при подписывание запросов, они подписывались не правильно и апи твиттера посылал меня на болт считая жуликом.


api, Linux, php, twitter, virtualbox      

Translimit.sh patch

Поднимая в очередной раз тему моего NAS'a, хочу обратить внимание владельцев на поломанный translimit.sh. Это скрипт, который запускается по крону и производит ротацию ваших торрентов, что бы они запускались или останавливались, нарабатывали ratio и т.п. В версии выложенной на сайте и форуме readynas, есть ошибка и поэтому он не работает с новыми версиями transmission.

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

Строку:

RATIO="$($REMOTE $TRANSOPT -t $ID -i | grep Ratio | awk '{ print $2; }')"

Заменить на:

RATIO="$($REMOTE $TRANSOPT -t $ID -i | grep Ratio: | awk '{ print $2; }')"

nas, torrents