Mr. Aleph написал очень сильный пост. Вот кто-то и выразил нормальными словами то, о чем я думаю последние пол года почти каждый день.
Можно поймать себя за руку на любом из пунктов в зависимости от этапа жизни.
21.01.10
Семь смертных грехов программиста
12.01.10
Smalltalk style lazy initialization in ruby (Proof of concept)
В Smalltalk есть очень полезная особенность, возможность ленивой инициализации значений. До тех пор, пока переменной не установят значение, оно равно nil и не занимает памяти, но на программиста возлагается задача не забыть это самое значение присвоить. Lazy initialization позволяет программисту все-таки забыть про это и не огрести люлей от рантайма.
Штука, в принципе, леко реализуемая почти везде, но в ST она очень круто выглядит и легко читается:
SomeClass>>lazyValue
^property ifNil: [property := 'Default'].
В руби для этого придумали целый новый метод ||= описание которого я с первого раза вкурить не смог, когда начинал разбираться в языке. Примерно в то же время я написал для себя библиотечку smalltalk_ifmessages.rb, она очень простая:
class Object
def ifTrue
if self
yield
else
self
end
end
def ifNil
if self == nil
yield
else
self
end
end
def ifNonNil
if self != nil
yield
else
self
end
end
end
С её помощью можно нафигачить в руби леко читаемую ленивую инициализацию:require 'smalltalk_ifmessages.rb'
class LazyClass
def lazy_prop
@property.ifNil { @property = "Default" }
end
def lazy_prop=(value)
@property = value
end
end
11.01.10
Xcode text macros, что б в следующий раз не искать
В Xcode есть клёвая система сниппетов, только вот фирма «Эпол» не сделала ничего хорошего, что бы пользователь мог сам создавать эти самые сниппеты. Надоело мне каждый раз писать руками многострочники перед методами, и что делать?
А делать вот что:
- Создать фолдер ~/Library/Application Support/Developer/Shared/Xcode/Specifications/
- Создать там файл ObjectiveC.xctxtmacro
- Написать в него текст, пример, ниже.
- Перезапустить компиляторный потогонный станок
/Developer/Applications/Xcode.app/Contents/PlugIns/TextMacros.xctxtmacro/Contents/Resources/ObjectiveC.xctxtmacroНу и, само собой, так можно кошмарить любой поддерживаемый Xcode'ом язык.
(
{
Identifier = objc.methodcomment;
BasedOn = objc;
IsMenuItem = YES;
Name = "Method comment";
TextString = "/**\n * <#desc#>\n */";
CompletionPrefix = com;
OnlyAtBOL = YES;
IncludeContexts = ( "xcode.lang.objc.block" );
}
)
07.01.10
Russian Lambda Planet переехала на fprog.ru
Ну вот мы и пристроили RLP в хорошие руки. Я считаю, что все у нас получилось довольно неплохо с планетой, функцию она свою выполняла, а теперь будет ее выполнять еще лучше.
Спасибо огромное всем, кто имел отношение к RLP, присылал багрепорты, ругал, писал про функциональное программирование и помогал с развитием. Прежде всего — огромное спасибо lrrr'у с которым мы ее и придумали, Алексу Отту который очень активно участвовал в развитии планеты и, фактически, был единственным человеком, рекомендующим новые источники.
Теперь я хочу пожелать новым хозяевам планеты, проекту «Практика функционального программирования», удачи и сказать спасибо за то, что приютили.
Подробности можно прочитать у Алекса вот тут.
17.12.09
TDD разработка компиляторов
Я тут пока болел прочитал наконец-то книжку Бека Test Driven Development: By Example. Там в конце указана некоторая незатронутая в книге критика ТДД, в числе прочего есть пункт: «С помощью TDD невозможно разработать компилятор».
Почему?
12.11.09
Зарубка: когда zsh валится в ад и израиль
Когда zsh начинает материться фразой «_alternative:69: command not found: _canonical_paths» при попытке получить список дополнения, нужно просто грохнуть ~/.zcompdump и перезапустить шелл.
Зарубка: zsh case insensitive completion, если вдруг сломалось
autoload -U compinit
compinit -C
zstyle ':completion:*' matcher-list 'm:{a-z}={A-Z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*'