Monthly Archives: Грудень 2014

Додекалендар

Я вирішив стати майстром верстки, CSS3, SVG і всяких інших крутих штук. Для цього вирішив забабахати календар на гранях додекаедра, розгортку якого можна подивитись на моєму гітхабі: http://bunyk.github.io/dodecahedron/

Календар на гранях додекаедра вигідний тим, що це оригінально, бо 3d, а ще ним добре грати футбол чи інші ігри з м’ячем. :)

Так як я на це вбив майже половину вихідних (5 з половиною годин замість трьох запланованих), і вже не маю сил написати рендеринг власне табличок для місяців, бо треба ще вирішити чи залишати текст в тегу <pre>, чи зверстати місяці табличками, то вирішив просто написати про це тут, може хтось хто в веб-дизайні розбирається краще, щось мені порадить і прискорить роботу.

Далі я ще планую зробити кнопочку яка дозволяє змінити рік (аби в 2015 заново не кодити), і кнопочки що дозволяють змінити фонові картинки. Тоді залишатиметься лише роздрукувати на A3 і можна клеїти комусь подарунок до нового року.

Найбільше сил пішло на те, щоб вирішити що React чомусь не хоче рендерити SVG, з D3 доведеться писати море коду, а Angular – саме воно, і треба його трохи підучити. Мені дуже сподобалось, надалі намагатимусь писати на ньому більше.

Розгортка і моделька

Розгортка і моделька з листка A4

А зовсім круті нерди можуть зробити аналогічний календар за допомогою Tikz в \LaTeX.


Filed under: Графіка, Кодерство, Нещоденник, Павутина Tagged: HTML, JavaScript, SVG

Трактат про Zope Component Architecture

Zope – це дуже-дуже старий фреймворк (історія почалася ще з 1995), але деякі його частини, а іноді і сам він використовуються в різних системах і досі. Наприклад Twisted використовує інтерфейси Zope (їх свідчення). Біда з ним в тому, що якась пристойна інструкція в інтернеті не доступна. Може вона й була там колись, але на жаль посилання не завжди працюють, а з такою старовиною як Zope – дуже часто ведуть в тупик 404. Своїм трактатом постараюсь цю біду хоч трохи виправити.

Ах, ще цікавий факт, ZCA з’явилась в Zope 3 (BlueBream), при спробі переписати все “правильно”, ігноруючи зворотню сумісність. Таким чином ситуація трохи нагадує ситуацію з Python 3. Тільки Python 3 з’явився в 2008, і здається таки має деякі шанси вижити, а от Zope 3 (BlueBream) – в 2004, і від нього відросли інші фреймворки, наприклад BFG, який об’єднався з Pylons і став Pyramid. Але цю всі історію дуже цікаво розповідає Пол Еверітт, один з тих хто все це почав. Він пояснить вам що Zope ще не вмерла, вона просто спить:

А тут мова піде лише про таку частинку Zope, як ZCA. І ми будемо писати код. З нуля!

Термінологія

Але почнемо з теорії, аби розуміти що збираємось писати.

  • Zope – Z Object Publishing Environment – фреймворк і веб-сервер які намагались публікувати у вебі об’єкти, ще в ті часи коли Apache віддавав статичний HTML і ганяв CGI скрипти. Шлях в URL в ньому відповідає не шляху до файлу зі скриптом, а шляху в ієрархії об’єктів. Кажуть то був прорив.
  • Компонент (Component) – якийсь код на Python, зазвичай клас, що реалізує інтерфейс. Компоненти поділяються на адаптери та утиліти (див. нижче).
  • Інтерфейс (Interface) – спеціальний клас, єдиною метою якого є опис функціоналу що реалізується іншим класом чи модулем. Вони реєструються в реєстрі компонент, і до цього реєстру можна робити запити “Дайте мені будь-ласка компоненти що реалізують оцей інтерфейс”. Класи можуть декларувати що вони реалізують (implement) певний інтерфейс. Екземпляри цих класів тоді надають (provide) цей же інтерфейс.
  • Сервіс (Service) – це об’єкт що працює з компонентами. Думайте про компоненти як про “речі”, а про сервіс – як про частину коду що бере ці “речі” і робить з ними щось корисне.
  • Реєстр компонентів (Component registry, також Site Manager) – база даних компонентів та інтерфейсів, сервіс за означенням вище. Якщо ви реєструєте компоненти в реєстрі, вони стають доступними для інших користувачів того ж реєстру. Існує глобальний реєстр компонентів що створюється автоматично, і можна використати ZODB як локальний реєстр.
  • ZODB – ZOpe Object Database – база даних об’єктів Zope. Використовувати її з компонентами не обов’язково, тому про неї якось іншим разом.
  • Глобальний реєстр компонентів (global component registry) – сервіс що автоматично створюється коли ваша програма що містить компоненти Zope запускається і наповнюється компонентами що описані в конфігураційних файлах ZCML. До глобального реєстру можна отримати доступ з будь-якого місця програми. Коли програма завершує роботу всі зміни внесені до глобального реєстру зникають і при наступному запуску він заново завантажується з ZCML.
  • Локальні компоненти (Local components) – це компоненти що не створюються в глобальному реєстрі компонентів. Зазвичай їх зберігають в ZODB, що також означає що вони персистентні, тобто можуть пережити перезапуск програми.
  • ZCML (вимовляється “зе-кемел”, Zope Configuration Markup Language) – XML файли, що описують компоненти які потрібно зареєструвати в глобальному реєстрі.
  • Адаптери (Adapter)- це класи що дозволяють використовувати з об’єктом нові інтерфейси. Клас адаптера містить виклик adapts() який вказує інтерфейс що адаптує адаптер, що означає що ви можете передати будь-який об’єкт, що реалізує цей інтерфейс, в метод __init__ класу адаптера, наприклад a = myAdapter(myobject). Тепер MyAdapter бере на себе обов’язок фронт-енда для myobject, таким чином, що будь-який інтерфейс реалізований за допомогою myAdapter, буде правильно працювати з myobject. В певному сенсі адаптер “огортає” адаптований об’єкт.
  • Фабрика (Factory) – це щось (якщо конкретніше, не щось, а утиліта, визначення якої буде нижче), яка створює компоненти та об’єкти. Це як більш високорівнева версія конструктора. Фабрика має бути об’єктом який можна викликати, і повинна реалізувати інтерфейс IFactory. Фабрики надають зручні засоби для доступу до конструкторів компонентів через реєстр компонентів, а не прямим викликом конструктора. Важливо зауважити що ZCM автоматично створює фабрики, коли ви реєструєте компоненти. В багатьох випадках це означає що ви не матимете справи зі створенням фабрики напряму.
  • Утиліта (Utility) – об’єкт який ви хочете додати до реєстру компонентів. Вона може бути будь-яким об’єктом мови Python, який може знадобитись іншій частині програми. Утиліта повинна реалізовувати принаймі один інтерфейс.

