Tag Archives: освіта

Новий безкоштовий онлайн-курс веб-розробки для початківців

Ну а шо, в мене тепер купа досвіду в викладанні, а попит є. То чому б ні? Першим 10-тьом учасникам – участь безкоштовна. ;) А далі буде видно скільки я осилю. Може раз на тиждень, поки не прийде пора відпусток літом?

Прем’єра в четвер, 17-го березня, онлайн, в Google Hangouts. Приєднатись можна за посиланням: https://plus.google.com/events/cd18to4v9bob2p94ume6fb7qih8

Курс розглядатиме всі аспекти, починаючи від верстання статичних сторінок (що я погано вмію :) ), і контролю версій, до NoSQL баз даних (бо SQL я погано вмію :) ), і того що таке REST API. Ну, коротше кажучи, будемо розбиратись разом. Але почнемо з простого – що таке Git, Github, HTML і як помістити останній на Github pages.

Викладаю я більш-менш терпимо. Ось відгук, там фраза “Окрема подяка за підбір тренерів” – то про мене. ;)

По ходу справи будемо писати підручник: https://uk.wikibooks.org/wiki/MEAN

Картинка для привернення уваги: Git changing head uk

Пропозиції про зміст, час, список літератури та та інші аспекти організації курсу приймаються прямо тут, в коментарях. В нас поки що нема українського віківерситету, але вікіпідручник і його адміністрація в моїй особі – до ваших послуг. :)


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

Пишемо переглядач молекул з Pyglet

Я хотів створити серію уроків про графіку в OpenGL по слідах NeHe, але отримав іншу пропозицію, і пріоритети змінились. Ну й графіка в наш час людей не так цікавить. Але так як задачу я почав робити, просто витирати її з списку проектів буде не цікаво, краще опублікувати те що є і перенести в список закінчених проектів. Чим я зараз й займусь.

Ідея програми – намалювати атоми сферами різних кольорів і розмістити їх в різних місцях простору, таким чином отримавши молекулу. Для цього нам треба знати координати. Для цього ми використаємо Open Babel – хімічну експертну систему. Ось інструкції з інсталяції, apt-get install python-openbabel якщо кому лінь їх читати.

Глюкоза

Молекула глюкози

Користуючись нею, ми можемо перетворити формулу SMILES, на список координат атомів:

import pybel

smile = raw_input('Enter SMILE molecule:')
molecule = pybel.readstring('smi', smile)
molecule.make3D()

for atom in molecule.atoms:
    print atom.type, ' '.join(map(str, atom.coords))

SMILES можна знайти в статтях вікіпедії про різні речовини. Ось наприклад глюкоза: OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@@H]1O. І її координати:

O3 3.08232699168 1.41136753836 1.97383867659
C3 2.63605783234 0.116724346362 2.37092125466
C3 2.87897272901 -0.854338624684 1.21070216538
H 2.47296741411 -0.36351143938 0.319191621385
O3 4.29331227545 -1.03408976253 1.03052197614
C3 2.18198168708 -2.2062426467 1.4123437219
H 2.52686439483 -2.70828022178 2.32628341407
O3 0.757046712076 -2.07375697965 1.48816465135
C3 2.4834103428 -3.09613160782 0.198042289604
H 2.03158506981 -2.66605342385 -0.704362586236
O3 1.84366255476 -4.36331585678 0.373985237387
C3 3.99532722341 -3.24522583591 0.00523555683618
H 4.41250004827 -3.77444425583 0.871020029013
O3 4.29626886035 -4.03252960027 -1.15195954921
C3 4.62954125722 -1.84273135567 -0.0947112115177
H 5.71887138656 -1.95252927548 -0.108137148969
O3 4.3079363412 -1.18316983652 -1.31789119536
HO 2.91473185309 2.02688340774 2.71060639162
H 1.56956736943 0.19992674022 2.5985040442
H 3.17829013287 -0.18365904297 3.27321534863
HO 0.532102901531 -1.64213847492 2.33074495499
HO 0.907383263524 -4.15051515566 0.55676359202
HO 3.89297302828 -3.59188323274 -1.91963488602
HO 3.3506978517 -1.05986229308 -1.37211748251

