marți, 19 noiembrie 2013

Bilanț bisăptămînal, partea I

Introducere

Aceste două săptămîni care au trecut au fost dedicate în mare măsură problemelor de logică. Chiar și atunci cînd am nimerit cu mașina într-un accident rutier -  tot la ele mă gîndeam.

Iată cîteva dintre ele.

Problema 1 (Încotro? În rai sau iad?)

Un om moare iar sufletul lui ajunge într-o odaie cu două uși. La fiecare dintre cele două uși stă un paznic. Unul spune mereu adevărul, iar celălalt mereu minte. O ușă duce spre rai, iar cealaltă - spre iad.
Cum poate afla sufletul acelui omul care dintre cele două uși duce spre rai? Dacă el nu cunoaște care dintre paznici spune adevărul și care minte, și are voie să pună doar o singură întrebare unuia dintre cei doi paznici?

Problema 2 (Vă amintiți de problema cu lupul, capra și varza?)

Pe malul unui rîu sînt patru persoane și o barcă cu două locuri. Toate cele patru persoane trebuie să treacă pe celălat mal. Se știe că primul trece cu barca (vîslind) de pe un mal pe altul în 1 minute, al doilea - în 2 minute, al III-lea - în 5 minute și ultimul în - 10 minute. Dacă vîslesc doi, atunci timpul scurs este cel maximal adică, dacă vîslește cel cu 1 minută și cel cu 10 minute, atunci timpul total va fi 10 minute; iar dacă se urcă în barcă cel cu 2 minute împreună cu cel cu 5 minute, atunci ei au nevoie de 5 minute pentru a trece de la un mal spre altul.

Cum să trecem aceste patru persoane pe celălat mal în cel mai scurt timp?

Problema 3 (Fără rest!)

O persoană pleacă la magazin după agrafe. În buzunar are 5 lei. În magazin sînt patru tipuri de agrafe: de 1 ban, 5 bani, 25 și 50 bani. El trebuie să cumpere 10 agrafe și să cheltuie toți cei 5 lei. Cum poate face acest lucru?

Problema 4 (Where am I?)

O persoană ajunge pe o insulă într-un mod mai puțin obișnuit: este adusă cu elicopterul. Pe acestă insulă este o regiune îngrădită cu un gard formă de poligon și înălțimea de un metru. Cum persoana în cauză poate să-și deie seama dacă  este înăuntrul sau în afara zonei îngrădite?

P.S. Soluțiile la probleme 1-4 vor fi prezentate în partea a II-a a acestui articol.

marți, 5 noiembrie 2013

Repetata moarte a idolilor

