понедельник, 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 и покажу конфигурацию того и другого.

вторник, 25 сентября 2012 г.

user lacks privilege or object not found

Замучался до смерти с такой ошибкой:

org.hibernate.exception.SQLGrammarException: user lacks privilege or object not found: PERSON
 at org.hibernate.exception.internal.SQLExceptionTypeDelegate.convert(SQLExceptionTypeDelegate.java:82)
 at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
 at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
 at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
 at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
 at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
 at $Proxy36.executeQuery(Unknown Source)
 at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:441)
 at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:396)
 at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:456)
 at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:464)
 at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:472)
 at org.springframework.jdbc.core.JdbcTemplate.queryForObject(JdbcTemplate.java:477)
 at org.springframework.jdbc.core.JdbcTemplate.queryForInt(JdbcTemplate.java:486)
 at org.springframework.jdbc.core.simple.SimpleJdbcTemplate.queryForInt(SimpleJdbcTemplate.java:117)
 at org.springframework.test.jdbc.SimpleJdbcTestUtils.countRowsInTable(SimpleJdbcTestUtils.java:56)
 at org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests.countRowsInTable(AbstractTransactionalJUnit4SpringContextTests.java:115)
 at com.logica.tutorial.AnotherTest.some2Test(AnotherTest.java:32)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
 at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
 at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
 at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
 at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:74)
 at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:83)
 at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:72)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:231)
 at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
 at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
 at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
 at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
 at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
 at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
 at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
 at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:71)
 at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
 at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:174)
 at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)
 at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)
 at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)
Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: PERSON
 at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
 at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
 at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source)
 at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source)
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at org.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
 ... 41 more
Caused by: org.hsqldb.HsqlException: user lacks privilege or object not found: PERSON
 at org.hsqldb.error.Error.error(Unknown Source)
 at org.hsqldb.error.Error.error(Unknown Source)
 at org.hsqldb.SchemaManager.getTable(Unknown Source)
 at org.hsqldb.ParserDQL.readTableName(Unknown Source)
 at org.hsqldb.ParserDQL.readTableOrSubquery(Unknown Source)
 at org.hsqldb.ParserDQL.XreadTableReference(Unknown Source)
 at org.hsqldb.ParserDQL.XreadFromClause(Unknown Source)
 at org.hsqldb.ParserDQL.XreadTableExpression(Unknown Source)
 at org.hsqldb.ParserDQL.XreadQuerySpecification(Unknown Source)
 at org.hsqldb.ParserDQL.XreadSimpleTable(Unknown Source)
 at org.hsqldb.ParserDQL.XreadQueryPrimary(Unknown Source)
 at org.hsqldb.ParserDQL.XreadQueryTerm(Unknown Source)
 at org.hsqldb.ParserDQL.XreadQueryExpressionBody(Unknown Source)
 at org.hsqldb.ParserDQL.XreadQueryExpression(Unknown Source)
 at org.hsqldb.ParserDQL.compileCursorSpecification(Unknown Source)
 at org.hsqldb.ParserCommand.compilePart(Unknown Source)
 at org.hsqldb.ParserCommand.compileStatements(Unknown Source)
 at org.hsqldb.Session.executeDirectStatement(Unknown Source)
 at org.hsqldb.Session.execute(Unknown Source)
 ... 48 more

Решается следующим образом - в настройку EntityManagerFactory бина в конфиге нужно добавить JPA найтройку "hibernate.hbm2ddl.auto" со значением "create", если вы используету, как и я, PersistanceProvider org.hibernate.ejb.HibernatePersistence. В таком случае база данных будет создаваться автоматически при инициализации sessionFactory в хибирнейте (http://docs.jboss.org/hibernate/orm/3.3/reference/en/html/session-configuration.html#configuration-optionall).

@Bean
@Autowired
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource) {
 LocalContainerEntityManagerFactoryBean bean = new LocalContainerEntityManagerFactoryBean();

 Map<String, Object> jpaPropertyMap = new HashMap<String, Object>();
 jpaPropertyMap.put("hibernate.dialect", "org.hibernate.dialect.HSQLDialect");
 jpaPropertyMap.put("hibernate.show_sql", true);
 jpaPropertyMap.put("hibernate.format_sql", true);
 jpaPropertyMap.put("hibernate.hbm2ddl.auto", "create");

 bean.setPersistenceProviderClass(HibernatePersistence.class);
 bean.setDataSource(dataSource);
 bean.setJpaPropertyMap(jpaPropertyMap);
 bean.setPackagesToScan(new String[] { "com.logica.tutorial.model" });

 return bean;
}