Ок, залишилось написати програму що бере оці координати і створює таку картинку як у цій публікації (увага, ввесь код звідси і аж до кінця публікації – це одна програма):

#! /usr/bin/python3
from random import random

import pyglet
from pyglet.window import key, Window
from pyglet.gl import *
from pyglet.gl.glu import *

window = Window()

Об’єкт наступного класу просто буде повертати кортеж з кольором для кожної назви атома. Деякі атоми ми задамо вручну, щодо правильної палітри – дивіться статтю CPK coloring.

class Palette(object):
    def __init__(self):
        self.colors = {
            'H': (0.0, 0.5, 0.5),
            'HO': (1.0, 0.5, 0.5),
            'C3': (0.1, 0.1, 0.1),
            'Car': (0.1, 0.1, 0.1),
            'O3': (1.0, 0.0, 0.0),
        }

    def get_color(self, name):
        if name not in self.colors:
            print(name)
            self.colors[name] = (random(), random(), random())
        return self.colors[name]

palette = Palette()

Молекула – це по суті список атомів (кожен з яких четвірка з назви і трьох координат), що буде завантажувати себе з файлу при створенні екземпляру класу, і вміє малювати себе:

class Molecule(object):
    def __init__(self, fn):
        self.atoms = []
        with open(fn) as f:
            for l in f:
                el, x, y, z = l.split()
                self.atoms.append(
                    (el, float(x), float(y), float(z))
                )

    def draw(self):
        for atom in self.atoms: # для кожного атома
            glPushMatrix() # зберегти матрицю моделі
            glTranslatef(*atom[1:]) # змістити матрицю моделі в координати атома
            # намалювати сферу радіусу 1 і кольору відповідного типу атома
            draw_sphere(1, palette.get_color(atom[0]))
            glPopMatrix() # завантажити збережену матрицю моделі

molecule = Molecule('glucose.dat') # створити молекулу глюкози

def draw_sphere(radius, color):
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
    
    # довго пояснювати що таке колір матеріалу, я й сам не до кінця знаю.
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, (GLfloat * 3)(*color))
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,
        (GLfloat * 3)(*map(lambda x: x/2, color))
    )
    # glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (GLfloat * 3)(*color))

    sphere = gluNewQuadric()
    gluSphere(sphere, radius, 50, 50) # 50, 50 - це кількість меридіанів та паралелей. 
    # якщо потрібно багато атомів - зменшіть їх кількість для збільшення продуктивності.

Тепер займемось власне перемальовуванням екрану:

@window.event
def on_draw():
    update_frame(0)

rotation = 0 # Глобальна зміна з поточним поворотом моделі
def update_frame(dt):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity() # завантажити матрицю ідентичності 

    global rotation
    rotation += dt * 10 # чим більше часу пройшло - тим більше повертаємо
    glRotatef(rotation, 0, 1, 0) # навколо осі y
    molecule.draw() # і малюємо нашу молекулу.

При зміні розмірів вікна (і при його створенні) ініціалізуємо всілякі налаштування OpenGL:

@window.event
def on_resize(width, height):
    glClearColor(0.0, 0.3, 0.0, 0.0) # задаємо колір фону

    glEnable(GL_DEPTH_TEST) # вмикаємо буфер глибини

    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glLightf(GL_LIGHT0, GL_POSITION, 1, 5, 4) # ставимо одне світло

    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45, width / height, .1, 1000) # перспективна проекція з кутом 45
    gluLookAt( # ставимо камеру і націлюємо її в цент сцени
     1, 4, 15, # eye
     0, 0, 0, # target
     0, 1, 0  # up
    )
    glMatrixMode(GL_MODELVIEW) 
    return pyglet.event.EVENT_HANDLED

