?

Log in

Оглавление. Sticky Post

Оглавление на память - несколько внутренних ссылок на мою уютненькую жежешечку для удобства навигации

Путешествия
Страховка для аренды автомобиля
На какие авиакомпании выгодно тратить мили Miles&More
Поиск бонусных билетов Star Alliance
Про аэропорт Веце (любителям Ryanair)
Дешёвые авиаперелёты
Наиболее гибкие поисковики авиабилетов
Про визы

Отчёты
Заставить себя писать отчёты достаточно тяжело, но я несколько осилил:
США, 2010. По США вышел пожалуй самый полный и подробный отчёт. Плюс саммари по поездке.
Германия-Дания, 2009
Андалусия, 2010

Проекты
Будучи программистом я разродился на несколько собственных проектов.
jSonde - Java profiler, analyzer & reverse engineering tool
L'evolution - моделирование точечных дефектов в кристаллических решётках; парные потенциалы и метод погружённого атома
lowcostair.ru - сайт о дешёвых авиаперелётах
К сожалению все эти проекты ныне заброшены из-за нехватки времени. Когда-нибудь я надеюсь к ним вернусь.

Всё остальное
Что делать если с вашей карты сняли деньги. На личном примере с Сбербанком
Выбор автомобиля за 300 - 400 тысяч рублей
Анализ рынка вакансий Java разработчиков в Санкт-Петербурге
Рассказ про некоторые IT-компании Петербурга, с которыми довелось сталкиваться
Музыкальные компиляции
Моя поэзия

Australia teaser

Tags:

Overbooking

Овербукинг - предлагают 400 евро на щщи за то чтобы лететь вечером другим рейсом.

Я зануда - полечу домой чтобы к обеду на работу выйти.

4 rooms

А сейчас чаевые беллбоям в отелях вообще принято давать? И сколько? Ну за то что сумки носят и.т.п.

Tags:

bravo
Иногда возникают ситуации когда нужно покупать билет у сторонних продавцов, а не у авиакомпаний напрямую - например когда на сайте а/к просто нету интересного мне рейса, или нету возможности делать мульти-сегментный поиск, или когда покупаешь билет не себе, а а/к требует чтобы держатель карты был одним из пассажиров, и.т.п.

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

Кто-нибудь сталкивался с хорошими продавцами? Основные требования:
  • Компетентный персонал
  • Мульти-сегментный поиск на сайте
  • Небольшие сборы за возврат/изменения в билетах

Второстепенные требования:
  • Желательно чтобы продавец "видел" билеты которых нет на сайтах а/к. Например AirBaltic с длинными остановками в Риге которые не доступны на сайте а/к
  • Удобный сайт
  • Продавец не должен быть самым дешёвым

Tags:

PayPal'а вопрос

Друзья, кто-нибудь пользуется PayPal?

У меня на paypal лежит 80 долларов. Я хочу купить билет на самолёт за 100 долларов.
Вопрос - можно-ли использовать имеющиеся на счету 80$ и доплатить оставшиеся 20$ с карточки?

Я попробовал и в итоге с карточки списались 100$ а 80$ остались нетронутыми.

Это я туплю или это be design?

Tags:

Субподряд

Коллега поделился замечательной ссылкой: http://www.theregister.co.uk/2013/01/16/developer_oursources_job_china/

Один чувак, "firm's top programmer", из US critical infrastructure company аутсорсил свою работу китайцам отдавая им 1/5 своей зарплаты. Вот так выглядит день ушлого программиста:
9:00 a.m. – Приходит в офис и два часа смотрит котиков в Интернетах
11:30 a.m. – Обед
1:00 p.m. – Ebay
2:00 p.m. – Facebook, LinkedIn
4:30 p.m. – Отчитывается перед руководством о проделанной китайцами работе
5:00 p.m. – Домой

"Bob is no longer employed by the firm. ®"
Вот такая несправедливость, хотя судя по статье работа была выполнена хорошо

Tags:

В Лаппеенранте у русского туриста украли продукты
tumblr_lmcuzdJ7a51qazntwo1_500

Когда приехали на такс фри на границе, то открыли багажник и увидели что все продукты украдены

Tags:

Plans for the New Year



Планы на ближайше дни:
23.12 - в 8 утра вылетаю в Амман
24.12 - утром на автобусе едем до границы (мост короля Хуссейна) и дальше в Иерусалим
25.12 - смотрим как евреи празднуют рождество
26.12 - Ад и Израиль
27.12 - возвращаемся в Амман и вечером берём тачку
28.12 - горячие источники на мёртвом море
29.12 - утром выезжаем в Петру; ночь в Петре
30.12 - Вади Рам; возвращаемся ночевать в Петру
31.12 - Шобак и Карак; возвращаемся в Амман на новогоднюю пати
01.01- замки в пустные
02.01 - Джераш, Аджлюн, Ум Кайс; вечером возвращаю машину
03.01 - Амман
04.01 - вылетаем назад в Россию


