Archive for Июнь 2010

Конфиги для bash

Июнь 16, 2010

Практически у каждого гуманоида, обреченного возиться с консолью, есть набор конфигурационных файлов, который собирается годами и содержит мудрость предков и пыль веков. И каждый неофит, постигший необходимость настройки bash под свои нужды, прежде всего стучится в гугл и тратит достаточно большое количество времени на чтение чужих конфигов.
Огромное число их можно откопать на GitHub. Есть даже специальный сайт, где сложено 1474 (на данный момент) конфиг-файла (там правда все в кучу .vimrc, .bashrc, .zshrc и т.д.).
Но в хранении конфигов есть один тонкий момент, с которым приходится сталкиваться любому, кто растит их некоторое время. Во-первых, они становятся довольно объемными и, следовательно, трудно поддерживаемыми, а во-вторых, часты бывают нужны разные настройки для разных машин.
Если обратиться к интернетам в поисках мудрости, то довольно часто рекомендуют простейший расклад, когда создается три файла:


aliases - разные удобные сокращения (alias lsa='ls -lha')
config  - настройки самого bash (export HISTSIZE=10000)
env     - настройки среды окружения (export LANG=en_EN.UTF-8)

Плюс еще пара файлов, которые это все загружают: bashrc и bash_profile
Данное решение нацелено на структуризацию и просто предлагает не сваливать все в кучу, а как-то разнести по темам. В принципе, это лучше, чем один .bashrc на 1500 строк.
Но проблема того, что на linux-сервере нам совершенно невозможно иметь TextMate, который стоит редактором по-умолчанию на mac-машине остается в силе, не говоря уже о различных PATH-переменных окружения, которые могут внести некоторую путаницу.
При этом я предполагаю, что мы храним все где-то в системе контроля версий на удаленном сервере (я храню на GitHub) и используем на каждой машине, где нам выдают шелл. Можно поколдовать с .gitignore и не пушить в репозиторий host-specific файлы, но не хочется их разом потерять вместе с внезапно сгоревшим хардом. Поэтому я решил немного допилить напильником изначальный расклад и вот, что получилось:


aliases         - общие aliases
config          - общий config 
hostname        - директория для host-specific файлов
    server-1    - очень боевой сервер
    dev-1       - сильно разработческая машина
platform        - директория для platform-specific файлов
    darwin      - все, что относится к миру mac
    linux       - все, что относится к миру суровых linux
scripts         - директория со вспомогательными скриптами
bashrc          - файл, который подгружает весь этот зоопарк

В самом bashrc есть только загрузка нужных файлов, выглядит это так:


droot=~/.dotfiles/bash

# Load common files
. ${droot}/config
. ${droot}/aliases

# Load platform-specific shortcuts
platform=`uname | awk '{print tolower($0)}'`
if [ -f ${droot}/platform/${platform} ]; then
    . ${droot}/platform/${platform}
fi

# Load machine-specific files, if presented
hostname=`hostname -s`
if [ -f ${droot}/hostname/${hostname} ]; then
    . ${droot}/hostname/${hostname}
fi

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

Изучаем Computer Science в MIT, Berkley, Stanford, etc.

Июнь 3, 2010

Образование 2.0

Как-то так сложилось, что программирование я изучал по книжкам и интернетам. Мне кажется, что это довольно распространенная практика, учитывая культ высшего образования в нашей стране и слабые представления абитуриентов о том, чем они хотят заниматься в дальнейшем. Есть, конечно, люди, которые выбирают себе увлечение в 10 лет и спокойно развиваются в выбранном направлении, но таких меньшинство.
Программинг — штука очень многогранная с большим количеством уровней абстракции и возможностями для саморазвития. Т.е. учиться программированию можно спокойно всю жизнь и все равно узнавать что-то новое. В какой-то момент на собеседовании выпускник Гарварда попросил меня решить одну задачку, а после того, как я не смог предоставить ему решение, объяснил, что надо было использовать модифицированный алгоритм Дейкстры. Тогда я понял, что в моем книжно-интернетном образовании есть провалы =).
Книги по околокомпьютерам я читаю постоянно, но ни одна из них не претендует на фундаментальность. Именно эта фундаментальность закладывается в университетских курсах, о которых я сегодня кратко расскажу.
Все началось с того, что где-то я наткнулся на сайт Academic Earth, на котором собраны записи с лекций в ведущих американских ВУЗах. Погуглив эту тему вглубь, я понял, что в америках давно существует практика выкладывания этих самых лекций и прочего сопроводительного материала в глобальную сеть, надо просто знать, где искать. Потом я вспомнил, что в iTunes есть раздел iTunesU, где оказались все те же лекции, только их там намного удобнее смотреть. Поэтому я здесь выложу подборку того, что мне показалось интересным со ссылками на оба источника, а вы сами решайте что по вам лучше. Сразу скажу, что все это курсы базового уровня, которые призваны устранить именно пробелы и дать немного пищи для размышлений. К сожалению, продвинутые курсы никто не расшаривает, чтобы люди не переставали платить деньги =)

MIT