При натисканні клавіш “вліво” і “вправо” оновлюємо кадр, повернувши трішки модель. А також оновлюємо 50 разів на секунду. І запускаємо цикл подій:

@window.event
def on_key_press(symbol, modifiers):
    if symbol == key.LEFT:
        update_frame(-1)
    elif symbol == key.RIGHT:
        update_frame(1)

pyglet.clock.schedule_interval(update_frame, 0.02)

pyglet.app.run()

На цьому і все. Можна було звісно написати набагато краще, без глобальних змінних, з кращими поворотами камери і кращим освітленням і т.п. Але поки що є важливіші речі. (Хоча, якщо ви захочете онлайн курс, і зможете зробити так що мені не треба буде ходити на роботу – можемо щось придумати ;) ).

Ах, і стаття з якої взято інформацію про те як отримати координати для атомів молекули: Patrick Fuller – Molecules in Blender


Filed under: Графіка, Кодерство Tagged: освіта, OpenGL, Python

Пишемо переглядач молекул з Pyglet

Я хотів створити серію уроків про графіку в OpenGL по слідах NeHe, але отримав іншу пропозицію, і пріоритети змінились. Ну й графіка в наш час людей не так цікавить. Але так як задачу я почав робити, просто витирати її з списку проектів буде не цікаво, краще опублікувати те що є і перенести в список закінчених проектів. Чим я зараз й займусь.

Ідея програми – намалювати атоми сферами різних кольорів і розмістити їх в різних місцях простору, таким чином отримавши молекулу. Для цього нам треба знати координати. Для цього ми використаємо Open Babel – хімічну експертну систему. Ось інструкції з інсталяції, apt-get install python-openbabel якщо кому лінь їх читати.

Глюкоза

Молекула глюкози

Користуючись нею, ми можемо перетворити формулу SMILES, на список координат атомів:

import pybel

smile = raw_input('Enter SMILE molecule:')
molecule = pybel.readstring('smi', smile)
molecule.make3D()

for atom in molecule.atoms:
    print atom.type, ' '.join(map(str, atom.coords))

SMILES можна знайти в статтях вікіпедії про різні речовини. Ось наприклад глюкоза: OC[C@H]1OC(O)[C@H](O)[C@@H](O)[C@@H]1O. І її координати:

O3 3.08232699168 1.41136753836 1.97383867659
C3 2.63605783234 0.116724346362 2.37092125466
C3 2.87897272901 -0.854338624684 1.21070216538
H 2.47296741411 -0.36351143938 0.319191621385
O3 4.29331227545 -1.03408976253 1.03052197614
C3 2.18198168708 -2.2062426467 1.4123437219
H 2.52686439483 -2.70828022178 2.32628341407
O3 0.757046712076 -2.07375697965 1.48816465135
C3 2.4834103428 -3.09613160782 0.198042289604
H 2.03158506981 -2.66605342385 -0.704362586236
O3 1.84366255476 -4.36331585678 0.373985237387
C3 3.99532722341 -3.24522583591 0.00523555683618
H 4.41250004827 -3.77444425583 0.871020029013
O3 4.29626886035 -4.03252960027 -1.15195954921
C3 4.62954125722 -1.84273135567 -0.0947112115177
H 5.71887138656 -1.95252927548 -0.108137148969
O3 4.3079363412 -1.18316983652 -1.31789119536
HO 2.91473185309 2.02688340774 2.71060639162
H 1.56956736943 0.19992674022 2.5985040442
H 3.17829013287 -0.18365904297 3.27321534863
HO 0.532102901531 -1.64213847492 2.33074495499
HO 0.907383263524 -4.15051515566 0.55676359202
HO 3.89297302828 -3.59188323274 -1.91963488602
HO 3.3506978517 -1.05986229308 -1.37211748251

Ок, залишилось написати програму що бере оці координати і створює таку картинку як у цій публікації (увага, ввесь код звідси і аж до кінця публікації – це одна програма):

