Sunday, January 15, 2012

OAuth2 provider instruction

I've decided to implement OAuth2 support in my web-site. Since my application is written in perl (based on Catalyst framework) I came to CPAN:
  • Found CatalystX::OAuth2::Provider, but it is too straightforward for my needs. And, looking through code, it seems to me not working at all.
  • There is a OAuth2::Lite, but marked as "beta", and not recommended for production use.
  • There is a Net::OAuth2 module, but it is a client only. 


So, I've decided that it'll be better to write my own implementation - just for my needs. And gone looking for samples / instructions.

I've start with reading oauth2 site -  not much, really, except for the link to RFC. Searching internet reveals some more articles, mostly about theory and some thoughts, and some server implementations. But... nothing like simple samples of realisation, or some code stub. Of course I can read other servers' code, but it is a bit annoying to decipher unknown web-framework written in not very familiar language. And so, I've read throughout RFC and made my own TODO list of what must be implemented in OAuth2 provider server.

My list is not universal, it is aimed to solve my particular situation. Also, when RFC allows different approaches I choose one, that suits me best.

Pre-register clients. Client registration includes:
  • client_id
  • password
  • uri, where user must be redirected to after access granted
  • logo, description
  • allowed scopes to request access to


authorize endpoint (/oauth/authorize)
  • Validate request:
    • find client by 'client_id' param - if not - show error page 'unauthorized_client' to user
    • if 'redirect_uri' param is present - check that it matches registered client pattern - if not - show error page to user - no redirect!
    • 'response_type' param == 'code' - if not - error = 'unsupported_response_type'
    • check that all substrings in 'scope' param are allowed for this client - if not - error = 'invalid_scope'
    • if 'state' param is present - save it in session
  • Authenticate user. Either get authentication information if already logged in, either provide ability to log in.
  • Show grants page with full description of grant request: client name, description, logo and list scopes.
  • If access not granted - redirect back with error = 'access_denied'.
  • If granted:
    • generate unique code string
    • store code with user_id, client_id, scopes, timestamp. If redirect_uri was in request - store it too.
    • form redirect url: redirect_uri from request OR client uri from registration, if 'state' was in request - add it, add list of scopes.


token endoint (/oauth/token)
  • Authenticate client (HTTP Basic) - get client_id, if not - error = 'invalid_client'
  • Check that 'grant_type' param == 'authorization_code', if not - error = 'unsupported_grant_type'
  • Find 'code' param value in DB. Check that client_id stored with code == client_id from authentication.
  • Ensure that code is not expired - stored timestamp > current timestamp - 60.
  • If 'redirect_uri' param is present in request - ensure that it is the same as stored with the code. If any of last three wrong - error = 'invalid_grant'
  • Create unique access token string, store it in DB (with client_id, user_id, timestamp, scopes).
  • Add headers to respond: Cache-Control: no-store and Pragma: no-cache
  • Respond with json {"access_token": token string, "token_type": "Bearer"}

Protected resource
And now, when you want to check that request is authorized to get information that belongs to user with 'user_id' and falls under scope 's1' you must:
  • check that 'Authorization' header is present
  • That it contains scheme "Bearer"
  • Decode base64 string, find access token in DB
  • Ensure, that this token allow access to user_id and scopes string contains 's1'

Few more words:
I assume that site supports some kind of per-user sessions.
Scope string is space-delimited list of any substrings, that could identify your site's sections or grants or any other kind of access restrictions.
'error' means that request must be redirected to redirection uri with param 'error'.
How to generate unique code and token strings is beyond this article, I think everyone has their favourite method.


Further reading:
I really think that it is very useful to read RFC - http://tools.ietf.org/html/draft-ietf-oauth-v2-22
And also RFC for Bearer scheme - http://tools.ietf.org/html/draft-ietf-oauth-v2-bearer-15
If now you want to add support for other flows - it'll be much easier.


It is not still implemented, just work-in-progress. I hope that I didn't make too much mistakes. Comments, advices and criticism are appreciated.

Sunday, October 16, 2011

Мысль дня

"Не дай бог этому демосу дать какую-нибуть кратию!" (c) моя жена.

