От семечки до ананаса

пятница, 11 апреля 2014 г.

Struts 2. Radio button example

JSP:
<s:radio list="myList" name="someProperty" listKey="key" listValue="value" />

Java action:
public String someProperty; // also getters and setters needed

public Set<Entry<String, String>> getMyList() {
 Map<String, String> map = new LinkedHashMap<String, String>();
 map.put("first", getText("message.from.properties.one"));
 map.put("second", getText("message.from.properties.two"));
 return map.entrySet();
}

Result:
<input type="radio" name="someProperty" id="myform_somePropertyfirst" value="first"/>
<label for="myform_somePropertyfirst">value of message.from.properties.one</label>
<input type="radio" name="someProperty" id="myform_somePropertysecond" value="second"/>
<label for="myform_somePropertysecond">value of message.from.properties.two</label>

понедельник, 6 января 2014 г.

Подбор паролей к кейстору

словарь pass.txt скачивается с тырнета

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.security.Key;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.List;

public class TestKeyStore{

    public static void main( String[] args ) throws IOException, KeyStoreException{
        KeyStore ks = KeyStore.getInstance( KeyStore.getDefaultType() );

        boolean passwordFromKeyStoreFound = false;

        for( String pass : getAvailablePasswords() ){

            FileInputStream fis = null;
            try{
                fis = new FileInputStream( "nemo_keystore" );
                ks.load( fis, pass == null ? null : pass.toCharArray() );
                passwordFromKeyStoreFound = true;
                System.out.println( "Password from keystore: " + pass );

                System.out.println( "Size: " + ks.size() );
                System.out.println( "Type: " + ks.getType() );

                System.out.println( "Aliases:" );
                Enumeration<String> aliasese = ks.aliases();
                while( aliasese.hasMoreElements() ){
                    String alias = aliasese.nextElement();
                    System.out.println( alias );

                    System.out.println( "----------- certificate info ----------" );

                    Certificate cert = ks.getCertificate( alias );
                    System.out.println( cert );

                    System.out.println( "Certificate type: " + cert.getType() );
                    System.out.println( "Public key: " + cert.getPublicKey() );

                    System.out.println( "------------ password known bruteforce ------------" );
                    for( String availablepass : getAvailablePasswords() ){
                        try{
                            ks.getKey( alias, availablepass == null ? null : availablepass.toCharArray() );
                            System.out.println( availablepass + " valid!!!!!" );
                        }
                        catch( UnrecoverableKeyException e ){

                        }
                    }

                    System.out.println( "------------ password bruteforce ------------" );
                    List<String> passwords = new ArrayList<String>();
                    FileInputStream pfis = new FileInputStream( "pass.txt" );
                    BufferedReader pbr = new BufferedReader( new InputStreamReader( pfis ) );

                    for( ;; ){
                        String line = pbr.readLine();
                        if( line == null ){
                            break;
                        }
                        passwords.add( line );

                    }

                    System.out.println( "read of dictionary completed. start bruteforce " );

                    for( String password : passwords ){
                        try{
                            Key key = ks.getKey( alias, password == null ? null : password.toCharArray() );
                            System.out.println( "!!! Password for " + alias + " found. It's: " + password + " !!!" );
                            System.out.println( key );
                        }
                        catch( UnrecoverableKeyException e ){

                        }
                    }

                }

            }
            catch( Exception e ){
            }
            finally{
                if( fis != null ){
                    fis.close();
                }
            }
            if( passwordFromKeyStoreFound ){
                break;
            }
        }

        System.out.println( "------------ end ------------" );
    }

    public static List<String> getAvailablePasswords(){
        return new ArrayList<String>(){
            private static final long serialVersionUID = 1L;

            {
                add( "tallink12" );
                add( "Tallink12" );
                add( "tallink13" );
                add( "Tallink13" );
                add( "tallink12345" );
                add( "Tallink12345" );
                add( "12345" );
                add( "qwerty12345" );
                add( "qwerty12" );
                add( "tallink" );
                add( null );
                add( "" );
                add( "Passw0rd1" );
                add( "Passw0rd" );

            }
        };
    }
}

четверг, 1 августа 2013 г.

Установка PHP 5.5.1, Apache 2.4.6 на Windows 7

Задолбался устанавливать вышеперечисленное.
Решил записать сюда, чтобы в следуйщий раз не тратить столько много времени на это.
Всё из-за невнимательности и спешки. Вообще всё в мануалах черным по белому ясно написано что с чем совместимо и что нужно качать.

Вообщем внимательно смотрим чтобы всё было 32 битным (64 бит хпх пока в эксперементальной разработке).

1) заходим сюда http://www.microsoft.com/en-us/download/details.aspx?id=30679 , жмем Download, выбираем VSU3\vcredist_x86.exe и устанавливаем.

2) идем сюда https://www.apachelounge.com/download/VC11/ качаем "Apache 2.4 win32 binary", разархивируем. Из ReadMe.txt в корне архива:

Install
-------


- Unzip the Apache24 folder to c:/Apache24 (that is the ServerRoot in the config).
Default folder for your your webpages is DocumentRoot "c:/Apache24/htdocs"

