Archive for the ‘FLOSS’ Category
Microsoft: A History of Anticompetitive Behavior and Consumer Harm
Skeniranje knjige “Gramatika arapskog jezika”
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!
OpenStreetMap.org iliti slobodno mapiranje svijeta
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.
Google Summer of Code 2008 (SoC 2008) is on!
Knjiga: Proizvodnja softvera otvorenog koda
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).
Raspored tastature za Crnu Goru
Č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.