13 martie 2013

Struts2: redirect Action to another Action


     <action name="myFirstAction" class="myClass" method="myMethod">
    <result type="redirectAction" name="stg-myMethod-returns">
        <param name="actionName"> mySecondAction </param>
        <param name="param-name-to-send"> ${paramVariable} </param>
   </result>
    <result type="dispatcher" name="stg-else-myMethod-returns"> jspToTreatOtherCases.jsp </result>
    </action>

* Parametrii suplimentari de trimis din myFirstAction in mySecondAction trebuie sa aiba setteri/getteri in myFirstAction pentru a putea fi vazuti de xml-ul Struts prin ${paramVariable}.
* redirectAction si actionName sunt cuvinte-cheie.

08 martie 2013

Unicode Hex Character Codes to String, in Java

private static String decodeEmail (String email) {

List<Integer> codes = new ArrayList<Integer> ();
String parts [] = email.replace("&#x", "").split(";");
for (int i=0; i<parts.length; i++) {
codes.add(Integer.parseInt(parts[i],16));
}
String result = "";
for (int code : codes) {
String s = Character.toString((char)code);
result += s;
}
return result;
}

Exemplu:
  • &#x7A;&#x68;&#x65;&#x6E;&#x79;&#x61;&#x5F;&#x69;&#x6E;&#x64;&#x40;&#x75;&#x6B;&#x72;&#x2E;&#x6E;&#x65;&#x74;
  • zhenya_ind@ukr.net

21 februarie 2013

Email grabbing with regex

String EMAIL_REGEX = "(?:[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[A-Za-z0-9!#$%&'*+/=?^_`{|}~-]+)*|\"(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21\\x23-\\x5b\\x5d-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])*\")@(?:(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\.)+[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?|\\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[A-Za-z0-9-]*[A-Za-z0-9]:(?:[\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x21-\\x5a\\x53-\\x7f]|\\\\[\\x01-\\x09\\x0b\\x0c\\x0e-\\x7f])+)\\])";

String content = "myname@provide.com tananana etc@example.com";
Pattern pattern = Pattern.compile(EMAIL_REGEX);
Matcher m = pattern.matcher(content);

while (m.find()) {
String email = m.group(0).trim();
System.out.println(email);
}

08 februarie 2013

Eight Puzzle

Eight Puzzle este una din problemele tipice pentru A* .
Pornind de la o stare initiala (stg) vrem sa ajungem la starea finala (dreapta), in cat mai putini pasi. O cautare in spatiul tuturor starilor nu mai este posibila din cauza numarului mare de stari (9! > 300,000)

Pentru a alege cat mai bine urmatoarea stare, A* combina costul de a ajunge in acea stare cu o euristica ce estimeaza costul de acolo pana in starea finala.
In cazul de fata, euristicile presupuse au fost:
- numarul de blocuri nelalocul lor (starea initiala vs. finala)
- suma distantelor Manhattan ale fiecarei valori din celulele initiale raportate la pozitiile in care se afla in celulele finale (mai multe despre asta aici)

In fine, implementarea mea se afla aici, pentru cazul considerat, am obtinut acelasi numar de pasi, insa cea de-a doua euristica a fost mult mai rapida.

UPDATE:
Pseudocodul de mai sus furnizat de AI-planning este putin defectuos... am refacut implementarea si ea se afla aici. In prima versiune, o stare nu era considerata decat o singura data, dupa care trecea in "allNodes". In noua versiune, o stare poate fi considerata si a doua oara, daca promite o distanta mai mica pana la solutie fata de cat promitea anterior (adica am descoperit solutia printr-o alta cale).

27 ianuarie 2013

Problema canibalilor si a misionarilor

Mi-am dezmortit putin cunostintele de C, facand problema "canibalilor si a misionarilor" , propusa de AI-planning. (chiar nu am vrut sa recurg la C, dar asta este cea mai buna varianta pentru un calculator pe care rulez tot timpul Ubuntu live)

Problema suna cam asa: "Un rau are 2 maluri. Pe malul din stanga se afla 3 misionari si 3 canibali, care vor sa ajunga pe malul din dreapta. Ei au la dispozitie o barca, cu capacitate maxima de 2 persoane. Cum pot trece ei astfel incat misionarii sa nu fie mancati de canibali? Daca pe unul din maluri exista misionari si ei sunt mai putini la numar decat canibalii, atunci vor fi mancati."

Am aflat ca aceasta problema este clasica in AI-planning , si are si o varianta mai extinsa a unor cupluri geloase. Momentan, m-am limitat la o implementare simpla in C, in care accentul cade pe modul cum se reprezinta starile si actiunile. Ce inseamna success si failure. Cum alegem sa facem cautarea - in depth, in breadth? Eu am ales varianta in adancime (recursivitate). Iar implementarea se poate vedea aici (cu 4 solutii gasite, care au aceeasi "lungime").