Sunday, August 21, 2011

Куала-Лумпур - Самуи

Обратная дорога оказалась попроще. За несколько дней до отъезда мы дошли пешком до Puduraya, взяли билеты на автобус до ХатЯй. Выбрали 22 часовой, оказалось это бизнес-класс, но мы решили что 10 рингит с человека за бизнес-класс мы можем себе позволить.
В день отъезда пришли туда же, долго искали платформу 19 от которой должен отходить наш автобус - оказалось она совмещенная с 18, и номер 18 написан с одной стороны, а 19 - с другой.
Впрочем, спустившись по эскалатору к автобусу мы выяснили, что на самом деле он отходит от 17 платформы - вот такое вот местное развлечение.
Ну это все мелочи - внутри автобуса большие кресла, у каждого свой пульт управления наклоном спинки и подъемом подставки для ног из двух частей, которые оч-чень медленно и неторопливо двигаются. Есть экранчик со своим пультом, выбор из чуть-чуть мультиков, фильмов, игр и музыки. При этом работают эти экранчики через один, а через два работают пульты.
В общем, все вроде хорошо. Колоритный водитель с напрочь сорванным голосом всех пересчитал, раздал пледы и мы поехали... до выезда с вокзала, где и заглохли на подъеме. Попыток через несколько мы конечно его преодолели, но начало не обнадежило.
Дальше все шло хорошо - едем, остановки на туалеты, граница одна, граница вторая, ХатЯй. Высадили нас у очередной маленькой конторы по перевозкам. В где-то 7 по тайскому времени. А в 8:30 был микроавтобус на Самуи.

Успели немного походить по ХатЯй - есть свои особенности... Например, повсюду торгуют орехами и сухофруктами в огромных упаковках... В какой-то мелкой едальне даже кофе нашелся...

Микроавтобус нас довез до ДонСака, хоть и с тайскими же остановками на трассе, заездами в деревени отдать посылку и т. п., но в меньших количествах, чем по пути туда. В результате мы плыли на 17 часовом пароме, и в 19 были дома.
Когда паром пришел - нас опять погрузили в микроавтобус, провезли до конца пирса - метров 200 - и высадили уже окончательно.

Куала-Лумпур

