Ne tako otvoreni blog

بسم الله والحمدلله والصلاة والسلام على رسول الله

Archive for the ‘FLOSS’ Category

Microsoft: A History of Anticompetitive Behavior and Consumer Harm

without comments

Written by edin1

Maj 16, 2009 at 22:04

Postavljeno u Ekonomija, FLOSS, GNU/Linux

Skeniranje knjige “Gramatika arapskog jezika”

without comments

Trenutno su kod mene (pozajmljena) oba dijela knjige “Gramatika arapskog jezika”, iz 1936/1937 godine. Knjige su prilično stare, ali se i dan danas koriste, u novijim izdanjima, za izučavanje arapskog jezika.

Kao što se iz gornjih linkova vidi, knjige su skenirane i postavljene na web archive-i za download. Ovaj tekst je tu da me podsjeti šta sam koristio/radio prilikom skeniranja.

Za skeniranje sam koristio MFP Samsung SCX-4200. Kao operativni sistem uglavnom koristim Ubuntu, ali SCX4200 ima problematične ne-slobodne driver-e za štampač, tako da sam samo skeniranje radio na WXP-u. Program (SmarThru) sam podesio da skenira 24-bitno, 300dpi, a slike sam sačuvavao kao JPEG, i to sa maksimalnim ponuđenim kvalitetom.

Nakon skeniranja koristio sam sljedeću (fixpages.py) Python skriptu (koja koristi PIL) za “kidanje” stranica:

import os

from PIL import Image as Im
import datetime
now = datetime.datetime.now

SRC_DIR = './raw'
DEST_DIR = './single'

if not os.path.exists(DEST_DIR):
    os.mkdir(DEST_DIR)

d_left = 50
d_right = 200
d_up = 20
d_down = 210

t1 = now()

for fname in sorted(os.listdir(SRC_DIR)):
    im = Im.open(os.path.join(SRC_DIR, fname))
    im = im.crop((d_left,d_up,im.size[0] - d_right,im.size[1] - d_down))

    bare, ext = fname.rsplit('.',1)
    pagenum = int(bare)
    if pagenum % 2:
        # odd page
        im = im.rotate(180)
    im.save(os.path.join(DEST_DIR, fname), quality=100)

t2 = now()
print t2 - t1

Naravno, podešavanja će biti drugačija za knjigu drugih dimenzija. Nakon što su stranice dotjerane koristio sam sljedeću skriptu za generisanje DjVu fajlova u boji:

import os
import sys
import subprocess
import datetime
now = datetime.datetime.now

DJVUFILES = []
PROCESSEDFILES = []
# A flag to indicate that no conversion from .jpg (etc.) to .djvu files
# should not be done
SKIPCONVERSION = None
# Remove old single .djvu files
REMOVEOLD = None

def removeold(indir):
    """Remove old .djvu files recursively."""
    for basename in sorted(os.listdir(indir)):
        fname = os.path.join(indir, basename)
        if os.path.isfile(fname):
            ext = os.path.splitext(fname)[1].lower()
            if ext == ".djvu":
                os.remove(fname)

def dir_iter(indir, outfile):
    """Convert all JPEG, PPM and PBM images in a directory to
    (separate) DjVu files.
    """
    for basename in sorted(os.listdir(indir)):
        fname_src = os.path.join(indir, basename)
        fname_dst = os.path.join(indir, basename + ".djvu")
        if os.path.isfile(fname_src):
            convert_one_img(fname_src, fname_dst)
#     firstfile = DJVUFILES.pop(0)
#     shutil.copy(firstfile, outfile)
#     for djvufile in DJVUFILES:
#         pass
    DJVUFILES.insert(0, outfile)
    DJVUFILES.insert(0, '-c')
    DJVUFILES.insert(0, 'djvm')
    t12 = now()
    print t12-t1
    subprocess.call(DJVUFILES)

def convert_one_img(fname_src, fname_dst):
    ext = os.path.splitext(fname_src)[1].lower()
    if ext == ".djvu":
        # This covers the case of existing .djvu files.
        # They should be added to the document
        basename_src = os.path.splitext(fname_src)[0]
        if basename_src in PROCESSEDFILES:
            return
        elif SKIPCONVERSION:
            DJVUFILES.append(fname_src)
        return

    if SKIPCONVERSION:
        return

    if os.path.exists(fname_dst):
        DJVUFILES.append(fname_dst)
        PROCESSEDFILES.append(fname_src)
        return

    args = [fname_src, fname_dst]
    if ext in (".jpg", ".jpeg", ".ppm"):
        args = "c44 -slice 74,89".split() + args
    elif ext == ".pbm":
        args.insert(0,"cjb2")
    else:
        return
    print args
    subprocess.call(args)
    DJVUFILES.append(fname_dst)
    PROCESSEDFILES.append(fname_src)

