Top.Mail.Ru
? ?
Веб-сервер на Ubuntu. Мои грабли.
Imagesphinks1
 До того свю жзнь пользовался Windows+denwer и хлопот не знал. :-) Решил на Ubuntu поднять всю свои разработку, поэтому веб-сервер пришлось учиться настраивать. Поднял по инструкции отсюда: http://forum.ubuntu.ru/index.php?topic=46573.0
Все вроде по инструкции, но не работает.

Грабли номер раз: не отображаются странички локального сайта - починилось выставлением прав 777 на все странички (конечно только для локальной машины). Как выяснилось apache запускается из под своего пользователя, который скорее всего не имеет прав на запускаемый вами сайт.

Грабли номер два: не работает phpmyadmin. Точнее до него не достучаться. Лечится созданием ссылки:
sudo ln -s /usr/share/phpmyadmin /var/www/phpmyadmin

Ну и не совсем грабли, а так последний штрих. Нужно было установить curl сделал так:
sudo apt-get install curl libcurl3 libcurl3-dev php5-curl
sudo /etc/init.d/apache2 restart

Заработало. :)

Работа с common-cli 1.2
Imagesphinks1
 В процессе работы на одним проектом, возникла необходимость разработать консольное приложение для удаленного доступа к системе. За подобное взялся впервые в таких масштабах, раньше все было на окошках или если консоль, то точно известно число, тип и порядок передаваемых параметров. А здесь возникла необходимость в большом количестве команд, каждая со своими параметрами, или вовсе без них, соответственно для обеспечения гибкости возникла потребность в парсере, переданных параметров.

Дабы не изобретать велосипед, решил взять готовую библиотеку. Выбор остановил на common-cli, для нее удалось найти пару примеров и использование ее казалось не очень уж сложны.
Как оказалось примеров не так уж много и покрывают они только базовые потребности разработчика. Попробую заполнить этот пробел своими пояснениями.

Итак, начнем. В основе Common-cli лежит понятие опции. Чтобы сразу внести ясность, попробуем определиться с терминологией. Рассмотрим такую строчку:

Text.exe –l login –password 123456

Происходит вызов программы test.exe с использованием опции l, которая в качестве аргумента принимает строку «login» и с использованием опции password, с аргументом в виде строки «123456». Нетрудно догадаться, что программа требует аутентификации, опция l отвечает за логин, а опция password само собой за пароль. Для простоты можно пару «опция, аргумент» рассматривать классичским способом «параметр=значение».

Кстати, форма записи со знаком «=» вполне допустима при использовании common-cli.
 
Опции могут быть без аргументов вовсе или аргументов может быть больше одного. Если имя опции состоит из 1 буквы, то ей предшествует «-» (назовем это, по простому «тире»). Если имя опции состоит из 2 и более букв то необходимо удваивать «тире», как с опцией password.

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

Option option = new Option("l", "login", true, "Login");

Коснтруктор в данном случае принимает 4 параметра: короткую форму опции (однобуквенная опция), длинную форму опции, флаг обозночающий наличие параметров и текстовое пояснение данной опции. Мы могли указать только однобуквнное предствления опции или только расширенное представлении опции, в каждом из этих случае конструктор принимал бы 3 параметра, но не указывать ни многобуквенной ни однобуквенной опции нельзя, необходимо указать хотя бы одну. Затем необходимо определить, как данная опция будет работать с аругментами. Примерно так:

option.setArgs(1); // число аргументов в опции
option.setOptionalArg(false);// являются ли аргументы необязательными для ввода, по умолчанию аргументы обязательны для ввода, так что эту строчку можно было опутить
option.setArgName("login ");//имя аргумета, именно так аргумент будет отображатся в справка по использованию командной строки.

Вроде бы из комментариев к коду все должно быть понятно. Если нам необходима опция без аргументов (опция-флаг), то ставим setArgs(0). После создания опции необходимо добавить ее в объект Options.

Options posixOptions = new Options();
posixOptions.addOption(option);

Теперь необходимо создать парсер командной строки и снабдить его необходимой информацией для работы:

CommandLineParser cmdLinePosixParser = new PosixParser();// создаем Posix парсер
CommandLine commandLine = cmdLinePosixParser.parse(posixOptions, commandLineArguments);// парсим командную строку

Для начала создаем парсер, полновесных парсера в common-cli 2 – Posix парсер и GNU парсер. Скажу честно, в их различия не вникал, но по беглому осмотру мне приглянулся Posix-парсер (регламентируется Posix стандартом, соотвественно будет работать на всех система поддерживающих этот стандарт «ссыль на него»).Затем запускаем парсер, в качестве параметров метод parse принимает коллекцию опций в виде объекта Options, и собственно строку с параметрами которые были переданны вашей программе при запуске (само собой что стандартный массив args[] перед использованием необходимо объекденить в одну строку разделяя элементы пробелами). Разультат разбора будет возвращен в объект commandLine.
 
Теперь необходимо выполнить полученные команды, делается это вот так:

