Clojure
Все о clojure и функциональном программировании
четверг, 20 июня 2013 г.
четверг, 2 мая 2013 г.
Курсы по Clojure закончились
В марте я начал курсы по языку Clojure. Все участники были поделены на три группы: А -- очники, B -- дистанционщики с преподавателем, С -- дистанционщики без преподавателя. Из примерно сотни стартовавших до конца обучения дошли всего 18 человек.
На фото -- мы с Никитой Белоглазовым толкаем речь.
Поскольку слушателей курсов было много, я попросил помочь мне вести группы Никиту Белоглазова, Алекса Отта, Никиту Прокопова и Виталия Монастырева. Благодаря их помощи, курсы получились довольно масштабными, если бы я был один, то смог бы взять максимум человек 30.
Параллельно я провел три занятия по Clojure и функциональному программированию в БГУ у третьекурсников ФПМ. Двум студентам, выполнившим ДЗ, я тоже вручил сертификаты.
На курсах мы разобрали следующие основные темы:
1. Основы ФП
2. Параллельное программирование
3. Макросы и предметно-ориентированные языки
4. Веб-разработка
По итогам курсов те, кто дошли до конца, разработали свое небольшое веб-приложение в стиле Single-Page Application. Самое забавное, на мой взгляд, сделал Виталий Монастырев (http://www.komoku.org:3000/index.html).
После вручения сертификатов как-то сама собой случилась посиделка с чаем и тортиком. На заседании было высказано несколько очень здравых идей и предложений. Вот краткие итоги:
1. Разработаем сайт минского коммьюнити clojure.by
После вручения сертификатов как-то сама собой случилась посиделка с чаем и тортиком. На заседании было высказано несколько очень здравых идей и предложений. Вот краткие итоги:
1. Разработаем сайт минского коммьюнити clojure.by
2. Задачи комьюнити:
а) пропаганда clojure, культурная экспансия в умы ООП-инфицированных;
б) обзоры интересных clojure-технологий в виде докладов на митапах;
а) пропаганда clojure, культурная экспансия в умы ООП-инфицированных;
б) обзоры интересных clojure-технологий в виде докладов на митапах;
в) совместная разработка best practices по использованию clojure в различных областях. На данный момент следующие темы требуют выработки общих best practices: веб-разработка, разработка параллельных алгоритмов средствами clojure, разработка предметно-ориентированных языков.
г) организация clojure-хакатонов.
Цели комьюнити всего две: повысить собстенный уровень образования в использовании Clojure, а также создать условия, при которых на коммерческих фирмах будут разрешать выполнять проекты на Clojure.
3. Создать чисто технарьскую конференцию thestrangeloop.by по примеру thestrangeloop.com. С этим пунктом пока много неясного, предлагаю его обсудить. Но в целом, на этой конфе должны быть исключительно программерские доклады от классных докладчиков (возможно даже дистанционно). Языки и технологии в основном маргинальные, вроде Clojure, Haskell, CL, Scheme, Emaсs Lisp, Scala, ML, Erlang и т.д. Задачи конфы -- дать возможность обсудить проблемы использования маргинальных технологий "вживую", познакомиться с грамотными специалистами. Причем я думаю, тезисы докладов стоит публиковать заранее, чтобы слушатели ознакомились и могли заготовить вопросы для обсуждения. Возможно даже такую конфу стоило бы проводить в онлайне -- дешево и сердито.
По поводу сlojure.by и thestrangeloop.by прошу высказаться всех заинтересованных.
Цели комьюнити всего две: повысить собстенный уровень образования в использовании Clojure, а также создать условия, при которых на коммерческих фирмах будут разрешать выполнять проекты на Clojure.
3. Создать чисто технарьскую конференцию thestrangeloop.by по примеру thestrangeloop.com. С этим пунктом пока много неясного, предлагаю его обсудить. Но в целом, на этой конфе должны быть исключительно программерские доклады от классных докладчиков (возможно даже дистанционно). Языки и технологии в основном маргинальные, вроде Clojure, Haskell, CL, Scheme, Emaсs Lisp, Scala, ML, Erlang и т.д. Задачи конфы -- дать возможность обсудить проблемы использования маргинальных технологий "вживую", познакомиться с грамотными специалистами. Причем я думаю, тезисы докладов стоит публиковать заранее, чтобы слушатели ознакомились и могли заготовить вопросы для обсуждения. Возможно даже такую конфу стоило бы проводить в онлайне -- дешево и сердито.
По поводу сlojure.by и thestrangeloop.by прошу высказаться всех заинтересованных.
воскресенье, 14 апреля 2013 г.
Настройка окружения Clojure и IntelliJ IDEA на MS Windows
Во-первых, необходимо установить leiningen2. Заходим на leiningen.org, читаем инструкции.
Качаем lein.bat куда-нибудь, например, в q:\programs\lein. Затем необходимо прописать этот путь в переменную %PATH% таким образом, чтобы lein.bat был доступен отовсюду.
Откройте cmd.exe и выполните команду lein self-install. Leiningen скачает и самостоятельно установит свою последнюю версию.
Домашний каталог утилиты lein -- C:\users\<user>\.lein, где <user> -- имя вашего пользователя. В домашнем каталоге lein находятся файлы настройки. Создайте там файл profiles.clj с таким содержимым:
{:user {:plugins [[lein-pprint "1.1.1"]
[lein2-eclipse "2.0.0"]
[lein-idea "1.0.1"]]
:dependencies [[slamhound "1.3.1"]]}}
Здесь перечислино несколько плагинов для интеграции с IDE Eclipse и IntelliJ IDEA.
Мы в любом случае будем использовать lein для того, чтобы создавать проекты и управлять зависимостями. На данный момент lein делает это гораздо лучше IDE.
Чтобы создать новый проект, выполните команду lein new myclojure1, где myclojure1 -- имя нового проекта.
Зайдите в каталог myclojure1 и выполните там команду lein deps. Leiningen подятянет все зависимости (в том числе и саму Clojure).
Сконвертируйте полученный проект в IDEA-project командой lein idea.
Далее, необходимо импортировать этот проект в IntelliJ IDEA. Чтобы IDEA могла работать с Clojure -- установите плагин LaClojure. Затем импортните проект myclojure1 (не забудьте настроить JDK для этого проеката, если не настроили для всей IDEA).
Запустить REPL можно выбрав пункт меню Tool -> Start Clojure Console.
Скомпилировать исходник на Clojure можно выбрав его в дереве проекта (src\myclojure1\core.clj), и выбрав пункт меню Tools -> Clojure REPL -> Load file in REPL.
Для того, чтобы перейти в неймспейс этого файла, обратите внимание на первую строчку core.clj:
(ns myclojure1.core)
Введите в REPL следующий текст:
(in-ns 'myclojure1.core)
После выполнения этой команды, все определения, доступные в core.clj станут доступны и в REPL.
Успехов!
Качаем lein.bat куда-нибудь, например, в q:\programs\lein. Затем необходимо прописать этот путь в переменную %PATH% таким образом, чтобы lein.bat был доступен отовсюду.
Откройте cmd.exe и выполните команду lein self-install. Leiningen скачает и самостоятельно установит свою последнюю версию.
Домашний каталог утилиты lein -- C:\users\<user>\.lein, где <user> -- имя вашего пользователя. В домашнем каталоге lein находятся файлы настройки. Создайте там файл profiles.clj с таким содержимым:
{:user {:plugins [[lein-pprint "1.1.1"]
[lein2-eclipse "2.0.0"]
[lein-idea "1.0.1"]]
:dependencies [[slamhound "1.3.1"]]}}
Здесь перечислино несколько плагинов для интеграции с IDE Eclipse и IntelliJ IDEA.
Мы в любом случае будем использовать lein для того, чтобы создавать проекты и управлять зависимостями. На данный момент lein делает это гораздо лучше IDE.
Чтобы создать новый проект, выполните команду lein new myclojure1, где myclojure1 -- имя нового проекта.
Зайдите в каталог myclojure1 и выполните там команду lein deps. Leiningen подятянет все зависимости (в том числе и саму Clojure).
Сконвертируйте полученный проект в IDEA-project командой lein idea.
Далее, необходимо импортировать этот проект в IntelliJ IDEA. Чтобы IDEA могла работать с Clojure -- установите плагин LaClojure. Затем импортните проект myclojure1 (не забудьте настроить JDK для этого проеката, если не настроили для всей IDEA).
Запустить REPL можно выбрав пункт меню Tool -> Start Clojure Console.
Скомпилировать исходник на Clojure можно выбрав его в дереве проекта (src\myclojure1\core.clj), и выбрав пункт меню Tools -> Clojure REPL -> Load file in REPL.
Для того, чтобы перейти в неймспейс этого файла, обратите внимание на первую строчку core.clj:
(ns myclojure1.core)
Введите в REPL следующий текст:
(in-ns 'myclojure1.core)
После выполнения этой команды, все определения, доступные в core.clj станут доступны и в REPL.
Успехов!
четверг, 4 апреля 2013 г.
Как деплоить Clojure на OpenShift
Прежде всего вам
необходимо зарегистрироваться на
OpenShift и залогиниться. Второй этап —
настроить ssh-доступ. Да, y OpenShift есть
специальные консольные утилиты для
работы без ssh, но это не наш случай.
1. Генерим открытый
ssh-ключ:
$ ssh-keygen -t rsa
В каталоге .ssh вы получите
два файла: id_rsa и id_rsa.pub.
2. Зайдите в настройки
своего аккаунта.
3. Выберите «Change settings»,
попадете на экран Personal Information.
4. Нажмите кнопку «Add a
new key...», попадете на экран Add a public key. Скопируйте туда содержимое файла
id_rsa.pub.
Далее необходимо создать
приложение.
5. Выберите вкладку «My
Applications» и нажмите кнопку «Add application».
OpenShift покажет вам экран выбора типа
приложения. Выберите приложение
Tomcat7.
6. На экране конфигурации
нового приложения введите его имя и нажмите кнопку «Create application.
7. Откроется экран с
подробностями о созданном приложении. Нажмите на ссылку «Add cartridge».
8. В открывшемся экране выберите нужную вам базу данных.
В этом примере мы рассматриваем MySQL 5.1.
Добавьте этот картридж.
9. OpenShift покажет вам
экран с информацией о вашей БД. Важный
момент: хост и порт для коннекта из
приложения хранятся в переменных
окружения среды OPENSHIFT_MYSQL_DB_HOST и
OPENSHIFT_MYSQL_DB_PORT.
10. Зайдите на вкладку
My applications, выберите ваше приложение и
нажмите на ссылку «Want to login to your
application?». OpenShift покажет вам ssh-команду
для логина на сервер.
11. Введите показанную
команду
$ ssh
515c...00401@helloworld-writing.rhcloud.com
Если до этого вы правильно
зарегистрировали ваш id_rsa.pub, то ssh тихо
залогинит вас на сервер и не спросит
пароля.
Выполните команду
$ ctl_all restart
Эта команда необходима
для того, чтобы OpenShift рестартанул
приложение и подтянул картридж с MySQL.
После перезагрузки в окружении среды
перезапущенного Tomcat появятся переменные
OPENSHIFT_MYSQL_DB_HOST и OPENSHIFT_MYSQL_DB_PORT.
12. Выйдите из ssh-сессии
командой exit. Сконфигурируйте строку
соединения к MySQL следующим образом.
(def env (into {} (System/getenv)))
(def dbhost (get env
"OPENSHIFT_MYSQL_DB_HOST"))
(def dbport (get env
"OPENSHIFT_MYSQL_DB_PORT"))
(def default-conn {:classname
"com.mysql.jdbc.Driver"
:subprotocol
"mysql"
:user "myuser"
:password
"mypassword"
:subname (str "//"
dbhost ":" dbport
"/helloworld?useUnicode=true&characterEncoding=utf8")
:delimiters "`"})
В поля :user и :password
необходимо подставить значения, которые
OpenShift выдал вам на шаге 9. В поле :subname
слово helloworld — это имя БД (также получено
на шаге 9).
13. Соберите ваше
веб-приложение командой lein ring uberwar.
Переименуйте её в ROOT.war.
14. Скопируйте war-ку на
сервер:
$ scp ROOT.war
515....01@helloworld-writing.rhcloud.com:app-root/data
15. Залогиньтесь на
сервер
$ ssh
515...401@helloworld-writing.rhcloud.com
16. Переместите
скопированную war-ку в каталог с
веб-приложениями:
$ mv app-root/data/ROOT.war
app-root/runtime/repo/webapps/
17. Через некоторое время
ваше новое приложение будет доступно.
В моем случае — по адресу
http://helloworld-writing.rhcloud.com.
среда, 27 марта 2013 г.
Clojure в БГУ
Сегодня договорились с деканом ФПМ БГУ о том, что я проведу три занятия по Clojure на ФПМ (занятия парные, лекция + ПЗ) в рамках спецкурса по функциональному программированию.
Главная печаль в том, что до крайности не хочется заниматься настройкой окружения в лаборатории, т.к. у них там компы c Windows XP и дохлым интернетом. Вот как студентам установить lein?
Одно из решений, которое я придумал: предложу студентам залогиниться на мой ноутбук по SSH и работать там в консольном Emacs-е. Заодно и ктулхуугодный редактор пропиарю :-)
Главная печаль в том, что до крайности не хочется заниматься настройкой окружения в лаборатории, т.к. у них там компы c Windows XP и дохлым интернетом. Вот как студентам установить lein?
Одно из решений, которое я придумал: предложу студентам залогиниться на мой ноутбук по SSH и работать там в консольном Emacs-е. Заодно и ктулхуугодный редактор пропиарю :-)
воскресенье, 10 марта 2013 г.
Почему Emacs?
На сегодняшний день основным инструментом программистов являются супер-технологичные IDE, помогающие выполнять процентов 80 ежедневной работы. Они умеют очень многое: автоматически дополнять код, отлаживать приложение, проводить сложный рефакторинг. Поэтому люди, пользующиеся такими старыми, с виду, инструментами, как Emacs, кажутся совсем уж чудаками. Но чудачество ли это в самом деле? И почему этот текстовый редактор до сих пор жив и все еще пользуется уважением?
На моей предыдущей работе я программировал в основном J2EE-приложения. Мне очень нравились Eclipse и Jetbrains Idea, с их помощью мне удавалось за очень короткое время разрабатывать формочки, веб-сервисы и даже архитектуру приложения. Да я, в общем, не особо и задумывался о том, на чем писать. Все пишут в Eclipse -- ну и я тоже.
А потом все резко изменилось. Мне предложили написать для платформы Android виртуальное казино. В приложении была всего одна формочка, зато масса логики, которую нужно было алгоритмизировать. Самым неприятным занятием было объявить в xml-файле 130 полей разметки на столе для ставок, затем их же проинициализировать в коде на java. Ни Eclipse, ни Idea уже ничем не могли мне в этом помочь, а выполнять эту работу вручную совсем не хотелось. Мои коллеги относились к этому проще. Они полагали, что раз платят, то нужно выполнять задание, даже если оно такое бездумное и скучное. Также полагал и мой менеджер. А как считаете вы?
Еще во время учебы в школе я решил, что стану программистом. Я обажал каверзные задачки, участвовал в олимпиадах, мне очень нравилось составлять алгоритмы. Профессия программиста меня привлекала своей загадочностью. В то время мне казалось, что программисты занимаются невероятно сложной и очень интеллектуальной работой. Сейчас уже прошло примерно пятнадцать лет с тех пор, и я уже думаю несколько иначе.
Чем же сегодня занимаются программисты на крупных фирмах, особенно на тех, которые практикуют "промышленное программирование"? Разве программированием? Большая часть времени уходит на всякую конфигурацию Spring или других фреймворков, генерацию заготовок кода при помощи IDE, добавление всяческих аннотаций для связи различных частей кода, написание и прогон тестов и т.д. Изредка код писать все-таки приходится. Но это, как правило, очень простой код: взять что-то из базы, привести объект к другому типу, в цикле пройтись по коллекции. Давайте спросим себя: неужели именно такое программирование нам нравится?
Когда я взялся писать виртуальное казино для Android, было ощущение, что меня разбудили после долгого сна. Я почуствовал, что передо мной задача очень отличающаяся от тех, что мне приходилось делать раньше. Мне не нужно было писать никаких конфигураций, да и IDE ничем не могло мне помочь. Мне нужно было писать алгоритмы и думать, много думать и много писать.
Первое, что я обнаружил, так это то, что текстовый редактор в Eclipse никуда не годится. Я набираю код всеми десятью пальцами сразу, и мне не надо смотреть на клавиатуру, когда мои пальцы находятся над клавишами алфавита. А для перемещения по тексту необходимо сдвигать правую руку на клавиши со стрелочками или даже еще дальше -- к PgDown/PgUp. Но даже это не идет ни в какое сравнение с тем, как отвлекает необходимость хвататься за мышку! Это здорово выбивает из состояния потока!
Во-вторых, конечно же, я не стал писать эти 130 полей вручную. Нужно было разработать какой-то генератор кода, и здесь Eclipse опять ничем не смог мне помочь. Писать плагины для Eclipse невероятно затратное дело. Следовало выбрать один из скриптовых языков вроде Perl, Python или Ruby. Но я все равно не понимал, почему не сделать возможность в Eclipse для написания простых плагинов как раз для таких случаев. В редакторе Eclipse есть курсор, и им можно было бы выделять фрагменты текста для обработки. А когда пишешь скрипт для обработки текста, например, на Perl, курсора нет, и необходимо как-то парсить структуру текста регулярными выражениями или помечать места для упрощения анализа текста.
В-третьих, когда огромный xml-файл был уже готов, время от времени приходилось подправлять сгенерированные координаты ячеек. Например, поднять весь ряд немного вверх, или сдвинуть часть ячеек чуть-чуть правее. Теоретически, можно было переделать генератор, сгенерировать новый код, вставить его на замену старому и решить задачу. Но в моем случае первоначально сгенерированный код уже был обработан вручную, и повторная генерация кода потребовала бы повторной его ручной обработки. Мне дико не хватало возможности написать макрос, чтобы текстовый редактор выполнял всю обработку за меня.
Мне не понравилось программировать казино на Android в Eclipse. Оказалось, что Eclipse прекрасно подходит для задач code monkeys, ежедневно клепающих формочки для очередной CRM на Java. Но этот же Eclipse совсем плохо показывает себя в задачах, для которых у него нет заготовок вроде генераторов кода.
Давайте спросим себя, что же это за задачи, для которых IDE подходят не очень хорошо?
Это самые нестандартные задачи, это проекты, содержащие элемент изобретательности, технического творчества. Это задачи, для которых в индустрии до сих пор не выработаны типовые решения. Это задачи, где вам приходится много алгоритмизировать и много думать.
Вернемся к самому первому тезису статьи. В самом ли деле, те, кто используют Emacs, безнадежно устаревшие чудаки? Или все-таки действительно есть причины для применения этого древнего текстового редактора?
А вы знаете, что, например, в Emacs можно настроить сочетания клавиш таким образом, чтобы всю работу с текстом, в том числе и перемещение, можно было выполнять, не убирая пальцы с алфавитно-цифровой клавиатуры? И тем более не хватаясь за мышку? Когда концентрация на коде максимальна, очень важно не отвлекаться на посторонние вещи!
Редактору Emacs легко придать абсолютно аскетичный вид. Казалось бы, зачем убирать панели инструментов, строку меню, боковые навигаторы кода и прочие элементы управления, если у нас итак достаточно вместительные экраны мониторов? Ответ очень простой: пространства на экране никогда не бывает достаточно! Когда-нибудь в будущем, когда картинка будет проецироваться пользователю напрямую в мозг и не будет ограничена размерами монитора, все равно будут те, кому и такое изображение покажется недостаточно вместительным. Эти будущие гики, также, как и сегодняшние, будут стараться убрать с изображения все отвлекающие детали и максимально освободить себе рабочее пространство, чтобы заполнить его действительно полезной информацией.
Таким образом, Emacs идеально подходит для тех, кому требуется полная концентрация внимания на редактируемом тексте.
Текстовый редактор Emacs -- это, по сути, небольшое ядро, включающее в себя интерпретатор языка Emacs Lisp, и громадное количество скриптов, написанных на этом Lisp-е. Весь интерфейс, все функции, вообще всё-всё-всё в Emacs -- это программы на Emacs Lisp. Все эти скрипты хорошо документируемы и доступны в исходных кодах. Поэтому, если вас что-то не устраивает в Emacs, то вы вольны изменить это так, как вам нравится. Писать плагины для Emacs невероятно просто.
Я специально хочу остановиться на этой мысли: писать плагины для Emacs так просто, что я, не задумываясь, пишу их чуть ли не для каждой сложной задачи. Посмотрите, как выглядит "Hello World" в стиле Emacs Lisp:
(defun my-test-message ()
(interactive)
(message "Hello, World!"))
Обратите внимание, сколько xml-конфигураций мы здесь не правим, сколько интерфейсов не реализовываем, сколько классов не наследуем! Всего одна простая функция, и если её скомпилировать (C-x C-e за последней скобкой функции), она тут же становится частью редактора Emacs!
Именно эта простота написания плагинов так сильно подкупает в Emacs. Когда я программирую на Java, я пишу расширения Emacs для генерации всего того boilerplate-кода, который не умеет генерировать Eclipse. Emacs автоматизирует мне много по-настоящему скучной рутинной работы!
Есть и еще одна проблема, с которой плохо справляются IDE -- это нестандартные и предметно-ориентированные языки программирования. Для них нет и никогда не будет поддержки в Eclipse, Idea, Netbeans и т.д. Но зато вы с лёгкостью можете добавить поддержку любого нужного вам языка в Emacs!
У Emacs есть еще один существенный плюс: превосходная интеграция с Clojure. Исторически сложилось так, что программисты на Lisp-подобных языках предпочитают разрабатывать программы в Emacs, потому что в этом редакторе есть все, что нужно лисперу. Это и правильная подсветка кода и скобочек, и автодополнение кода, и REPL для интерактивной разработки, и просмотр документации, и многое другое. Если вы планируете посвятить много времени Lisp-подобным языкам, то вам однозначно стоит попробовать Emacs. Тем более, что освоив Clojure вам будет уже довольно просто разобраться с Emacs Lisp и разрабатывать плагины для этого текстового редактора. Если у вас действительно возникнет желание изучить также и Emacs Lisp, могу порекомендовать вам пособие.
Откровенно говоря, нужно признать, что у Emacs есть одна проблема: довольно высокий порог вхождения. Далеко не с первого раза можно понять, как там что устроено и почему именно так, а еще как переделать, чтобы было удобнее. В Emacs множество комбинаций клавиш начинаются с Ctrl, от чего сильно устает левый мизинец; комбинации для перемещения курсора придумали как будто специально, чтобы ими было неудобно пользоваться: Ctrl-f, Ctrl-b, Ctrl-n, Ctrl-p. Это связано с тем, что Emacs создали очень давно, когда у клавиатур не только не было клавиши "Win", но даже и само расположение клавиш было другим. Например, Клавиша Ctrl находилась на том месте, где сейчас традиционно расположена Alt, и Ctrl в то время нажимали большим пальцем левой руки, а вовсе не мизинцем.
Но, как уже было сказано, ничто не мешает вам изменить управляющие клавиши. Например, известный Emacs-ер Xah Lee создал проект ergoemacs, в котором он предлагает совершенно иную раскладку, намного более эргономичную.
Для слушателей Clojure Course, которые хотели бы попробовать Emacs, я создал немного модифицированную версию Ergo Emacs. Этот конфиг, конечно, не заменит начального ознакомления с документацией, но зато поможет сделать работу с Emacs несколько удобнее.
Ниже несколько основных клавиатурных сочетаний, которые я использую в своем конфиге. Здесь используются следующие традиционные для Emacs обозначения клавиш: C -- Ctrl, M -- Alt, S -- Shift.
Перемещение курсора:
M-i -- up
M-k -- down
M-j -- left
M-l -- right
M-u -- word left
M-o -- word right
M-S-i -- page up
M-S-k -- page down
M-S-j -- beginning of document
M-S-l -- end of document
M-h -- end of line
M-S-h -- beginning of line
C-l -- go to line
Редактирование текста:
M-m -- new line
M-d -- backspace
M-f -- delete
M-Space -- start/end selection
M-c -- copy
M-x -- cut
M-v -- paste
M-s -- save document
C-o -- open file
Работа с окнами:
C-x 2 -- split window horizontally
C-x 3 -- split window vertically
C-x 0 -- close current window
C-x 1 -- leave only current window
M-q -- next window
M-S-9 -- shrink horizontal window
M-S-0 -- enlarge horizontal window
M-9 -- shrink vertical window
M-0 -- enlarge vertical window
Закладки:
C-b -- set bookmark
M-b -- jump to bookmark
Системные операции:
F5 -- run Emacs command
C-x C-c -- close Emacs
C-x b -- select buffer
C-x k -- kill buffer
C-c l -- truncate long lines on/off
C-g -- сancel
F11 -- show help for my keybindings
Для того, чтобы воспользоваться моим конфигом, просто скопируйте его себе в домашнюю дирректорию.
А вообще, конечно, очень рекомендую прочесть учебник по Emacs в переводе Алекса Отта.
На моей предыдущей работе я программировал в основном J2EE-приложения. Мне очень нравились Eclipse и Jetbrains Idea, с их помощью мне удавалось за очень короткое время разрабатывать формочки, веб-сервисы и даже архитектуру приложения. Да я, в общем, не особо и задумывался о том, на чем писать. Все пишут в Eclipse -- ну и я тоже.
А потом все резко изменилось. Мне предложили написать для платформы Android виртуальное казино. В приложении была всего одна формочка, зато масса логики, которую нужно было алгоритмизировать. Самым неприятным занятием было объявить в xml-файле 130 полей разметки на столе для ставок, затем их же проинициализировать в коде на java. Ни Eclipse, ни Idea уже ничем не могли мне в этом помочь, а выполнять эту работу вручную совсем не хотелось. Мои коллеги относились к этому проще. Они полагали, что раз платят, то нужно выполнять задание, даже если оно такое бездумное и скучное. Также полагал и мой менеджер. А как считаете вы?
Еще во время учебы в школе я решил, что стану программистом. Я обажал каверзные задачки, участвовал в олимпиадах, мне очень нравилось составлять алгоритмы. Профессия программиста меня привлекала своей загадочностью. В то время мне казалось, что программисты занимаются невероятно сложной и очень интеллектуальной работой. Сейчас уже прошло примерно пятнадцать лет с тех пор, и я уже думаю несколько иначе.
Чем же сегодня занимаются программисты на крупных фирмах, особенно на тех, которые практикуют "промышленное программирование"? Разве программированием? Большая часть времени уходит на всякую конфигурацию Spring или других фреймворков, генерацию заготовок кода при помощи IDE, добавление всяческих аннотаций для связи различных частей кода, написание и прогон тестов и т.д. Изредка код писать все-таки приходится. Но это, как правило, очень простой код: взять что-то из базы, привести объект к другому типу, в цикле пройтись по коллекции. Давайте спросим себя: неужели именно такое программирование нам нравится?
Когда я взялся писать виртуальное казино для Android, было ощущение, что меня разбудили после долгого сна. Я почуствовал, что передо мной задача очень отличающаяся от тех, что мне приходилось делать раньше. Мне не нужно было писать никаких конфигураций, да и IDE ничем не могло мне помочь. Мне нужно было писать алгоритмы и думать, много думать и много писать.
Первое, что я обнаружил, так это то, что текстовый редактор в Eclipse никуда не годится. Я набираю код всеми десятью пальцами сразу, и мне не надо смотреть на клавиатуру, когда мои пальцы находятся над клавишами алфавита. А для перемещения по тексту необходимо сдвигать правую руку на клавиши со стрелочками или даже еще дальше -- к PgDown/PgUp. Но даже это не идет ни в какое сравнение с тем, как отвлекает необходимость хвататься за мышку! Это здорово выбивает из состояния потока!
Во-вторых, конечно же, я не стал писать эти 130 полей вручную. Нужно было разработать какой-то генератор кода, и здесь Eclipse опять ничем не смог мне помочь. Писать плагины для Eclipse невероятно затратное дело. Следовало выбрать один из скриптовых языков вроде Perl, Python или Ruby. Но я все равно не понимал, почему не сделать возможность в Eclipse для написания простых плагинов как раз для таких случаев. В редакторе Eclipse есть курсор, и им можно было бы выделять фрагменты текста для обработки. А когда пишешь скрипт для обработки текста, например, на Perl, курсора нет, и необходимо как-то парсить структуру текста регулярными выражениями или помечать места для упрощения анализа текста.
В-третьих, когда огромный xml-файл был уже готов, время от времени приходилось подправлять сгенерированные координаты ячеек. Например, поднять весь ряд немного вверх, или сдвинуть часть ячеек чуть-чуть правее. Теоретически, можно было переделать генератор, сгенерировать новый код, вставить его на замену старому и решить задачу. Но в моем случае первоначально сгенерированный код уже был обработан вручную, и повторная генерация кода потребовала бы повторной его ручной обработки. Мне дико не хватало возможности написать макрос, чтобы текстовый редактор выполнял всю обработку за меня.
Мне не понравилось программировать казино на Android в Eclipse. Оказалось, что Eclipse прекрасно подходит для задач code monkeys, ежедневно клепающих формочки для очередной CRM на Java. Но этот же Eclipse совсем плохо показывает себя в задачах, для которых у него нет заготовок вроде генераторов кода.
Давайте спросим себя, что же это за задачи, для которых IDE подходят не очень хорошо?
Это самые нестандартные задачи, это проекты, содержащие элемент изобретательности, технического творчества. Это задачи, для которых в индустрии до сих пор не выработаны типовые решения. Это задачи, где вам приходится много алгоритмизировать и много думать.
Вернемся к самому первому тезису статьи. В самом ли деле, те, кто используют Emacs, безнадежно устаревшие чудаки? Или все-таки действительно есть причины для применения этого древнего текстового редактора?
А вы знаете, что, например, в Emacs можно настроить сочетания клавиш таким образом, чтобы всю работу с текстом, в том числе и перемещение, можно было выполнять, не убирая пальцы с алфавитно-цифровой клавиатуры? И тем более не хватаясь за мышку? Когда концентрация на коде максимальна, очень важно не отвлекаться на посторонние вещи!
Редактору Emacs легко придать абсолютно аскетичный вид. Казалось бы, зачем убирать панели инструментов, строку меню, боковые навигаторы кода и прочие элементы управления, если у нас итак достаточно вместительные экраны мониторов? Ответ очень простой: пространства на экране никогда не бывает достаточно! Когда-нибудь в будущем, когда картинка будет проецироваться пользователю напрямую в мозг и не будет ограничена размерами монитора, все равно будут те, кому и такое изображение покажется недостаточно вместительным. Эти будущие гики, также, как и сегодняшние, будут стараться убрать с изображения все отвлекающие детали и максимально освободить себе рабочее пространство, чтобы заполнить его действительно полезной информацией.
Таким образом, Emacs идеально подходит для тех, кому требуется полная концентрация внимания на редактируемом тексте.
Текстовый редактор Emacs -- это, по сути, небольшое ядро, включающее в себя интерпретатор языка Emacs Lisp, и громадное количество скриптов, написанных на этом Lisp-е. Весь интерфейс, все функции, вообще всё-всё-всё в Emacs -- это программы на Emacs Lisp. Все эти скрипты хорошо документируемы и доступны в исходных кодах. Поэтому, если вас что-то не устраивает в Emacs, то вы вольны изменить это так, как вам нравится. Писать плагины для Emacs невероятно просто.
Я специально хочу остановиться на этой мысли: писать плагины для Emacs так просто, что я, не задумываясь, пишу их чуть ли не для каждой сложной задачи. Посмотрите, как выглядит "Hello World" в стиле Emacs Lisp:
(defun my-test-message ()
(interactive)
(message "Hello, World!"))
Обратите внимание, сколько xml-конфигураций мы здесь не правим, сколько интерфейсов не реализовываем, сколько классов не наследуем! Всего одна простая функция, и если её скомпилировать (C-x C-e за последней скобкой функции), она тут же становится частью редактора Emacs!
Именно эта простота написания плагинов так сильно подкупает в Emacs. Когда я программирую на Java, я пишу расширения Emacs для генерации всего того boilerplate-кода, который не умеет генерировать Eclipse. Emacs автоматизирует мне много по-настоящему скучной рутинной работы!
Есть и еще одна проблема, с которой плохо справляются IDE -- это нестандартные и предметно-ориентированные языки программирования. Для них нет и никогда не будет поддержки в Eclipse, Idea, Netbeans и т.д. Но зато вы с лёгкостью можете добавить поддержку любого нужного вам языка в Emacs!
У Emacs есть еще один существенный плюс: превосходная интеграция с Clojure. Исторически сложилось так, что программисты на Lisp-подобных языках предпочитают разрабатывать программы в Emacs, потому что в этом редакторе есть все, что нужно лисперу. Это и правильная подсветка кода и скобочек, и автодополнение кода, и REPL для интерактивной разработки, и просмотр документации, и многое другое. Если вы планируете посвятить много времени Lisp-подобным языкам, то вам однозначно стоит попробовать Emacs. Тем более, что освоив Clojure вам будет уже довольно просто разобраться с Emacs Lisp и разрабатывать плагины для этого текстового редактора. Если у вас действительно возникнет желание изучить также и Emacs Lisp, могу порекомендовать вам пособие.
Откровенно говоря, нужно признать, что у Emacs есть одна проблема: довольно высокий порог вхождения. Далеко не с первого раза можно понять, как там что устроено и почему именно так, а еще как переделать, чтобы было удобнее. В Emacs множество комбинаций клавиш начинаются с Ctrl, от чего сильно устает левый мизинец; комбинации для перемещения курсора придумали как будто специально, чтобы ими было неудобно пользоваться: Ctrl-f, Ctrl-b, Ctrl-n, Ctrl-p. Это связано с тем, что Emacs создали очень давно, когда у клавиатур не только не было клавиши "Win", но даже и само расположение клавиш было другим. Например, Клавиша Ctrl находилась на том месте, где сейчас традиционно расположена Alt, и Ctrl в то время нажимали большим пальцем левой руки, а вовсе не мизинцем.
Но, как уже было сказано, ничто не мешает вам изменить управляющие клавиши. Например, известный Emacs-ер Xah Lee создал проект ergoemacs, в котором он предлагает совершенно иную раскладку, намного более эргономичную.
Для слушателей Clojure Course, которые хотели бы попробовать Emacs, я создал немного модифицированную версию Ergo Emacs. Этот конфиг, конечно, не заменит начального ознакомления с документацией, но зато поможет сделать работу с Emacs несколько удобнее.
Ниже несколько основных клавиатурных сочетаний, которые я использую в своем конфиге. Здесь используются следующие традиционные для Emacs обозначения клавиш: C -- Ctrl, M -- Alt, S -- Shift.
Перемещение курсора:
M-i -- up
M-k -- down
M-j -- left
M-l -- right
M-u -- word left
M-o -- word right
M-S-i -- page up
M-S-k -- page down
M-S-j -- beginning of document
M-S-l -- end of document
M-h -- end of line
M-S-h -- beginning of line
C-l -- go to line
Редактирование текста:
M-m -- new line
M-d -- backspace
M-f -- delete
M-Space -- start/end selection
M-c -- copy
M-x -- cut
M-v -- paste
M-s -- save document
C-o -- open file
Работа с окнами:
C-x 2 -- split window horizontally
C-x 3 -- split window vertically
C-x 0 -- close current window
C-x 1 -- leave only current window
M-q -- next window
M-S-9 -- shrink horizontal window
M-S-0 -- enlarge horizontal window
M-9 -- shrink vertical window
M-0 -- enlarge vertical window
Закладки:
C-b -- set bookmark
M-b -- jump to bookmark
Системные операции:
F5 -- run Emacs command
C-x C-c -- close Emacs
C-x b -- select buffer
C-x k -- kill buffer
C-c l -- truncate long lines on/off
C-g -- сancel
F11 -- show help for my keybindings
Для того, чтобы воспользоваться моим конфигом, просто скопируйте его себе в домашнюю дирректорию.
А вообще, конечно, очень рекомендую прочесть учебник по Emacs в переводе Алекса Отта.
пятница, 1 марта 2013 г.
14 марта стартуют курсы Clojure
Вам надоела многословность
Java или C#? Вы хотите, чтобы писать программы
было проще и быстрее? Вас достало писать
вручную одни и те же паттерны проектирования?
Решение есть! Приходите
на курсы Clojure, мы научим вас самым
современным методам программирования!
Вы будете использовать преимущества
функционального
подхода, интерактивной
разработки и метапрограммирования.
Мы покажем вам, как автоматизировать
программерскую рутину!
С
14 марта по 18 апреля
2013г. в офисе компании
ITA
(г.Минск, проспект Независимости, 58) будут
проходить курсы программирования на
Clojure. Программа курсов включает в себя
изучение основ функционального
и мета-программирования
средствами языка Clojure, а также применение
Clojure для разработки современных
веб-приложений.
Примерный
план занятий:
14.03.2013
— Установка и
настройка необходимых инструментов,
введение в Clojure и функциональное
программирование.
21.03.2013
— Функции высшего порядка, ленивые
вычисления, полиморфизм, STM, взаимодействие
с Java.
28.03.2013
— Макросы,
предметно-ориентированные языки,
генерация кода.
04.04.2013
— Введение в веб-стек Clojure. Ring, Compojure,
lib-noir, развертывание приложений.
11.04.2013
— Генерация html
(Clostache, Hiccup, Enlive), Взаимодействие с БД
(Korma).
18.04.2013
— ClojureScript вместо
JavaScript.
Для
успешного прохождения курсов необходимо
иметь представление о Java, SQL, HTML, CSS и
JavaScript.
Количество
мест на очную форму обучения ограничено.
Поэтому те, кто хочет посетить курсы
лично, должны будут выполнить тестовое
задание на алгоритмизацию. Задание
будет объявлено в группе «Clojure Course»
в
facebook 7 марта 2013г. Если у Вас есть желание
получить задание предварительно,
присылайте Ваши заявки на email: d.bushenko@gmail.com.
После успешного прохождения очной формы
курсов, слушатели получат сертификаты.
Для
тех, кто не сможет попасть на очную форму
обучения, мы предложим вам дистанционную.
Информацию о том, как попасть на
дистанционную форму обучения мы объявим
в группе «Clojure Course» в facebook 7 марта 2013г.
Подписаться на:
Сообщения (Atom)