Even Catfish Can Code

30.12.2009

The case of the 500-mile email

Filed under: 1 — dantkz @ 15:39
Tags: , , , ,

The following is the 500-mile email story in the form it originally appeared, in a post to sage-members on Sun, 24 Nov 2002.:

From trey@sage.org Fri Nov 29 18:00:49 2002
Date: Sun, 24 Nov 2002 21:03:02 -0500 (EST)
From: Trey Harris
To: sage-members@sage.org
Subject: The case of the 500-mile email (was RE: [SAGE] Favorite impossible
task?)

Here’s a problem that *sounded* impossible… I almost regret posting the
story to a wide audience, because it makes a great tale over drinks at a
conference. :-) The story is slightly altered in order to protect the
guilty, elide over irrelevant and boring details, and generally make the
whole thing more entertaining.

I was working in a job running the campus email system some years ago when
I got a call from the chairman of the statistics department.

“We’re having a problem sending email out of the department.”

“What’s the problem?” I asked.

“We can’t send mail more than 500 miles,” the chairman explained.

(далее…)

Мотивирующее

Filed under: 1 — dantkz @ 09:18
Tags: , , ,

“Do not train children to learning by force and harshness, but direct them to it by what amuses their minds, so that you may be better able to discover with accuracy the peculiar bent of the genius of each.” – Plato.

26.12.2009

Ruby: Кодирование во время выполнения

Ruby — динамический язык, который позволяет конструировать и интерпретировать фрагменты кода в ходе выполнения статически написанной программы. С помощью API отражения программа получает информацию о себе самой. Благодаря этому на этом языке сравнительно легко создавать отладчики, профилировщики и т.д.
Например, мне очень нравится такая возможность:

puts "Enter method's name you wish to create"
method_name = gets
puts "Enter body of the method"
method_body = gets

method_definition=%[def #{method_name}\n #{method_body}\n end] # compose method
eval(method_definition) # define method
eval(method_name) # invoke your new method

Структуры данных: Стек

Filed under: 1 — botique @ 00:40
Tags: , , , , ,

В данной статье рассмотрим такую элементарную структуру данных, как стек. Стек представляет собой динамическое множество, элементы которого добавляются и удаляются в соответствии со стратегией LIFO (last-in, first-out): первым из стека удаляется элемент, который был помещен туда последним. В программах, например, стек используется для работы с автоматическими переменными. По мере появления автоматические переменные добавляются в вершину стека. Когда их действие прекращается, они удаляются из стека.

Опишем основные свойства и операции стека в общем виде. Стек содержит определенное количество элементов, что делает его контейнером. Значит, его можно реализовать с помощью массива elements с количеством элементов STACK_SIZE. Дополнительно задаются атрибуты topIndex и topElement, представляющие индекс последнего помещенного в стек элемента и сам этот элемент соответственно. Если значение topIndex равно 0, то стек не содержит ни одного элемента и является пустым. Проверить стек на наличие в нем элементов можно с помощью операции isEmpty. Если производится попытка снять элемент с пустого стека, то это приводит к ошибке underflow (опустошение). Если значение topIndex равно STACK_SIZE, то стек переполняется, что приводит к ошибке overflow. Эта проверка осуществляется с помощью операции isFull.

Операция вставки элемента производится функцией PUSH (запись в стек), а операция удаления — функцией POP (снятие верхнего элемента со стека).

Существует множество эффективных способов реализации стеков. В данной статье рассмотрим объектно-ориентированный подход.

В разделе private класса Stack инкапсулируется способ представления данных (обычный массив, динамический, связный список, …). В данный момент ограничимся обычным массивом из STACK_SIZE элементов (константа, специфичная для класса, объявлена в 24 строке, см. листинг 1). В дальнейшем можно легко заменить его на динамический без внесения изменений в общедоступный (public) интерфейс класса.

Функции pop() и push() возвращают информацию о состоянии стека (пуст или заполнен), поэтому объявлены как bool, a не void. Таким образом, программист имеет возможность обработки ситуаций переполнения и очистки стека. Фактически, проверку переполнения и опустошения стека выполняют функции isFull и isEmpty, которые объявлены в разделе private.

Вместо того чтобы давать определение стека на основе конкретного типа данных (int, double, …), мы его опишем на базе обобщенного типа StackElement с использованием спецификатора typedef. Конечно, более правильным вариантом было бы использование шаблонов класса, но в данной статье мы пока их рассматривать не будем.

Далее представлен код на C++

Листинг 1. Файл Stack.h

#ifndef STACK_H_INCLUDED
#define STACK_H_INCLUDED
typedef int StackElement;

class Stack
{
    public:
        Stack(); //default constructor
        ~Stack(); // destructor

        /*inserts a new element to stack,
          returns true if it is possible */
        bool push(const StackElement & element);

        /* deletes a top element from the stack,
           returns true if it is possible*/
        bool pop();

        /* returns top element of stack*/
        StackElement getTopElement() const;

    private:
        /* size of stack, constant */
        enum {STACK_SIZE = 5};

        StackElement elements[STACK_SIZE];

        /* index of top element*/
        int topIndex;

        /* value of the top element*/
        StackElement topElement;

        /* checks if stack is empty */
        bool isEmpty() const;

        /* checks if stack is full */
        bool isFull() const;
};
#endif

Листинг 2. Файл Stack.cpp

#include "stack.h"

Stack::Stack()
{
    topIndex = 0;
}

Stack::~Stack(){}

bool Stack::isEmpty() const
{
    return topIndex == 0;
}

bool Stack::isFull() const
{
    return topIndex == STACK_SIZE;
}

bool Stack::push(const StackElement & element)
{
    if (!isFull())
    {
        elements[topIndex++] = element;
        topElement = elements[topIndex];
        return true;
    }
    return false;
}

bool Stack::pop()
{
    if (!isEmpty())
    {
        topElement = elements[--topIndex];
        return true;
    }
    return false;
}

StackElement Stack::getTopElement() const
{
    return topElement;
}

Листинг 3. Файл main.cpp

#include <iostream>
#include <cctype>
using namespace std;
#include "stack.h"

int main()
{
    char ch;
    int elem;
	Stack stack;

    cout<<"Enter 'I' to insert element to stack, \n"
        <<"'D' to delete element from stack, \n"
        <<"'Q' to quit\n";

    while(cin>>ch && toupper(ch) != 'Q')
    {
        switch(ch)
        {
            case 'I' :
            case 'i' : cout<< "Enter element to insert:\n";
            cin>>elem;
            if (stack.push(elem))
            {
                cout<<"Element "<<elem<<" is inserted to stack.\n";
            }
            else
            {
                cout<<"Stack overflow!\n";
            }
            break;

            case 'D' :
            case 'd' :
            if (stack.pop())
            {
                cout<<"Element "<<stack.getTopElement()<<" is deleted from stack.\n";
            }
            else
            {
                cout<<"Stack underflow!\n";
            }
            break;
        }
    }
    return 0;
}

Литература:
1) Т. Кормен, Ч. Лейзерсон, Р. Ривест, К. Штайн. Алгоритмы. Построение и анализ.
2) С. Прата. Язык программирования С++. Лекции и упражнения.