Отель, в котором мы остановились называется Bintang Warisang. Очень приличный отель оказался за свою цену. И расположен хорошо, и интернет есть - wi-fi в лобби и ресторане и проводной в номерах, и сантехника не только под азию - в душе есть даже бортик, чтоб вода не выливалась. В общем мы очень довольны. Единственный недостаток - очень уж скудные завтраки.
По приезде, а оказались мы в отеле без чего-то 7 утра, нам подтвердили номер, но сказали что свободен будет к полудню... "ну, может к 11 - подходите, вдруг. Но вообще-то заселение в 14". Мы оставили пакет с вещами и пошли бродить... Набродились по 4 кафешкам - после Тая был такой восторг от повсеместного запаха кофе, что удержаться было просто нереально. Получили первую дозу впечатлений и к половине 12 вернулись в отель, где успешно заселились, проверили интернет и упали спать.
Основные впечатления от города так и остались потом - эдакий вавилон. Самые разные расы и национальности ходят по улицам, общаются и незаметно, чтобы кого-то напрягало присутствие не таких как он. Видимо совсем расисты в Куалу не ездят, а на остальных сильно давит большое количество других.
Дальнейшие дни с утра были заполнены беготней по разным делам, и последующей работой до ночи для меня, или походами по местным аквариумам/музеям для семьи.
В один день у нас получилось сильно разнообразить свою меню. Позавтракали малайской кухней, пообедали японской и поужинали пакистанской. В японском ресторане попробовали суши, которые внешне скорее на пирожные похожи - с каким-то украшением, кремом, соусом, в оболочке из чего-то типа суфле... очень вкусно в общем. Пакистанская кухня тоже вполне вкусная, хотя практически вся острая. Но сам ресторан поразил больше - это ресторан, там есть "буфет" - плати 25 рингит и ешь сколько влезет, или можешь заказать, если знаешь что. Однако народ себя ведет как в столовой - помещение тесное, столики понатыканы, и народ спокойно подсаживается где свободный стул найдет. Зазывала там очень уговаривал зайти, да мы собственно и сами хотели попробовать, но таки решились, когда он начал "Я вам сейчас все расскажу. Вот тут - берете рис, а потом набираете что хотите. Вот это - курица", показывая на какие-то странные колбаски, явно ручного производства, "Вот это - креветки", тыкая в какое-то жуткого вида красное месиво и так далее. Когда уходили он тоже очень интересовался понравилось нам или нет - заверили, что понравилось. Но мы были единственными белыми, видимо все-таки редко кто рискует.
Про такси надо еще сказать - оно очень разное. От старых скрипучих драндулетов до представительского класса. При этом и стоят они по разному. Особенно отличается цена если без счетчика договариваться. А еще есть таксисты, которые ездят и подбирают - они более склонны к разумным ценам или счетчкам, а есть те, которые стоят рядом с отелями и ждут - у них в 2-3 раза дороже.
Отдельно надо рассказать про улицу китайских едален - Джалан Алор. Она идет параллельно Букит Бинтанг, т.е. от нас до начала улицы было минуты 2 пешком.  Как-то так получилось, что мы до нее добрались только в предпоследний день, хотя и знали что она есть, и что там дешево кормят и вообще. Наконец, решили попробовать поужинать там. Улица начинается переполненным китайским рестораном, вполне прилично выглядящим... Но мы посмотрели - мест практически нет, официанты загнанные - т.е. обслуживать будут долго, да и мы искали не дорогой ресторан, а дешевую едальню. Пошли дальше - одна за другой понатыканы кафешки, столики вынесены на улицу, в основном потому, что собственно помещение - это кухня, и место для столиков есть только на улице. На сто метров - 5 кафешек и 10 зазывал. Очень утомительно отмахиваться от них, и главное, пока они пристают толком не поймешь - стоит здесь садится или нет. В результате, приземлились за столик в едальне, где кто-то уже что-то ел, и по виду нормально приготовленное, и не было слишком много народу.
Когда нам принесли заказ, тут-то мы и поняли, что китайская кухня к которой мы привыкли, и китайская кухня для китайцев - две огромные разницы. Мясо, которое нам принесли - очень вкусное и интересное, какая-то слегка тушеная говядина в сладком имбирно-кунжутном соусе с зеленым луком и свежим огурцом. А вот лапша, точнее две разные лапши, оказались с трудом съедобными. А еще у них были ван-тоны, которые мы знаем как пельмени, слегка обжаренные в кипящем масле... Заказали сразу большую порцию - 16 штук. Оказалось, что "слегка" обжаривать равно как и следить, чтобы начинки было намного больше чем теста, умеют только в ресторанах, а тут это выглядит как кусок теста, в котором, скорее по запаху, угадывается наличие начинки, зажаренного в масле до состояния сухаря.
Но больше всего нас поразил чай. Ведь для нас "китайский чай" - это синоним хорошего и вкусного напитка. А тут - китайцы сами заваривают свой чай... должно же быть еще лучше, да? Правда цена у него странная - 80 копеек за стакан... Но может это за маленькую пиалу, подумали мы... В результате - принесли нам три пивные кружки с чем-то чайного цвета, на вкус больше всего напоминающее заваренный пару часов назад веник... Вот так мы выяснили, что простые китайцы пьют кошмарный чай, а то что мы знаем под названием "китайский чай" - это сплошь дорогие сорта. Но по деньгам оказалось, что есть там раза в 3-4 экономнее, чем даже в дешевых ресторанах на Букит Бинтанг.

Saturday, July 9, 2011

Самуи - Куала Лумпур

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

Долго выбирали как туда добираться. Самолет отвергли за его стоимость. Почитав про автобус+поезд решили что не хотим рисковать и суетиться - автобус до Хат Яй приходит с разбросом в 2 часа, можно приехать за час до поезда, или через час после его ухода. Остановились в результате на автобусах.