Zilele trecute am fost impus de circumstanțe să apelez la linia fierbinte a Agenției Pentru Protecția Consumatorului (022 741464, http://consumator.gov.md/). Vroiam să mă consult în legătură cu refuzul personalului unui magazin de a accepta reparația, în baza garanției, a unui produs cumpărat de la ei.

În discuția cu doamna de la linia fierbinte am aflat doua lucruri utile:

  1. Dacă reprezentanții magazinului refuză să accepte reparația produsul (cumpărat de la ei), însă nu doresc să argumenteze în scris cauza refuzului, cel simplu este să le trimiteți acest produs prin scrisoare (colet)  recomandată. În acest caz ei sînt obligați fie să accepte produsul, fie să vă  scrie de ce nu-l acceptă.
  2. Dacă nu vi se oferă registrul de reclamații sau nu vrea nimeni să vă semneze plîngerea în formă liberă. Cel mai simplu este să scrieți o plîngere despre acest fapt la adresa Agenției Pentru Protecția Consumatorului.

Soluțiile de mai sus funcționează, sînt legale și vă scutesc de discuții neplăcute (nervoase) cu personalul fie incompetent, fie fricos, fie arogant. Dar atenție: acest soluții ne spun că în momentul apariției nedreptății, nimeni nu are să vină sa vă ajute. Nu puteți suna la cei de la Agenție cum a-ți suna la poliție cerîndu-le să vină chiar atunci pentru a clarifica lucrurile și a întocmi, dacă e cazul, un proces verbal.

Mulți (printre care și eu) au iluzia că doar venind undeva și evidențiind faptul că se încălcă legea imediat vor obține satisfacție. Este o abordare care trebuie evitată. Trebuie să fii gata întotdeauna să te descurci singur...

În acest context îmi aduc aminte de o frază din Fundația lui Isaac Asimov și anume: „Legile lui Seldon îi ajută pe cei ce se ajută singuri”[Isaac Asimov, Fundația. Fundația și Imperiul, Biblioteca Adevărul 2010, Vol. 86, p. 313].

luni, 14 octombrie 2013

Timpul local și data în limba română în Moodle (sau - pînă ajungi la Dumnezeu, te mănîncă sfinții)

1. Problema


Data creării subiectelor de discuție din forumuri este afișată în limba engleză, iar ora în format 12 ore (sufixate cu AM sau PM după caz); de exemplu:

by Admin User - Tuesday, September 10, 2013, 7:46 PM

în loc de

de către Admin User - marți, 10 septembrie 2013, 19:46

Chiar dacă... toate opțiunile legate de formatul afișării datei și orei, limba implicită pentru site, setările de localizare, chiar și traducerile zilelor săptămînii și a denumirilor lunilor... toate-s în ordine.

2. Contextul


Ubuntu 12.04 LTS; Moodle 2.5.1

3. Pre soluție


Moodle este scris în PHP. Respectiv formatarea datei și timpului se face prin funcțiile din PHP, în particular prin funcția strftime (http://php.net/manual/ro/function.strftime.php). Acest fapt poate fi confirmat analizînd codul sursă sau, mai simplu, prin faptul ca în fișierul langconfig.php din categoria core (Site administration > Language > Language customisation) șabloanele de formatare a datei și orei au sintaxa identică cu cea a argumentului format a funcției strftime.

Funcția strftime la rîndul ei formatează în raport cu setările regionale curente a sistemului de operare. Dacă se dorește formatarea cu alte setări regionale  fără a schimba cele curente a sistemului se poate folosi funcția setlocale.

Anume așa e realizat în Moodle. Înainte de a fi utilizată vreo funcție de formatare a datei sau orei se cheamă funcției moodle_setlocale (din moodlelib.php) care la rîndul ei cheamă setlocale.

Funcția setlocale activează setările regionale indicate; cu condiția că acestea sînt disponibile în sistem. Puteți chema de 1001 ori funcția setlocale cu parametrul, de exemplu, ro_RO.UTF-8, dar dacă aceste setări regionale nu-s instalate în sistem nu veți avea denumiri de luni în română. De unde? Sistemul nu le are.

Cel mai des cînd se instalează sistemul cel care instalează specifică fusul orar, specifică moneda, iar setările regionale rămîn cele englezești, adică en_EN. Configurația ro_RO.UTF-8 nefiind instalată (pe server). Pe un calculator Desktop posibil că da (de exemplu cînd am instalat Linux Mint cu KDE imediat după instalare am fost rugat să introduce astfel de info).


Așadar, dacă nu aveți setările regionale ro_RO.UTF-8 instalate nu aveți cum să primiți denumiri de luni în română.

4. Soluția



Verificați setările Moodle legate de localizare:

  • Administration > Language > Language Settings
    • Default language = Română (ro)
    • Sitewide locale = ro_RO.UTF-8
  • Administration > Appearance > Calendar
    • Time display format = 24=hour
  • Administration > Language > Language Customisation > Română (ro)
    • core calendar.php: zilele săptămînii sînt traduse
    • core langconfig.php: locale=ro_RO.UTF-8

Verificați lista fișierelor de localizare (setări regionale) disponibile în sistem:

locale -a

Dacă în lista afișată lipsește rîndul ro_RO.utf8. Atunci acest fișier trebuie generat. Îl puteți genera cu ajutorul comenzii:


sudo locale-gen ro_RO.UTF-8

După ce ați generat fișierul de localizare obligatoriu reporniți sistemul, de exemplu prin:  

sudo reboot

Dacă nu reporniți sistemul funcția PHP strftime se va comporta straniu: ba va formata în română, ba în engleză.

marți, 8 octombrie 2013

Un exemplu de utilizare a programului GNU parallel

1. Începutul

În data de 29 septembrie 2013, la Bălți, s-a desfășurat „Ziua Libertății Programelor și 30 de ani de GNU”. Evenimentul a fost organizat de Fundația Ceata (http://ceata.org) și sprijinit de Universitatea de Stat "Alecu Russo" din Bălți (http://www.usarb.md). Programul evenimentului poate fi găsit la adresa http://ceata.org/evenimente/zlp-2013-%C8%99i-30-de-ani-de-gnu-%C3%AEn-b%C4%83l%C8%9Bi.html. Țin să precizez că Bălți nu a fost unicul oraș în care Fundația Ceata a organizat evenimente legate Ziua Libertății Programelor. Au fost de tot șase orașe.  Mai multe detalii le puteți găsi în comunicatul oficial al Fundației Ceata.

Cine s-a săturat de citit poate să privească fotografiile de la evenimentul din Bălți, https://albume.ceata.org/index.php?/category/118.

2. GNU Parallel (și GNU Stow)

Reiese așadar din denumirea evenimentului că trebuia să se fi vorbit mult despre GNU. Așa și a fost. S-a vorbit despre GNU Hurd, despre programele făcute de cei de la GNU, în special, de Emacs, de GNU Core Utilities etc. Eu am vorbit despre GNU Prallel și GNU Stow (http://www.slideshare.net/vundicind/gnu-parallel-i-gnu-stow). Apropo prezentarea de pe slideshare.net este pusă la dispoziţie, cu toate că nu este specificat pe primul diapozitiv a prezentării, sub Licenţa Atribuire - Distribuire-în-condiţii-identice 3.0 Ne-adaptată (CC BY-SA 3.0).

Am vorbit despre metode de instalare a GNU parallel, am dat exemple de utilizare combinată cu programul grep, am explicat cum poate fi controlat  numărul de procese paralele  și în final am prezentat un contraexemplu (un caz în care executarea sarcinilor în paralel înrautățește lucrurile). N-am reușit însă să prezint un alt exemplu. Un crawler web realizat în întregime doar prin comenzi GNU/Linux și care face interogările către server în paralel. Nu l-am prezentat pentru nu-l aveam finalizat atunci. Acum după cîteva săptămîni am găsit totuși timp și l-am data gata.

 3. Crawler web care folosește GNU parallel și nu doar GNU parallel

Am fost inspirat de exemplul de crawler web din manualul programului GNU parallel. Crawlerul realizat de mine este la fel un script shell care l-am numit „pwspell” (pe lung ar fi „Parallel Web Spell Checker”) adică un crawler care mai și verifică ortografia paginilor vizitate. Script-ul poate fi descărcat de pe Github.com(https://github.com/vundicind/pwspell). Proiectul pe Github conține trei fișiere: script-ul și două fișiere text. Fișierul README_ro.md conține indicații, în română, pentru instalare (pachete adiționale) și rulare.

Script-ul face ceea ce am scris mai sus că face, dar mai este de lucru la el. De exemplu, dacă textele în website conțin literele „ț” și „ș” cu sedilă (redactate din Windows XP) atunci toate cuvinte cu aceste două litere vor fi considerate greșite de pwspell. Acest fapt se datorează lui aspell (programul utilizat de crawler pentru verificarea ortografiei) în dicționarele căruia se folosesc „ț” și „ș” cu virgulă (cum e corect).

Pentru mine acest script are o importanță mai mult didactică decît funcțională. Crawler-ul este un exemplu netrivial de utilizare combinată de comenzi GNU/Linux, un exercițiu de scriere de script-uri shell reușit.

luni, 30 septembrie 2013

Crearea de tabele pentru problemele de transport folosind LaTeX

1. Exemplul I

În exemplul de mai jos sînt utilizate doar comenzile: \multicolumn, \multirow și \cline. Apropo pentru commanda \multirow e nevoie de \usepackage{multirow}. Documentarea acestor comenzi poate fi găsită aici.


\begin{tabular}{|c|cc|cc|cc|cc|c|}
\hline
& \multicolumn{2}{|c|}{$C_1$}
  & \multicolumn{2}{|c|}{$C_2$}
  & \multicolumn{2}{|c|}{$C_3$}
  & \multicolumn{2}{|c|}{$C_4$}
  & \\
\hline
\multirow{2}{*}{$F_1$}
  & \multicolumn{1}{|c|}{} & 2
  & \multicolumn{1}{c|}{} & 3
  & \multicolumn{1}{c|}{} & 5
  & \multicolumn{1}{c|}{} & 1
  & \multirow{2}{*}{8}\\
\cline{3-3}\cline{5-5}\cline{7-7}\cline{9-9}
& & & & & & & & & \\
\hline
\multirow{2}{*}{$F_2$}
  & \multicolumn{1}{|c|}{} & 7
  & \multicolumn{1}{c|}{} & 3
  & \multicolumn{1}{c|}{} & 4
  & \multicolumn{1}{c|}{} & 6
  & \multirow{2}{*}{10}\\
\cline{3-3}\cline{5-5}\cline{7-7}\cline{9-9}
& & & & & & & & & \\
\hline
\multirow{2}{*}{$F_3$}
  & \multicolumn{1}{|c|}{} & 4
  & \multicolumn{1}{c|}{} & 1
  & \multicolumn{1}{c|}{} & 7
  & \multicolumn{1}{c|}{} & 2
  & \multirow{2}{*}{10}\\
\cline{3-3}\cline{5-5}\cline{7-7}\cline{9-9}
& & & & & & & & & \\
\hline
& \multicolumn{2}{|c|}{6}
  & \multicolumn{2}{|c|}{8}
  & \multicolumn{2}{|c|}{9}
  & \multicolumn{2}{|c|}{15}
  & 38\\
\hline
\end{tabular}


Rezultatul este următorul:

Puteți accesa (și compila) fișier LaTeX integral cu acest exemplu pe ShareLaTeX.com (https://www.sharelatex.com/project/52540b39ce0382ac30000347). Proiectul pe ShareLaTeX.com conține două fișiere, alegeți fișierul tabular.tex.

 2. Exemplul al II-lea

E cam mult de scris în exemplul de sus. În cele ce urmează este prezentată o metodă de construire a tabelului utilizînd cadrul tabu (care are nevoie de \usepackage{tabu}).

\newcommand{\cost}[1]{\raisebox{0.5cm}{\framebox{#1}}}

\everyrow{\hline}
\setlength{\tabcolsep}{0pt}

\begin{tabu}{|X[c,m]|X[r,m]|X[r,m]|X[r,m]|X[r,m]|X[c,m]|}
&
\multicolumn1{c|}{$C_1$}&
\multicolumn1{c|}{$C_2$}&
\multicolumn1{c|}{$C_3$}&
\multicolumn1{c|}{$C_4$}&\\
$F_1$ & \cost{2}  & \cost{3} & \cost{5} & \cost{1} & 8\\
$F_1$ & \cost{7}  & \cost{3} & \cost{4} & \cost{6} & 10\\
$F_1$ & \cost{4}  & \cost{1} & \cost{7} & \cost{2} & 10\\
& 
\multicolumn1{c|}{6} & 
\multicolumn1{c|}{8} & 
\multicolumn1{c|}{9} & 
\multicolumn1{c|}{15} & 
\multicolumn1{c|}{38}\\
\end{tabu}

Rezultatul va arăta astfel:



Puteți accesa (și compila) fișier LaTeX integral cu acest exemplu pe ShareLaTeX.com (https://www.sharelatex.com/project/52540b39ce0382ac30000347). Proiectul pe ShareLaTeX.com conține două fișiere, alegeți fișierul tabu.tex.


\mathbb{1}

Cum putem aplica stilul "Blackboard bold" la numere?
Din păcate pachetul standard în care este definită comanda \mathbb (amsmath sau amssymb, nu țin minte exact) este limitat doar la litere ($\mathbb{R}$, $\mathbb{Q}$ etc) și nu conține glife pentru cifre. O soluție este pachetul bbold care extinde comanda \mathbb cu unicul "dezavantaj" că glifele pentru litere arată puțin altfel.
Altă soluție este pachetul bbm care nu modifica comanda \mathbbm, ci "vine" cu o noua comanda \mathbbm.
Ambele pachete pot fi instalate în Ubuntu prin intermediul pachetul de sistem texlive-fonts-extra.

luni, 16 septembrie 2013

Fixing (un)common Moodle errors

1. Site Administration block with unexpandable links


The problem: in the "Site administration" block, the links such as "users", "courses", "grades" (or any other links that must expand on a click) do not work like they're supposed to.
The context: I ran into this issue after I've changed the location of "moodledata" directory on the server (Ubuntu 12.04 LTS; Moodle 2.5.1).
The solution: I had to purge the caches via command line, as follows:
sudo su www-data -c "php admin/cli/purge_caches.php"
Here are some links that I found on this issue. However, I didn't find out the reason for this problem to appear:

2. "Incorrect access detected, this server may be accessed only through..."

The problem: i have an instance of Moodle behind a proxy and the former (the instance) is mapped in the local proxy URL space by use of ProxyPass and ProxyPassReverse directives. I have modified the "$CFG->wwwroot" parameter from "config.php" to match the proxy server domain name, but I still get the error message:

Incorrect access detected, this server may be accessed only through "http://xxx.xxx.xxx.xxx/moodle" address, sorry.

The context: Ubuntu 14.04.02 LTS; Moodle 2.8.5+).
The solution: add to "config.php", before the "lib/setup.php" include directive,  the line:

$CFG->reverseproxy = true;