Install this theme

Posts tagged: programming

Sharecode

Я очень давно и долго искал средство для быстрого шаринга кода. Не нашел, и решил написать свое :)

Основная цель – разобраться наконец таки с CoreData, а что может быть лучше для изучения API, чем Python? Так что свежие темплейты PyObjC для Xcode в руки, и вперед, к победе!

Пункт первый. CoreData не настолько страшная. Даже вообще не страшная.

Пункт второй. Магия интеграции Python’овых классов в ObjC рантайм поразает воображение.

Пункт третий. BWToolkit рулит.

Пункт четвертый. Pygments офигительно рулит.

Итого, всего за полтора часа был написан костяк приложения, который умеет хранить сниппеты, и делать подсветку по заданному типу кода. И еще drag&drop на иконку в доке работает. В планах: добавить шаринг по бонжуру и посмотреть насколько стабильно CoreData шарится через Dropbox, добавить способы быстрого получения сниппетов (it’s all about speed, anyway), спрятать иконку из дока (и добавить в менюбар) – я предпочитаю такой режим использования. Ну и еще воз и маленькая тележка, я что-то никак всерьез с Cocoa не поиграюсь, так что теперь можно устроить основательное копание во всех апи.

Репа на гитхабе: http://github.com/farcaller/Sharecode/

Тестовый билд (0.0.1alpha): Sharecode.app.zip

Safari XPath

I’ve finally got tired of Firefox and XPather, so I did a quick investigation and wrapped up a similar plugin for Safari.

UPDATE: version 1.2 now supports OSX 10.6 and latest Safari

Safari XPath allows you to get XPath expression for any DOM Node, or query nodes by XPath.

Download it from here. To install, unpack and move bundle to ~/Library/Application Support/SIMBL/Plugins/. And yes, you need to have SIMBL installed.

Now, restart Safari and look for “XPath” in the context menu. It’s pretty obvious from there.

Questions, suggestions?

C is a very low-level language, to the point that you can almost see the assembly code behind C if you stare long enough at the screen (in my experience, however, when that happens, you’re just seeing things and should instead go home and have some rest).
CoreData

CoreData на ифоне – вроде бы замечательный фреймворк с широкими возможностями… Но при портировании допущено столько ошибок! Я за сегодняшний день познакомился с десятком кодов ошибок Cocoa (я про коды ошибок не слышал со времен своего детства и Дельфей!). Код падает рандомно, совершенно не понятно, что можно делать, а что – нельзя. Ну и до кучи – кривая документация и примеры (более того дефолтный шаблон CoreData-приложения вообще сломан). Fail.

OpenGL

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

Сегодня дебажил код, который отлично бегал в симуляторе, но упорно падал на ифоне (3G, 3.0PWN). При чем именно падал, по полной программе и разными ошибками, ругаясь то на арифметику, то на ошибки адресации. Ах да, Xcode отправил меня лесом, и сказал что с gdb на ифоне говорить не будет. Просто не будет. Без оснований. Фиг чего отдебажишь, только постмортемы и читать.

Это все в довесок к ноющей челюсти и температуре. Писец, шикарный день выдался.

Красивая инициализация синглтонов

Увидел сегодня очень интересный метод инициализации класса один раз (вернее на самом деле - не один раз, но “должен остатся только один”). Все закручено вокруг libc’шного OSAtomicCompareAndSwapPtrBarrier, который гарантирует либо атомарную установку указателя на нужный объект или фейл. Таким образом надо проверить статическую переменную, и если она все еще nil - то создать новый экземпляр себя и попробовать подменить nil настоящим указателем. Если получилось - у нас есть первый и единственный инстанс объекта, если нет - то было создано два (или более) объектов одновременно и все лишние пойдут в release.

Собственно сниппет (спионерен отсюда):

+ (id)defaultCenter
{
	static MAKVONotificationCenter *center = nil;
	if(!center)
	{
		// do a bit of clever atomic setting to make this thread safe
		// if two threads try to set simultaneously, one will fail
		// and the other will set things up so that the failing thread
		// gets the shared center
		MAKVONotificationCenter *newCenter = [[self alloc] init];
		if(!OSAtomicCompareAndSwapPtrBarrier(nil, newCenter, (void *)&center))
			[newCenter release];
	}
	return center;
}