Wednesday, February 22, 2012

Coding Dojo - экстремальное погружение

   Не так давно мне посчастливилось попарнокодить с Johannes Brodwall. Один из результатов спаринга я уже опубликовывал в предидущем блоге (см. Зачетный пример на TDD)
   К сожалению мне не удалось попасть на его мастер-класс "TDD Coding Dojo", так как именно в этот день я обещал своей жене то, чего она ждала последние 7 лет - пойти с ней на танцевальную вечеринку. Можете себе представить мою досаду, когда мы, одетые, побритые и накрахмаленные пришли вечером в танцевальный клуб и узнали, что вечеринку перенесли на другой день?!. Еще раз сделаю ссылку на сайт танцевельной тусовки дабы чаще смотреть обновления об изменении планов.
   В общем я задался целью организовать это мероприятие у нас на фирме. Слава Богу, контора большая и желающих должно набраться большое количество. Тем более, что Саша развил в киевском офисе клевую идею с техтолками, что уже создало своеобразную тусовку.
   Итак, я вооружился инструкциями "Как стартануть Coding Dojo" от Johannes'a и решил попробовать запустить это у себя на компе

Как это работает


   Coding Doje Extreme Setup состоит из 2-х частей - клиентская (я ее буду называть Extreme Setup хост, или просто хост) и серверная. Хост - это программа, которая 1 раз в 10 секунд посылает http запросы всем зарегестрированным серверам участников и сравнивает их ответы с правильным вариантом. Если ответ правильный - игрок получает очки, если ответ неправильный - очки отнимаются. Включив принцип КО можно догадаться, что сервер - это программа, запущенная на компьютере участника. В случае с Java - это обычный сервлет

Как установить хост


   Для одной игры хост нужен только один, так что если вы собираетесь только играть можете смело перепрыгивать в секцию Установка сервера.
   Клонируем git://github.com/jhannes/extreme_startup.git. Это форкнутая отсюда https://github.com/rchatley/extreme_startup версия. Выбрал ее потому, что она отработана на киевском dojo на XPDays. Я склонировал в папку C:\workspace\projects\dojo-startup\extreme_startup
   Дальше делаем все согласно README.md из проекта, а именно:
Устанавливаем Ruby 1.9.3 (качаем отсюда)


   Скачиваем Ruby DevKit и распаковываем в (я установил в c:\workspace\bin\RubyDevKit)


   Далее устанавливаем DevKit:
- Открываем командную строку, переходим в c:\workspace\bin\RubyDevKit и запускаем ruby dk.rb init.

- Сгенерировался config.yml файл. Откроем и посмотрим. Должны увидеть путь к установленному Ruby.

Если нет – надо добавить

- Запускаем ruby dk.rb install



   Переходим в папку со склонированным репозиторием (C:\workspace\projects\dojo-startup\extreme_startup) и запускаем команду gem install bundler.

   Затем запускаем команду bundle install и ждем, пока скачаются и установятся необходимые библиотеки. После появления обнадеживающей надписи

   запустим extreme startup сервер в режиме разогрева (warmup mode): ruby warmup_web_server.rb

   Проверяем страничку с результатами http://localhost:3000 (пока пустая). Проверяем, что хост доступен с другого компьютера.

   Чтобы присоединиться к игре необходимо ввести имя и URL веб сервера игрока, запущенного на его машине. Для каждого языка программирования существует свой простой способ стартануть сервер. Я привел инструкции как это сделать на Java. Для других языков смотрите список проектов в каталоге extreme_startup_servers
   Ждем, когда все игроки настроят свои средства разработки и зарегистрируются. Как только все прокричали «я готов!» останавливаем сервер и запускаем реальную игру командой ruby web_server.rb

