Friday, July 18, 2014

Running tomcat 7 under java8 in ubuntu 12.04

Latest tomcat version for ubuntu 12.04 is 7.0.26, which doesn't support java 8:

SEVERE: ContainerBase.addChild: start:
org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost].StandardContext[]]
    at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:895)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:871)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:615)
    at org.apache.catalina.startup.HostConfig.deployDirectory(HostConfig.java:1095)
    at org.apache.catalina.startup.HostConfig$DeployDirectory.run(HostConfig.java:1617)
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
    at java.util.concurrent.FutureTask.run(FutureTask.java:262)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at java.lang.Thread.run(Thread.java:745)
Caused by: org.apache.tomcat.util.bcel.classfile.ClassFormatException: Invalid byte tag in constant pool: 18
    at org.apache.tomcat.util.bcel.classfile.Constant.readConstant(Constant.java:131)
    at org.apache.tomcat.util.bcel.classfile.ConstantPool.<init>(ConstantPool.java:60)
    at org.apache.tomcat.util.bcel.classfile.ClassParser.readConstantPool(ClassParser.java:209)
    at org.apache.tomcat.util.bcel.classfile.ClassParser.parse(ClassParser.java:119)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsStream(ContextConfig.java:2032)
    at org.apache.catalina.startup.ContextConfig.processAnnotationsFile(ContextConfig.java:2011)

http://stackoverflow.com/questions/23484098/invalid-byte-tag-in-constant-pool-tomcat7-war-jdk-incompatibilty
https://issues.apache.org/bugzilla/show_bug.cgi?id=53735

So to use java 8 you have to upgrade tomcat. Newest version can be found in Ubuntu 14.04 (see Packages.gz).

To add this repo, edit /etc/apt/sources.list, add
deb http://ru.archive.ubuntu.com/ubuntu trusty main multiverse
at the end of the file. Then
sudo apt-get update
sudo apt-get install tomcat7

Next, this version of tomcat uses eclipse compiler to compile jsp. Bundled version has issue with java 8:

org.eclipse.jdt.internal.compiler.classfmt.ClassFormatException
    at org.eclipse.jdt.internal.compiler.classfmt.ClassFileReader.<init>(ClassFileReader.java:372)
    at org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:231)
    at org.apache.jasper.compiler.JDTCompiler$1.findType(JDTCompiler.java:187)
    at org.eclipse.jdt.internal.compiler.lookup.LookupEnvironment.askForType(LookupEnvironment.java:102)
    at org.eclipse.jdt.internal.compiler.lookup.UnresolvedReferenceBinding.resolve(UnresolvedReferenceBinding.java:49)
    at org.eclipse.jdt.internal.compiler.lookup.BinaryTypeBinding.resolveType(BinaryTypeBinding.java:122)

All you have to do is to add ecj-4.4M7.jar to /usr/share/java. Just google this file, I've founded it here: https://devtools.jahia.com/nexus/content/groups/public/org/eclipse/jdt/core/compiler/ecj/4.4M7/.
Also update symlinks eclipse-ecj.jar to point to ecj-4.4M7.jar instead of eclipse-ecj-3.5.1.jar.

Friday, June 6, 2014

Uptolike / кнопка "вверх"

На uptolike.com в модуле социальных кнопок появилась возможность добавить кнопку "Перейти в начало документа". Для этого в теге div необходимо добавить параметр data-top-button='true':
<script type="text/javascript">(function(w,doc) {
if (!w.__utlWdgt ) {
    w.__utlWdgt = true;
    var d = doc, s = d.createElement('script'), g = 'getElementsByTagName';
    s.type = 'text/javascript'; s.charset='UTF-8'; s.async = true;
    s.src = ('https:' == w.location.protocol ? 'https' : 'http')  + '://w.uptolike.com/widgets/v1/uptolike.js';
    var h=d[g]('body')[0];
    h.appendChild(s);
}})(window,document);
</script>
<div data-pid="###" ...  data-top-button='true' class="uptolike-buttons" ></div>
Кнопка добавляется в конец списка соц. сетей, перед многоточием. При нажатии на кнопку документ проскролится вверх.

Wednesday, March 5, 2014

Uptolike / рейтинги

На uptolike.com зарелизили модуль рейтингов. Смысл модуля - в подсчете лайков/анлайков на манер кнопок like соц сетей. Конкурентное преимущество состоит в том, что подсчет идет на основе профиля соц сети, то есть 2 раза проголосовать не получится даже с разных браузеров.


