Програми програмування на mac os. Як програміст Windows може бути досить продуктивним у Mac OS X? Розробники вже користуються дивовижними можливостями Swift

Програми програмування на mac os.  Як програміст Windows може бути досить продуктивним у Mac OS X?  Розробники вже користуються дивовижними можливостями Swift
Програми програмування на mac os. Як програміст Windows може бути досить продуктивним у Mac OS X? Розробники вже користуються дивовижними можливостями Swift

Слово

Пам'ятайте: “На початку було Слово…». Ось це саме воно. У цій серії статей спробуємо розібратися та описати, як можна програмувати під Mac OS Xщо робити варто, що не варто. Ну, і навіщо це взагалі потрібно. Адже є безліч інших систем.

Аргументи…

На користь кожної операційної системи є свої аргументи. І часто програмування під якусь із систем – це не питання вибору чи переваг, але частина технічного завдання. У такому разі сперечатися (аргументовано) досить складно. І мабуть тільки Mac OS X(і взагалі комп'ютери Apple)можна хоч якось відстояти у цій суперечці за робоче місце.

Нехай нам програмувати все-одно на чому. Наприклад, для web. У такому разі найчастіше ми працюємо з Apache/MySQL/P(HP/Perl/Python). Тут проблем немає для будь-якої ОС. Але далі - потрібно перевіряти, як все візуально виглядає у браузерах. І всі системи підводить неможливість (легального) запуску Mac OS Xдля перевірки, як буде працювати сайт у Safari. А ось навпаки – будь ласка, скільки завгодно. У трьох варіантах.

Гаразд, нехай навіть нам потрібно розробляти щось конкретно під Linux/Windows. Начебто б у цьому випадку точно потрібно вибирати відповідну платформу, відповідну ОС. Але заждіть, навіщо? У віртуальних машинах ці системи працюють блискуче. При цьому є можливість локально емулювати мережу (запустити сервер в одній VM, клієнта в іншій), робити снапшоти (зберігати стан VMна певний час для наступного отката) тощо.

І, нарешті, ніхто не забороняє поставити рідну Linuxабо Windows(або обидві відразу) на Mac. Зворотне зробити не можна. А ось так – запросто, якщо потрібно.

Чи є аргументовані мінуси у Маків? Так є. Патологічна ворожість. Декому потрібне щось конкретне. Наприклад, настроюваність . Або розгортання вікна подвійним клацанням миші на заголовку. Ось треба і все. В такому випадку Mac OS Xкатегорично протипоказаний, нічого крім негативних емоцій у разі не виходить.

та факти…

А факти прості. На конференціях розробників все частіше зустрічаються MacBook'іі MacBook Pro.На них проводяться презентації, демонструються прототипи розробок та фінальні релізи.

Mac'і увійшли до життя розробників досить щільно. А подекуди просто підкорили їх. Наприклад, Javaтехнологія. На конференції JavaOneвідсотків 60 всіх комп'ютерів – це ноутбуки фірми Apple.

Ну досить лірики. Давайте подивимося, що взагалі надає Appleдля програмування і як зручно все це налаштувати, щоб користуватися.

Дайте два!

Є дві прості речі, які не завжди очевидні та не завжди легко розуміються різними розробниками. Особливо тими, хто створює не кінцевий продукт (Notepad),а платформу для інших (1C).

По-перше, для створення платформи потрібно, щоб на ній щось працювало. Тобто, щоб сторонні програмісти могли під неї створювати програми. Згадаймо, який галас був з приводу iPhone SDK…Ще б пак, практично ніколи ще такі SDKне лунали просто так. І майже ніколи вони не були настільки якісними. Або, наприклад, коли розроблялася Sony Playstation 3, DevKit(Інструментарій розробника, Developer Toolkit)для неї був готовий набагато раніше за саму приставку. Щоб до виходу приставки вже могли з'явитися хоч кілька ігор. Тому інструментарій – це важливо. Це архіважливо. І в Appleце добре розуміють. Вони роздають його безкоштовно (до будь-якого Мака на диску з ОС поставляється і SDK), вони його активно розвивають.

По-друге, створення великої платформи - це велика праця багатьох людей (які використовують ті самі Маки). Люди різні, і інструментарій має бути різноманітним. З цією метою з Mac OS XЗазвичай поставляється кілька скриптових мов, вже настроєних до роботи. Власне, Mac OS X -єдина ОС (зараз починають з'являтися Linux'и),в якій спочатку стоїть Java.Тому для того, щоб почати програмувати під Mac OS X,не потрібно завантажувати та встановлювати, наприклад, Python,якщо ви хочете написати на ньому скрипт. Просто сідайте та пишіть – воно вже там, уже налаштоване.

Далі буде…

у цьому топіку я покажу як написати простенький додаток для iPhone з використанням офіційного SDK. Придбати його просто, потрібні:
1. Intel-based Mac (хоча і на PowerPC теж працює, але після деяких рухів тіла)
2. iPhone SDK. Я писатиму на beta 2. Останню версію можна отримати, зареєструвавшись на developer.apple.com. Beta 2 можна знайти у торрентах

HelloHabr

щоб сильно не напружувати моск зробимо найпростіше: додаток буде лише показувати логотип хабра. Відкриваємо XCode (обов'язково в 32-бітномурежимі) і створюємо новий Cocoa Touch додаток:

назвемо його HelloHabr та збережемо на робочий стіл.

Майстер створення проектів уже зробив за нас. Подивимося на вміст main.m:
#import

Int main(int argc, char *argv)
{
NSAutoreleasePool * pool = [init];
//оскільки в айфоні не можна використовувати складання сміття, то для полегшення життя використовуємо autorelease pool
int retVal = UIApplicationMain(argc, argv, nil, @«HelloHabrAppDelegate»);
//Щоб запустити програму, потрібно викликати цю функцію. @«HelloHabrAppDelegate» - клас, якому буде передано управління
;
return retVal;
}

Тепер поглянемо на HelloHabrAppDelegate.h:
#import

І на HelloHabrAppDelegate.m:
#import HelloHabrAppDelegate.h
#import MyView.h

@implementation HelloHabrAppDelegate
//ці директиви означають, що при компіації замість звернень через., вписати getter"и та setter"и
synthesize window;
synthesize contentView;

//функція, делегована від UIApplication
- (void)applicationDidFinishLaunching:(UIApplication *)application (
// Створюємо головне вікно
self.window = [[ initWithFrame:[ bounds]] autorelease];
// створюємо contentView
self.contentView = [[ initWithFrame:[ applicationFrame]] autorelease];
//додаємо наш contetntView до головного вікна, щоб воно відобразилося
;
// робимо видимим головне вікно
;
}

- (void) dealloc (;
;
;
}

Маленька мат.частина закінчена, приступимо до написання програми. Зберігаємо логотип хабра в папку із додатком. Потім перетягнемо його з папки в папку Resources нашого проекту у вікні XCode:

Тепер додамо до MyView нове поле «habrView» типу «UIImageView *», тобто. MyView.h виглядатиме так:
#import

А тепер визначимо в класі MyView процедури init та dealloc:
#import MyView.h

@implementation MyView
- (id) initWithFrame:(CGRect)frame (if(self = ) (
//Колір фону - чорний
];
//створюємо новий об'єкт із зображенням логотипу хабра
UIImage *image = ;
//Створюємо компонент, який і буде показувати логотип
self->habrView = [ initWithFrame:CGRectMake(0, 0, .width, .height)];
;
];

;
//додаємо компонент відображення логотипу хабра на форму
;
}
return self;
}