#! /usr/bin/python3
from random import random

import pyglet
from pyglet.window import key, Window
from pyglet.gl import *
from pyglet.gl.glu import *

window = Window()

Об’єкт наступного класу просто буде повертати кортеж з кольором для кожної назви атома. Деякі атоми ми задамо вручну, щодо правильної палітри – дивіться статтю CPK coloring.

class Palette(object):
    def __init__(self):
        self.colors = {
            'H': (0.0, 0.5, 0.5),
            'HO': (1.0, 0.5, 0.5),
            'C3': (0.1, 0.1, 0.1),
            'Car': (0.1, 0.1, 0.1),
            'O3': (1.0, 0.0, 0.0),
        }

    def get_color(self, name):
        if name not in self.colors:
            print(name)
            self.colors[name] = (random(), random(), random())
        return self.colors[name]

palette = Palette()

Молекула – це по суті список атомів (кожен з яких четвірка з назви і трьох координат), що буде завантажувати себе з файлу при створенні екземпляру класу, і вміє малювати себе:

class Molecule(object):
    def __init__(self, fn):
        self.atoms = []
        with open(fn) as f:
            for l in f:
                el, x, y, z = l.split()
                self.atoms.append(
                    (el, float(x), float(y), float(z))
                )

    def draw(self):
        for atom in self.atoms: # для кожного атома
            glPushMatrix() # зберегти матрицю моделі
            glTranslatef(*atom[1:]) # змістити матрицю моделі в координати атома
            # намалювати сферу радіусу 1 і кольору відповідного типу атома
            draw_sphere(1, palette.get_color(atom[0]))
            glPopMatrix() # завантажити збережену матрицю моделі

molecule = Molecule('glucose.dat') # створити молекулу глюкози

def draw_sphere(radius, color):
    glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
    
    # довго пояснювати що таке колір матеріалу, я й сам не до кінця знаю.
    glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, (GLfloat * 3)(*color))
    glMaterialfv(GL_FRONT_AND_BACK, GL_EMISSION,
        (GLfloat * 3)(*map(lambda x: x/2, color))
    )
    # glMaterialfv(GL_FRONT_AND_BACK, GL_SPECULAR, (GLfloat * 3)(*color))

    sphere = gluNewQuadric()
    gluSphere(sphere, radius, 50, 50) # 50, 50 - це кількість меридіанів та паралелей. 
    # якщо потрібно багато атомів - зменшіть їх кількість для збільшення продуктивності.

Тепер займемось власне перемальовуванням екрану:

@window.event
def on_draw():
    update_frame(0)

rotation = 0 # Глобальна зміна з поточним поворотом моделі
def update_frame(dt):
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    glLoadIdentity() # завантажити матрицю ідентичності 

    global rotation
    rotation += dt * 10 # чим більше часу пройшло - тим більше повертаємо
    glRotatef(rotation, 0, 1, 0) # навколо осі y
    molecule.draw() # і малюємо нашу молекулу.

При зміні розмірів вікна (і при його створенні) ініціалізуємо всілякі налаштування OpenGL:

@window.event
def on_resize(width, height):
    glClearColor(0.0, 0.3, 0.0, 0.0) # задаємо колір фону

    glEnable(GL_DEPTH_TEST) # вмикаємо буфер глибини

    glEnable(GL_LIGHTING)
    glEnable(GL_LIGHT0)
    glLightf(GL_LIGHT0, GL_POSITION, 1, 5, 4) # ставимо одне світло

    glViewport(0, 0, width, height)
    glMatrixMode(GL_PROJECTION)
    glLoadIdentity()
    gluPerspective(45, width / height, .1, 1000) # перспективна проекція з кутом 45
    gluLookAt( # ставимо камеру і націлюємо її в цент сцени
     1, 4, 15, # eye
     0, 0, 0, # target
     0, 1, 0  # up
    )
    glMatrixMode(GL_MODELVIEW) 
    return pyglet.event.EVENT_HANDLED

