vineri, 27 decembrie 2013

Aforisme personale

Dragostea este sentimentul puternic care leagă două persoane, împreună cu neputința de a explica acest sentiment.

duminică, 22 decembrie 2013

Despre un subiect întotdeauna deschis: Dragostea

Revizuind propriile trăiri... succese și greșeli... de atunci (din ziua cînd am primit buletinul :-D) pînă acum, am ajuns la concluzia că pentru mine de multe ori dragostea era simțită drept un transfer parțial a propriei identități (eu) asupra altei identități (ea). Un fel de lărgire (extindere) a mulțimii lucrurilor materiale și imateriale care formează pilonii identități mele. Iar întrucît în centrul unei identități sănătoase trebuie să fie egoismul, noua identitate se dorește a fi controlată. Dorință (aproape imposibil de realizat) care poate pune începutul unui război (cu tine, cu ea, cu toată lumea...) din start pierdut... și din cauza căreia dragostea devine o condiție suficientă a nebuniei și a contopirii.

vineri, 20 decembrie 2013

Utilizarea vectorilor în PHP (sau Care este prețul ascuns al libertății?)


PHP (PHP: Hypertext Preprocessor) este un limbaj slab tipizat. Mai mult, interpretatorul PHP nici nu suportă specificarea tipului la declararea variabilelor. Acest fapt oferă programatorului libertatea de a „jongla” cu tipurile datelor în funcție de necesități, lăsînd pe seama interpretatorului recunoașterea tipului variabilelor. Dar „Libertatea înseamnă răspundere...”[1]. O situație de care m-am „poticnit” recent demostrează acest lucru.

[Ne]cazul cu vectorii

La prima vedere s-ar părea că în PHP vectorii sînt de două feluri: vectori obișnuiți (structuri liniare în memorie) și vectori asociativi (perechi de chei și valori). Fals! În PHP orice vector este vector asociativ ordonat. Acest fapt generează o mulțime de avantaje (flexibilitate și spațiu de manevră limitat doar de fantezia programatorului), dar... cere mai multă atenție, responsabilitate...

Fie un vector, indexat numeric, doar că că construit nu într-o ordine nefirească.
<?php
$a = array();
$a[1] = 'Valoarea1';
$a[2] = 'Valoarea2';
$a[0] = 'Valoarea0';
 
afiseaza_tablou($a);
?>

Știind că funcția afiseaza_tablou parcurge vectorul și sfișează fiecare element;  ce va afișa funcția? Mai exact, mă intereseaza ordinea în care vor fi afișate elemntele.

Răspuns: depinde de tipul structurii repetitive utilizate pentru parcurgerea vectorului. Fară a pierde din generalitate putem evidenția două cazuri:

(1) Este folosită structura for(;;); de exemplu:

<?php
function afisare_tablou($tablou) {
 for($i=0; $i<count($tablou); $i++)
  echo "a[$i]=$a[$i]\n";
}
?>

Atunci rezultatul afișarii va fi:

a[0]='Valoarea0'
a[1]='Valoarea1'
a[2]='Valoarea2'

(2) Dacă însă este folosită structura foreach ( as ) (de care m-am molipsit de cînd programam în Java); de exemplu:

<?php
function afisare_tablou($tablou) { 
 foreach($tablou as $i=>$v) 
 echo "a[$i]=$v\n"; }
?>
Atunci se va afișa:

a[1]='Valoarea1'
a[2]='Valoarea2'
a[0]='Valoarea0'

Ordinea afișarii este diferită. Deoarece vectorii sînt întotdeauna ordonați, iar valoarea cu indexul 0 a fost adăugată în ultimul rînd.

Soulții.

(1) Specificarea numarului de elemente ale vectorului.

<?php
$a = array(3);
?>

(2) Reindexarea vectorului folosind funcția array_values.


<?php
$a = array_values($a);
?>

(3) Sortarea vectorului folosind  funcția ksort.

<?php
ksort($a);
?>