- (void) dealloc (;
;
}
end

Всі. Компілюємо, запускаємо та отримуємо те, що й хотіли:

А тепер метод створення додатків для лінивих. Dashcode вміє створювати веб-програми для iPhone і iPod Touch. Відкриваємо Dashcode і як заготовку вибираємо RSS. Переходимо на вкладку Page Attributes, задаємо Page Title: "Harbrahabr RSS", Feed URL: "feed://habrahabr.ru/rss/main/". Потім переходимо на вкладку "Harbrahabr RSS" (відкриється дизайнер) і змінюємо напис "My RSS Feed" на "Habrahabr RSS Feed":

Натискаємо Run та отримуємо RSS-рідер Хабра:

У принципі, все. Відгуки, побажання, пропозиції чекаю в коментарях

Upd:трохи підправив форматування, код читається краще, але до ідеалу далеко

Як легко видно, це просто стандартна "заглушка". Її завданням є правильна ініціалізація програми, яка виконується функцією NSApplicationMain. У цю ініціалізацію (яка загальна всім додатків) входить створення об'єкта NSApp класу NSApplication(точніше, NSApp вказує на цей об'єкт).

Одним із головних завдань об'єкта класу NSApplication є завантаження головного nib -файла (насправді у додатку може бути більше одного xib -файла, але при цьому один, зазвичай, MainMenu.xib є головним і автоматично завантажується при запуску програми).