При натисканні клавіш “вліво” і “вправо” оновлюємо кадр, повернувши трішки модель. А також оновлюємо 50 разів на секунду. І запускаємо цикл подій:

@window.event
def on_key_press(symbol, modifiers):
    if symbol == key.LEFT:
        update_frame(-1)
    elif symbol == key.RIGHT:
        update_frame(1)

pyglet.clock.schedule_interval(update_frame, 0.02)

pyglet.app.run()

На цьому і все. Можна було звісно написати набагато краще, без глобальних змінних, з кращими поворотами камери і кращим освітленням і т.п. Але поки що є важливіші речі. (Хоча, якщо ви захочете онлайн курс, і зможете зробити так що мені не треба буде ходити на роботу – можемо щось придумати ;) ).

Ах, і стаття з якої взято інформацію про те як отримати координати для атомів молекули: Patrick Fuller – Molecules in Blender


Filed under: Графіка, Кодерство Tagged: освіта, OpenGL, Python

Генштаб для грамнацистів

Щойно з’явилась ідея супер-пупер сервісу для всіх хто пише і вичитує.

Сценарії використання

  1. Користувач бачить помилку на якомусь сайті. (Ідея націлена на вікіпедію, але має працювати на будь-яких інших сайтах, наприклад тут.) Нехай він зареєстрований на нашому порталі грамнацистів, і встановив букмарклет. Користувач виділяє ту помилку, натискає на букмарклет, той букмарклет показує попап з формою, де вписаний рядок з помилкою, полем куди можна ввести правильний варіант, пояснення помилки і посилання на словники та правопис.
  2. Користувач пише статтю. Він хоче написати її грамотно. Він вводить її текст, натискає інший букмарклет, і той використовуючи алгоритм Ахо-Корасік чи щось легше, підкреслює всі помилки і в попапах показує коментарі користувачів що їх виправили, та варіанти виправлень.
  3. Користувач вважає що помилка – не помилка, і попередній користувач помилився додавши її до словника. В попапі він клацає кнопочку “обговорення” і переходить на наш портал, де може обговорити.
  4. Адміністратори/редактори (вікіпедії) вирішують хто правий, а хто ні. Помилка яка насправді такою не була, позначається, і при наступних спробах її ввести, йому будуть повідомляти що це не помилка, і якщо він не згоден – посилати в обговорення.
  5. Найпопулярніші помилки, які вже точно помилки експортуються в файл що читається роботом який лазить по вікіпедії і виправляє всі статті та перевіряє всі нові правки. Якщо користувач вніс правку з помилкою – йому приходить повідомлення з поясненням суті помилки, проханням так не робити і порадою поставити букмарклет. :) На зразок такого:

  6. Треба врахувати те, що помилок існує більше ніж правильних слів (наприклад в слові “пиво” можна помилитися 32^4 = 2^{20} \approx 10^6 мільйоном різних способів, і то якщо не враховувати що також існують пропуск, дефіс, апостроф та інші символи. Тому варто намагатись вводити лише часті помилки, а решту залишати на hunspell. Словник для hunspell теж дозволити редагувати спільно, через букмарклети.

P.S. Я ще можу змиритись з тим що Firefox мені підкреслює hunspell, latex, букмарклет, попап і подібне. Але “блозі”, “кнопочку” “P.S.” і т.п. міг би вже вивчити.


Filed under: Кодерство, Павутина Tagged: вікіпедія, освіта, цілі

Генштаб для грамнацистів

Щойно з’явилась ідея супер-пупер сервісу для всіх хто пише і вичитує.

Сценарії використання

  1. Користувач бачить помилку на якомусь сайті. (Ідея націлена на вікіпедію, але має працювати на будь-яких інших сайтах, наприклад тут.) Нехай він зареєстрований на нашому порталі грамнацистів, і встановив букмарклет. Користувач виділяє ту помилку, натискає на букмарклет, той букмарклет показує попап з формою, де вписаний рядок з помилкою, полем куди можна ввести правильний варіант, пояснення помилки і посилання на словники та правопис.
  2. Користувач пише статтю. Він хоче написати її грамотно. Він вводить її текст, натискає інший букмарклет, і той використовуючи алгоритм Ахо-Корасік чи щось легше, підкреслює всі помилки і в попапах показує коментарі користувачів що їх виправили, та варіанти виправлень.
  3. Користувач вважає що помилка – не помилка, і попередній користувач помилився додавши її до словника. В попапі він клацає кнопочку “обговорення” і переходить на наш портал, де може обговорити.
  4. Адміністратори/редактори (вікіпедії) вирішують хто правий, а хто ні. Помилка яка насправді такою не була, позначається, і при наступних спробах її ввести, йому будуть повідомляти що це не помилка, і якщо він не згоден – посилати в обговорення.
  5. Найпопулярніші помилки, які вже точно помилки експортуються в файл що читається роботом який лазить по вікіпедії і виправляє всі статті та перевіряє всі нові правки. Якщо користувач вніс правку з помилкою – йому приходить повідомлення з поясненням суті помилки, проханням так не робити і порадою поставити букмарклет. :) На зразок такого:

  6. Треба врахувати те, що помилок існує більше ніж правильних слів (наприклад в слові “пиво” можна помилитися 32^4 = 2^{20} \approx 10^6 мільйоном різних способів, і то якщо не враховувати що також існують пропуск, дефіс, апостроф та інші символи. Тому варто намагатись вводити лише часті помилки, а решту залишати на hunspell. Словник для hunspell теж дозволити редагувати спільно, через букмарклети.

P.S. Я ще можу змиритись з тим що Firefox мені підкреслює hunspell, latex, букмарклет, попап і подібне. Але “блозі”, “кнопочку” “P.S.” і т.п. міг би вже вивчити.


Filed under: Кодерство, Павутина Tagged: вікіпедія, освіта, цілі

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

З відзнакою. Ось як він виглядає. Власне це не зовсім диплом, бо просто показує що я всього лиш завершив курс який тривав сім тижнів, і не підтверджує того факту що завдання робив я. І не зовсім швейцарський, бо 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: добре, освіта

Вступ до PowerShell

Зробив на роботі доповідь по PowerShell:

І не переживайте, там з восьмої хвилини в конференції нарешті настає тиша. :)

