суббота, 17 января 2009 г.

Подробнее об эмуляторе

Особенности

  • Для представления одного байта MIX машины используются шесть бит,
  • Устройства ввода/вывода предсталяют собой просто файлы (за исключением терминала),
  • Задержек при обмене данными с устройствами ввода/вывода нет :) Если это будет забавно, то реализую в следующей версии.
  • Программы скармливаемые эмулятору не должны содержать синтаксических ошибок --- режим ассемблирования команд вообще предназначался для отладки самого эмулятора, так уж получилось, что я его оставил.
  • ``Лишние'' символы в кодировке Кнутта заменены на знаки вопроса --- я не сообразил, как заставить GCC переваривать UTF8, может подскажет кто.

    Команды эмулятора

  • dr --- вывести на экран содержимое регистров и флагов. Screenshot.
  • dm <addr> <count> --- вывести на экран содержимое ячеек памяти. Screenshot.
  • em <addr> <value> --- записать число в ячейку памяти. Команды записи числа в регистр нет --- она без надобности, так как у самой MIX есть занесение константы в регистр:)
  • run <addr-start> <addr-stop> --- запустить на исполнение код.
  • asm <addr> <instruction> --- самая мощная команда, ассемблирует одну инструкцию MIX по указанному адресу.

    Вот как выглядит текст программы из книги Кнутта Ссылка и результат её запуска.

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

    Чтобы собрать эмулятор вместе с документацией, потребуются GCC version 4.1.2 20061115 (prerelease), транслятор [[noweb]] version 2.11, ``украшатель'' кода С++ dpp version 0.2.1 copyright Dan Schmidt и издательская система LaTeX 2e <2003/12/01>.

  • пятница, 16 января 2009 г.

    MIX эмулятор

    Написал эмулятор машины MIX, чтобы было интереснее читать Кнутта. Первую программку из книги (найти первые 500 простых чисел) выполняет на ура. Особенности позже, пока проверю ссылки.
  • PDF версия исходных текстов.
  • Полный архив.

    Язык русский, кодировка UTF-8.

  • понедельник, 5 января 2009 г.

    Несложная настройка mutt+procmail+fetchmail+postfix

    Совсем неидеальная настройка для dialup машины с динамическим IP и сказочным доменом, ставилась цель настроить и забыть :) Дистрибутив Debian Etch, пакеты mutt, postfix, procmail и fetctmail ставились без настроек. Если при установке что-то и спрашивалось, соглашался на первый же предложенный вариант. Mutt будет искать новую почту в каталоге ~/mail, который также будет содержать подкаталоги Read(прочитанные письма), Sent(отправленные письма) и Drafts(черновики).

    Файл ~/.muttrc

    # ---- language-env DON'T MODIFY THIS LINE!
    # Character set to be used.
    set charset=utf-8
    set send_charset=us-ascii:koi8-r:utf-8
    # ---- language-env end DON'T MODIFY THIS LINE!
    set folder="~/mail"
    set mbox_type="Maildir"
    set spoolfile="~/mail/"
    set mbox="+Read"
    set record="+Sent"
    set postponed="+Drafts"
    mailboxes +Read +Sent +Drafts
    set signature="~/.signature"
    set move=yes
    macro index c "?" "open a different folder"
    macro pager c "?" "open a different folder"
    
    Создаём каталог для почты и назначаем нужные права.
    mkdir ~/mail
    mkdir ~/mail/new
    mkdir ~/mail/cur
    mkdir ~/mail/tmp
    chmod 0700 -R ~/mail
    
    По мелочи:

    Файл ~/.zshrc

    # Добавляем
    export MAILDIR=$HOME/mail
    export VISUAL=vim
    export EDITOR=vim
    

    Файл ~/.signature

    Моя подпись :) Пока ничего не работает из-за особенностей локальной доставки, поэтому принимаемся за неё.

    Файл ~/.procmailrc

    MAILDIR=$HOME/mail
    DEFAULT=$MAILDIR/
    

    Procmail пока не раскидывает почту по каталогам, это оставлено на будущее.

    Файл /etc/postfix/master.cf

    # Не трогая остального добавляем следующую строчку
    hold      unix  -       -       -       -       -       smtp
    

    Файл /etc/postfix/main.cf

    # See /usr/share/postfix/main.cf.dist for a commented, more complete version
    # Debian specific:  Specifying a file name will cause the first
    # line of that file to be used as the name.  The Debian default
    # is /etc/mailname.
    #myorigin = /etc/mailname
    
    smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
    biff = no
    
    # appending .domain is the MUA's job.
    append_dot_mydomain = no
    
    # Uncomment the next line to generate "delayed mail" warnings
    #delay_warning_time = 4h
    
    # TLS parameters
    smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
    smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
    smtpd_use_tls=yes
    smtpd_tls_session_cache_database = btree:${queue_directory}/smtpd_scache
    smtp_tls_session_cache_database = btree:${queue_directory}/smtp_scache
    
    # See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
    # information on enabling SSL in the smtp client.
    
    #=================================
    # Моя машина имеет имя rbox.net
    myhostname = rbox
    mydomain = net
    mydestination = rbox.net, localhost.net, localhost
    
    #=================================
    # адрес smtp провайдера 
    relayhost = smtp.mail.ru
    
    mailbox_size_limit = 0
    home_mailbox=mail/
    mailbox_command = /usr/bin/procmail -a $DOMAIN -d $LOGNAME
    
    default_transport=hold
    defer_transports = hold
    transport_maps=hash:/etc/postfix/transport
    
    disable_dns_lookups=yes
    smtp_generic_maps = hash:/etc/postfix/generic
    
    smtp_sasl_auth_enable = yes
    smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
    smtp_sasl_type = cyrus
    smtp_sasl_security_options = noanonymous
    
    Создаём три файлика

    Файл /etc/postfix/transport

    rbox  local:
    rbox.net  local:
    localhost.rbox.net local:
    

    Файл /etc/postfix/generic

    локальный_пользователь@rbox                 имя_ящика@mail.ru
    локальный_пользователь@rbox.net             имя_ящика@mail.ru
    

    Файл /etc/postfix/sasl_passwd

    smtp.mail.ru  имя_ящика:пароль_к_ящику
    
    Даём знать Postfix'у о существовании этих файлов:
    cd /etc/postfix
    postmap generic
    postmap transport
    postmap sasl_password
    /etc/init.d/postfix restart
    
    На данный момент можно без подключения к сети написать письмо самому себе, отправить и получить. Изменим поведение postfix, чтобы при наличии соединения письма отправлялись немедленно, а не копились в очереди.

    Файл /etc/ppp/ip-up.d/postfix

    #!/bin/sh -e
    # Called when a new interface comes up
    # Written by LaMont Jones 
    # don't bother to restart postfix when lo is configured.
    if [ "$IFACE" = "lo" ]; then
     exit 0
    fi
    # If /usr isn't mounted yet, silently bail.
    if [ ! -d /usr/lib/postfix ]; then
     exit 0
    fi
    RUNNING=""
    # If master is running, force a queue run to unload any mail that is
    # hanging around.  Yes, sendmail is a symlink...
    if [ -f /var/spool/postfix/pid/master.pid ]; then
     pid=$(sed 's/ //g' /var/spool/postfix/pid/master.pid)
     exe=$(ls -l /proc/$pid/exe 2>/dev/null | sed 's/.* //;s/.*\///')
     if [ "X$exe" = "Xmaster" ]; then
      RUNNING="y"
     fi
    fi
    # start or reload Postfix as needed
    if [ ! -x /sbin/resolvconf ]; then
     f=/etc/resolv.conf
     if ! cp $f $(postconf -h queue_directory)$f 2>/dev/null; then
      exit 0
     fi
     if [ -n "$RUNNING" ]; then
      #===============================================================
      # Вот новая строчка
        /usr/sbin/postconf -e defer_transports=smtp
      /etc/init.d/postfix reload >/dev/null 2>&1
     fi
    fi
    # If master is running, force a queue run to unload any mail that is
    # hanging around.  Yes, sendmail is a symlink...
    if [ -n "$RUNNING" ]; then
     if [ -x /usr/sbin/sendmail ]; then
      /usr/sbin/sendmail -q >/dev/null 2>&1
     fi
    fi
    

    Файл /etc/ppp/ip-down.d/postfix

    #!/bin/sh -e
    # Called when an interface disconnects
    # Written by LaMont Jones 
    # start or reload Postfix as needed
    # If /usr isn't mounted yet, silently bail.
    if [ ! -d /usr/lib/postfix ]; then
     exit 0
    fi
    RUNNING=""
    # If master is running, force a queue run to unload any mail that is
    # hanging around.  Yes, sendmail is a symlink...
    if [ -f /var/spool/postfix/pid/master.pid ]; then
     pid=$(sed 's/ //g' /var/spool/postfix/pid/master.pid)
     exe=$(ls -l /proc/$pid/exe 2>/dev/null | sed 's/.* //;s/.*\///')
     if [ "X$exe" = "Xmaster" ]; then
      RUNNING="y"
     fi
    fi
    if [ ! -x /sbin/resolvconf ]; then
     f=/etc/resolv.conf
     if ! cp $f $(postconf -h queue_directory)$f 2>/dev/null; then
      exit 0
     fi
      #===============================================================
      # Вот новая строчка
      /usr/sbin/postconf -e defer_transports=hold
     if [ -n "$RUNNING" ]; then
      /etc/init.d/postfix reload >/dev/null 2>&1
     fi
    fi
    exit 0
    
    Забираем почту с помощью fetchmail.

    Файл ~/.fetchmailrc

    poll pop3.mail.ru protocol pop3 
        user "имя_ящика", with password "пароль_к_ящику", is "локальный_пользователь" here;
    sslproto=""
    
    Вот и всё. В таком варианте я получаю почту ручками (fetchmail -v), отвечать могу как оффлайн, так и онлайн. Пока я не в сети почта накапливается, при подключении к сети очередь сбрасывается и далее осуществляется немедленная отправка.

    понедельник, 24 ноября 2008 г.