24.12.2009

Списывание

Зачем вы списываете, студенты? Кто сказал, что “студентом считается тот, кто списывает на экзаменах”? “Списывать” не модно и не “гламурно” кто бы вам, что не говорил. Почему вы слушаете не ваших учителей, а тех людей-студентов, которые вам говорят – “Зачем ты паришься? Просто спиши и все!”.

Студенты! Вас по ночам совесть не мучает после экзамена, который вы нагло списали? Самое странное в данной ситуации – то, что вы не признаете что вы “не правы” и пытаетесь себя выгородить. Только вот перед кем? Перед преподавателем? Думаю что это утопия, никто не отменял принципа жизни “Сначала вы работаете на авторитет, а потом авторитет работает на вас”, а в случае “списывания”  о каком авторитет и уважении может идти речь? Думаю, что ответ очевиден.

Вы надеетесь на то что “все будет хорошо”  и “все обойдется” после того как вы списали? Я думаю что “нет”!

Как часто вам приходиться идти на “сделку с совестью” при её наличии у вас?

18.12.2009

Умение абстрагировать

Filed under: 1 — dantkz @ 10:37
Tags: , , , ,

Некоторые просто не могут мыслить абстрактно.

Хотя все можно объяснить легче:

16.12.2009

Предметы. Часть 1. Introduction to Programming

Introduction to Programming – Введение в программирование – Алгоритмизация и языки программирования

Данная дисциплина есть во всех университетах, на всех специальностях связанных с IT. Курс по сути является введением в программирование, которое обычно является самым важным умением программиста. За семестр студенты обучаются основам какого-либо языка программирования:

  • переменные, типы данных
  • ввод и вывод данных
  • ветвление
  • циклы
  • массивы
  • функции
  • классы и структуры
  • работа с файлами
  • и тп.

и знакомятся с  простыми алгоритмами как:

  • нахождение суммы, произведения элементов массива
  • нахождение минимума, максимума в массиве
  • сортировка и бинарный поиск
  • и тп.

Бывают вариации в зависимости учебной программы университета.

Самое интересное связанное с этой дисциплиной, это язык программирования на котором строится программа. В пост-СССР странах популярным выбором был Pascal (Паскаль).

Паскаль был создан Никлаусом Виртом в 1968-69 годах после его участия в работе комитета разработки стандарта языка Алгол-68. Он был опубликован в 1970 году Виртом как небольшой и эффективный язык, чтобы способствовать хорошему стилю программирования, использовать структурное программирование и структурированные данные.