if __name__ == '__main__':
    import optparse
    parser = optparse.OptionParser(
        usage='%prog [-c] <indir> <outfile>'
        )
    parser.add_option("-s", "--skipconversion",
                   action="store_true", dest="skipconversion", default=False,
                  help="Skip conversion of images to (single) .djvu files")
    parser.add_option("-r", "--removeold",
                   action="store_true", dest="removeold", default=False,
                  help="Remove old (single) .djvu files")
    options, args = parser.parse_args()
    SKIPCONVERSION = options.skipconversion
    REMOVEOLD = options.removeold
    try:
        indir = args[0]
        outfile = args[1]
    except IndexError:
        print parser.usage
    t1 = now()
    if REMOVEOLD:
        removeold(indir)
    dir_iter(indir, outfile)
    t2 = now()
print t2 - t1

Kao što se vidi, koristio sam isključivo Open Source programe za generisanje/manipulisanje DjVu fajlovima.

Za prebacivanje u PDF format sam koristio program djview, tj. djview4. Ovaj program može da odradi i konverziju u bitonalni format, ali je konverzija korica bila nezadovoljavajuća, jer korica biva praktično kompletna “ocrnjena”.

Da bih generisao bitonalni (crno-bijeli) DjVu (fajlovi su manji nego DjVu fajlovi u boji) prihvatljivih karakteristika morao sam slike imati u PBM formatu, koji koristi koristi program cjb2. Za JPEG/PBM konverziju sam koristio sljedeću bash comandu:

anytopnm jpegs/image.jpg |ppmtopgm |pgmtopbm -threshold -value 0.15>image.pbm

“-threshold” opcija odrađuje bitonalizaciju po starom dobrom threshold principu. 0.15 je prag (threshold) koji je bio zadovoljavajući. Ima malo više crnih tačaka ali neka.

Još da napomenem da sam kod generisanja DjVu-a u boji koristio i opciju:

c44 -slice 74,89,99

ali ona daje duplo veći fajl.

To je sve čega mogu da se sjetim.

Ne zaboravite me u dovama!

Written by edin1

Novembar 20, 2008 at 12:27

Postavljeno u FLOSS, Islam, Knjige, Python, Skeniranje

OpenStreetMap.org iliti slobodno mapiranje svijeta

without comments

Ekipa LUG-a Crne Gore je “pokrenula inicijativu” za pravljenje slobodne mape Crne Gore preko sajta OpenStreerMap.org.  Momci su već ubacili dosta ulica za Podgoricu, posebno nakon prve GPS ture po PG.  Izmjena mapa je vrlo jednostavna.  Za PG, dovoljno je da odete ovdje.

Written by edin1

oktobar 5, 2008 at 10:37

Postavljeno u Crna Gora, FLOSS, Geo

Google Summer of Code 2008 (SoC 2008) is on!

without comments

Written by edin1

Februar 25, 2008 at 21:29

Postavljeno u FLOSS, Google, SoC

Knjiga: Proizvodnja softvera otvorenog koda

without comments

Iliti Producing Open Source Software. Knjigu sam dobio od Google-a, kao učesnik njihovog Google Summer of Code projekta (2007 godina). Knjiga je objavljena pod otvorenom licencom, postoji PDF, HTML i štampano izdanje. Knjiga je prevedena na nekoliko jezika, ali (zasad) ne i na neki od južnoslovenskih jezika.

Knjigu toplo preporučujem svima (i oni iskusniji će sigurno naći nešto interesantno i korisno u njoj) koji učestvuju ili žele da učestvuju u FOSS projektima, jer je autor u njoj kondenzovao sopstveno dugogodišnje iskustvo na ovom polju.

Pošto je tema FOSS, znatan dio knjige je posvećen komunikaciji učesnika/programera na FOSS projektima, a mnogi savjeti se mogu primijeniti i na ostale vidove pismene komunikacije (nevezano za FOSS).

Written by edin1

Novembar 3, 2007 at 10:26

Postavljeno u FLOSS, Knjige

Tagged with

Raspored tastature za Crnu Goru

without comments

Časlav Ilić je zatražio razdvajanje srpske i crnogorske tastature pod Linux-om (tj. X-Windows-om):
http://bugs.freedesktop.org/show_bug.cgi?id=12390

Ukratko rasporedi su formalno razdvojeni i raspored slova je samo prekopiran iz starog SCG rasporeda.

Više o detaljima ovdje:
http://lug.itam.ws/forum/index.php?topic=117.0
http://www.linuxo.net/forum/index.php/topic,8102.0.html

Update: Moj patch za podrazumijevanu latinicu crnogorskog tastaturnog rasoreda je prihvaćen.

Written by edin1

Novembar 3, 2007 at 09:09

Postavljeno u Crna Gora, GNU/Linux

Tagged with