Установка сервера на Java.


   Прежде всего нужно убедиться, что установлен Maven (если нет, то утанавливаем отсюда) и он доступен по путям: mvn –version что-то выдает
   Скачиваем зип архив отсюда. Это содержимое репозитория со старт-поинтами https://github.com/bodil/extreme_startup_servers. Я склонировал в папку C:\workspace\projects\dojo-startup\extreme_startup_servers
   Запускаем любимую java IDE (в моем случае это IntelliJ IDEA) и создаем новый проект из мавеновского pom.xml. Проект берем этот: /java/servlet_for_dummies (C:\workspace\projects\dojo-startup\extreme_startup_servers\java\servlet_for_dummies)

   После открытия проекта смотрим что внутри


  • ExtremeStartupServer – класс с main методом для запуска Jetty
  • ExtremeStartup – сервлет, который мы будем программировать
  • ExtremeStartupTest – тест, который нам поможет этот сервлет запрограммировать

       Запустим ExtremeStartupTest – если все тесты зеленые, то запускаем сервер (ExtremeStartupServer)
       Открываем браузер и вводим адрес http://localhost:1337/?q=what+is+the+sum+of+8+and+22


       Все, теперь можем регистрировать наш сервер. Переходим на страничку хоста (http://localhost:3000 или в случае другого компа – IP адрес этой машины), нажимаем I want to play и вводим имя (латинскими буквами!) и URL вашего сервера.

       Если хост смог достучаться до сервера, то увидим примерно такую обнадеживающую надпись


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


       Выведем на консоль то, что спрашивает хост – делаем изменения в классе ExtremeStartup
       Оказывается хост хочет узнать как меня зовут.


       Не вопрос, поменяем реализацию метода answer
       и смотрим на свой результат. Ура! У меня есть первый правильный ответ


       Итак, в консоли мы видим приходящие запросы и программируем сервлет так, чтобы он отдавал правильные результаты. За каждый правильный результат начисляются баллы, за каждый неправильный или пропущенный ответ вычитаются. Думаю очень полезно использовать тест, чтобы не поломать предыдущую функциональность и иметь возможность быстро сэмулировать запрос.
       Все, можно кричать "Я готов!"
  • Friday, February 10, 2012

    Netty - очередное чудо асихнронной событийности в сети

    Раз уж я так увлекся исследованиями асинхронными событийно-ориентированными сетевыми платформами на Java, то не могу не упомянуть о Netty. Как заявлено на сайте Netty - это асинхронный событийный фреймворк для сетевых приложений
    Не будем утруждать себя чтением доки (хотя иногда это очень стоит делать), а сразу реализуем такой же примерчик, какой мы делали для демонстрации node.js
    Как обычно, создаем мавеновский проект. Вот pom.xml:

    Обрати внимание на то, что здесь добавлен Мавен репозиторий JBoss
    Создаем класс самого сервера:
    Чуть подробнее о классах, которые он использует:

    ChannelFactory это фабрика для создания и управления Channel'ами и их ресурсами. Channel в Netty - это аналог Channel'ов из пакета java.nio.channels с возможностью асинхронного вызова чтения/записи.
    NioServerSocketChannelFactory - это реализация ChannelFactory. Конструктор принимает 2 Executor'a : bossExecutor и workerExecutor. Boss потоки обслуживают открытые серверные Channel's (ServerSocketChannel). Worker потоки осуществляют неблокирующее чтение/запись для одного или нескольких ченелов. Т.е. если, например на сервере открыто 2 порта 80 и 443, то их обслуживать будут 2 Boss потока. Как только сервер примет клиентское соединение, то boss передаст принятый Channel одному из worker потоков.
    ServerBootstrap - это вспомогательный класс для инициализации сервера. Можно и без него, но прийдется много кода писать
    Дальше мы конфигурируем ChannelPipelineFactory. Как только сервер приймет новое соединение, то будет создан новый ChannelPipeline этой фабрикой.
    Вот наша реализация ChannelPipeLineFactory

    Немного о том, что такое ChannelPipeline. Как только создан новый Channel, то с ним ассоциируется новый экземпляр pipeline. Pipeline содержит набор обработчиков событий, которые вызываются при получении сообщения или записи. При этом принята метафора, что все сообщения на чтение обрабатываются восходящими обработчиками (Upstream Handler), а на запись - нисходящими (Donwstream Handlers).
    Например, если клиент подключился к серверу и послал GET запрос, то вызовутся Upstream обработчики, то есть те, которые реализуют интерфейс ChannelUpstreamHandler. Когда мы сформировали ответ и отдаем его клиенту вызовутся обработчики, которые реализуют интерфейс ChannelDownstreamHandler. Причем Upstream вызовутся в порядке, котором их определили при добавлении, а Downstream - в обратном направлении.
    В нашем случае при получении сообщения вызовется сначала HttpRequestDecoder, а затем наш HelloHander
    Обратите внимание на то, что здесь идет 2 раза запись в Channel. При chunked ответе содержимое обьекта response автоматически станет пустым. Поэтому Hello пришлось записывать отдельным блоком и дальше создавать наши асинхронные таски с помощью AsyncExecutor
    Поскольку вся запись/чтение в ченел асинхронные, то для того, чтобы сделать действие действительно после того, как запись произойдет нужно зарегистрировать листенера, который вызовется после физической записи блока в поток ввода-вывода
    Еще один интересный момент - если у нас чанкед ответ, то HTTP спецификация просит последний блок (chunk) делать пустым
    Запустим приложение и дадим команду из командкой строки curl -i http://localhost:8081. В результате выведутся http headers, за ними Hello и World 0, а затем с интервалом в 2 секунды - World N.

    Вывод.Судя по архитектуре фреймворк должен быть устойчив к большому наплыву пользователей (масштабируемость). Очень легковесный, jar файл занимает 800К. Сложная в разработке и понимании (одна метафора с событиями чего стоит). Отлично подошла бы для специфических задач, например для веб серверов, которые передают/принимают большие потоки данных, или для систем, где большое количество пользователей делают однотипные операции (AJAX чаты, месенджеры и т.п.). Медиа стриминг, говорят, тоже отлично решается с помощью этого фреймворка.

    Servlet 3.0 - лучше позже чем никогда

    Наконец-то после 6 лет с момента реализации технологиии Comet в Jetty и 2х лет со дня выхода финальной версии спецификации Servlet 3.0 вышел релиз Jetty 8, который эту спецификацию, собственно, и реализует. Кроме аннотаций и прочих рюшечек самое интересно новшество - это, конечно, возможность асинхронной обработки запроса, что сильно упрощает процесс Server Push'a. Посмотрим на примере как реализована эта возможность.
    Создаем проект. Для этого нам понадобится средство сборки Maven. Создаем мавеновский проект и прописываем зависимости. Вот полный код моего pom.xml:
    Реализуем такой же примерчик, как тот, что я делал во время демонстрации node.js
    Вот таким будет наш сервлет:

    В аннотации сервлета есть важное свойство asyncSupported. Это значит, что наш сервлет может переводить запрос в асинхронное состояние. Перевод делается методом startAsync()
    Мой класс AsyncExecutor, над реализацией и чистотой кода которого я особенно не думал:
    Теперь запустим наше приложеньице. Удобно делать это с помощью jetty-maven-plugin. Я делаю это из IntelliJ IDEA:

    Теперь посмотрим как это работает и заодно глянем на header'ы. Запускаем curl -i http://localhost:8080/hello. Сразу выводится Hello и World 0, затем World N - каждые 2 секунды

    Ура! Работает!

    Node.js - все гениальное просто

    Недавно посмотрел ролик Райана Дала (Ryan Dahl), идейного вдохновителя и создателя платформы для быстрых и масштабируемых сетевых приложений node.js. Очень понравилась простота и легковесность этого решения. Node.js - модная и активно развивающаяся платформа, интересно, что ее уже активно используют в eBay. Собственно, я и начал это исследование, вдохновленный идеей ql.io от eBay (тут анонс)

    1. Инсталлируем
    Скачиваем отсюда и ставим как обычно. Я еще добавил в пользовательские пути

    Пробуем запустить из консоли. Открылась консоль, в которой можно побаловаться и позапускать Javascript функции и выражения.

    Node.jsпостроен на javascript движке V8 от google. Этот движон используется в chrome. Естественно, что в консоли node нету обьектов браузера, но можно посмотреть process()

    2. Hello World!
    Напишем такую вот програмку:

    И запустим. После чего сначала появится Hello, затем через 2 секунды world


    После выполнения - вернулись в командную строку. Теперь попробуем сделать так:


    Приложение не завершается, т.к. есть что делать (колбек, который надо вызывать каждые 2 сек)


    3. Пишем веб-сервер
    Ок, Javascript в консоли - это, конечно, очень круто, но давай напишем серверное приложение


    И запустим его. Интересно посмотреть на http headers. Смотрим с помощью curl это curl –i http://localhost:8000


    4. Делаем Server push
    Hello World - это элементарно. Концепция асинхронной событийной модели node.js позволяет так же элементарно реализовывать server push, как и в примере с выводом на консоль.

    Этот примерчик немножно посложнее. После Hello каждые 2 секунды будем выводить World N, где N - это значение каунтера. Будем выводить, пока не надоест, а надоест нам через 5 выводов



    Вывод. В этом примере, конечно, не рассматриваются преимущества асинхронной событийной модели при разработке, но такой подход все чаще используется. Это связано с возросшей нагрузкой на серверные ресурсы, которая особенно стала заметна после появления Web 2.0 и постоянно растущем количестве nice-and-sexy online приложений где пользователю не надо жать Refresh чтобы получить новую порцию данных.
    Подробнее о преимуществах и как это устроено можно посмотреть здесь или здесь или в моей презентации с Ciclum Java Saturday, которую расшарю позже

    Wednesday, January 11, 2012

    JBehave быстрый старт


    JBehave - это легковесный и простой в использовании фреймворк для разработки тестов используя подход BDD.Конечно существует множество расширений, такие как jbehave-web или jbehave-osgi(полный спписок расширений смотри на их проекте в github), но в данном примере я ограничусь только основными возможностями
    Для начала потребуется средство сборки и управления зависимостями Maven. Скачать можно отсюда. Инструкция по установке здесь

    Шаг 1. Создаем шаблон проекта
    В консоли (cmd) переходим в папку, в которой хотим создать проект. Запускаем команду:
    mvn archetype:generate
    На вопрос "Choose a number or apply filter" вводим org.jbehave:jbehave-simple-archetype и подтверждаем выбор (жимаем 1)

    Далее спросит какую использовать версию (Choose version). Вводим последнюю релизнутую, в моем случае это 3.5.4 (или номер 18)

    Далее последует вопрос к какой группе будет относится проект (groupId) и имя артефакта (artifactId).

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

    Шаг 2. Смотрим что внутри
    Открываем IDE и импортируем Maven проект. В IntelliJ IDEA 11 это выглядит так:


    Ставим плагин для JBehave (Project->Settings->Plugins):
    Смотрим на структуру проекта.
    Там мы видим
    a. My.story – файл, в котором описана наша история. Пока из одного сценария. Как видим нереализованные степы подсвечиваются как ошибки и ключевые слова выделены цветами. Эту приятность дает нам установленный плагинчик
    б. MyStories.java – это основной класс, который используется для запуска тестов на jbehave (своего рода main класс).
  • Он определяет конфигурационные параметры для тестов. По умолчанию MostUsefulConfiguration с параметрами по умолчанию. Тестовые файлы будут загружаться из classpath, отчет будет выводиться на консоль, в текстовый файл, html и xm. Конфигурация нас устраивает, так и оставим.
  • Переопределенный метод stepsFactory создает фабрику для реализации степов. В данном случае пока один класс со степами – MySteps
    в. MySteps.java - Сам класс с реализацией степов, пока пустой – в нем будем реализовывать шаги наших тестовых сценариев

    Шаг 3. Попробуем реализовать простую историю
    Попробуем реализовать историю удаления/добавления чисел из списка.
    Выражу эту историю в формате, который обычно используется в agile процессах во время планирования:
    As a [role]
    I want [feature]
    So that I receive [value]
    Наша история, записанная в таком формате выглядит примерно так:
    As a developer
    I want to add and remove numbers from the list
    So that I can use the basic list functionality
    Это и есть наше письменное описание функциональности (Narrative)

    Из описания следует как минимум 2 сценария: добавить элемент и удалить его. Так и запишем
    A number can be added to the list
    A number can be removed from the list

    Каждый сценарий разбиваем на набор шагов Given-When-Then:
    Given an empty list
    When I add a number 123
    Then size becomes 1 and the list contains 123
    и
    When I remove number 123
    Then the list is empty

    Попробуем запустить. Запускаем MyStories как обычный JUnit тест

    Тесты прошли. Смотрим на консоль. Каждый шаг в сценарии находится в состоянии PENDING, что естественно т.к. мы ничего еще не реализовали.
    Scenario: A number can be added to the list
    Given an empty list (PENDING)
    When I add a number 123 (PENDING)
    Then size becomes 1 and the list contains 123 (PENDING)
    @Given("an empty list")
    @Pending
    public void givenAnEmptyList(){
    // PENDING
    }

    Напишем реализацию наших степов:

    И запустим...в консоли видим, что все наши 2 сценария падают с ошибкой:
    Scenario: A number can be added to the list
    Given an empty list
    When I add a number 123
    Then size becomes 1 and the list contains 123 (FAILED)
    (junit.framework.AssertionFailedError: expected:<1> but was:<0>)

    Scenario: A number can be removed from the list
    When I remove number 123
    Then the list is empty (FAILED)
    (junit.framework.AssertionFailedError: null)


    Failed to run story com/amazontest/stories/my.story
    junit.framework.AssertionFailedError: expected:<1> but was:<0>
    at junit.framework.Assert.fail(Assert.java:47)

    Если запустить мавеновский билд mvn install
    То в файлике target\jbehave\view\reports.html будет красивый HTML отчет о последнем запуске
    Осталось только реализовать необходимую функциональность и радоваться прошедшим тестам.
  • Thursday, December 22, 2011

    Зачетный пример на TDD - Prime Factors

    Недавно мне посчастливилось попрактиковаться в парном программировании с Johannes Brodwall во время его визита в Киев на конференцию XP Days. Мы, играючи в ТДД пинг понг, за пару часов реализовали 2 довольно сложных примерчика, так называемых kata для его coding dojo сессии на XP Days. Причем успели один из примеров реализовать не только на Java, но еще на CoffeScript.

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

    Если ты еще не знаком с правилами ТДД пинг понг, то рекомендую посмотреть как это делается здесь или попрактиковаться на нашем треннинге по ТДД.

    "Prime Factors" (не знаю как по-русски).
    Разложить целое число на множители из простых чисел:
    2 -> [2]
    3 -> [3]
    4 -> [2,2]
    6 -> [2,3]
    9 -> [3,3]
    12 -> [2,2,3]
    15 -> [3,5]
    и так далее...

    Итак, начали...
    Johannes. Естественно с теста:

    public class PrimeTest {
    @Test
    public void primeFactorOfOne() {
    assertEquals("[]", Prime.factorsOf(1).toString());
    }
    Я. А че тут думать? Самая простая реализация - вот:
    Тесты прошли, пишу следующий тест:
    junit.framework.ComparisonFailure:
    Expected  :[2]
    Actual    :[]

    Johannes. Тоже не особо думая
    и, после запуска тестов - пытается отдать мне это:
    Oops... тест зеленый, сори, мне идет эта подача:
    junit.framework.ComparisonFailure:
    Expected  :[2, 2]
    Actual    :[4]

    Я. Лень что-то придумывать сложное. Первая мысль - добавить тупой if и разделить на 2
    как ни странно, но прошло. Тихо радуюсь про себя, что не мне реализовывать следующий тест:
    junit.framework.ComparisonFailure:
    Expected  :[5]
    Actual    :[2, 2]

    Johannes. Видимо, почувствовал мое злорадство и тоже долгими раздумьями над идеальным решением себя не утрудил:
    и, как говорится, "получите, распишитесь" - забираю клавиатуру с таким красным тестом:
    junit.framework.ComparisonFailure:
    Expected  :[2, 3]
    Actual    :[3, 3]

    Я. Тут я немного подвис. Смотрю на то, как падает тест и не без помощи напарника понимаю, что для того, чтобы в списке появилась 2, а потом 3, нужно организовать цикл:
    Ура! Работает! Все тесты зеленые. Пробую добавить тест на семерку - проходит. Поправляю на 8 и отдаю клавиатуру
    junit.framework.ComparisonFailure:
    Expected  :[2, 2, 2]
    Actual    :[2, 4]

    Johannes. Все, что надо сделать - это заменить if на while:

    Все тесты зеленые! Я пытаюсь добавить тест на двухзнчные числа, потом думаю подловить, предав что-то вроде такого 2*3*5*7*11*13*17*19*23, потом отнимаю от этого выражения 1, затем 2 но поломать код не получается - тесты зеленые! Все, сдаюсь и соглашаюсь: РАБОТАЕТ!

    На этом бы и поставить точку, но в вообще существуют еще нефункциональные требования, которые зачастую не так легко проверить при помощи TDD.
    Этот алгоритм еще можно оптимизировать по скорости, но чтобы это почувствовать мы добавили такой тест, который выполнялся около 23 секунд:

    И "пофиксили" его вот таким изменением:

    Все, теперь не только РАБОТАЕТ, но и работает БЫСТРО!

    Tuesday, December 06, 2011

    Как мигрировать локальный репозиторий SVN на Git/Github

    Git предоставляет мост через который можно работать с SVN как с удаленным репозиторием, при этом пользуясь практически всеми возможностями, которые предоставляет Git. Все, что нужно сделать - это научиться пользоваться командой git svn которая идет вместе с инсталляцией клиентской версии git. С миграцей репозитория на Git\Github тоже ничего не должно быть сложного. Достаточно добавить удаленный репозиторий после импорта SVN в локальный проект и набрать команду git push. Эх, если бы все было так просто...Расскажу как у меня это получилось с обходом одной грабли, на которую пришлось наступить.

    Для начала устанавливаем клиентскую версиою Git. Я использовал msysgit версии 1.7.8-preview.

    Предположим, что наш локальный SVN репозиторий находится в папке C:\workspace\Repository и свн установлен на машине.

    Открываем командное окошко (cmd) и набираем команду

    svnserve --daemon --root C:\workspace\Repository

    Этим мы запустили сервер SVN, который дает нам возможность удаленного доступа к нашему репозиторию по протоколу svn, что даст возможность Git его скачать. Теоретически и документация говорит, что git svn должен понимать протокол file://, но если бы все было так просто... на StackOverflow нашел свою проблему с решением

    Далее создаем новую папку в которой будет создан локальный слепок SVN репозитория в GIT формате (в моем случае C:\workspace\git-repository)

    Запускаем Git-bash в этой папке из контекстного меню Windows Explorer. И запускаем команду
    $ git svn clone svn://localhost --no-metadata

    Чем больше репозиторий, тем дольше она будет выполняться. В моем случае на 100 комитов она выполнялась минут 5. После чего у меня появилась папка localhost с содержимым svn репозитория и отображением всего SVN репозитория в локальном репозитории GIT.
    Перехожу в эту папку
    $ cd localhost/

    и связываю локальный репозиторий с удаленным репозиторием Github, который я заблаговременно создал:
    $ git remote add origin git@github.com:tdd-elevator-training/elevator.git

    после чего мне осталось залить (пушнуть) изменения на сервер, что я с радостью и делаю вот таким способом:
    $ git push -u origin master

    Все, мой SVN репозиторий полностью со всей историей и даже с сохраненными авторами начальных комитов в Github.

    Monday, December 05, 2011

    Как быстро настроить Github в Intellij IDEA

    Недавно вышел релиз кандидат Intellij IDEA 11. В числе многих украшательств и фишечек JetBrains расширил поддержку популярного вершн контрола Git/Github. Мне очень захотелось попробовать поработать с Git, но помня нашу неудачную с Сашей попытку настроить Github проект из Intellij IDEA, я предварительно вооружился документацией на русском языке после чего начал настраивать Git репозиторий. Здесь я расскажу как у меня это получилось и на какие грабли наступил.

    Шаг 1. Установка Git клиента.

    Следуем инструкциям по инсталляции с Github. Скачиваю msysgit (версия Windows здесь http://code.google.com/p/msysgit/downloads/list). Дальше все как по картинкам в инструкции.
    Затем добавил переменную среды GIT_HOME, которая указывает куда установил Git:


    после чего добавил в Path:
    Шаг 2. Создаем репозиторий и публичный ключ

    У нас уже есть учетная запись на Github, я использую ее и создаю репозиторий под названием "test".
    Для того, чтобы сервер Git смог меня аутентифицировать (узнать) мне нужно сгенерировать rsa ключ. Делается это так:
    Запускаю Git-bash из контекстного меню Windows Explorer (откуда запустил 0 не важно)
    Знакомлю git клиента с параметрами пользователя, которые он будет использовать в поле Author для чего ввожу команды:
    Затем генерирую файл ключа:
    После того как я ввел пароль мне генератор сказал где лежит файл ключей:
    Мне нужен публичный ключ, который находится в ./ssh/id_rsa.pub. Открываю этот файлик и копирую содержимое в буфер обмена (Ctrl+C).

    Открываю страничку настроек моего акаунта в Github (Account Settings) и добавляю новый ключ в секции SSH Public Keys:

    Все, теперь сервер должен меня узнать.

    Шаг 3. Создаем проект и начинам комитить

    Открываю скачанную недавно Intellij IDEA 11 RC, кликаю на Check out from Version Control и выбираю Git в выпадающем меню:

    в окне Clone Repository ввожу Git Repository URL, Parent directory и Directory name:
    Узнать Git Repository URL можно настройках репозитория, но я просто скопировал со страницы с инструктажем по настройке локального репозитория:
    После того, как склонировался репозиторий создал проект и добавил в него README.txt файлик. Я готов комититься. Жимаю и выбираю комит с пушем (Commit and Push...) из окошка Commit changes:
    Важный момент: окне просмотра Git push IDEA показывает, что master - это не "tracked" бранч. Т.е. он не связан с удаленным репозиторием. Почему так получилось - не понятно, но когда я экспериментировал с другим сервером Git хостинга unfuddle, все заработало сразу. В общем для того, чтобы это "полечить" достаточно выбрать галочку "Push current branch to alternative branch":
    Все, мои изменения на сервере. Могу в этом убедиться просмотрев логи:
    не верю своему счастью, меняю README.txt и делаю комит в идее (без пуша). После чего меняю еще раз и комичу с пушем:
    Master теперь связан с удаленным репозиторием, о чем красноречиво говорит надпись master -> origin/master. Origin - это псевдоним удаленного репозитория. Git дает этот ему этот псевдоним по умолчанию. Это удобно, если работать с несколькими репозиториями одновременно - но это уже совсем другая история :)

    Кстати, чуть не забыл проверить дошли ли мои изменения:


    Если не работает 

    При попытке сделать update выдает ошибку идентификации или просто долго висит

    Запусти git-bash и посмотри где он думает находится HOME директория пользователя (команда cd ~, затем pwd). Затем убедись что в этой директории находится папка с ключами .ssh



    Добавь переменную окружения HOME, которая указывает на home директорию из git-bash. В моем случае уже были установлены переменные HOMEDRIVE и HOMEPATH, которые указывали на Z:\
    Перезапусти IDEA