Introduction to Computer Science and Programming
Раньше в качестве введения в программирование там читали легендарный Structure and Interpretation of Computer Programs и Scheme давали в качестве первого языка. Сейчас используют Python, и читают курс пара мужиков, один очень веселый и интересные, а второй суровый и я от него засыпаю.
Страничка с материалами к курсу
AcademicEarth
iTunesU

Introduction to Algorithms
Тем, кто уже прочел Осла или Кнута этот курс не даст ничего нового, но остальным может пригодиться как популярное введение в классические алгоритмы
AcademicEarth
iTunesU

MIT выкладывает, по-моему, больше всех курсов, полный список можно найти здесь.

Stanford

CS106a Programming Methodology
Курс для тех, кто в глаза не видел программирования, но уже знает как включать компьютер. Примечательно, что курс идет на Java и, в принципе, в конце там довольно приличные приложения пишутся. Ведет очень веселый индус, которого позитивно смотреть за завтраком.
AcademicEarth
iTunesU

CS106b Programming Abstractions
Это уже посерьезнее, там C++ и довольно нескучная тетка. Является логическим продолжением предыдущего курса.
AcademicEarth
iTunesU

CS107 Programming Paradigms
Последний из CS курсов, доступных от Stanford, самый продвинутый. Но даже в нем не обсуждают еще Design Patterns.
AcademicEarth
iTunesU

Stanford лучше всех подходит к выкладыванию дополнительных материалов. Вот здесь можно найти прямо целые архивы со всем необходимым чтивом, исходниками и даже стенограммами лекций(!), которые пригодятся по мере выполнения домашних заданий.

Berkley

До этих курсов я пока не добрался, но в списке они у меня есть, поэтому кратко:
The Structure and Interpretation of Computer Programs
Это курс по той самой легендарной книжке, от которой отказались в MIT. Хотя я бы рекомендовал смотреть оригинальные записи с их лекций, благо они доступны на их сайте.
AcademicEarth
iTunesU

Operating Systems and System Programming
Курс по системному программированию, для общего развития
AcademicEarth
iTunesU

Data Structures
Курс по классическим структурам данных.
AcademicEarth
iTunesU

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

На хабре проскакивала статья, где автор тоже собирал множество ссылок на разные источники знаний. Ну а для разгрузки, я хотел бы еще порекомендовать смотреть на YouTube Google Tech Talks, где участвуют приглашенные ораторы и рассказывают много интересных вещей.

Последний из Things, The Hit List и OmniFocus

Июнь 3, 2010

OmniFocus

OmniFocus — это тяжелая артиллерия в рядах таск-менеджеров. Когда начал барахлить THL, и я подумал, что надо бы мигрировать куда-то я подумал про него. Потом нашел скрипт, который импортировал все таски из THL (в plain-виде, т.е. без иерархий) и потратил пару часов на то, чтобы воссоздать дерево проектов и списков. Получилось красиво и серьезно. Дальше я повспоминал то, что слышал про него во всяких MacPowerUsers и отправился смотреть скринкасты все с тем же шотландским акцентом. На это ушло еще пара часов. И вот спустя почти полдня я понял, что так и не понимаю, как с ним работать =).
Во-первых он тоже очень сильно мышко-ориентирован. Т.е. навигация по проектам и спискам другими способами невозможна, хотя емаксовские биндинги на вверх-вниз он поддерживает и можно с клавиатуры обеспечивать вложенность проектов и тасков.
Во-вторых интерфейс у него какой-то совершенно не маковский, перегруженный непонятными кнопками, которые на проверку оказываются предустановками системы фильтрации. И вот эта система фильтрации и есть его главная фича. На ней построены все кейсы работы с этой программой.

Должен сказать, что по сравнению с Things, который был немного игрушечным, но вызывал симпатию и с ним хотелось работать, эта штука своей монструозностью вызывает у меня некоторое отторжение.В принципе, я понимаю, что с точки зрения GTD — это очень хороший инструмент. Потому что у него есть встроенные reviews, которые все ленятся делать и есть ощущение «надежной системы», которой можно доверять. Т.е. когда ты уже не можешь держать в голове названия всех своих проектов и забываешь когда у тебя какие дедлайны и хочешь ну чего-то сильно автоматизированного, вот тут OmniFocus очень хорошо подойдет. Надо только отказаться от желания все сделать на бегу и с клавиатуры, а каждый день тратить на него немного времени, выставляя все эти «последовательно-параллельно», даты review, сроки начала и окончания, флаги и контексты и все будет отлично. Это вечером, а утром надо пробегать через все активные проекты, выставлять, допустим флажок, который говорит нам, что мы хотим это делать сегодня и врубать фильтр, отсекающий все остальное.
Проще говоря, не подружился я пока с этой чудесной программой и теперь, когда у меня кончились претенденты я немного в растерянности. Я написал систему бэкапа для THL, но она не спасает, т.к. он просто не пишет в свой файл на диск, а хранит данные где-то в памяти и потом благополучно их теряет. Есть еще идея дампить из него данные через AppleScript, но их потом сложно запихивать обратно. Одно расстройство, короче. Видимо, придется делать свой таск-менеджер с клавиатурой и шаблонами проектов.