if (commandLine.hasOption(“l”)) { // проверяем, передавали ли нам команду l, сравнение будет идти с первым представлением опции, в нашем случаее это было однобуквенное представление l
String[] arguments = commandLine.getOptionValues(“l”);// если такая опция есть, то получаем переданные ей аргументы
System.out.println("We try to Login with: " + arguments[0]);// выводим переданный логин
… // работаем дальше
}

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

public static void printHelp(
final Options options,
final int printedRowWidth,
final String header,
final String footer,
final int spacesBeforeOption,
final int spacesBeforeOptionDescription,
final boolean displayUsage,
final OutputStream out)
{
final String commandLineSyntax = "java test.jar";//подсказка по запуску самой программы
final PrintWriter writer = new PrintWriter(out);// куда печатаем help
final HelpFormatter helpFormatter = new HelpFormatter();// создаем объект для вывода help`а
helpFormatter.printHelp(
writer,
printedRowWidth,
commandLineSyntax,
header,
options,
spacesBeforeOption,
spacesBeforeOptionDescription,
footer,
displayUsage);//формирование справки
writer.flush(); // вывод
}

Чтобы все стало ясно, приведу пример вызова данного метода:

printHelp(
posixOptions, // опции по которым составляем help
80, // ширина строки вывода
"Options", // строка предшествующая выводу
"-- HELP --", // строка следующая за выводом
3, // число пробелов перед выводом опции
5, // число пробелов перед выводом опцисания опции
true, // выводить ли в строке usage список команд
System.out // куда производить вывод
);

Пожалуй здесь все понятно, кроме термина «строка usage». Приведу пример пример, из которого станет ясно как использовать данный параметр. При значении true вывод будет примерно такой:

usage: java test.jar [-l <login>] [-h]

При значении false, вывод будет таким:

usage: java test.jar

Думаю разница понятна.

Последнее - это группы опций. Например, есть две опции -a и -b, они являются взаимоисключающими, то есть одновременно не могут быть указаны. Для такого случая и создаются группы опций:

OptionGroup optionGroup = new OptionGroup();
optionGroup.addOption(new Option("a", true, "A option");
optionGroup.addOption(new Option("b", true, "B option");
posixOptions.addOptionGroup(optionGroup);

Тоже все довольно просто.
 
В общем бибилиотека оставила неплохие впечатления по использованию, но очень быстро ее стало не хватать. Текущая версия бибилиотеки 1.2, при этом идет развитие абсолютно новой версии 2.0 – собственно, по описанию api версии 2.0 можно сказать, что эта версия должна удовлетворить большинство потребностей предъявляемых к библиотекам cli.

Плюсы common-cli:
простота использования
группы опций
длинные и короткие нотации опций (-l, --login)
возможность парсить опции следующего вида -ab, когда есть две опции -a, -b
 
Минусы (из собственных потребностей, а так их конечно больше):
нет возможности создавать подкоманды (как в git есть команды branch, status и т.д. со своими опциями)
не очень удобная работа с аргументами опции, если их больше 1

В итоге, для простенькой cli - отличное решение, что-то более серьезное искать альтернативы или ждать версию 2.0.

Мой опыт собеседования в Яндексе
Imagesphinks1

Всем мое почтение.

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

Итак, все началось в декабре прошлого года, когда я на сайте Яндекса увидел две вакансии: Java Junior Developer и Java Developer. К каждой из них прилагались тестовые задания. Решил проверить свои силы и начал решать их. Спустя несколько дней было отправлено резюме и решения задачек в HR Яндекса.

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

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

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

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

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

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

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

Потом появился мой интервьюер. Про себя удивился, что он был один. Из прочтенного в сети я знал, что обычно любят собеседование проводит по 2-3 человека. Интервьюер представился, начал на «Вы», потом попросил разрешения перейти на «ты». И началось…

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

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

Где-то через час или полтора после начала собеседования, к нам присоединился еще один интервьюер. В ход пошли знаменитые логические задачки. Первые две пошли на ура. На третье я подзавис, воспользовавшись моментом, мои собеседники вышли, как я понял, чтобы обменяться мнениями. Это мне дало минут 5-7 подумать в спокойной обстановке, правда решения это мне так и не принесло. Потом пошла следующая задача, за ней еще одна и еще одна. :-) В итоге, мне задали 6 или 7 логических задачек, не справился я только с двумя. На этом этапе, меня так же не оставляли один на один с «бедой»: внимательно следили за тем как я искал решение, задавали вопросы, следили за рассуждениями.

Затем перешли к общим вопросам за жизнь: какие технологии еще знаю не связанные с Java, с какими ОС работал, чем не устраивает текущая работа. Потом последовало еще одно совещание. В итоге мне объявили, что меня готовы взять на Junior Developer. Потом уже начал я задавать вопросы об организации труда, о том, чем предстоит заниматься. Со мной терпеливо вели беседу, все объясняли. В общем, собеседование продолжалось около 4 часов, из которых только заключительные минут 30 были посвящены общим организационным вопросам. Согласия на работу от меня сразу не требовали, дали время подумать, после чего проводили до холла.

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


Image