АРХИВ КАТЕГОРИИ "ТЕХНОЛОГИИ"
НОЯБРЬ 8, 2012

Hi,

Рябы рябские, как дела?

Меня тут вдруг запарила проблема с оптимистик локинг фейлур (StaleObjectStateException, OptimisticLockingFailureExceptionHibernateOptimisticLockingFailureException) в Grails, когда слишком частые запросы на сервер приводят к синхронному обновлению домена в персистенс, что в свою очередь приводит к падению одного из запросов, т.к. version уже обновлен другим потоком (запросом). Собсно я  решил написать небольшой хелпер для сохранения доменов, в  итоге это оказало не хелпером, а заижекченым методом во все доменные классы проекта. Ща покажу как это юзается, а потом уже саму имплементацию.

Домен

  1. // по дефолту в грейлс каждый домен
  2. // юзает optimistic locking, используя
  3. // version колонку (проперти)
  4. class Something {
  5.   String name
  6.   String value
  7. }

Стандартное сохранение домена

  1. // загружаем и обновляем значение
  2. def e = Something.get(1)
  3.  
  4. // если в этот момент другой запрос (поток) обновит
  5. // эту запись, то грейлс кинет StaleObjectStateException
  6. e.value = "asdasd"
  7. e.save flush: true, failOnError: true

Сохранение с optimistic locking with retry вариант 1

  1. // загружаем и обновляем
  2. def e = Something.get(1)
  3.  
  4. // если в этот момент другой  запрос (поток) обновит
  5. // эту запись, то мы рефрешнем запись в сессии и
  6. // попробуем обновить еще разок
  7. e.saveOptimisticWithRetry flush: true, failOnError: true, retryCount: 2, { obj ->
  8.   obj.value = "asd"
  9. }

Сохранение с optimistic locking with retry вариант 2

  1. // все параметры опциональны, их можно опустить
  2. // по дефолту:
  3. // retryCount = 2
  4. // flush = false
  5. // failOnError = true
  6. def e = Something.get(1)
  7. e.saveOptimisticWithRetry retryCount: 5, { obj ->
  8.   obj.value = "asd"
  9. }

Сохранение с optimistic locking with retry вариант 3

  1. // все параметры опциональны, их можно опустить
  2. def e = Something.get(1)
  3. e.saveOptimisticWithRetry { obj ->
  4.   obj.value = "asd"
  5. }

Имплементация optimistic locking with retry

  1. // в Bootstrap.groovy к примеру можно
  2. // заинжектить метод во все домены
  3. for (dc in grailsApplication.domainClasses) {
  4.   dc.metaClass.saveOptimisticWithRetry = { args = null, setter ->
  5.     final int retryCount = args?.containsKey('retryCount') ? args.retryCount : 2
  6.     final boolean failOnError = args?.containsKey('failOnError') ? args.failOnError : true
  7.     final boolean flush = args?.containsKey('flush') ? args.flush : true
  8.    
  9.     int i = 0
  10.     while (true) {
  11.       try {
  12.         // Save domain
  13.         setter(delegate)
  14.         delegate.save(failOnError: failOnError, flush: flush)
  15.         return
  16.       }
  17.       catch (StaleObjectStateException e) {
  18.         // Throw exception if retry count bounds reached
  19.         if (++i > retryCount) {
  20.           throw e
  21.         }
  22.        
  23.         // Refresh object within session
  24.         delegate.refresh()
  25.       }
  26.     }
  27.   }
  28. }

Хорошего дня!

PS Можно вобщем-то подменить и сам метод save() у доменов, добавив в него имплементацию ретрая при оптимистик логинг фейлуре ексепшене.

НОЯБРЬ 2, 2012

Hi,

Рябы рябские, сайлент хилл 2 в кино показывают — смотреть всем!

Прошел месяц с моего переезда на AWS, я обещал скинул сколько вышло по деньгам итд, поэтому вот, выкладываю. $6.56 за этот месяц получилось, в след месяце запощу расходы за весь ноябрь.

AWS Activity Report for one month ec2 route rds 647x768 Amazon AWS  спустя месяц %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news

ОКТЯБРЬ 29, 2012

university of liverpool Как я поступал в Университет Ливерпуля %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news

Hi,

Как дела рябчики?

Я тут приболел чуток, но это мелочи, пью чаёк, рефакторю и фикшу код — стандартненько все.