Как и в случае с кнопками, код отдается синхронный, он вполне подходит для страницы с одной конкретной статьей, но не очень для страницы со списком статей (например главная страница сайта).


Для списка статей, как и в случае с кнопками шар, есть специальная версия кода:

  1. Вставляем скрипт 
    <script src='http://w.uptolike.com/widgets/v1/uptolike.js' 
         type='text/javascript'></script>
    в <head>
  2. В нужное место кода вставляем <div> с классом uptolike-rating.

Заметьте, если вы уже вставили кнопки с помощью описанного мной подхода, то пункт 1 делать не нужно, скрипт уже добавлен.

Пример div:
<div class="uptolike-rating" data-count-clicks="true" 
    data-icon-color="cc0000" data-icon-size="14" 
    data-pid="1" data-url="http://penkovvladimir.blogspot.ru/"><div>


Параметры следующие:

  • data-url - адрес страницы, на которой размещена статья
  • data-pid - идентификатор проекта на сайте Uptolike
  • data-like-layout - порядок элементов в блоке like. 3 буквы 't' = текст, 'i' = иконка, 'c' = счетчик. Например, tic = текст-иконка-счетчик. ict=иконка-счетчик-текст. i - иконка
  • data-like-layout - порядок элементов в блоке like. 3 буквы 't' = текст, 'i' = иконка, 'c' = счетчик. Например, tic = текст-иконка-счетчик. ict=иконка-счетчик-текст. i - иконка
  • data-dislike-layout - порядок элементов в блоке dislike. Аналогично like-layout
  • data-icon-size - размер иконки в пикселях.
  • data-icon-style - стиль иконки. Число от 0 до 5
  • data-icon-color - цвет иконки. Формат "rrggbb"
  • data-text-size - размер текста в пикселях.
  • data-text-color - цвет текста. Формат "rrggbb"
  • data-count-clicks - true|false. Если true, то разрешает нажатие на кнопки. Если false, то выводит блок как статическую текстовую информацию.
  • data-like-text - текст блока like
  • data-like-title - подсказка блока like
  • data-dislike-text - текст блока dislike
  • data-dislike-title - подсказка для блока dislike
  • data-disable-tooltip - true|false. Если true, то подсказка не отображается.
Объясню смысл параметра data-count-clicks. С помощью него можно вывести блок, отображающий количество лайков, но не дающий возможности нажать на кнопку. Так сделано, к примеру, в youtube: под общим количеством просмотров у них выводится количество голосов, а кнопки для голоса выводятся в левой части блока.

Анализируя работу кода в firebug, видим что на сервер уходит всего 2 запроса: запрос на скрипт ratingModule.js и скомпанованный запрос на параметры каждого блока, что ни коим образом не нагружает загружку страницы.

Tuesday, February 4, 2014

Оптимизация кода uptolike.ru

Сегодня я поделюсь небольшим хаком по настройке социальных кнопок Uptolike!
Почему социальные кнопки и почему Uptolike? Все просто - этим сервисом я пользуюсь сам, но возможно, описанное ниже решение окажется полезным еще для кого-то.

Забегая немного вперёд, хочу сказать, что информация своего рода инсайдерская, возможно скоро и сами Uptolike прольют свет на такой способ размещения, но так приятно быть первым..

Tuesday, December 10, 2013

Tune spring remoting over http exporter

Noticed that using spring remoting over HttpInvokerProxyFactoryBean everything hangs when one of invokations is too long.

The problem is with SimpleHttpServerFactoryBean on server side. It turns out it handles requests on single thread by default. Solution:
package transport;

import org.springframework.remoting.support.SimpleHttpServerFactoryBean;
import java.util.concurrent.Executors;

public class ThreadedHttpServerFactoryBean extends SimpleHttpServerFactoryBean {

    public ThreadedHttpServerFactoryBean() {
        setExecutor( Executors.newFixedThreadPool( 50 ) );
    }
}

Here we gave 50 threads to http server.

Monday, November 25, 2013

im4java: float density parameter

IMOperation.density takes int as arguments, which is not a case. To pass double argument use:

double density = 144.65;
imOperation.addRawArgs( "-density", String.format( "%1.1f", density) );

Wednesday, October 30, 2013

Speed up tomcat

sudo mcedit /opt/site/conf/server.xml

find
    <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443" />

change to
    <Connector port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol"
               connectionTimeout="20000"
               URIEncoding="UTF-8"
               redirectPort="8443" />
done.