При цьому відбувається фактично розархівація всього дерева об'єктів та зв'язків між ними, заданий у цьому xib -файл. Як уже зазначалося в попередній статті, саме NSApp і буде власником головного xib -Файла.

Однією з цікавих особливостей програмування під Mac OS X є вкрай рідкісне створення нових класів на основі NSWindow та NSApplication - практично завжди всі необхідні дії можуть бути досягнуті шляхом делегування та патерну Observer .

В основі написання додатків з графічним інтерфейсом лежить Smalltalk"а концепція MVC (Model, View, Controller .

Відповідно до цієї концепції (як це не дивно Ruby on Rails при побудові Web-сторінок використовує цю саму концепцію) виділяються об'єкти, що служать для показу даних ( views), об'єкти, що представляють дані ( models) та об'єкти, що відповідають за їх взаємодію з користувачем ( controllers).

Mac OS X вже містить велику кількість готових об'єктів, призначених для показу даних (вони зазвичай успадковані від класу NSView). У досить простих додатках немає необхідності створювати спеціально модель (хоча для великих додатків це виявляється дуже зручним – вся бізнес-логіка міститься саме в моделі і не вилазить за її межі).

Тому в простих програмах зазвичай використовуються готові об'єкти viewsАле пишеться свій об'єкт-контролер, який відповідає за взаємодію з користувачем. Найчастіше такий контролер успадковується безпосередньо від NSViewта використовує потужні можливості системи з делегування та оповіщення про події.

Почнемо створення додаток зі створення інтерфейсу користувача для нього. Для цього викличемо Interface Builderподвійним клацанням миші по файлу MainMenu.xib(English) зі списку файлів у правій частині вікна проекту. При цьому запуститься Interface Builderвідразу відкривши xib-файл з нашого проекту.

Відразу ж після запуску Interface Builder-А приберемо всі зайві вікна. Далі відкриємо вікно інспектора (за допомогою команди меню Tools/Show Info) і у властивостях вікна поставимо заголовок Calculator і знімемо виділення з пункту "Zoom (and resize)".

4. Налаштування вікна калькулятора.

Перетягнемо поле для введення тексту з палітри компонентів, розташувавши його в самому верху вікна. Далі перетягнемо кнопку і помістимо її в нижній лівий кут вікна (рис. 5). Змінимо текст кнопки на "0", а її тег (поле Tag:) на 0 і трохи зменшимо її розмір.

Рис 5. Викладаємо компоненти.

Після цього виберемо з меню Layoutкоманду Embed Objects Inі для неї виберемо пункт Matrix. В результаті буде створено об'єкт класу NSMatrix, що є прямокутною матрицею з компонент заданого класу.

Зверніть увагу, що вікно інспектора тепер відображає властивості об'єкта класу NSMatrix.

6. Створення блоку кнопок.

Рис 7. Властивості матриці кнопок.

Побудуємо в такий спосіб таблицю з кнопок розміру 3х4.

Рис 8. Налаштування текстового поля.

Налаштуємо поле введення за допомогою інспектора - приберемо виділення з пункту "Editable" - це не дозволить явно вводити текст у це поле - і задамо вирівнювання тексту праворуч (рис 9).

9. Завдання атрибутів текстового поля.

Вибираючи таким чином по черзі всі кнопки налаштуємо їх параметри наступним чином - як текст задаємо одну з цифр (щоб вийшло так як на рис 10), а як тег для кожної кнопки вкажемо значення відповідної їй цифри (рис 11). Крім того утсановим для матриці кнопок режим (Mode) Highlight, замість встановленого за умовчанням List.

Рис 10. Виділення окремої кнопки із матриці.

Рис 11. Налаштування атрибутів окремої кнопки із матриці.

Ми відразу додамо підтримку клавіатури, використовуючи так звані key equivalent"и, розглянутим нами у попередній статті. Для цього клацнувши мишею по полю Key Equiv.(після чого навколо поля з'явиться блакитна рамка) натиснемо на клавішу, яку ми хочемо вибрати як key equivalentа.