А вот пришло утречком письмо счастья, о том, что меня таки взяли в Ливерпульский Университет на Master of Science in Software Engineering, обучение начинается с декабря этого 2012 года. Сразу отвечу на несколько очевидных вопросов, которые я сам задавал своему адмишен консультанту, и которые многие я уверен захотят задать:

  • Обучение удаленное;
  • Поступить можно не имея высшего образования (даже бакалавра), если есть сравнимый опыт работы по специальности, т.е. примерно от 5 лет опыта работы в IT;
  • Платное, в зависимости от выбора типа оплаты, от €17,000 до €21,500, побробнее тут;
  • Диплом не отличается о того, который получают студенты, обучаясь в Ливерпуле в самом универе on-site, или очно как говорят у нас;
  • Сроки обучения зависят от интенсивности, с которым ты обучаешься, примерно в пределах от 18 до 48 месяцев (1.5 года — 4 лет);
  • После успешного окончания универа, можно приехать в Ливерпуль на graduation ceremony;
  • Подробнее о MCs in Software Engineering;
  • Подробнее об Online education in University of Liverpool.

А теперь я вкратце напишу как я поступал, вероятно кому-нибудь это будет полезно. Сперва я выбрал специальность и подал заявку на поступление, кажется тут. На следующий день мне уже звонил мой admission consultant (далее Майкл), с которым мы общались на тему зачем я хочу поступать, есть ли у меня вышка и/или опыт работы в ИТ и ваобще о погоде, на инглише. В дальнейшем мы с Майклом созванивались более 5 раз, точно уже не припомню, собственно через него и проходил процесс моего поступления, ему я скидывал все документы, задавал вопросы, Майкл же мне все объяснял и консультировал что да как. Замечательный чувак, спасибо ему:) Теперь по поводу требований и документов:

  • Скан загран паспорта — это легко сделать;
  • Скан школьного аттестата (я, кстати, не уверен что это нужно было, но если ваобще вышки нет, то лучше отправить);
  • Скан диплома из универа, или если нет диплома, то документ, подтверждающий обучение в универе в течение 2-3 лет, или когда вас там отчислили icon smile Как я поступал в Университет Ливерпуля %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news , меня вот отчислили на 8 семестре, т.е. не хватило пол года до бакалавра О_О в любом случае политех это какашка, хотя тусить там прикольно;
  • Резюме — что-то типа такого;
  • Оч важное: Мотивационное письмо на английском 180+ слов, у меня получилось аж 282;
  • Самое важное: Качественное рекомендательное письмо с текущего места работы — тут мои друзья, Санчес и Егорун, и Дейв постарались отличненько, за что им огромное спасибо;

Собирал и приводил в порядок все эти документы я неделю, и потом запулил их Майклу, который мне как обычно перезвонил и рассказал о дальнейшем плане действий, а он  таков, что мне нужно было теперь ждать аксепт или реджект письмо на почту, ну и звонка Майкла icon smile Как я поступал в Университет Ливерпуля %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news Сам Майкл уже после того как получил от меня все документы, несколько раз названивал в офис AirSense и мучал Дейва разговорами, так что лучше чтоб на текущем вашем месте работы могли общаться на английском.

Ну вот и все, это если в кратце. Есть вопросы — пишите, я, френдли гай, готов всегда помочь.

Хорошего дня!

UPD1 Terms & Conditions: http://www.liverpool-degrees.com/Online%20Learning/Fees%20and%20Finance/Terms%20and%20Conditions.aspx

UPD2 Students Handbook: http://success.ohecampus.com/index.php?mod=dcp&act=navigationindex&navigationid=3633

ОКТЯБРЬ 6, 2012

AWS LOGO RGB 300px Миграция сайта с хостинга sweb на Amazon AWS %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news

Hi,

Рябчики, как дела?

Я тут мигрировал все свои проекты (которые хостились на хостинге sweb) в том числе блог и скока лет на Amazon AWS. Сейчас я расскажу вкратце чо да как, быть может кому-то пригодится опыт в данном вопросе.

Зачем

Все просто — это так прикольно иметь свой сервачок! icon smile Миграция сайта с хостинга sweb на Amazon AWS %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news На самом деле AWS предоставляет кучу возможностей, в том числе и для моих будущих (вероятно) проектов, множество различных сервисов, с которыми между прочем можно даже общаться через AWS API, к примеру на Java. Например, из нетривиального есть SQS, Elastic MapReduce, DynamoDB, итд.