[1] „Libertatea înseamnă răspundere, de aceea majoritatea oamenilor se tem de ea.” (Bernard Shaw)

duminică, 8 decembrie 2013

Note personale privind Yii

Yii este un cadru de programare [en. framework] pentru dezvoltarea aplicațiilor web folosind limbajul PHP. O caracteristică importantă a Yii este filosofia simplă din spatele cadrului ceea ce implică ușurința (rapiditatea) de asmilare (învățare) a acestuia.

Numele Yii este o prescurtare de la „Yes it is!”.

În cele ce urmează prezint notele mele privind soluțiile la problemele cu care m-am ciocnit la prima încercare de a folosi Yii.

Adrese „prietenoase”. 
Implicit o aplicaţie web creată cu Yii nu foloseşte facilităţile de rescriere a adreselor oferite Apache sau Nginx. Activarea acestei opţiuni nu este un lucru complicat. Ansamblul de acţiuni pentru activare este descris mai jos.
  1. In fișierul protected/config/main.php trebuie de scos comentariile de la  blocul care începe cu 'urlManager'=>array(.
  2. Pentru a exclude șirul index.php din adresele generate în blocul decomentat mai sus trebuie de modificat sau de adăugat, în caz că nu există, rîndul: 'showScriptName'=>false,.
  3. În final, dacă în calitate de web server se folosește Apache, în dosarul rădăcină a aplicației trebuie de creat fișierul .htaccess cu următorul conținut:
RewriteEngine on

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

Algoritmul de mai sus va avea efectul scontat doar dacă aplicația se află într-un dosar pe nivelul I al serverului Apache. În celelate cazuri trebuie de făcut o schimbare în continutul fișierului .htaccess. În cazul meu aplicația era disponibilă la adresa http://localhost/~vundicind/app/, iar conținului fișierului .htacces a trebuit să fie:

RewriteEngine on

RewriteBase /~vundicind/app/

# if a directory or a file exists, use it directly
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d

# otherwise forward it to index.php
RewriteRule . index.php

Și ultima, în configurarea Apache, dosarul în care stau fișierele aplicației trebuie să aibă AllowOverride FileInfo.

sâmbătă, 7 decembrie 2013

Long Live The TeX Live (or How to install TeX Live on Ubuntu?)


What is the most common encountered error message when you try to compile a latex document which wasn't made by you?... Exactly:

! LaTeX Error: File `<somefilename>.sty' not found.

What is the solution? There are at least three solutions:
  1. You could download the package files from the Comprehensive TeX Archive Network and install manually in your system.
  2. If you use a GNU/Linux distribution, Ubuntu for example, then you could google the name of the Ubuntu package (or Debian package) which in turn, contains the latex package that you need and install the first via the apt-get command.
  3. If you use MS Windows then you could launch the Package Manager program from MiKTeX software and install the package via one-two clicks of mouse.
After N years of solving this problem I can say with certitude that I'm tired of solution 1 and 2. I like the solution 3, but it's only available on Windows... Is there a way to move the solution 3 to GNU/Linux context? Yes! It is called TeX Live (2013). And the steps for implementing the solutions are presented bellow.

1. Get rid of all texlive Ubuntu packages

sudo apt-get remove texlive-base

2. Download the TeX Live (2013) installation files form http://tug.org/texlive/acquire.html and install it.

wget http://mirror.ctan.org/systems/texlive/tlnet/install-tl-unx.tar.gz
tar -xf install-tl-unx.tar.gz
cd install-tl-20131125
sudo ./install-tl

type I for the question and wait about two - three hours for installation process to finish.

3. Install the dependencies for the graphic interface of the TeX Live (2013) programs. 

sudo apt-get install tk
sudo apt-get install perl-tk

4. Clone key files from TeX Live located in /usr/local/ to /usr/ 

Run: sudo /usr/local/texlive/2013/bin/x86_64-linux/tlmgr --gui

From the Actions menu (Fig. 1) select Handle symlinks in system dirs... item and in the dialog that will show (Fig. 2) click on Update symbolic links button, then on OK.



Figure 1. TeX Live Manager 2013 GUI




 Figure 2. Handle symlinks in system dirs dialog

This step is necessary because it seems that some executable from tlmgr do not use internaly relative paths, but absloute paths like /usr/bin/tex

5. Install the necessary package

sudo tlmgr install <somepackagename>

Voilà.

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;


sâmbătă, 31 august 2013

Some random examples with PGF/TikZ

July 2013, the lucky month when a student of mine whom I was advising on his undergraduate thesis, finally successfully finished it. It happened that I only now have the time to write about this event. I was much busy before.
The title of the thesis was "Computer Technologies for Visualization of Mathematical Objects"  (the original title, in Romanian, sounds like: "Tehnologii de vizualizare a obiectelor matematice prin utilizarea calculatorului").
We both had been working hard to get it well done. And the fruitful result of the months of hard work that we had spent is, on my side, some good experience of working with LaTeX, PGF/TikZ, appreciation of the work from my colleagues, on the student's side, the highest score for this work and,  on the committee's side, the pleasant experience of viewing some fresh ideas, powerful technologies, a well-structured and understandable content of the work.

I will present some of the things that the thesis was about in the paragraphs below.


\begin{figure}[!hb]
\tikzset{external/force remake}   
\centering%
\begin{tikzpicture}
  \begin{axis}[xlabel=$x$,ylabel=$y$,zlabel=$z$]
    \addplot3[surf, samples=20] {x^2-y^2};
    \begin{scope}[every node/.style={circle,inner sep=1.5pt,fill=black}]
      \node[pin=50:\footnotesize{saddle point}] at (axis cs:0,0,0) {};
    \end{scope}
  \end{axis}
\end{tikzpicture}
\caption{Saddle point of function $f(x,y)=x^2-y^2$}
\end{figure}



\begin{figure}[!hb]
\begin{tikzpicture}
  \begin{axis}[xlabel=$x$,ylabel=$y$,zlabel=$z$,view/az=225,view/h=165]  
    \addplot3[surf,samples=20,domain=-3:3] {(x^3)+(y^3)-(3*x)-(12*y)+1};
    
    \begin{scope}[every node/.style={circle,inner sep=1.5pt,fill=black}]
      \node[pin=140:\footnotesize{minimum}] at (axis cs:1,2,-17) {};
      \node[pin=140:\footnotesize{maximum}] at (axis cs:-1,-2,19) {};
      \node[pin=140:\footnotesize{saddle}] at (axis cs:1,-2,15) {};
      \node[pin=140:\footnotesize{saddle}] at (axis cs:-1,2,-13) {};
    \end{scope}
  \end{axis}
\end{tikzpicture}  
\caption{Critical points of function $f(x,y)=x^3+y^3-3x-12y+1$}
\end{figure}

\begin{figure}[!hb]
\begin{tikzpicture}
  \begin{axis}[xlabel=$x$,ylabel=$y$,zlabel=$z$,view/az=75]  
    \addplot3[surf,samples=20,domain=-3:3] {(x^3)+(y^3)-(3*x)-(12*y)+1};      

    \begin{scope}[every node/.style={circle,inner sep=1.5pt,fill=black}]
      \node[pin=170:\footnotesize{minimum}] at (axis cs:1,2,-17) {};
      \node[pin=140:\footnotesize{maximum}] at (axis cs:-1,-2,19) {};
      \node[pin=160:\footnotesize{saddle}] at (axis cs:1,-2,15) {};
      \node[pin=140:\footnotesize{saddle}] at (axis cs:-1,2,-13) {};
    \end{scope}
  \end{axis}
 
\end{tikzpicture}  
\caption{Critical points of function $f(x,y)=x^3+y^3-3x-12y+1$ (different view)}
\end{figure}

luni, 25 februarie 2013

LaTeX: Adrese cu conținut înteresant

Revista organizației TeX User Group, TUGboathttp://www.tug.org/tugboat/Contents/

Site-ul stackoverflow.com: http://stackoverflow.com/
Lectură plăcută!