Тег - це число, яке можна присвоїти будь-якому візуальному елементу (успадкованому від NSView). У деяких випадках використання тегів дозволяє помітно полегшити життя програмісту. Так у даному випадку ми зіставимо всім цифровим кнопкам посилку одного і того ж повідомлення ( digit:), а обробник повідомлення (у контролері) для отримання відповідної цифри просто запросить тег від об'єкта, що посилає повідомлення.

Наступним кроком буде забирання двох зайвих кнопок (крайні кнопки в останньому ряду), щоб у нас вийшло рівно десять кнопок (як і цифр).

Для цього подвійним клацанням миші виділіть ліву нижню кнопку в матриці і у вікні інспектора зніміть виділення з пункту "Enabled" і поставте виділення у пункту "Transparent".

Внаслідок цих дій ліва нижня кнопка стане невидимою. Аналогічно зробимо невидимою та праву нижню кнопку.

Рис 12. Вікно калькулятора з цифровими кнопками та кнопками С та СА.

Нашим наступним кроком буде створення класу контролера. Для цього на панелі об'єктів Libraryвідкриємо розділ Objects & Controllersі перетягнемо синій кубик, що є об'єктом класу NSObject у вікно Main Menu.xib (English) (рис 13).

Рис 13. Створення класу з урахуванням класу NSObject

Виділивши цей об'єкт у вікні інспектора відкриємо закладку Identity(Переостання). Далі у полі Classзмінимо назву класу з NSObjectна CalcController.

Рис 14. Властивості класу CalcController.

Далі за допомогою кнопок + у розділах Class Actionsі Class Outletsдодамо нашому класу CalcControllerодин outletз ім'ям text, задавши як його клас NSTextField і наступні методи - (розділ Class Actions) - operation:, digit:, clear:і clearAll:.

Перший із цих методів ( operation:) буде викликатися при натисканні кнопки, що відповідає будь-якій арифметичній операції. Метод digit:буде викликатись при натисканні будь-якої з цифрових кнопок, призначення методів clear:і clearAll:зрозуміло з назви.

Після того, як ми задали якісь outlet"и та методи нам потрібні, за допомогою команди меню File/Write Class Files...створимо файли CalcController.h та CalcController.m.

Рис 15. Створення файлів для класу CalcController.

При цьому з'явиться діалогове вікно, в якому потрібно встановити, що потрібно створення обох файлів і їх потрібно відразу додати до проекту Calculator.

Рис 16. Додавання створених файлів у проект.

Після цього повернемося назад у XCodeі переконаємося, що файли CalcController.h та CalcController.m дійсно додалися до проекту.

Відкриємо файл CalcController.h – для цього можна або одноразовим клацанням миші по ньому відкрити файл у нижній частині вікна проекту (рис 17) або подвійним клацанням відкрити файл в окремому вікні.

17. Вікно проекту з відкритим файлом CalcController.h.

Зверніть увагу, що файл CalcController.h містить повний опис класу CalcController, як ми його визначили в Interface Builder"е.

Змінимо файл CalcController.h, як показано на наступному лістингу.

Я використовую MacBook Pro протягом декількох місяців вдома, і мені було цікаво, чи є хороша книга або керівництво, яке може допомогти мені стати найкращим програмістом на Mac. Можливо, Mac-еквівалент Початок програмування Linux . Примітка. Я не шукаю ресурс про те, як програмувати програму Mac, натомість я шукаю більш загальний посібник з використання Mac для спільного середовища розробки.

Як тло я є програмістом Windows вдень. Протягом багатьох років я також займався деякими Linux та BSD, особливо в школі, наприклад, програмуванням сокетів, графікою, типом типу make install. Вдома я робитиму Java, Scala, PHP і т.д. На Mac.

Досі я використовував Eclipse, QuickSilver та TextMate. VMWare Fusion, XCode та NetBeans налаштовані, але я їх не використовую. Перемикач DVI KVM підключається до реальної клавіатури, трекболу та монітора. Нещодавно залишився до пізньої битви з MacPorts і зрозумів, що мені потрібен x86_64. Найбільша проблема, з якою я зіткнувся - це налаштувати PHP. Я не знаю, чому вони не постачаються з бібліотекою MySQL та GD. Зрештою, я зрозумів, що це Googling, і побудував розширення з джерела. У мене таке відчуття, що я не отримав записки і не прочитав базового керівництва про те, як стати програмістом на Mac, наприклад, як працює вся архітектура. Як програміст Windows може бути досить продуктивним у Mac OS X?

