вторник, 19 января 2016 г.

Шаблон проектирования Одиночка

Одиночка используется когда необходим ровно один экземпляр какого-то класса, доступный для остальных элементов программы.

Два примера реализации:
package Singleton;
use strict;
use warnings;
use feature 'state';

my $singleton = { rand => int(rand(100)) };

sub instance {
    ref $singleton eq __PACKAGE__ 
        ? $singleton : bless $singleton, shift;
}

sub instance_with_state { 
    state $singleton = { rand => int(rand(100)) };
    ref $singleton eq __PACKAGE__ 
        ? $singleton : bless $singleton, shift;
}

1;

и тестирование для них:

суббота, 16 января 2016 г.

Изучаем содержимое стека в программе на Assembler: вычисления факториала

В качестве примера возьмём программу вычисления факториала из книги Programming from the Ground Up и исследуем стек программы во время её выполнения.

.text                        # Здесь начинается текст программы.

.globl _start                # Указываем, где расположена точка входа.

.type factorial, @function   # Помечаем factorial как функцию.
factorial:
                             # (S2), (S7)
    nop                      # Нулевая операция, удобно для отладки.
    pushl %ebp               # Сохраняем %ebp в стек. (S3), (S8)
    movl  %esp, %ebp         # Теперь %ebp указывает на вершину стека.
    movl  8(%ebp), %eax      # Помещаем в %eax 1-й аргумент функции.
    cmpl  $1, %eax           # Если он равен 1 (базовый случай),
    je    end_factorial      # то переходим к выходу из функции.

    decl  %eax               # Уменьшаем на единицу аргумент функции и
    pushl %eax               # помещаем его в стэк. (S6)
    call  factorial          # Вызываем саму себя из функции.
    movl  8(%ebp), %ebx      # Помещаем 1-й аргумент функции в %ebx.

    imull %ebx, %eax         # В %eax помещаем результат %eax * %ebx.

    end_factorial:        
        movl %ebp, %esp      # Делаем %ebp вершиной стека. (S12)
        popl %ebp            # Помещаем из стека в %ebp. (S10), (S13)
        ret                  # Выходим из функции. (S11), (S14)

_start:
    pushl $2         # Помещаем аргумент функции factorial
                     # в стек. (S1)

    call factorial   # Вызываем функцию factorial.     
    addl $4, %esp    # Очищаем стек от аргумента функции. (S15)

    movl %eax, %ebx  # Результат функции используем как код
                     # выхода из программы.

    movl $1, %eax    # Заказываем системный вызов exit
    int $0x80        # и вызываем его.
Собираем и запускаем программу:

четверг, 14 января 2016 г.

Уголовный кодекс

Список статей УК РФ, имеющих отношение к ИТ.


воскресенье, 10 января 2016 г.

Язык программирования Assembler

Для тех, кто всё-таки решился его изучить. Отличные небольшие видео-уроки с кучей практических примеров по этой теме, правда на английском языке.
  1. Assembly Primer For Hackers (Part 1) System Organization - изучаем упрощённую схему компьютера: CPU, память, устройства ввода/вывода и шину, а так же регистры и их структуру.
  2. Assembly Primer For Hackers (Part 2) Virtual Memory Organization - изучаем распределение адресов в виртуальной памяти для каждого процесса в системе Linux, исследуя файл /proc/{proc_id}/maps.
  3. Assembly Primer For Hackers (Part 3) Gdb Usage Primer - отлаживаем простую C программу в отладчике gdb, дизассемблируем её, изучаем содержимое памяти, стэк и регистры.
  4. Assembly Primer For Hackers (Part 4) Hello World - разбираем структуру Assembler программы, смотрим коды системных вызовов и пишем классику "Hello world".

пятница, 8 января 2016 г.

Язык программирования Perl

Особенности работы с файловыми дескрипторами в Perl

#!/usr/bin/perl 

use strict;
use warnings;

use Benchmark qw(:all);
use FileHandle;

cmpthese(100000, {
    fh_1 => sub {
        open my $fh1, "<", "a.txt" or die $!;
        my @whole_file = <$fh1>;
    },
    fh_2 => sub {
        open my $fh2, "<", "a.txt" or die $!;
        my @whole_file = $fh2->getlines;
    },
    fh_3 => sub {
        my $fh3 = FileHandle->new;
        $fh3->open("< a.txt") or die $!;
        my @whole_file = $fh3->getlines;
    }
});

__END__
        Rate fh_3 fh_2 fh_1
fh_3 29155/s   -- -36% -43%
fh_2 45872/s  57%   -- -11%
fh_1 51282/s  76%  12%   --


Во-первых, для того чтобы использовать объектные методы для файлового дескриптора (варианты fh_2, fh_3), необязательно прибегать к помощи модуля FileHandle, в чьей компетенции находится предоставление подобного функционала. Можно обойтись и без него, если прочитать пару строк из документации perlobj:

четверг, 7 января 2016 г.

Навыки

Пополняющийся список навыков, технологий и прочего необходимого для программистов.

Общее

  1. Английский язык.
  2. Русский язык.
  3. Навык десятипальцевой печати.


Математика

  1. Математическая логика.
  2. Комбинаторика.
  3. Теория вероятностей.
  4. Криптография.
  5. Теория игр.

Теория ИТ

  1. Алгоритмы и структуры данных.
  2. Шаблоны проектирования.
    1. Одиночка
  3. Архитектура системы.

Тестирование

  1. Тестирование элементов (Unit testing)

Технологии

  1. Язык программирования Assembler
  2. Язык программирования C.
  3. Язык программирования Perl
  4. Язык программирования Clisp.
  5. Язык программирования JavaScript.
  6. Язык написания скриптов Shell.
  7. Язык разметки HTML.
  8. Каскадные таблицы стилей CSS.
  9. SQL (Postgres, SQLite).

 

Физический уровень

  1. Архитектура компьютера.
  2. Сетевые технологии.

Инструменты

  1. Система контроля версий (git)
  2. Редактор (vim)

Проектирование

  1. Требования к идеальному сайту

Администрирование

Безопасность


Обучение

  1. stackoverflow.com и его русская версия ru.stackoverflow.com
  2. slideshare.net - лекции обо всём на свете на разных языках.

Юриспруденция

  1. Трудовой кодекс.
  2. Уголовный кодекс

Трудоустройство 

  1. Список вакансий на moikrug.ru
  2. Список резюме на moikrug.ru
  3. Вакансии на stackoverflow.com

Экономика и финансы 

Управление временем

Здоровье и спорт