Всех с наступающим

Tags:

Полуостров Snæfellsnes

Полуостров Snæfellsnes находится на западе Исландии, к северу от столицы страны. Мы провели здесь один день, объехав полуостров против часовой стрелки на автомобиле. Картинка для привлечения внимания:

Read more...Collapse )

Krafla

Крафла - вулкан в Исландии а также зона вулканической активности вокруг него. Одно из самых мимимишных мест в Исландии.
Находится на севере страны рядом с озером Миватн - пропустить с ring road невозможно.

1. Бурлящий прудик

Ещё 21 картинкаCollapse )

Tags:

Peru - May'2013

На майские праздники полечу посмотреть видно-ли что-нибудь в Мачу-Пикчу:


Стоит это, страшно сказать, аж 12 тыщ рублей:

Tags:

Упрямства пост

Люди очень упрямы в своей вере:
1
Между прочим профессионалы своего дела:
2
Moar примеров в ru_travel по тегу "юмор". Например вот

Tags:

ByteBuffer (as well as System.arrayCopy) supports overlapping copying inside itself:

@Test
public void testCopyDirectByteBufferOverlapping() {
    ByteBuffer byteBuffer = (ByteBuffer)ByteBuffer.allocateDirect(3).put((byte)'a').put((byte)'b').put((byte)'c').flip();
    System.out.println((char) byteBuffer.get(0) + "" + (char) byteBuffer.get(1) + "" + (char) byteBuffer.get(2));
    byteBuffer.put((ByteBuffer)byteBuffer.duplicate().position(1));
    System.out.println((char) byteBuffer.get(0) + "" + (char) byteBuffer.get(1) + "" + (char) byteBuffer.get(2));
}

This test prints:

abc
bcc

Tags:

S&M

sssshhssss подсказал место в Санкт-Петербурге где можно на большом экране и с хорошим звуком смотреть записи концертов. Вчера ходили на S&M Metallica c симфоническим оркестром Сан-Франциско - очень круто. Можно посмотреть концерт попивая пиво сидя на удобном диванчике без потных металлюг вокруг.


LyricsCollapse )

Tags:

Event Listeners in Spring

It's very easy to create event listeners in Spring. For example we need to flush some caches on some actions. At first lets define an event listener interface and event class:
import java.util.EventListener;

public interface CacheReloadListener extends EventListener {

    void onCacheReload(CacheReloadEvent cacheReloadEvent);

}

import java.util.EventObject;

public class CacheReloadEvent extends EventObject {

    public CacheReloadEvent(Object source) {
        super(source);
    }

}


That's it! We can now inject all listeners together with their bean ids to any bean:

import javax.inject.Inject;
import javax.inject.Named;
import java.util.Collections;
import java.util.Map;

@Named
public class Notificator {

    private final Map<String, CacheReloadListener> cacheReloadListeners;

    @Inject
    public Notificator(Map<String, CacheReloadListener> cacheReloadListeners) {
        this.cacheReloadListeners = Collections.unmodifiableMap(cacheReloadListeners);
    }

    public void fireCacheReloadEvent() {
        for (CacheReloadListener cacheReloadListener : cacheReloadListeners.values()) {
            cacheReloadListener.onCacheReload(new CacheReloadEvent(this));
        }
    }

}


Isn't it nice?

Tags:

HashMap.get() performance on Java 7

I have created a simple test to test HashMap get() operation performance:
import java.util.*;

public class TestHashMap {

    private static final int MAP_SIZE = 100000;

    public static void main(String... args) {
        Map<String,String> map = new HashMap<String,String>();
        for (int i = 0; i < MAP_SIZE; i++) {
            map.put("key" + i, "value" + i);
        }
        makeMultipleReads(map, 15000); // warmup
        long start = System.currentTimeMillis();
        makeMultipleReads(map, 10000000);
        long end = System.currentTimeMillis();
        System.out.println(end-start);
    }

    private static void makeMultipleReads(Map<String,String> map, int steps) {
        for (int i = 0; i < steps; i++) {
            assert null != map.get("key" + (i % MAP_SIZE));
        }
    }

}

Let's compile it and execute using JRE 1.6.0_35 and 1.7.0_07 (both executed on Linux x64):
[dbedrin@localhost tmp]$ vi TestHashMap.java
[dbedrin@localhost tmp]$ /opt/jdk1.6.0_35/bin/javac TestHashMap.java 
[dbedrin@localhost tmp]$ /opt/jdk1.6.0_35/bin/java -ea TestHashMap
1552
[dbedrin@localhost tmp]$ /opt/jdk1.7.0_07/bin/java -ea TestHashMap
1097


I have backported HashMap from OpenJDK7 but it didn't help to improve the performance on JRE 1.6
You can use any other classes as a map key with the same results (originally I've spotted it using ByteBuffer's as a key), so it's not related to new hash functions introduced for Strings in Java 7.