Пошли в турагенство, взяли joint ticket до Куалы - нам сказали что сначала будет микроавтобус, потом большой автобус. Ну да, мы так и читали - микроавтобус до Хат Яй, потом пересадка на большой малайский автобус до Куала Лумпур. Вроде все хорошо.

С утра вышли на дорогу, где нас должны были подобрать. Нас уже ждали - мы были первые в списке пассажиров, так что даже ждать не пришлось. Сели, поехали подбирать остальных. Объехали весь остров, приехали наконец к въезду на пирс. Там нас высадили, выдали билеты на большой автобус и посадили в него. Присмотревшись, обнаружили что автобус идет до Сураттани. Через минут 20 ожидания, автобус медленно поехал к соседнему причалу, где нас опять высадили и мы перешли на паром.

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

Приплыли в Донсак, выгрузились с парома и сели обратно в свой автобус. Едем-едем, местами спим, местами глазеем... Внезапно автобус останавливается прямо на дороге, заходит какой-то мужик и говорит "КуалалампА. гоу" - типа, кому до Куала Лумпура - на выход. Ну мы вышли в полном недоумении - а это оказывается  ненавязчивый тайский сервис автобусных перевозок такой. Этот самый мужик повел нас через дорогу и во дворы, привел к закрытому на решетку помещению и радостно сообщил "файмину". Чего произойдет через 5 минут - непонятно, но ждем. А пока он жестами показал "пописать" и потыкал в ближайшие кусты.

Через 5 минут приехали люди на байках, открыли решетку, за которой оказалось местное автобусное агенство, вместе с кафе. Нам предложили поесть, попить, туалет - все за двойную цену, и выдали очередные ваучеры, на сей раз "Хат Яй - Куала Лумпур", плюс наклейки с буквами KL - чтобы нас не забыли выгрузить где надо.

Через еще почти час ожидания, приехал наконец микроавтобус, забрал нас и мы поехали... Ехали долго и сложно - два часа крутились по городу, подбирая людей, мешочки, пакетики и авоськи. Потом выехали из города и стали развозить эти мешочки по окрестным деревням - сначала в одну сторону по трассе, попутно еще кого-то подобрав, потом в другую, заодно заехав в университет и забрав там человека, и только потом поехали в Хат Яй... Пол-дороги еще и выслушивали местную попсу на большой громкости, а попытка попросить водителя сделать потише ни к чему бы не привела, если бы подобранная в университете женщина не перевела ему, добрая душа - вот что значит образование :). Правда потом мы подобрали пожилую даму, которая села на последний ряд - и водитель выключил задние колонки совсем. По пути остановились на заправку и встряли в очередь, ждали еще полчаса тут. На подъездах к городу опять начали кружить и развозить передачи. И как и раньше - внезапно остановились и уже привычно пошли за мужиком сказавшим "КуалалампА". Дошли до очередного автобусного агенства, обменяли выданные нам ваучеры на билеты, заполнили иммиграционные карточки, показали паспорта и стали ждать, вроде бы через полчаса должен был быть автобус...

Пока ждали немного осмотрелись. Город более цивилизованный чем даже Сураттани - дома больше, дороги более загружены, больше рекламы, в том числе мировых брендов. Приятно удивило количество людей, говорящих по телефонам с видеосвязью - все-таки в Хат Яй с мобильной связью все в порядке. А потом начали искать что бы поесть. Какая-то едальня рядом была - но сколько времени они готовят непонятно, и есть ли там неострая еда - тоже неясно. А совсем рядом с нами готовили какие-то лепешки с картошкой. В общем - взяли мы этих лепешек с собой в дорогу. Потом мы решили что это была пакистанская кафешка. И лепешки оказались вкусные, хотя там и было напихано порядком чили - но если его вынуть, то съедобно даже для детей.

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