четверг, 6 сентября 2012 г.

Указание месторасположения php.ini

В конец конфигурационного файла апача (C:\Program Files (x86)\Apache Software Foundation\Apache2.2\conf\httpd.conf) добавил:

PHPIniDir "C:\PROGRA~2\PHP\"

но phpinfo() всё равно выдает "Loaded Configuration File: C:\Windows\php.ini".

Решается заменой слешей на прямые:

PHPIniDir "C:/PROGRA~2/PHP/".

Теперь "Loaded Configuration File: C:\Program Files (x86)\PHP\php.ini"

http://ru.wikipedia.org/wiki/%D0%9F%D1%83%D1%82%D1%8C_%D0%BA_%D1%84%D0%B0%D0%B9%D0%BB%D1%83

четверг, 26 июля 2012 г.

Liferay. Please enter a valid XML URL.

После инсталляции Liferay (в моем случае 6.1.10EE) при попытке добавить новую страницу (Site Pages -> Add Page) вылезает сообщение "Please enter a valid XML URL."

В моем случае лечится так: заходим в Control Panel -> Porta -> Portal Settings -> Display Settings, проверям, что язык по умолчанию "English (United Kingdom)" и жмем Save. Пробуем добавить страницу еще раз.

вторник, 24 июля 2012 г.

mvn versions:display-dependency-updates

Познакомился с Versions Maven Plugin.
Вот такой оутпут имеем по команде display-dependency-updates:

[INFO] Scanning for projects...
[INFO]                                                                         
[INFO] ------------------------------------------------------------------------
[INFO] Building Liferay Apps 1.9-SNAPSHOT
[INFO] ------------------------------------------------------------------------
[INFO] 
[INFO] --- versions-maven-plugin:1.3.1:display-dependency-updates (default-cli) @ liferay-apps ---
[INFO] The following dependencies in Dependencies are using the newest version:
[INFO]   cglib:cglib-nodep .............................................. 2.2.2
[INFO]   com.liferay.portal:portal-impl ................................. 6.1.0
[INFO]   com.liferay.portal:portal-service .............................. 6.1.0
[INFO]   com.liferay.portal:util-taglib ................................. 6.1.0
[INFO]   com.microsoft:reporting-api .................................... 1.0-0
[INFO]   commons-dbcp:commons-dbcp ........................................ 1.4
[INFO]   commons-digester:commons-digester ................................ 2.1
[INFO]   commons-httpclient:commons-httpclient ............................ 3.1
[INFO]   commons-lang:commons-lang ........................................ 2.6
[INFO]   javax.portlet:portlet-api ........................................ 2.0
[INFO]   javax.servlet:jstl ............................................... 1.2
[INFO]   net.sf.dozer:dozer ............................................. 5.3.2
[INFO]   org.apache.velocity:velocity-tools ............................... 2.0
[INFO]   oro:oro ........................................................ 2.0.8
[INFO]   struts:struts .................................................. 1.2.9
[INFO] 
[INFO] The following dependencies in Dependencies have newer versions:
[INFO]   com.codeborne:selenide .................................... 1.2 -> 1.4
[INFO]   com.google.code.gson:gson ............................... 2.1 -> 2.2.2
[INFO]   com.tallink.torpedo:torpedo-rmi-client ................... 2.7 -> 2.11
[INFO]   commons-collections:commons-collections ................. 3.2.1 -> 3.3
[INFO]   commons-io:commons-io ................................... 2.0.1 -> 2.4
[INFO]   commons-validator:commons-validator ................... 1.3.1 -> 1.4.0
[INFO]   javax.servlet:servlet-api ......................... 2.5 -> 3.0-alpha-1
[INFO]   javax.servlet.jsp:jsp-api ............................... 2.1 -> 2.2.1
[INFO]   javax.validation:validation-api ............. 1.0.0.GA -> 1.1.0.Alpha1
[INFO]   junit:junit ............................................ 4.8.2 -> 4.10
[INFO]   log4j:log4j ..................................... 1.2.16 -> 1.3alpha-8
[INFO]   mysql:mysql-connector-java .......................... 5.1.18 -> 5.1.21
[INFO]   org.apache.httpcomponents:httpclient .................. 4.1.2 -> 4.2.1
[INFO]   org.hibernate:hibernate-validator ........ 4.2.0.Final -> 5.0.0.Alpha1
[INFO]   org.mockito:mockito-all ........................... 1.9.0 -> 1.9.5-rc1
[INFO]   org.mortbay.jetty:jetty ......................... 6.1.25 -> 7.0.0.pre5
[INFO]   org.mortbay.jetty:jetty-management .................. 6.1.25 -> 6.1.26
[INFO]   org.mortbay.jetty:jetty-util ............... 6.1.25 -> 7.1.6.v20100715
[INFO]   org.seleniumhq.selenium:selenium-java ............... 2.18.0 -> 2.25.0
[INFO]   org.slf4j:jcl-over-slf4j .............................. 1.6.1 -> 1.6.6
[INFO]   org.slf4j:slf4j-api ................................... 1.6.1 -> 1.6.6
[INFO]   org.slf4j:slf4j-log4j12 ............................... 1.6.1 -> 1.6.6
[INFO]   org.springframework:spring-context ......... 3.1.1.RELEASE -> 3.2.0.M1
[INFO]   org.springframework:spring-jdbc ............ 3.1.1.RELEASE -> 3.2.0.M1
[INFO]   org.springframework:spring-oxm ............. 3.1.1.RELEASE -> 3.2.0.M1
[INFO]   org.springframework:spring-test ............ 3.1.1.RELEASE -> 3.2.0.M1
[INFO]   org.springframework:spring-web ............. 3.1.1.RELEASE -> 3.2.0.M1
[INFO]   org.springframework:spring-webmvc-portlet ...
[INFO]                                                3.1.1.RELEASE -> 3.2.0.M1
[INFO]   org.springframework.ws:spring-ws-support ...
[INFO]                                           2.0.5.RELEASE -> 2.1.0.RELEASE
[INFO] 
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.474s
[INFO] Finished at: Tue Jul 24 14:49:32 EEST 2012
[INFO] Final Memory: 11M/152M
[INFO] ------------------------------------------------------------------------

А вообще на домашней страничке много чего еще интересного. Но пока только эту команду попрактиковал.

понедельник, 23 июля 2012 г.

Концфигурация rebel.xml для Liferay Theme.

<?xml version="1.0" encoding="UTF-8"?>
<application xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://www.zeroturnaround.com"
 xsi:schemaLocation="http://www.zeroturnaround.com http://www.zeroturnaround.com/alderaan/rebel-2_0.xsd">

 <classpath>
  <dir name="D:/workspace-cms/liferay-theme/target/classes"></dir>
 </classpath>

 <web>
  <link target="/">
   <dir name="D:/workspace-cms/liferay-theme/src/main/webapp">
   </dir>
  </link>
 </web>

</application>

среда, 18 июля 2012 г.

Инициализация новых объектов в Velocity. Liferay.

В Liferay (6.1.1) возникла проблема с отображением подменю в навигации, если страница является скрытой (hidden). Дело в том, что эта страница не попадает в массив элементов $nav_items, доступный в шаблоне (velocity, в данном случае).

Некоторое время траха поисков привели к такому варианту:

#set($layoutLocalService = $serviceLocator.findService("com.liferay.portal.service.LayoutLocalService"))