Змінити. Конкретний тип програми, який я хочу розробити, на мій погляд, не має особливого значення. Це може бути Java, Scala, PHP, як я згадував, або Cocoa, C++ або щось ще.

Я шукаю конкретну книгу, ресурс, поради про те, як бути ефективнішим програмістом на Mac, бажано щось окрім "встановити XYZ".

6 відповідей

Здається вам потрібний огляд того, як Mac OS X працює на системному рівні, більше, ніж переосмислення інструментів і т.д. Якщо це станеться, я почну з (основного) Посібник із системної архітектури Mac OS X від Apple, потім перейдіть до Початок роботи з Mac OS X , який повинен дати вам достатньо огляд для початку роботи.

З вашого питання незрозуміло, що ви маєте намір робити з вашим програмуванням, але якщо ви вирішите продовжити розробку Cocoa/OS X, я рекомендую програму Cocoa для Mac OS X від Aaron Hillegass.

Переробивши з Windows у Mac OS X близько п'яти років тому, я часто знаходжу себе так само. Я просто не можу бути продуктивним у Windows (наскільки це можливо, я можу бути продуктивним), як я можу на Mac OS X.

Щиро кажучи, між Mac OS X і Windows існує безліч невеликих відмінностей. Я знаходжу найбільшу причину для людей, які так думають (зазвичай це стосується лише геймерів та розробників) полягає в тому, що вони намагаються використовувати Mac як Windows. Ви повинні навчитися визнавати, що вам потрібно використовувати командний ключ, а не ключ управління і т.д.

Схоже, ви використовуєте Mac, тому що ви повинні на противагу тому, що хочете. Це дійсно набагато краще, ніж Windows, коли ви звикаєте до неї.

Я думаю, що багато програмістів на Windows приходять на Mac і не намагаються його правильно вивчити, тому що вони самовдоволені, думаючи, що вони всі знають, тому що вони "використовували Windows все своє життя". Я думаю, як тільки ви знайдете Spotlight, Expose, "Ярлики для клавіатури Mac OS X" і т.д. Ви виявите, що ви самі є багато більш продуктивним, ніж будь-коли були на Windows.... і його дійсно забавна ОС для використання.

Ознайомтеся з деякими з найкращих програм Mac, які ви можете отримати і. Ви також можете виконати пошук "100 найкращих програм для Mac".

Крім того, я помітив, що ви намагалися налаштувати якийсь веб-сервер безпосередньо в Mac OS X. Він поставляється з одним, але якщо ви збираєтеся додати MySQL та деякі інші розширення, я б не пішов шляхом MacPorts. Отримати VMWare Fusion або VirtualBox (з відкритим вихідним кодом) та запустити сервер у віртуальній машині. Набагато чистіше. У мене є subversion/trac FreeBSD VM, який обробляє мій локальний контроль версій.

Я хотів би додати, що якщо ви зараз не використовуєте Xcode, ви повинні обов'язково вивчити його і використовувати його якнайшвидше. Це набагато приємніше IDE для використання, ніж Visual Studio, і це зробить ваше життя набагато простішим.

Не забувайте, що ви, ймовірно, витратили роки на сайтах довідки Windows, ви малою мірою повинні зробити це з Mac. Щоразу, коли у вас є проблема з використанням Mac, поставте питання ServerFault . Ми все більш ніж готові допомогти вам.

У мене така сама ситуація, як у вас. Я використовую Windows для розробки і близько року тому купив MBP для дому (коли я перейшов до офісу). Мені дуже важко отримати будь-яку реальну роботу на моєму MBP. Якось я звик до середовища Windows із двома екранами. Але нехай це вас не зупинить. Декілька програм, які я пропоную вам отримати, такі:

  • Передача - Гарний клієнт ftp
  • MAMP – запускає веб-сервер майже з коробки. Добре для базового розвитку.
  • Quicksilver - допомагає швидко знайти програми.
  • Простір разом з жестів (Налаштуйте ваші жести, щоб переміститися з одного екрана на інший, я використовую три пальці, слизькі).
  • Entourage - для електронної пошти
  • Термінал - для ssh (альтернатива шпаклівки) (входить до комплекту)
  • Dreamweaver/BBedit/Textmate (все досить пристойно, але я люблю editplus на вікнах, а не шанувальник IDE).