Уселись обратно в автобус и поехали дальше. Ехали, спали, пытались читать вывески - малайская письменность основана на латинском алфавите, так что нет проблемы прочитать... Единственная неприятность - на очередной стоянке пошли в туалет, а там денег хотят - местных. Всего-то 30 копеек (примерно 3 рубля), но их нет... Ужасное ощущение - с собой деньги в 4 разных валютах + карточки, а вот заплатить за вход не могу... Спасибо, добрая женщина - наша попутчица, услышав в моем высказывании, на чистом русском между прочим, знакомое слово "рингит" - так называется малайская валюта - заплатила за нашего ребенка. Доехав до города опять начали кружить - то в одном месте дорога перекрыта, то в другом менты поток поворачивают, то еще чего... Потом оказалось что у них в этот день проходил очередной ежегодный марафон в поддержку чего-то там типа мира во всем мире...

В результате мы остановились на какой-то улочке и нам сказали выходить - на вопрос "а где вокзал-то?", сказали "КуалалампА!" и потыкали пальцем в землю. Типа довезли до города, а про вокзал речи не было... Это стало неприятной неожиданностью - мы как-то рассчитывали, что приедем на вокзал, где есть банкоматы, карты города и кафешки с wifi... Пришлось вспомнить, что мы когда-то были простыми путешественниками, и вообще умеем выбираться из незнакомых мест...

Огляделись, вспомнили, что мы знаем о городе - к счастью, мы несколько дней изучали карту Куалы, так что не совсем невежественные были... Высадили нас на окраине Чайнатауна. Так что мы поимели возможность прогуляться по настоящему чайнатауну со всеми его прелестями. В такой ранний час - 6 утра - вовсю работали палатки с едой и цветочные магазинчики. При этом они недавно открылись - о чем свидетельствовал мокрый тротуар. Перед открытием они моют свою территорию, по методу авгиевых конюшен - налить воды побольше, и пусть оно куда-нибудь стечет. Оно и стекает - и результат на улице такой же, как после тех же конюшен. Прогулка превращается в квест - найди сухое, или хотя бы не сильно грязное место, чтобы ногу поставить.

Пройдясь таким образом, заметили вывеску 7/11 - это сеть круглосуточных минимаркетов, распространена по всей Азии. В них обычно есть банкомат, ну и всякие булки, вода и прочее. Зашли, банкомат и правда есть - но не работает. Парень за стойкой утверждал, что заработает через 10 минут - вот равно в 6 и заработает. Ну что ж - подождали, заходим в 6 - "Работает?", "Нет, пока нет"... Другой парень выскочил и говорит, а вот там же банк есть и потыкал пальцем в скопление палаточек "На углу. Банк.". Ну ладно, на углу так на углу... Где он только угол этот? Разглядеть здание уже проблема - оно облеплено палаточками с едой, цветами и еще бохзнаетчем, при этом на втором этаже еще и плакаты висят с рекламой этой самой еды, цветов и прочего... Нырнули мы в это скопление, прошли его насквозь - и действительно, там оказался банк и даже, ура-ура, банкомат работал. Правда выдавал он только купюры по 50 рингит, но это мы решили вернувшись в 7/11 и купив пару булок.

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

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

Monday, June 13, 2011

Путешествие на Тао

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

Поплыли на Тао на утреннем пароме, проспали почти всю дорогу. Приплыли, кого-то попросили найти нам лодку-такси и доплыли до пляжа Sai Thong, куда собирались. Пока грузились в лодку вымокли по ... , ну почти по пояс, короче.
Прошлись по пляжу, посмотрели одно жилье, прошли чуть дальше, нашли Char Bungalow, и там и поселились. Бунгало забавно размещены - остров и так гористый, а тут прямо на скале расположены домики-голубятни. Сняли домик, правда сначала пришлось объяснять что нам надо две кровати, потом выяснять какой же дом свободен, и все это как-то неторопливо, с постоянным брожением по территории - отвели в один, ах, вам надо две, отвели в другой, но он будет свободен через полчаса, а сколько стоит, а это надо с мамой обсуждать, дошли до мамы, обсудили, отвели в третий. В общем, заодно по скалам попрыгали и территорию посмотрели - пальмы, танжерины, обломки скал, цветы... И собаки, гады, абсолютно невоспитанные, лают и бросаются на все, что движется, и вообще жить мешают.

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