#set($longClass = $portal.getClass().forName("java.lang.Long"))
#set($longClassPrimitive = $longClass.getDeclaredField("TYPE").get(null))
#set($httpServletRequestClass = $portal.getClass().forName("javax.servlet.http.HttpServletRequest"))
#set($themeDisplayClass = $portal.getClass().forName("com.liferay.portal.theme.ThemeDisplay"))
#set($requestVarsClass = $portal.getClass().forName("com.liferay.portal.theme.RequestVars"))
#set($navItemClass = $portal.getClass().forName("com.liferay.portal.theme.NavItem"))
#set($layoutClass = $portal.getClass().forName("com.liferay.portal.model.Layout"))

#set($requestVars = $requestVarsClass.getConstructor($httpServletRequestClass, $themeDisplayClass, $longClassPrimitive, $longClassPrimitive).newInstance($request, $themeDisplay, $layout.getAncestorPlid(), $layout.getAncestorLayoutId()))

#set($ancessorLayout = $layoutLocalService.getLayout($layout.getAncestorPlid()))
#set($currentNavItem = $navItemClass.getConstructor($requestVarsClass, $layoutClass).newInstance($requestVars, $ancessorLayout ))


работает на ура.

воскресенье, 15 июля 2012 г.

вторник, 8 мая 2012 г.

Автоматическое добавление имени разработчика в Elipse при создании новых типов и методов.

eclipse.ini
-Duser.name=George Zalizko

Preferences -> Java -> Code Style -> Code Templates -> Comments
Edit the Comment: Types

/**
* @author ${user}, ${date} ${time}
*
* ${tags}
*/


Automatically add comments for new types and methods
галочка тут.

воскресенье, 15 апреля 2012 г.

Qualification Round 2012. Problem A. Speaking in Tongues

Первый раз немножко поучаствовал в Google Code Jam. К сожаленью плотный график из разных дел не разрешил весь уикенд потратить на решение головоломок от гугла, но очень понравилось. Вот так решил первую задачку:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

public class Main {

 public static void main(String[] args) throws Exception {

  TreeMap<Character, Character> map = getMap();

  File inputFile = new File("A-small-attempt0.in");
  FileInputStream fileInputStream = new FileInputStream(inputFile);
  BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream));

  File outputFile = new File("out.txt");
  FileOutputStream fileOutputStream = new FileOutputStream(outputFile);
  BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(fileOutputStream));

  Integer t = Integer.valueOf(reader.readLine());

  String line = null;
  for (int i = 1; (line = reader.readLine()) != null && i <= t && i <= 30; i++) {
   if (i != 1) {
    writer.newLine();
   }

   writer.write("Case #" + i + ": ");

   for (int j = 0; j < line.length() && j <= 100; j++) {
    Character c = line.charAt(j);
    writer.write(map.get(c));
   }
  }

  reader.close();
  writer.close();
 }

 private static TreeMap<Character, Character> getMap() {
  TreeMap<Character, Character> map = new TreeMap<Character, Character>();
  map.put('a', 'y');
  map.put('o', 'e');
  map.put('z', 'q');
  map.put('q', 'z');

  String i = "ejp mysljylc kd kxveddknmc re jsicpdrysirbcpc ypc rtcsra dkh wyfrepkym veddknkmkrkcdde kr kd eoya kw aej tysr re ujdr lkgc jv";
  String o = "our language is impossible to understandthere are twenty six factorial possibilitiesso it is okay if you want to just give up";

  for (int n = 0; n < i.length(); n++) {
   map.put(i.charAt(n), o.charAt(n));
  }

  return map;
 }

 @SuppressWarnings("unused")
 private static void printMap(Map<Character, Character> map) {
  Iterator<Entry<Character, Character>> iterator = map.entrySet().iterator();
  int i = 0;
  while (iterator.hasNext()) {
   Entry<Character, Character> entry = iterator.next();
   System.out.println(++i + ". " + entry.getKey() + " -> " + entry.getValue());
  }
 }
}

надеюсь, они меня возьмут на работу :D