Презентація зроблена на основі вікіпідручника з PowerShell, який порізано на слайди і показано за допомогою deck.js (хоча про технологію якось іншим разом).

Це приклад того як доповіді робити не варто. Не варто змішувати підручник і презентацію, на презентації повинен бути лише код, картинки і максимум одне-два слова тексту. І якщо все таки якийсь текст вже є – не можна його читати. Ваші слухачі грамотні все таки.

З іншого боку – краще зробити щось неідеально, ніж не зробити ідеально. :)

Є інший приклад: Александр Соловьев — Functional Reactive Programming & ClojureScript. Чувак не париться, лише 16 слайдів, видно що тема його вставила, але пояснити він її може заледве на пальцях. Проте я таки зрозумів що FRP – це як в Excel, і при цьому не заснув.

P.S. Наступна доповідь буде кращою. :)


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

Дівчина-салат

Дівчина-салат – це робоча назва прототипу підручника німецької який я на тих вихідних створив, але все не мав нагоди про це написати.

Власне якби я був голлівудським продюсером, я б вже давно на додачу до людини-павука, людини-кажана, жінки-кішки і решти людей-гібридів зняв би “дівчину-салат”. Це історія про дівчинку яка народилась від того що її мама з’їла генетично-модифіковану рослину (а які ви думаєте ще можуть рости на городі у відьми?) з виду Valerianella locusta, також відому як Рапунцель. А вони зняли якусь “Заплутану історію”, яку я не дивився, зате, прочитав оригінал братів Грімм. Казка містить глибоку мораль, суть якої в тому, що коли дітей недостатньо виховали, то навіть якщо їх замкнути в вежі, це не допоможе.