Пообедали тут же. Цены, конечно, несколько удивили, дорого для такого места, но списали это на сложность доставки многих продуктов. Зато готовят неплохо... хотя и не все - привычный pad thai здесь, а похоже и на всем острове, готовят не так, как на Самуи, и нам не понравилось. А рис и салаты понравились.
Пока сидели - смотрели на море, на колышашиеся пальмы, на облака... в общем созерцать есть чего и действительно вполне умиротворяет и успокаивает. Так что мы остаток дня отдыхали, немного прошлись по окрестностям, ничего особенного не увидели и после ужина легли спать. Отдельное выдалось развлечение с выгонянием больших мотыльков - мы по глупости включили свет внутри, не включив света снаружи дома - ну и гоняли их потом. А, да - все окна в доме дырявые - стекол нет, а в "жалюзи" не хватает хотя бы одной секции. Ночка выдалась веселая - меня через 3 часа сна разбудили эти гадские собаки, и уснуть уже не получилось... одно хорошо - в этой продуваемой ветрами голубятне можно спокойно курить, не опасаясь помешать спящим.

На следующий день с утра мы решили позавтракать чем-нибудь вкусным, пусть и неполезным, и пойти исследовать остров, на сколько нас хватит. Пришли на завтрак, где выяснилось что хлеба для сендвичей и гамбургеров нет, тунца нет, апельсинов нет, "растительности нет, населена роботами"... в общем, завтракали омлетом. Надо заметить, вкусно.
Сначала пошли прогуляться по дороге на рынок. Горная дорога, местами без покрытия, в большинстве мест все-таки бетонная, но с дикими углами наклона. Добрались до верхней точки этой дороги и радостно посмотрели на спуск вниз, к рынку. Виды красивые обалденно - тропический остров во всей своей красе, с большой бухтой, песчаной косой омываемой волнами, лазурной водой и всеми прочими элементами дизайна Far Cry. Хороших фоток нет - вид все время что-то заслоняет типа вышки ретранслятора или большого куста, а лазить еще куда-то ради фоток сил уже не было - еще же обратно идти. До рынка не дошли - представив себе обратный подъем, решили не рисковать.

Вернувшись и отдохнув решили пройтись в порт. Прежде, чем идти, заглянули в хижину с вывеской "Бар". Держит его пара ребят, по некоторым признакам помесь кого-то с кем-то и с мексиканцами. В баре картинки в духе байкеров америки, революции мексики и пляжной эротики. И 3 портерта Че Гевары. ¡Viva la revolución. И гитара, раскрашенная под мексиканский флаг. Услышав наш заказ - 3 апельсиновых сока, парень явно огорчился - он наверное ждал что мы хоть грибочков спросим... И долго потом интересовался чистый ли я табак курю в своей трубке :)
Наконец, пошли в порт. Дорога - забавная бетонная горная тропа. Посмотрели на побережье в целом, полюбовались поселком Bamboo Hut - хижины выстроены на скалах, с балконам над морем... в общем, пожить там было бы прикольно, наверное... По пути видели большого паука, который спрятался от нас под камнем, и ящерицу, метров полутора длинной, которая тоже сныкалась когда мы подошли. Чисто крокодил, только морда совсем другая.

Дойдя до города, практически сразу пристроились в первом же прилично выглядящем месте. Надо заметить, что таких было немного - пара баров, где не было еды, пара едален, где не было людей, и Safety Stop Pub - где мы засели. Названию удивляться не приходится, учитывая, что Тао - одна из мировых точек дайвинга. Кормят там скорее по-европейски - даже тайские блюда подают порциями, чтобы накормить голодного европейца, который есть 2, максимум 3 раза в день, а не тайца, который ест 5-6 раз. А еще у них есть настоящий кофе. В общем - остались очень довольны, хотя стоил наш обед целых 800 бат. Ужасно дорого для Таиланда. Но мы же в отпуске, нэ?

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

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

С паромом выяснилась подробность - покупая билет на паром, больше чем за час до отхода - получаешь не билет, а ваучер, который надо обменять на билет с 14:00 до 14:30 (на 15:00 рейс), если будут места. Пока мы ждали, сели в том же пабе и пообедали, сбегав обменяв ваучер на билеты посреди обеда. Зато когда пришли на пирс - там стояла длинная очередь за билетами, а у нас уже все было хорошо и оставалось только подождать.

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

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