Так же Amazon AWS это все в одном — и облачный сервер(а), и базы данных (реляционные и/или документные), и DNS и прочее.. Причем это все очень легко доключается/отключается и настраивается через консоль. Можно увеличивать машинные мощности очень легко, к примеру в момент подключить дополнительную RO базу в проект с высокой нагрузкой на базу.

Ну и можно ставить любые приложение, т.к. application server? легко, tomcat, jetty — все делается достаточно просто и можно хостить сразу Java EE / Grails / Scala приложения icon smile Миграция сайта с хостинга sweb на Amazon AWS %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news

Как

Мне нужно было перенести 4 проекта: два из них WordPress, еще два — PHP on Zend. Осуществил я это за пол дня, включая апгрейд WordPress почти трехгодичной давности (2.6.3) на новую версию 3.4.2.

Для начала я сделал все бекапы (копии) проектов, включая продакшен билды и дампы баз данных. sweb почему-то снимал по дефолту дамп базы в кодировке cp1251, поэтому потом пришлсь конвертировать их в utf-8, спасибо iconv -f CP1251 -t UTF-8 dump.sql > dump-utf8.sql icon smile Миграция сайта с хостинга sweb на Amazon AWS %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news

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

После всех локальных манипуляций я залогинился в Amazon AWS и начал свое путешествие…

Сперва я создал клауд сервер (cloud server) на Linux, Amazon EC2. Собственно сейчас я использую только один micro instance и пока что его хватает. После я создал pem ключик для доступа к серверу по ssh и скопировал локальные файлы используя scp.

Тут я подумал что пора бы уже подумать о базе данных (MySQL), где что хранить, в итоге я решил подключить Amazon RDS вместо поднятия локальной базы на инстансе — вполне логичное решение. Пришлось добавить IP EC2 инстанса в список разрешенных IP для конекта к базе. Окей, тут все гут, базу получили. Дальше я пошел по ssh на сервер, создал нужные 4 схемы и импортировал свои дампы в каждый из них. Все, база данных настроена и можно приступать к конфигурации самого сервера.

(Я все еще на инстансе, и работаю по ssh…) Что нам нужно: Apache HTTPD, MySQL client, PHP5 with GD and MySQL driver. Все это ставится очень просто, ведь в наших руках есть супер инструмент apt-get — надеюсь тут не нужно объяснять. После этого последовала настройка апаче веб сервера с виртуал хостами, это заняло некоторое время, но в итоге я все настроил и можно было стукнуть свой блог извне.

Теперь настало время настроить DNS, сказать интернету, на какой IP теперь стучаться при обращении к моим доменам. Тут на помощь приходит Amazon Route 53. Настраивается очень просто, и в итоге у меня получилось 2 домена + 2 сабдонема для одного из них. Поменял DNS сервера на nic.ru для своих доменов, подождал до 2-х часов ночи и теперь при обращении к chupakabr.ru, sanke.chupakabr.ru, skokalet.chupakabr.ru, delaitak.ru — запросы идут на мой емейзон инстанс! Greetz!

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

  • Аларм по используемым ресурсам: Чтобы отслеживать abnormal поведение на сервер, например слишком длительная 100% загрузка на процессор, или аномально большой объем сводящего трафика.
  • Вотчдог-аларм: Следит за тем что инстанс работает (status: running).
  • Биллинг аларм: Аларм показывает, что за текущий день забилалось (ну и слово), например не более доллара по всем Amazon сервисам.
При достижении определенных условий аларм генерирует ворнинг email и засылает его на указанный адрес (email, СМС).

Выводы

Выводы делать пока что рано — в конце месяца посмотрим сколько это все добро выйдет мне в долларах, но пока что я очень доволен icon smile Миграция сайта с хостинга sweb на Amazon AWS %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 news

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

UPDATE: Еще я заюзал EC2 Elastic IP — статический IP для инстанса, для одного инстанса — бесплатно!

Enjoy the weekend!

 

СЕНТЯБРЬ 20, 2012

Hi,

Kak dela?