Казочку я читав мовою оригіналу, і це перший текст німецькою який я осилив. Осилив я його активно заглядаючи в словник, і виглядало це ось так:

Рапунцель з нотатками

Рапунцель з нотатками

І під час того я постійно думав, що це взагалі мій улюблений спосіб вчитись, тому що це не нудно і швидко набирається словниковий запас. Але чи вчусь я, поки гортаю сторінки словника? Здається єдине чого я вчусь – швидше відкривати потрібну сторінку і швидше знаходити на ній слово. На запам’ятовування самого слова йде менше часу і це напевне не добре.

Тому я подумав, що класно було б мати книжки, де словник знаходиться прямо на тій сторінці яку я читаю. Як в Gerda malaperis! (коли з’явиться українська стаття, нагадайте замінити посилання, не соромтесь). Gerda malaperis звісно виняткова книжка, бо написана саме з навчальною метою і на жаль аналогічних я більше не знаю.

Ще я подумав що подібним чином можна адаптувати звичайні твори. І саме для цієї мети мають чудово підходити зноски які вміє робити LaTeX. Їх було так багато, що довелось застосувати деякі нестандартні модулі аби спростити нумерацію. А ще довелось застосувати XeTeX, він знає про Unicode-шрифти. Бо в звичайному TeX Live отримати одночасно німецькі умляути й кирилицю дуже важко.

Є ще метод Іллі Франка, але він мені чомусь не дуже йде, напевне тому що там дізнаватись значення слова занадто просто і я ловлю себе на тому що читаю не німецькою а російською, пропускаючи все що не в дужках.

Коментарі щодо мого розуміння німецької граматики (і української), підказки щодо вдосконалення оформлення видання (ось код для XeTeX, рев’ю можна робити як тут, так і прямо на Google Code) та інша критика вітається.


Filed under: Всяке, Конспекти, Розмітка Tagged: deutsch, книжки, освіта

Теорія вивчення іноземної мови

Перейти зразу до суті.

Наука дослідження людини, а особливо її мозку куди складніша ніж наприклад комп’ютерні науки, тому нема чого дивуватись що в цій галузі існує купа найрізноманітніших напрямків. А міждицсциплінарних – ще більше. І виявляється на стику прикладної лінгвістики (як використовувати мову з користю?) і когнітивної психології (як люди думають своєю головою?) існує наука про опанування другої мови (second language acquisition). Відрізняється вона від науки опанування першої мови тим що опановуючи першу мову ви використовуємо лише наші вроджені інстинкти мавпування, а не підручники і спілкування з викладачем. Я прочитав про цю науку, і хоча там роблять публікації ще з 80-тих, але поки що не сильно наблизились до проекту Вавилонської вежі.

Правда одна ідея мені таки запам’яталась: існує два типи навчання: елементне та системне. Я так зрозумів це як синтетичний та аналітичний підхід. В першому випадку ми вчимо окремі елементи мови: слова, речення, певні фрази і т.п. В другому випадку ми вчимо якісь систематичні правила.

І особисто для мене працює лише елементне навчання. Правила я все одно не можу запам’ятати бо для їх використання треба думати. А мова це така штука яка повинна сидіти десь глибше свідомості. Ви бачите слово immer, always, ĉiam, всегда, いつも чи завжди і у вас залежно від контексту автоматично повинно засвічуватись поняття \forall t. Чи в крайньому випадку при immer повинно засвічуватись “це німецькою означає завжди”. Далі контекст повинен переключитись і всі наступні слова вже автоматично беруться зі словника.

Правда можуть виникнути сюрпризи наприклад коли ви чуєте “Bei mir bist du schein” і пробуєте перекласти з німецької, а потім інтернет підказує що то насправді ідиш, а німецькою пишеться “Für mich bist du schön”.

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