Паскаль плох тем, что в современной разработке за рубежом Паскаль практически не используется.

Другие популярные языки для обучения данной дисциплины это — C, C++, Java. Все  три языка похожи, но Java требует ООП подхода в коде, что может сбить с толку по началу. Также в Java нет указателей, что облегчает задачу при учебном процессе, но может быть готовит не самых сильных программистов. Joel Spolsky и Paul Graham уже высказались против использования Java в ВУЗ-ах.

В MIT, как и в некоторых других ВУЗ-ах, курс “введение в программирование” используют язык Scheme(диалект языка Lisp) и учебник написанной специально для этого курса.

При разработке Scheme упор был сделан на элегантность и простоту языка. Философия языка подчёркнуто минималистская. Его цель — не сваливать в кучу разные полезные конструкции и средства, а напротив — удалить слабости и ограничения, вызывающие необходимость добавления в язык новых возможностей. В результате, Scheme содержит минимум примитивных конструкций и позволяет выразить все, что угодно путём надстройки над ними.

Язык не самый практичный в индустрии, но популярный в разработке искусственного интеллекта и некоторых других проектов.  Joel Spolsky любит Lisp за функциональное программирование. Paul Graham может хвалить Lisp очень очень долго.

Впрочем, несмотря на достоинства Lisp-а, MIT с 2008-го года сменила свой курс основанный на Scheme на 3 курса основанные на Python. Вот почему MIT решили сменить свой курс:

Costanza asked Sussman why MIT had switched away from Scheme for their introductory programming course, 6.001. This was a gem. He said that the reason that happened was because engineering in 1980 was not what it was in the mid-90s or in 2000. In 1980, good programmers spent a lot of time thinking, and then produced spare code that they thought should work. Code ran close to the metal, even Scheme — it was understandable all the way down. Like a resistor, where you could read the bands and know the power rating and the tolerance and the resistance and V=IR and that’s all there was to know. 6.001 had been conceived to teach engineers how to take small parts that they understood entirely and use simple techniques to compose them into larger things that do what you want.

But programming now isn’t so much like that, said Sussman. Nowadays you muck around with incomprehensible or nonexistent man pages for software you don’t know who wrote. You have to do basic science on your libraries to see how they work, trying out different inputs and seeing how the code reacts. This is a fundamentally different job, and it needed a different course.

So the good thing about the new 6.001 was that it was robot-centered — you had to program a little robot to move around. And robots are not like resistors, behaving according to ideal functions. Wheels slip, the environment changes, etc — you have to build in robustness to the system, in a different way than the one SICP discusses.

And why Python, then? Well, said Sussman, it probably just had a library already implemented for the robotics interface, that was all.

Впрочем это тоже не так уж плохо. Paul Graham считает, что Python лучше чем Java.

Остается лишь добавить, что какой бы язык вы не изучали, самое главное — умение решать задачи поставленные перед вами, а во многом  это зависит не от языка, а от вашей практики и способности. Также, своевременное изучение и понимание этой дисциплины критично для последующего успешного обучения.

Успокаивающее

Они (подростки) сегодня обожают роскошь, у них плохие манеры и  нет никакого  уважения  к авторитетам, они высказывают неуважение к старшим, слоняются без дела и постоянно сплетничают. Они все время спорят с  родителями,  они  постоянно вмешиваются в разговоры  и  привлекают  к  себе  внимание,  они  прожорливы  и тиранят учителей…

Cократ, V век до н. э.

14.12.2009

Новый Год и День Независимости

Filed under: 1 — dantkz @ 14:12
Tags: , ,

Только в нашей стране организовывают студентам новый год 15-го декабря, и ожидают студентов 16-го на старой площади.
И еще кураторам надо всю ночь бдить студентов. :(

13.12.2009

Код. Тайный язык информатики – Автор: Чарльз Петцольд

Filed under: 1 — dantkz @ 10:00
Tags:

Обложка книги

Советую всем начинающим изучать ИТ. Скачать.

Вот цитата одной из рецензий на книгу:

На примере фонариков, азбуки Морзе, шрифта Брайля и штрих-кодов (с пояснением принципов устройства всего этого) автор знакомит нас с основами кодирования информации. Из лампочек и батареек сначала мы собираем разные вроде бы пустяковые устройства, которые позже превращаются в полноценный компьютер. И уже ближе к концу автор знакомит читателей с машинными кодами, языком ассемблера и т.д. Все проходит гладко, четко, последовательно, без непонятных перескоков, шквала страшных терминов и с отличными живыми объяснениями. Признаюсь, мне давно не попадалась столь наполненная информацией и доступная книга.

На английском книга называется:
Code: The Hidden Language of Computer Hardware and Software (Charles Petzold)

Следующая страница →

Тема: Rubric. Блог на WordPress.com.

Follow

Get every new post delivered to your Inbox.