When you unzip to an other location, change ServerRoot in the httpd.conf,
and change in httpd.conf the Documenroot, Directories, ScriptAlias,
also when you use the extra folder config file(s) change to your location there.

Start apache in a DOS box:

>httpd.exe

Install as a service:

>httpd.exe -k install

ApacheMonitor:

Double click ApacheMonitor.exe, or put it in your Startup folder.
от себя добавлю, что перед тем как будете устанавливать сервис запустите консоль от имени администратора.

3) отсюда http://windows.php.net/download/ качаем "VC11 x86 Thread Safe (2013-Jul-18 20:59:48)" PHP 5.5 (5.5.1)
разархивирум, переименовываем в php, кладем куда угодно.


4) настройка (http://php.net/manual/ru/install.windows.apache2.php)
LoadModule php5_module "c:/php/php5apache2.dll"
AddHandler application/x-httpd-php .php

# конфигурирование пути к php.ini
PHPIniDir "C:/php"

5) в папке с пхп копируем php.ini-development в эту же папку и переименовываем в php.ini.

6) Перезагружаем сервер.


Ошибки.
Евли после добавления виртуалхоста в браузере появится:
Forbidden
You don't have permission to access / on this server.
а в логе (C:\Apache24\logs\errors.log) что-то вроде этого:
[Thu Aug 01 16:06:19.262800 2013] [authz_core:error] [pid 35172:tid 1048] [client 127.0.0.1:51370] AH01630: client denied by server configuration: C:/Users/zalizkog/Dropbox/www/homecafe.local/

Замените "Require all denied" на "Require all granted" и добавьте "Options FollowSymLinks Indexes". FllowSymlinks нужен для работы mod_rewrite а Indexes чтобы отображать содержимое папке виртуального хоста, если не найден index.php или index.html
<Directory />
AllowOverride All
Require all granted
Options FollowSymLinks Indexes
</Directory>

Ошибка в логе, если вы не указали FollowSymLinks:
[Thu Aug 01 16:04:37.066581 2013] [rewrite:error] [pid 40336:tid 1088] [client 127.0.0.1:51358] AH00670: Options FollowSymLinks and SymLinksIfOwnerMatch are both off, so the RewriteRule directive is also forbidden due to its similar ability to circumvent directory restrictions : C:/Users/zalizkog/Dropbox/www/homecafe.local/

Такая ошибка, если отключен модуль mod_rewrite:
[Thu Aug 01 16:03:16.879563 2013] [core:alert] [pid 32776:tid 1092] [client 127.0.0.1:51353] C:/Users/zalizkog/Dropbox/www/homecafe.local/.htaccess: Invalid command 'RewriteEngine', perhaps misspelled or defined by a module not included in the server configuration


Расширение в php.ini:
extension_dir = "C:\php\ext"
раскомментировать те расширение которые нужно

понедельник, 29 октября 2012 г.

Auto24.ee оповещатель о поступивших к продаже авто

Не так давно мне потребовалось купить автомобиль.
Так как в Эстонии самый популярный сайт по продаже авто - www.auto24.ee, то присматривал я машину приемущественно на нем. Это небольшое лирическо отсутпление. А суть такова, что на этом портале есть функциональность извещения по эмалу о новых поступивших автомобилях на основе параметров поиска, но она оповещает ещеждевно, в 7 утра об этом. Когда я несколько дней подряд получал эти извещения и звонил по хорошим предложениям владельцам, чтобы договориться о том, когда и где можно посмотреть авто, то получал - "извините, а машина уже продана". Это при всем при том, что я звонил в районе 9-10 часов. Т.е. хорошие предложения как горячие пирожки расходятся.

В итоге я психанул, и написал такой вот маленький скриптик, который бегает по крону каждые 5 минут и присылает прямо мне (и жене) на майл новые объявления о продаже.
Телефон соответственно у меня постоянно синхронизируется с гмайлом. Так же была настроена фильтрация сообщених по заголовку с приминением к этим письмам определенного гмайл ярлыка. На телефоне включена сихрнонизация этого ярлыка и оповещения при каждом полученном эмайле (а не одноразовое при поступлении новых сообщений).

В кронджобе запись выглядит вот так:
*/5 * * * * "php /home1/georgeee/[PATH_TO_SCRIPT]/parse.php parse=true"

GET параметры передаются как аргументы к пхп интерпретатуру, а не как мы привыкли через знак вопроса.

<?php
$url_file = 'url.txt';
$site = 'http://rus.auto24.ee';

if (isset($_GET['url'])) {
    $fp = fopen($url_file, 'w+');
    fputs($fp, $_GET['url']);
    fclose($fp);
    die('SAVED');
}

$current_url = file_get_contents($url_file);