Я припускаю, що ваше питання полягає не в навчанні COCOA, а про більш ефективне використання MAC. Ну, наведені вище інструменти можуть допомогти вам.

На жаль, ваше питання не дуже зрозуміле щодо того, що ви дійсно хочете.

Якщо ви хочете написати щось крос-платформне, може бути дуже корисно мати віртуальну машину для тестування. Коли в Linux я завжди використовував VirtualBox, він також працює і з OS X.

у цьому топіку я покажу як написати простенький додаток для iPhone з використанням офіційного SDK. Придбати його просто, потрібні:
1. Intel-based Mac (хоча і на PowerPC теж працює, але після деяких рухів тіла)
2. iPhone SDK. Я писатиму на beta 2. Останню версію можна отримати, зареєструвавшись на developer.apple.com. Beta 2 можна знайти у торрентах

HelloHabr

щоб сильно не напружувати моск зробимо найпростіше: додаток буде лише показувати логотип хабра. Відкриваємо XCode (обов'язково в 32-бітномурежимі) і створюємо новий Cocoa Touch додаток:

назвемо його HelloHabr та збережемо на робочий стіл.

Майстер створення проектів уже зробив за нас. Подивимося на вміст main.m:
#import

Int main(int argc, char *argv)
{
NSAutoreleasePool * pool = [init];
//оскільки в айфоні не можна використовувати складання сміття, то для полегшення життя використовуємо autorelease pool
int retVal = UIApplicationMain(argc, argv, nil, @«HelloHabrAppDelegate»);
//Щоб запустити програму, потрібно викликати цю функцію. @«HelloHabrAppDelegate» - клас, якому буде передано управління
;
return retVal;
}

Тепер поглянемо на HelloHabrAppDelegate.h:
#import

І на HelloHabrAppDelegate.m:
#import HelloHabrAppDelegate.h
#import MyView.h

@implementation HelloHabrAppDelegate
//ці директиви означають, що при компіації замість звернень через., вписати getter"и та setter"и
window;
contentView;

//функція, делегована від UIApplication
- (void)applicationDidFinishLaunching:(UIApplication *)application (
// Створюємо головне вікно
self.window = [[ initWithFrame:[ bounds]] autorelease];
// створюємо contentView
self.contentView = [[ initWithFrame:[ applicationFrame]] autorelease];
//додаємо наш contetntView до головного вікна, щоб воно відобразилося
;
// робимо видимим головне вікно
;
}

- (void) dealloc (;
;
;
}

Маленька мат.частина закінчена, приступимо до написання програми. Зберігаємо логотип хабра в папку із додатком. Потім перетягнемо його з папки в папку Resources нашого проекту у вікні XCode:

Тепер додамо до MyView нове поле «habrView» типу «UIImageView *», тобто. MyView.h виглядатиме так:
#import

А тепер визначимо в класі MyView процедури init та dealloc:
#import MyView.h

@implementation MyView
- (id) initWithFrame:(CGRect)frame (if(self = ) (
//Колір фону - чорний
];
//створюємо новий об'єкт із зображенням логотипу хабра
UIImage *image = ;
//Створюємо компонент, який і буде показувати логотип
self->habrView = [ initWithFrame:CGRectMake(0, 0, .width, .height)];
;
];

;
//додаємо компонент відображення логотипу хабра на форму
;
}
return self;
}

- (void) dealloc (;
;
}

Всі. Компілюємо, запускаємо та отримуємо те, що й хотіли:

А тепер метод створення додатків для лінивих. Dashcode вміє створювати веб-програми для iPhone і iPod Touch. Відкриваємо Dashcode і в якості заготовки вибираємо RSS. Потім переходимо на вкладку «Harbrahabr RSS» (відкриється дизайнер) і змінюємо напис «My RSS Feed» на «Habrahabr RSS Feed»:

Натискаємо Run та отримуємо RSS-рідер Хабра:

У принципі, все. Відгуки, побажання, пропозиції чекаю в коментарях

Upd:трохи підправив форматування, код читається краще, але до ідеалу далеко