čtvrtek 22. prosince 2011

Pouštěč dávek

Jestli se jako já chystáte pustit přes svátky nějakou dávku a bojíte se výpadků proudu nebo náhodných pádů počítače, nabízím jednoduchou utilitku. Program pouští dávku a zapisuje si řádku, na které skončil. Po násilném ukončení a znovuspuštění program skočí na poslední řádku. Program si také uchovává vlastnosti dávky ve Windows, tzn. můžete za aktuální řádku připsat další řádky a oni se provedou i když program už běží. (Trochu vepřové, ale nadmíru užitečné.) Připomínky, vylepšení a stížnosti pochopitelně vítám. Tu je skript v pythonu "batcher.py":


import sys
import os

def writeState(fname, state):
  f = open(fname, "w")
  f.write("%d\n" % state)
  f.close()          

if not len(sys.argv) == 3:
  print
  print "Error: Batcher needs two arguments."
  print
else:
  fnameBatch = sys.argv[1]
  fnameState = sys.argv[2]
  while True:
    try:
      fState = open(fnameState)
      line = fState.readline()
      state = int(line.strip())
      fState.close()
    except IOError:
      state = 0
      writeState(fnameState, state)
    fBatch = open(fnameBatch)
    iLine = 0
    for line in fBatch:
      if iLine == state:
        break
      iLine = iLine + 1
    if not state == iLine:
      break
    if not os.system(line.strip()) == 0:
      print
      print "Warning: An error has occurred at line no. %d." % (state + 1)
      print
    state = state + 1
    writeState(fnameState, state)

Skript má dva parametry: jméno souboru s dávkou a jméno souboru s číslem aktuální řádky. Pokud druhý soubor neexistuje, jede se od první (nulté) řádky.

středa 21. prosince 2011

Pozvánka do Nečtin

Chcete vidět/slyšet/setkat se s Jiřím Fialou, Václavem Cílkem, Ivanem Ryndou, Jiřinou Šiklovou, aj.? Tady najdete způsob, jak to udělat:

http://www.ums.zcu.cz/vypisclanek.php?jakaKategorie=&jakaPodkategorie=&clanek=96

čtvrtek 15. prosince 2011

Mýtus o slunci a Platónova úsečka

Citát z Platónovy Ústavy v pdf zde.

https://docs.google.com/open?id=0B3pp9Xdhjj-sZGRmYjFhMjEtNGVlMy00ZmU2LTk5MmItYzRmZTQwYmVmODNi

Věc je snad dostatečně známá, a tak jen o sázení paralelních zrcadlových textů (facing pages) v latexu. Možností je víc, já to dělám takto:


\documentclass[a4paper, 12pt]{book}
\usepackage{a4wide, ledmac, ledpar, hyperref, etex}
\usepackage[czech, greek, english, german]{babel}
\usepackage[utf8x]{inputenc}
\usepackage[symbol]{footmisc}

\hypersetup{
    bookmarks=true,         % show bookmarks bar?
    unicode=false,          % non-Latin characters in Acrobat’s bookmarks
    pdftoolbar=true,        % show Acrobat’s toolbar?
    pdfmenubar=true,        % show Acrobat’s menu?
    pdffitwindow=false,     % window fit to page when opened
    pdfstartview={FitH},    % fits the width of the page to the window
    pdftitle={Ústava},    % title
    pdfauthor={Platón},     % author
    pdfsubject={},   % subject of the document
    pdfcreator={},   % creator of the document
    pdfproducer={}, % producer of the document
    pdfkeywords={}, % list of keywords
    pdfnewwindow=true,      % links in new window
    colorlinks=true,        % false: boxed links; true: colored links
    linkcolor=blue,         % color of internal links
    citecolor=green,        % color of links to bibliography
    filecolor=magenta,      % color of file links
    urlcolor=cyan           % color of external links
}

\maxchunks{300}

\begin{document}

\selectlanguage{czech}

\pagestyle{myheadings}
\markboth{\footnotesize{Platón}}{\footnotesize{Ústava}}