Where did these 50% come from?


UPD: It turned out to be caused by -XX:+UseCompressedOops
More details here: http://ru-java.livejournal.com/1102606.html

Tags:

Nothing to envy

Разжился книгой про Северную Корею Nothing To Envy by Barbara Demick. А ещё говорят что репортёрам (тем более американским) туда не попасть
dprk-dmsp-dark

Tags:

Let's now increase the response size to 512 kilobytes and test the open-circuit HTTP server in 8 concurrent keep-alive connections.

The difference between java IO and NIO in blocking thread-per-connection model becomes significant: 7833 requests per seconds for IO vs 11520 rps for NIO. Whoa - that's a big difference. 11520 rps is approximately 45 gigabits per second.

We'll get back to these results later (I'm still not ready to summarize the results) and now I'll talk about buffering and Nagle's algorithm. Let's decrease the response size to 2 kilobytes and split it into two chunks:
private final static byte[] dataChunk1;
private final static byte[] dataChunk2;

private final static byte[] data;

static {

    byte[] responseBody = new byte[2*1024];

    data = ("HTTP/1.1 200 OK\r\n" +
            "Connection: Keep-Alive\r\n" +
            "Content-Type: text/plain\r\n" +
            "Content-Length: " + (responseBody.length) + "\r\n\r\n" +
            new String(responseBody)).getBytes();

    dataChunk1 = new byte[data.length / 2];
    dataChunk2 = new byte[data.length - dataChunk1.length];

    System.arraycopy(data, 0, dataChunk1, 0, data.length / 2);
    System.arraycopy(data, data.length / 2, dataChunk2, 0, data.length - data.length / 2);

}

Server will send the response using two consequence OutputStream.write(byte[]) calls:
//os.write(data);
os.write(dataChunk1);
os.write(dataChunk2);
os.flush();


Starting wrt.... WTF?
[dbedrin@localhost wrk-master]$ ./wrk -t 8 -c 8 -r 800 http://localhost:8090/
Making 800 requests to http://localhost:8090/
8 threads and 8 connections
Thread Stats Avg Stdev Max +/- Stdev
Latency 39.97ms 51.49us 40.26ms 74.88%
Req/Sec 0.00 0.00 0.00 100.00%
800 requests in 3.96s, 1.63MB read
Requests/sec: 201.93
Transfer/sec: 421.82KB


We've degraded from ~200000 RPS to miserable 200 requests per second. It's caused by Nagle's algorithm. In Java you can disable it using Socket.setTcpNoDelay(true) method. It brings us to ~135000 RPS - much better comparing to 200 but still far from initial 200K.

Introducing BufferedOutputStream (TCP_NODELAY option isn't important any more in this case) brings us to initial performance of 200K RPS:
BufferedOutputStream bos = new BufferedOutputStream(os, data.length);
while (!Thread.interrupted()) {
    inputStream.read(readBuffer);
    bos.write(dataChunk1);
    bos.write(dataChunk2);
    bos.flush();
}


When using NIO we can disable Nagle's algorithm using SocketChannel.setOption(StandardSocketOptions.TCP_NODELAY, true) method.
It will give us 140K rps comparing to 210K rps when response is sent in a single chunk. Good, but how can we get initial performance of 210K requests per second?

There's no BufferedOutputStream analog for channels - instead SocketChannel implements GatheringByteChannel interface with following methods:
public long write(ByteBuffer[] srcs, int offset, int length)
        throws IOException;


Utlizing this method brings us to performance of 187K rps:
ByteBuffer[] chunks = new ByteBuffer[]{ dataChunk1, dataChunk2};

while (!Thread.interrupted()) {

    s.read(readBuffer);
    readBuffer.rewind();

    long total = data.limit();
    while ((total -= s.write(chunks)) > 0);
    dataChunk1.rewind();
    dataChunk2.rewind();

}


Not as good as 210K but it doesn't consume any additional memory which is great! We can create our own buffer similar to BufferedOutputStream which will increase performance a bit up to 195 RPS:
buffer.put(dataChunk1).put(dataChunk2).flip();
while (buffer.remaining() > 0) {
    s.write(buffer);
}
buffer.clear();

dataChunk1.rewind();
dataChunk2.rewind();


The throughput increase isn't significant so I assume that it's better to keep the memory usage low and use GatheringByteChannel.

Summary:
TechnologyThroughput (requests per second)
IO; 1 chunk200 000
IO; 2 chunks200
IO; 2 chunks; disabled Nagle135 000
IO; 2 chunks; BufferedOutputStream200 000
NIO; 1 chunk210 000
NIO; 2 chunks200
NIO; 2 chunks; disabled Nagle140 000
NIO; 2 chunks; self-written buffer195 000

Tags:

Latest Month

January 2016
S M T W T F S
     12
3456789
10111213141516
17181920212223
24252627282930
31      

Syndicate

RSS Atom
Powered by LiveJournal.com
Designed by Kenn Wislander