Коротше кажучи зараз я намагаюсь перевірити гіпотезу того чи можна мову вивчити самостійно на рівні читання газет, просто читаючи. Хоча я вже прослухав Pimsleur German I, подивився Extr@ auf Deutsch (тепер залишилось вивчити німецьку і можна буде ще раз подивитись), прочитав по 50 сторінок Langenscheidt Німецька мова 20 хвилин щодня, і С.О. Носков “Самовчитель німецької мови”, потім знайшов ключі до вправ і подумав що їх все таки напевне варто робити.

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

Проте все одно, щоб читання не було таким болісним, на перших етапах хотілось би якось уникнути текстів що містять багато низькочастотних слів, і читати якісь учбові тексти. Ідеальною була б книжка на зразок “Gerda malaperis”, але вона чомусь одна така, і лише для есперанто.

Плюс книжки Gerda malaperis в тому що це детектив, який дає якусь напругу, і викликає постійне бажання дізнатись що там далі. Часом настільки що починаєш пропускати половину слів, сюжет все одно від того не змінюється. Це мінус. Тому щоб себе стримувати повинен бути якийсь тест. “Після прочитання цього розділу ви повинні знати наступне. Якщо не знаєте – потрібно читати уважніше”. Плюс будь-якого тесту, навіть найлегшого в тому що він змушує задуматись. І я придумав теорію як зробити тести складнішими.

По суті

Є набір пар запитання – відповідь. В нашому випадку запитання – це слова або фрази на зразок “es tut mir leid”. Відповіді – це їх переклад, в даному випадку “мені шкода”. Треба перевірити знання цих пар, і вказати користувачу слабкі місця. Яким чином визначити слабкі місця? 10 разів перевірити чи користувач знає слово. Якщо він 9 разів з десяти знає – то так і записати – це слово користувач знає на 9 з десяти. Далі вибирати слова які користувач знає найгірше і давати їх йому.

Тести з варіантами відповіді – найкращі для комп’ютера тому що їх просто перевіряти. Для тестів “введіть відповідь” потрібно буде зробити неслабенький синтаксичний аналізатор і зведення відповіді до “канонічної форми”.

Правда тести занадто легкі, тому що наприклад тест “entschuldigung: а) сонце б) їсти в) прошу пробачення г) або” можна вирішити просто тому що варіанти а, б, та г точно не підходять. Але тести можна поступово ускладнювати.

Якщо користувач раптом помиляється, і обирає варіант б) ми записуємо в табличку з помилками пару entshuldigung – їсти, і кажемо що при 10 показах слова enshuldigung користувач обрав цей неправильний переклад 2 рази. І таким чином коли ми наступного разу будемо показувати тест зі словом “пробачте” користувачу, ми з більшою ймовірністю домішаємо туди помилковий варіант “їсти”, просто тому що користувач частіше робить цю помилку.

Таким чином можна буде виявити слова які я плутаю, наприклад: besuchen – відвідувати, гостювати; brauchen – потребувати; bekommen – отримувати, і вчити мене їх не плутати.

Я вирішив підівчити JavaScript, і написати програмку для цього. Вчора виклав її прототип на github. https://github.com/bunyk/item_lang_learn.

Проблеми на даний момент – я здається якось неправильно прив’язую події до кнопок з варіантами відповідей, бо після кількох кліків завжди запускається тільки подія для неправильної відповіді. Напевне варто переписати з однаковим обробником для всіх кнопок, але присвоїти кнопкам різні ідентифікатори.

Друга проблема – якщо робити модель на основі localStorage – треба буде за допомогою JavaScript багато сортувати, і взагалі робити речі які гарна база даних робила б за нас. А localStorage не вміє.

Ну, і ще проблема в тому аби зробити оформлення нормальним. jQueryUI і Bootstrap ніби непогані, але лише їх недостатньо.

Але наступного року придумаю як з цим розібратись.


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