Избранные фотки в альбоме начиная с этой.

Несколько комментариев:
- поскольку рядом с островом огромные колонии кораллов, там весьма строго смотрят за их сохранностью - нельзя мусорить, местами нельзя вытаскивать из воды обитателей (живых или мертвых), за плавание с гарпуном - до 3 лет тюрьмы, и запрещены ласты.
- с другой стороны, на тех двух пляжах, где мы плавали, по утрам море замусорено именно антропогенным мусором - вода чистая, но пакетов и прочей дряни в ней много.
- насколько мы видели, в отличии от Самуи (да и остального Таиланда), здесь просыпаются ощутимо позже - рестораны в отелях начинают работать в 8, тогда же народ выползает на уборку территории и т.п.
- на пляжах таки рекомендуется быть поосторожнее, потому что обломков кораллов куча, и регулярно попадаются достаточно острые. В толпе отъезжающих почти у каждого 7 была перебинтована нога.

Раскладка по ценам, кому интересно:
- билет на паром в одну сторону 600 бат на взрослого, 300 бат на ребенка 4-11 лет. 3000 бат всего.
- лодка-такси до пляжа 100 бат с человека. 300 бат всего.
- аренда домика с двумя кроватями 400 бат в сутки. 800 бат всего.
- и дорогая еда: 30 бат за стаканчик чая, 80 бат за два тоста с маслом и сыром, 70 бат омлет, 70 бат жареный рис...

Tuesday, May 10, 2011

Database tables and columns naming conventions

Once again I've got to explain what I think about database tables and columns naming conventions. This time, I've decided to write down my points, to be able next time just to give a link :).

Starting with tables - main question is plural or singular form should be used. Main point in favor of plural form is something like "it is a collection of entities, so it must be named in plural form". Singular form is preferred when you want to write query like "where user.id = ", and not "where users.id = ".

When it comes to columns' names, there are much more arguing about it. Main one is about primary key - should it be ID or entity_id. In case you've used plural form for tables, it become more pleasant in queries - "where users.user_id = ". Next bone of contention is about short forms in columns' names - could you name it like userGoodsCnt, or you must name it like amount_of_goods_in_user_cart.

It's funny to notice that usually, ones that love plural form of tables' names and long version of primary key prefer long version of columns' names too. Why do they love long names so much? In most cases they say that it's because "database schema must be as much readable as it could be". It is very important to have readable and pretty much self-explanatory schema, then why others disagree? Ones that like short forms says that "it is _understandable_, and it is shorter. save a byte - save a tree". One more point - description of column or table could be kept near it, not necessarily in name - in description, in repository, in comments... 

From my point of view, it is all about when and how you work with schemes. Either you usually look on DB chart, or DB schema or some entities' relations graph... in this case you prefer long, self-describing names, since comments are hidden at this time. And, what is usually much more important, you look at this chart from time to time, either you are DBA with a lot of such schemes, or it's just not your primary job - you just refer to schema sometimes, so you do not need to remember it and want to get all information from just one look. On the other side are those who work with tables' and columns' names many times a day, those who write code and queries. They usually keep whole DB schema in mind, and since they write all those names with their own fingers - they want it to be as short as possible.
First group are architects, who do not write code, technical directors and so on. Second are developers and coders.

Summary: if you are a leader and architect, do not forget about those who will work with schema every day - do not spoil their comfort in favor of pleasure look of DB chart. Developer's comfort is very important - not lesser then yours. But they spend much more time with DB - don't forget about it. It doesn't mean that table could be named as table1 with columns A,B,C - no way.

I myself prefer to name tables in plural form, but to name columns as short as possible. It's because I use ORM, so I do not usually see ugly queries like "where users.id = ", but I use forms like "select from users where name like" - it is ok with me. But when it comes to columns' names - I try to keep it as short as possible, as long as it is understandable to those, who work in the same project. I'm pretty much sure, that if you can't spend time to read and understand DB schema with shortened forms (like usr instead of user) - then you'll not have enough time to make something good to project's technical development.