Все вы, наверное, слышали о моих плагинах для Firefox для скачивания музыки и видео вконтакте. Собственно я передал во владение эти плагины позавчера ребятам из Гонконга (плагины для хрома остаются все еще в моем владении).

Так вот, почему они ушли в Китай? В прошлую пятницу я получил забавное письмецо в ночи о покупке моих двух плагинов для фаерфокса какой-то неизвестной мне фирмы из гонконга icon smile Как я firefox плагины продавал %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 В нем представитель фирмы предлагал купить оба за небольшую сумму. По идее сами плагины мне уже давно не интересны, т.к. я использую Chrome уже в течение где-то года, поэтому я незамедлительно согласился, подняв цену в два раза icon smile Как я firefox плагины продавал %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 В итоге сошлись на прибавке 80% от изначального предложения — вобщем-то неплохо, для меня по крайней мере, т.к. поддерживать плагин больше не нужно да и еды теперь можно прикупить icon smile Как я firefox плагины продавал %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8

Статистика по плагинам очень неплохая на самом деле, если сложить показатели обоих, то будем иметь такой расклад:

  • Общее число установок более 750,000
  • Ежедневное число скачек в районе 1,500
  • Ежедневных пользователей примерно 55,000
  • 94% пользователей используют Windows (разочарование) icon smile Как я firefox плагины продавал %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8
По поводу передачи плагинов — на сайте фаерфокса это крайне неудобно реализовано, точнее ваобще не реализовано, поэтому мне пришлось отдать свой фаерфокс девелопер аккаунт как он есть, сменив пароль, логин и почту, и далее зарегать новый аккаунт по старыми данными, правда при этом фаерфокс сайт сошел с ума и теперь, когда я пытаюсь залогиниться на сайте по этим креденшелам, то получаю страницу о том, что произошла ошибка, которая будет вскоре пофикшена (правда уже прошло 2 дня и она все еще не пофикшена). Ну, подождем еще немного — не горит.
Вобщем, если плагины не будут работать — обращаться теперь не ко мне icon smile Как я firefox плагины продавал %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8 а я уже в свою очередь буду стараться поддерживать Chrome плагины.
PS А вот и сами графики со статистикой по плагинами на 13 сентября:
vk music stats last 30 days 987x768 Как я firefox плагины продавал %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8
vk video stats last 30 days Как я firefox плагины продавал %d1%82%d0%b5%d1%85%d0%bd%d0%be%d0%bb%d0%be%d0%b3%d0%b8%d0%b8
СЕНТЯБРЬ 12, 2012

Hi,

Just a note (i.e. backup of a script):

#!/bin/bash
  1.  
  2. SRC=trunk
  3. DST=branches/rel1_0
  4. filename=$1
  5.  
  6. #
  7. # Commandl line params parsing
  8. #
  9.  
  10. if [ -z $filename ]; then
  11.         echo "Usage: getdiff.sh "
  12.         exit 1
  13. fi
  14.  
  15. full_path=0
  16. if [ '-f' == $2 ]; then
  17.         full_path=1
  18. fi
  19.  
  20. diff_dirs=0
  21. if [ '-d' == $2 ]; then
  22.         diff_dirs=1
  23. fi
  24.  
  25. #
  26. # Business
  27. #
  28.  
  29. # Get files paths
  30. dst_file_path=""
  31. src_file_path=""
  32. if [ $full_path -eq 1 ]; then
  33.         dst_file_path="$DST/$filename"
  34.         src_file_path="$SRC/$filename"
  35. elif [ $diff_dirs -eq 1 ]; then
  36.         dst_file_path="$DST/$filename"
  37.         src_file_path="$SRC/$filename"
  38. else
  39.         dst_file_path=`find $DST -name "$filename"`
  40.         if [ -z $dst_file_path ]; then
  41.                 echo "Cannot find destination file '$filename' in '$DST' directory"
  42.                 exit 2
  43.         fi
  44.  
  45.         src_file_path=`find $SRC -name "$filename"`
  46.         if [ -z $src_file_path ]; then
  47.                 echo "Cannot find source file '$filename' in '$SRC' directory"
  48.                 exit 3
  49.         fi
  50. fi
  51.  
  52. # do diff
  53. echo "Doing diff"
  54. echo " dst: $dst_file_path"
  55. echo " src: $src_file_path"
  56. diff -r $dst_file_path $src_file_path
Страницы:1...34567...18