Я знаю що ви з цього словника майже нічого не зрозуміли. Не бійтесь, я теж. Далі ми розберемо це на практиці, і ситуація проясниться.
Read more »

Як я отримав швейцарський “диплом”

З відзнакою. Ось як він виглядає. Власне це не зовсім диплом, бо просто показує що я всього лиш завершив курс який тривав сім тижнів, і не підтверджує того факту що завдання робив я. І не зовсім швейцарський, бо Cousera – американська компанія.

Але важливо те, що я пройшов курс функціонального програмування на Scala, який:

  • Базується на SICP.
  • Мову Scala викладає творець мови Scala. І він не тільки багато знає, він ще й вміє це доступно пояснити.
  • Мартін Одерськи – викладач Фередальної політехнічної школи Лузани – одному з двох політехнічних університетів Швейцарії. В іншому, Федеральній вищій технічній школі в Цюріху він в 89-тому отримав PhD, під керівництвом не аби кого, а Ніклауса Вірта. Який створив мову Паскаль – найвідомішу широкому загалу.
  • Задачі настільки добре покриті автоматичними тестами, що можна суто завдяки їм знайти в себе помилку, навіть не звертаючись до форумів. Форуми теж чудові, я двічі застрявав і двічі підказка знаходилась саме на форумі. (Що не означає що вам там викладуть готове рішення).

Ну і найголовніше – що я таки хоч один пройшов. Бо до того записувався на NLP, логіку, криптографію, гейміфікацію, і так і не набрав на жодному з них більше 5%. На цьому ж – 97.5%. Треба було показати собі що це простіше ніж здається, головне кілька місяців зберігати мотивацію, чи просто раз на тиждень застосовувати силу волі і садити себе за комп’ютер.

Крім того, я збираюсь колись написати книжку про те як бути кращим студентом, в тому числі і як використовувати наявні можливості MOOC, а це буде якось дивно, коли поганий студент пише про те як бути гарним. Тому мушу потрохи виправляти ситуацію.

Третя мотивація – я хочу записатись на курс FRP. Що таке FRP – дивіться “Александр Соловьев — Functional Reactive Programming & ClojureScript “. Надихаюча доповідь яку можна розтягувати на цитати.

Як виявилось для успіху потрібно було робити те, що я майже від 8-го класу ніколи не робив – домашні завдання. І здавати їх вчасно, бо за кожну добу спізнення знімають 20% балів. Через це я набрав не 100%. Звідси висновок – не варто здавати лаби в останній момент, бо може ще якась помилка вилізе.

Фото з лекції

Фото з лекції

Коли в університеті я дивився на викладача який звичайною крейдою пише по звичайній дошці і записував це все в цифровий файл, то в цьому випадку я дивився на цифрового викладача, який пише електронним пером по слайдах (набагато зручніше ніж MIT OCW, де вони просто живу лекцію з крейдою знімають на відео, хоча й зробити напевне набагато дорожче), і при цьому записував все звичайною ручкою в звичайний зошит. Хоча, потім оцифрував цей конспект, так як паперові постійно губляться, і зручніше шукати щось в Google ніж в шафі.

Коротше кажучи моя подяка професору Одерськи:

Great introductory course on functional programming, great tasks, and great lectures. Will also inroll into your reactive programming couse. Keep going!


Filed under: Кодерство, Нещоденник Tagged: добре, освіта