\renewcommand{\mp}[1]{\ledsidenote{#1}}

\begin{pages}
\renewcommand{\Rlineflag}{*}

\begin{Leftside}
\beginnumbering{}
\selectlanguage{greek}
\input{platon-ustava-509-511-gr.tex}
\end{Leftside}

\begin{Rightside}
\beginnumbering{}
\selectlanguage{czech}
\input{platon-ustava-509-511-cz.tex}
\end{Rightside}

\Pages

\end{pages}

\end{document}

Z psychohygienických důvodů mám samotný text ve dvou různých souborech. V každém souboru jsou odstavce, přižemž každý odstavec začíná řádkou s příkazem \pstart končí řádkou \pend. Může to vypadat takto:


\pstart
This is the first paragraph.
\pend
\pstart
This is the second paragraph.
\pend

A druhý soubor:


\pstart
Toto je první odstavec.
\pend
\pstart
Toto je druhý odstavec.
\pend

Kódování UTF8 je pochopitelně jen kvůli řečtině. Pokud by takto někdo chtěl sázet poznámky pod čarou nebo nedej Bože rovnice, musel by pár věcí dodělat. V případě potřeby poradím. Připraveno je jen makro \mp, což je makro pro marginpar. Při sazbě je třeba extrémní trpělivost. Dokázal by takto někdo udělat celou Ústavu?

úterý 13. prosince 2011

Čechy z dálky

Řek Λαόνικος Χαλκοκονδύλης byl typický blogger, protože své názory na cokoli si nenechával pro sebe, i když o věci samé nevěděl zhola nic. Co slyšel o husitech si přeložil do vlastní řeči a ze skutečnosti nezbylo nic. Asi jako dnešní průměrný názor utvořený podle televize.

S nimi sousedí Čechové. V jejich zemi někteří sdílejí víru se Samoty, jiní s Germány a oblékají se podobně jako Paioni. Jejich hlavní město je Praha. Mnozí obyvatelé teprve nedávno přestali uctívat oheň a Slunce. V celé Evropě jen tento jediný národ nesdílí některé z nynějších nám známých náboženství, totiž Ježíšovo, Mohamedovo nebo Mojžíšovo, která, jak dobře víme, v našem světě téměř úplně převládla. Ale podle toho, co jsme se doslechli, existuje v Indii za Kaspickým mořem a za územím Massagetů národ, která se oddal uctívání Apollona. Češi však vyznávají i jiné bohy, Dia a Héru, jak vyložíme, až k tomu při výkladu dospějeme.
Laoniko Chalkokondydés – Výklad dějin

pondělí 5. prosince 2011

Jednoduchý experiment

V čase 0 existuje jediný objekt, který má periodu rovnu 1.0. Každý objekt periodicky podle své periody vygeneruje nový objekt, který bude mít zcela náhodně buď dvojnásobnou periodu, nebo periodu poloviční. Pokud hádáte, že počet objektů bude růst exponenciálně nebo superexponencionálně, tak hádejte znovu, nebo si spusťte přiložený program. Tento miniexperiment by měl sloužit jako ukázka, že evoluce není jenom záležitosti výběru, protože zde žádný výběr není, ale i způsobu replikace. Pustil jsem to 10 x a graf přilkádám.
import random

class object:
    def __init__(self, objs, P):
        self.objs = objs
        self.P = P
        self.T = 0.0
    def sleep(self):
        self.T = self.T + self.P
    def run(self):
        if random.uniform(0.0, 1.0) > 0.5:
            newP = 2 * self.P
        else:
            newP = 0.5 * self.P   
        child = object(self.objs, newP)
        child.T = self.T
        self.objs.append(child)
        child.sleep()
        self.sleep() 
  
  
objs = []
first = object(objs, 1.0)
objs.append(first)


Tsim = 0.0

for isim in range(100):
        print Tsim, len(objs)
 
        for i in range(len(objs)):
            obj = objs[i]
            if obj.T == Tsim:
                obj.run()
        Tsim = None
        for obj in objs:
            if Tsim == None or Tsim > obj.T:
                Tsim = obj.T