function sendmail($mobiles, $current_url) {
    $message = '
<html>
<head>
  <title>Fresh Mobiles</title>
</head>
<body>
  <p>Добавленные машины за последние 5 минут, соответствующие <a href="' . $current_url . '">таким критериями поиска</a>:</p>
  <ul>
';
    foreach ($mobiles as $m) {
        $s = "<a href='" . $m['url'] . "' target='_blank'>";
        $s .= $m['model'];
        $s .= " [{$m['year']}] ";
        $s .= " [{$m['transmission']}] ";
        $s .= " [{$m['price']} EUR]";
        $s .= "</a>";
        $message .= '<li>' . $s . '</li>';
    }
    $message .= '
  </ul>
</body>
</html>
';

    $headers = 'MIME-Version: 1.0' . "\r\n";
    $headers .= 'Content-type: text/html; charset=utf-8' . "\r\n";
    $headers .= 'From: George Zalizko <george.zalizko@gmail.com>' . "\r\n";
    $headers .= 'To: Natalja Zalizko <natalja.zalizko@gmail.com>' . "\r\n";

    mail('george.zalizko@gmail.com', 'auto24 fresh mobiles', $message, $headers);
}

if (isset($_GET['parse'])) {

    $fp = fopen('db.txt', 'a');

    $already_received = file('db.txt', FILE_IGNORE_NEW_LINES);

    $html = file_get_contents($current_url);

    if (strstr($html, '<div class="infoMessage">Не нашли автомобилей</div>') != false) {
        die();
    }

    $table_pos_start = strpos($html, '<table id="usedVehiclesSearchResult" class="section search-list">');
    $table_pos_end = strpos($html, '<div class="paginator">', $table_pos_start);
    $html_table = substr($html, $table_pos_start, $table_pos_end - $table_pos_start);

    $html_table = mb_convert_encoding($html_table, 'utf-8', mb_detect_encoding($html_table));
    $html_table = mb_convert_encoding($html_table, 'html-entities', 'utf-8');

    $dom = new DOMDocument('1.0', 'UTF-8');
    @$dom->loadHTML($html_table);


    /*
      <tr class="result-row item-odd   ">
      <td class="pictures">
      <a href="/kasutatud/auto.php?id=1152848" class="small-image">
      <img src="http://img1.auto24.ee/auto24/72/521/31396521.jpg" alt="" style="width:74px;height:56px;display:block;border:1px solid"></a>
      </td>
      <td class="make_and_model">
      <a href="/kasutatud/auto.php?id=1152848">Opel Omega 2.2 88 кВ</a>
      <div class="commercial"></div>
      <div class="extra">168&nbsp;000&nbsp;км<span>&nbsp;</span>универсал<span>&nbsp;</span>задний привод</div>
      </td>
      <td class="auction_ttl"></td>
      <td class="year">2001</td>
      <td class="fuel">Д</td>
      <td class="transmission">М</td>
      <td class="pictures" style="padding: 0px;"></td>
      <td class="price">2450</td>
      </tr>
     */

    $xpath = new DOMXPath($dom);
    $entries = $xpath->query("//table/tr[@class]");

    $mobiles = array();
    foreach ($entries as $entry) {
        $price = $xpath->query("td[@class='price']", $entry)->item(0)->nodeValue;
        if (empty($price)) {
            continue;
        }
        $year = $xpath->query("td[@class='year']", $entry)->item(0)->nodeValue;
        $transmission = $xpath->query("td[@class='transmission']", $entry)->item(0)->nodeValue;

        $el_make_and_model = $xpath->query("td[@class='make_and_model']/a", $entry)->item(0);
        $make_and_model = $el_make_and_model->nodeValue;

        $url = $el_make_and_model->getAttribute('href');
        if (!in_array($url, $already_received)) {
            $mobiles[] = array(
                'url' => $site . $url,
                'model' => $make_and_model,
                'year' => $year,
                'price' => $price,
                'transmission' => $transmission
            );
            fwrite($fp, $url . "\n");
        }
    }

    if (!empty($mobiles)) {
        sendmail($mobiles, $current_url);
    }
    fclose($fp);
} else {
    ?>
    <form method="GET" action="<?php echo $_SERVER['PHP_SELF']; ?>">
        <p>
            Current url:<br/>
            <a href="<?php echo $current_url; ?>"><?php echo $current_url; ?></a>
        </p>
        <p>
            <input type="text" name="url"/>
            <input type="submit" value="save"/>
        </p>
    </form>
<?php } ?>

Может кому-нить еще пригодится ;-)

пятница, 5 октября 2012 г.

Spring 3.1 + JPA + DBUnit, Gradle, Maven

В этой коротенькой статье-примере я хотел бы поделиться недавно приобретенным опытом, а именно:
  • Относительно новой возможности Spring Framework-a создавать так называемую Java based configuration, используя для этого фактически обычные POJO объекты с вкраплением анатаций от спринга
  • Написание Unit-тестов для тестировании базы данных. Рассмотрится несколько вариантов. Первый - тестирование базы с помощью Spring test context framework-a. Второй вариант - контекст, как в и первом случае, будет создавать SpringJUnit4ClassRunner.class из набора вышеупомянутого фреймворка, но для тестирования будет использоваться библиотека DBUnit.
  • Вначале проект специально был создан с использованием Maven-a, чтобы потом попробовать Gradle. Расскажу о полученных впечатлениях от Gradle и покажу конфигурацию того и другого.