-неизвестно

 -Поиск по дневнику

Поиск сообщений в ATUM

 -Подписка по e-mail

 

 -Постоянные читатели

 -Статистика

Статистика LiveInternet.ru: показано количество хитов и посетителей
Создан: 17.02.2006
Записей:
Комментариев:
Написано: 1139




Мечты составляют половину реальности....(Жозеф ЖУБЕР) В этом мире все когда-то было мечтой...

Сортировка шелла java

Вторник, 08 Апреля 2014 г. 10:48 + в цитатник
http://www.java2s.com/Tutorials/Java/Algorithms/Shell_sort_implementation_in_Java.htm


public class Main {
public static void main(String[] args) {
int maxSize = 10;
ShellSort arr = new ShellSort(maxSize);
/*w w w . j a va2 s. co m*/
for (int j = 0; j < maxSize; j++) {
long n = (int) (java.lang.Math.random() * 99);
arr.insert(n);
}
arr.display();
arr.shellSort();
arr.display();
}
}
 
class ShellSort {
private long[] data;
 
private int len;
 
public ShellSort(int max) {
data = new long[max];
len = 0;
}
 
public void insert(long value) {
data[len] = value;
len++;
}
 
public void display() {
System.out.print("Data:");
for (int j = 0; j < len; j++)
System.out.print(data[j] + " ");
System.out.println("");
}
 
public void shellSort() {
int inner, outer;
long temp;
// find initial value of h
int h = 1;
while (h <= len / 3)
h = h * 3 + 1; // (1, 4, 13, 40, 121, ...)
 
while (h > 0) // decreasing h, until h=1
{
// h-sort the file
for (outer = h; outer < len; outer++) {
temp = data[outer];
inner = outer;
// one subpass (eg 0, 4, 8)
while (inner > h - 1 && data[inner - h] >= temp) {
data[inner] = data[inner - h];
inner -= h;
}
data[inner] = temp;
}
h = (h - 1) / 3; // decrease h
}
}
 
}

Метки:  

hibernate

Пятница, 04 Апреля 2014 г. 10:26 + в цитатник

Метки:  

HTML5Game Arkanoid game in JavaScript and HTML5 Canvas

Среда, 26 Марта 2014 г. 10:52 + в цитатник

Метки:  

Без заголовка

Четверг, 20 Марта 2014 г. 13:20 + в цитатник
import java.io.*;
import javax.servlet.*;
 
// программа реализует интерфейс Servlet
class DoloadServlet implements Servlet
{
ServletConfig config; // объект ServletConfig
 
public DoloadServlet() {} // ничего не делает
 
// при инициализации сохраняем config
public void init(ServletConfig config) throws ServletException
{this.config = config;}
 
// выдаёт сохранённый config
public ServletConfig getServletConfig() {return config;}
 
// информация о сервлете
public String getServletInfo() {return "DoloadServlet";}
 
public void destroy() {} // ничего не делает
 
// обработка запроса
public void service(ServletRequest request, ServletResponse response)
throws ServletException, java.io.IOException
{
// разбирать запрос мы не будем, просто срязу
// создаём HTTP заголовок:
 
String head = "HTTP/1.0 200 OK\n"+
+ "Server: DoloadServlet\n"
+ "Content-Type: text/html; charset=windows-1251\n"
+ "Connection: Keep-Alive\n"
+ "Content-Encoding: multipart/mixed\n"
+ "Transfer-Encoding: chunked"
+ "Pragma: no-cache\n\n";
 
// теперь добавляем первоначальные данные
// для этого примера — 20 тэгов "<br>" с переносом строки
for(int i = 0; i < 20; i++) head = head + "<br>\n";
 
// берём поток вывода
ServletOutputStream os = response.getOutputStream();
 
// пишем туда заголовок и первоначальные данные
os.print(head);
 
// отправляем всё записаное в буффер к клиенту
response.flushBuffer();
 
// начинаем добавлять новые строки:
// эти строки будут выглядеть следующим образом:
// номер строки, потом "<br>\n"
// каждая новая строка будет появляться раз в 3 секунды
int i = 0;
while(true)
{
// инкримент счётчика
i++;
 
// пишем строку
os.print(""+i+"<br>\n");
 
// сброс буффера
response.flushBuffer();
 
// примораживаем поток на 3 секунды
try {sleep(3000);}
catch(Exception e){}
}
}
}

Без заголовка

Четверг, 20 Марта 2014 г. 13:19 + в цитатник
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.util.zip.*;
 
// сервлет является наследником HttpServlet
public class ZipServlet extends HttpServlet
{
// функция обработки метода GET
public void doGet(HttpServletRequest request,
HttpServletResponse response)
throws ServletException, IOException
{
// устанавливаем, что страничка является HTML документом
response.setContentType("text/html");
 
// берём параметр "Accept-Encoding" из HTTP заголовка
String encodings = request.getHeader("Accept-Encoding");
 
// берём параметр "encoding" — ранее заданная кодировка документа
String encodeFlag = request.getParameter("encoding");
 
// Куда будем выводить
PrintWriter out;
 
// если поле "Accept-Encoding" в запросе присутствует
if(encodings != null)
{
// и если это поле содержит значение "gzip",
// а кодировка ещё не была установлена,
if((encodings.indexOf("gzip") != -1)
&&!encodeFlag.equals("none"))
{
// то то, куда будем выводит, будет за одним
// и сжимать текст с помощью GZIP
out = new PrintWriter(new GZIPOutputStream(
response.getOutputStream()), false);
 
// и устанавливаем флаг для браузера,
// что документ будет сжат
response.setHeader("Content-Encoding", "gzip");
}
else // в противном случае выводить будем без сжатия
out = response.getWriter();
}
else // в противном случае выводить будем без сжатия
out = response.getWriter();
 
 
out.println("This a test!!!"); // пишем тело документа
out.close(); // и закрываем вывод.
 
//Всё, по завершению работы этой ф-ии,
// документ будет отправлен
}
}

Без заголовка

Четверг, 20 Марта 2014 г. 11:15 + в цитатник
http://y3x.ru/2012/10/tomcat6-accesslogvalve/


Из дополнительных ключей я бы выделил:
%m – метод обращения (GET, HEAD, POST, PUT, OPTIONS и др.)
%q – параметры запроса, все что было у пользователя в адресной строке после знака вопроса.
%U – путь запроса, все что было у пользователя до знака вопроса.
%r – объединяет все три ключа

%m %U%q
%s – код ответа сервера (200, 404, 500 и т.д.)
%u – логин удаленного аутентифицированного пользователя.

Дату и время позволяют получать следующие ключи:
%t – когда обрабатывался запрос.
%D – сколько времени потребовалось на обработку запроса в миллисекундах.
%T – сколько времени потребовалось в секундах.

Параметры заголовков запроса можно получить по аналогии с %{User-Agent}i и %{Referer}i. Главное знать их точное название и указать i для входящих заголовков, o для исходящих. Для получения информации о cookie нужно добавлять c.

Параметры запроса, которые можно получить по ключу могут быть следующими:
%{Accept}i – типы контента который может принять пользователь (его браузер). В результате в лог может попасть примерно следующее:

text/html,application/xhtml+xml,application/xml
%{Accept-Charset}i – кодировки, которые понимает браузер пользователя. Например:

ISO-8859-1,utf-8;q=0.7,*;q=0.3
%{Accept-Encoding}i – какие способы упаковки данных можно использовать. В логах может оказаться такая информация:
Chromium:

gzip,deflate,sdch
Opera, Firefox:

gzip, deflate
%{Accept-Language}i – языки, которые поддерживает браузер.
Например:

en-US,en
В общем, есть богатое поле для экспериментов.

алгоритмы java

Среда, 19 Марта 2014 г. 15:29 + в цитатник

Метки:  

Algorithms and clients in the textbook

Вторник, 25 Февраля 2014 г. 11:37 + в цитатник
Algorithms and clients in the textbook

http://algs4.cs.princeton.edu/code/

Метки:  

FutureResult

Вторник, 25 Февраля 2014 г. 10:53 + в цитатник
Листинг 2. Использование FutureResult для улучшения кэширования


public class FileCache {
private Map cache = new HashMap();
private Executor executor = new PooledExecutor();

public void get(final String name) {
FutureResult result;

synchronized(cache) {
result = cache.get(name);
if (result == null) {
result = new FutureResult();
executor.execute(result.setter(new Callable() {
public Object call() { return loadFile(name); }
}));
cache.put(result);
}
}
return result.get();
}
}

Метки:  

java date time

Пятница, 21 Февраля 2014 г. 13:34 + в цитатник

Метки:  

count(order)

Четверг, 20 Февраля 2014 г. 23:20 + в цитатник
select order, count(order) from my_table_name group by order


SELECT gameId , count( * ) as count FROM PaymentReqLog
group by gameId order by count desc
limit 10;


SELECT online_report_name, gameId , count( * ) as count FROM ReqLog p
ReqName group by gameId order by count desc
limit 10

Метки:  

Бизнес идея

Четверг, 20 Февраля 2014 г. 15:26 + в цитатник
отправлять нотификации на номер телефона (нужна база пользователей и приложение через которые он его получит )

биржа приложений

Метки:  

count(*) mysql top 10

Среда, 19 Февраля 2014 г. 23:13 + в цитатник

SELECT country_column as country, count(country_column) as c FROM COUNTRIES_TABLE group by country order by c desc limit 10;

Метки:  

MappedByteBuffer java

Понедельник, 17 Февраля 2014 г. 11:10 + в цитатник
MappedByteBuffer

RandomAccessFile raf = new RandomAccessFile("test.test","rw");
raf.writeInt(145);
raf.writeUTF(" ");
raf.writeUTF("afdfjhf");
raf.writeUTF(" ");
FileChannel fchan = raf.getChannel();
System.out.println(fchan.size());
MappedByteBuffer buf = fchan.map(FileChannel.MapMode.READ_WRITE,0,fchan.size() );

Метки:  

haskell

Вторник, 11 Февраля 2014 г. 15:15 + в цитатник

Метки:  

алгоритмы java

Вторник, 11 Февраля 2014 г. 14:42 + в цитатник

Метки:  

...

Понедельник, 10 Февраля 2014 г. 15:02 + в цитатник

public class MaxMem {
public static void main(String[] args) {
Object ref = new long[Integer.MAX_VALUE]; // максимально для массива т.к. индекс массива int
}
}


~ 16 Гб (8 байт * MAX_VALUE)


...

BigInteger b = new BigInteger("8");
BigInteger b1 =new BigInteger(""+Integer.MAX_VALUE);
b = b.multiply(b1);
System.out.println(b);
BigInteger mb = b.divide(new BigInteger("1024")).divide(new BigInteger("1024"));
System.out.println(mb+ " mb");

17179869176 byte
16383 mb

Exception in thread "main" java.lang.OutOfMemoryError: Requested array size exceeds VM limit
at newpackage.puzzles.puzzle7.MaxMem.main(MaxMem.java:19)
Java Result: 1

java uml doc

Четверг, 06 Февраля 2014 г. 11:37 + в цитатник

Метки:  

GWT gwt-dispatch

Четверг, 06 Февраля 2014 г. 11:21 + в цитатник

Метки:  

java списки node

Среда, 05 Февраля 2014 г. 13:11 + в цитатник

Метки:  

gxt vs gwt

Среда, 05 Февраля 2014 г. 09:23 + в цитатник

Метки:  

BufferedReader.lines java

Среда, 05 Февраля 2014 г. 09:14 + в цитатник
public static void main(String[] args) {
try (BufferedReader reader = Files.newBufferedReader(
Paths.get("myfile.txt"),
StandardCharsets.UTF_8)) {
System.out.println(reader.lines().count());
} catch (IOException ex) {
}
}
Print out all the lines:
 
public static void main(String[] args) {
try (BufferedReader reader = Files.newBufferedReader(
Paths.get("myfile.txt"),
StandardCharsets.UTF_8)) {
reader.lines().forEach(System.out::println);
} catch (IOException ex) {
}
}
Print out the longest line in a file:
 
public static void main(String[] args) {
try (BufferedReader reader = Files.newBufferedReader(
Paths.get("myfile.txt"),
StandardCharsets.UTF_8)) {
System.out.println(reader
.lines()
.mapToInt(String::length)
.max()
.getAsInt());
} catch (IOException ex) {
}
}

Метки:  

netbeans maven gwt

Понедельник, 03 Февраля 2014 г. 16:00 + в цитатник

Метки:  

java уроки

Четверг, 23 Января 2014 г. 14:12 + в цитатник
System.out.println(Double.valueOf("NaN")); //NaN

Метки:  

программирование

Среда, 22 Января 2014 г. 09:55 + в цитатник

Метки:  

InputStream в String и обратно

Понедельник, 20 Января 2014 г. 11:09 + в цитатник
Java: InputStream в String и обратно

Начну с простого: как представить строку в виде InputStream:

InputStream is= new ByteArrayInputStream(str.getBytes(Charset.forName(strCharset)));

Здесь str - исходная строка, strCharset - кодировка, с использованием которой символы строки будут лежать в InputStream, ну и is - результирующий поток.
Для обратного преобразования вариантов много, один из них - читать символы в цикле, пока не кончится поток. Но можно сделать это короче, с помощью Apache Commons IO:

StringWriter writer = new StringWriter();
IOUtils.copy(is, writer, strCharset);
String str= writer.toString();

Метки:  

java

Суббота, 18 Января 2014 г. 00:33 + в цитатник
тогда маппинг будем проходить следующим образом, вместо аннотации @Table(name="STUDENT") напишем
@NamedNativeQuery(name="getAllStudent",query="{? = call get_all_students}", callable=true, resultClass=Student.class)
А вызов этой функции будет следующим:
List student = (List) session.getNamedQuery("entity").list();

Ну, а чтобы вызвать нашу процедуру save_book проделаем следующие манипуляции:
CallableStatement st = session.connection().prepareCall("{call save_book(?,?,?)}");
st.setLong(1,0);
st.setString(2, "Золотой ключик, или Приключения Буратино");
st.setString(3,"повесть-сказка Алексея Николаевича Толстого");
st.registerOutParameter(1, java.sql.Types.NUMERIC);
st.execute();
System.out.println(st.getLong(1));


http://habrahabr.ru/post/132385/









Метки:  

java book

Пятница, 17 Января 2014 г. 20:52 + в цитатник

Метки:  

Отправка JMS сообщения

Пятница, 17 Января 2014 г. 13:40 + в цитатник
//Отправка JMS сообщения 
 
 
@Resource(mappedName="jms/ConnectionFactory")
private static ConnectionFactory connectionFactory;
 
@Resource(mappedName="jms/Queue")
private static Queue queue;
 
 
connection = connectionFactory.createConnection();
session = connection.createSession(true,
Session.SESSION_TRANSACTED);
messageProducer = session.createProducer(queue);
 
message = session.createTextMessage();
 
for (int i = 0; i < NUM_MSGS; i++) {
message.setText("This is message " + (i + 1));
System.out.println("Sending message: " +
message.getText());
messageProducer.send(message);
}



//Получение JMS сообщения 
 
@MessageDriven(mappedName="jms/Queue", activationConfig = {
@ActivationConfigProperty(propertyName =
"destinationType",
propertyValue =
"javax.jms.Queue")
})
public class SimpleMessageBean implements MessageListener {
 
public void onMessage(Message inMessage) {
TextMessage msg = null;
 
try {
if (inMessage instanceof TextMessage) {
msg = (TextMessage) inMessage;
logger.info("MESSAGE BEAN: Message received: " +
msg.getText());
} else {
logger.warning("Message of wrong type: " +
inMessage.getClass().getName());
}
} catch (JMSException e) {
e.printStackTrace();
mdc.setRollbackOnly();
} catch (Throwable te) {
te.printStackTrace();
}
}
 

Метки:  

Магнит

Четверг, 16 Января 2014 г. 10:28 + в цитатник

Метки:  

android api lib.ru epub books

Четверг, 16 Января 2014 г. 09:41 + в цитатник

Метки:  

flightradar24

Пятница, 10 Января 2014 г. 21:41 + в цитатник
http://www.airfleets.net/home/

http://www.flightradar24.com/

Самолеты и их история

Метки:  

java 7 vs php

Пятница, 10 Января 2014 г. 16:23 + в цитатник

Метки:  

Java html parser

Понедельник, 06 Января 2014 г. 14:22 + в цитатник

Метки:  

чтение файла java

Пятница, 20 Декабря 2013 г. 22:33 + в цитатник

final String FILE_NAME = "d:\\CSV_Files\\test1.txt";
Reader reader = new FileReader( new File( FILE_NAME ) );
// размер буфера 512
BufferedReader bufferedReader = new BufferedReader( reader , 512 );
String line;

while ( ( line = bufferedReader.readLine() ) != null )
System.out.println( line );

Метки:  

Собеседование по Java concurrency

Пятница, 29 Ноября 2013 г. 11:56 + в цитатник
Собеседование по Java concurrency

http://swein2.blogspot.ru/2011/10/concurrency.html


Нашел интересный список из over 50 вопросов к интервью по Java concurrency и многопоточности. На все старался отвечать честно, что совсем не знал - гугл (~11 вопросов в основном на тему хитрых названий).

Ниже то что получилось.


Назовите различия между Collections.synchronizedMap(new HashMap()) и ConcurrentHashMap.
SynchronizedMap оборачивает обычный Map используя единственный монитор для блокировки,
тогда как ConcurrentHashMap
позволяет делать неблокирующее чтение (но можно увидеть старые\невалидные данные)
на запись делит map на секции, к каждой из которых идет свой объект блокировки (это уменьшает общее время ожидания)
Что такое кооперативная многозадачность и есть ли она в Java. Если да, то какие преимущества. Если нет, то какая тогда в Java?
Способ деление времени CPU между потоками при котором каждый поток обязан отдавать управление следующему добровольно.

Преимущества - возможно меньшие накладные расходы на переключение контекста если среда исполнения полностью нами контролируется (нет лишних переключений контекста)

Недостатки - если один поток завис или ведет себя некорректно то вся система зависла и другие потоки никогда не получат управление.

В Java - вытесняющая многопоточность.
Что такое "зеленый потоки" и есть ли они в Java (в HotSpot JVM.6)?
Легковесные потоки (эмулируемые) виртуальной машиной или средой исполнения..

не подрузамевают под собой реального создания соотв. потоков ОС, как следсвие нет переключения между USER и KERNEL режимами ядра ос. В Java6 нету.
Различия в интерфейсах Runnable и Callable.
первый не может вернуть результат или бросить Exception, оба - обертки кода для вызова из других потоков
Напишите минимальный неблокирующий стек (всего два метода — push() и pop()).
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class Stack {

private final AtomicReference> headRef = new AtomicReference>(null);

public void push(T value) {
Element newHead = new Element();
newHead.value = value;
Element oldHead;
do {
oldHead = headRef.get();
newHead.next = oldHead;
} while (!headRef.compareAndSet(oldHead, newHead));
}


public T pop() {
Element oldHead = null;
Element newHead = null;
do {
oldHead = headRef.get();
if (oldHead == null) {
return null;
}
newHead = oldHead.next;
} while (!headRef.compareAndSet(oldHead, newHead));
return oldHead.value;
}


public static class Element {
private T value;
private Element next;
}

}
Напишите минимальный copy-on-write ArrayList (всего четыре метода — void add(int indx, int item), int get(int indx), void remove(int indx), int size()).
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
public class CopyOnWriteArrayList {

private volatile Object[] array = new Object[0];

public void add(int index, T item) {
if (index < 0) {
throw new IllegalArgumentException();
}
boolean needsModification = index > array.length - 1;
if (!needsModification) {
if (item == null) {
needsModification = array[index] != null;
} else {
needsModification = item.equals(array[index]);
}
}

if (needsModification) {
final Object[] newArray = Arrays.copyOf(array, Math.max(array.length, index + 1));
newArray[index] = item;
array = newArray;
}
}

public void remove(int index) {
if (index < 0 || index >= array.length) {
throw new IllegalArgumentException();
}
int newSize = array.length - 1;
if (newSize < 0) {
newSize = 0;
}
final T[] newArray = (T[]) new Object[newSize];
System.arraycopy(array, 0, newArray, 0, index);
if (index + 1 < newSize) {
System.arraycopy(array, index + 1, newArray, index, newSize - index);
}
array = newArray;
}

public T get(int index) {
return (T)array[index];
}

public int size() {
return array.length;
}
}
Различя между Thread.isInterrupded() и Thread.interrupted().
interrupted() проверяет флаг того что поток прерван и сбрасывает его, isInterrupded() ничего не трогает и можно вызывать несколько раз
Что происходит при вызове Thread.interrupt()?
Если поток
заблокирован на мониторе, ждет другой поток итп (wait, notify) - вылетит InterruptedException но флаг interrupted потока не поставится
Если поток ждет ввод-вывод на InterruptableChannel то тоже вылетит exception
Ecли поток ждет ввод-вывод то он тут же прекратится и выставится флаг Interrupted
Либо просто ставится статус Interrupted
Некоторые из следующих методов deprecated а некоторые и не были никогда реализованы. Какие? Thread.interrupt(), Thread.stop(), Thread.yield(), Thread.suspend(), Thread.resume(), Thread.join(), Thread.start(), Thread.run(), Thread.sleep().
stop(), suspend(), resume() - deprecated т.к. могут убить\остановить поток оставив его ресурсы в неизвестном\промежуточном состоянии которое не является валидным
interrupt() - прерывает поток если он занимается I/O и выставляет флаг interrupted
yield() - принудительно передает квант времени следующему потоку
join() - текущий поток ждет другой поток
start() - стартует нитку
run() - стартует код в текущей нитке без порождения отдельного потока
sleep() - усыпить поток на некоторое время, не отпуская захваченные локи\мониторы\ресурсы
Что Вы знаете о асинхронных вызовов методов? Есть ли это в самом языке Java? Если есть, то как реализовано? Если нет, то как бы Вы реализовали?
Есть ExecutorService который принимает Callable, и возвращает интерфейс Future; это позволяет
заблокироваться и подождать завершения вычислений
следить за тем выполнен Callable или нет
отменить вычисление если оно не закончислось
Перечислите ВСЕ причины по которым может выскочить InterruptedException.
Поток ждет в wait, sleep(...), join() или заблокирован на длительное время аналогичным вызовом.. и из соседнего потока дернули interrupt()
Что изменилось между JMM до Java 5 и NewJMM после Java 5?
volatile дает более внятные happens before гарантии, не только на порядок присвоения самих volatile переменных но и на side-эффекты.
?
1
2
3
4
5
6
7
8
9
10
11
int a = 0;
int volatile b = 0;


a = 100;
b = 1;

//в другом потоке
if(b==1) {
// тут гарантируется что a == 100
}
Плюс стало возможным писать код вида
?
1
public volatile MyObject obj = new MyObject();
и быть уверенным что в момент когда из другого потока обратятся к полю obj, ссылка будет присвоена уже проинициализированному объекту и конструктор полностью отработает. В старой Memory model ссылка могла присвоиться не полностью собранному объекту из за эффекта переупорядочивания инструкции VM и CPU.
В классе String все поля финальные. Можно ли убрать ключевое слово финал? Ведь сеттеров все равно нет — следовательно поля нельзя переустановить.
Нет, т.к. final поля нужны для безопасной "публикации" объектов между потоками.
Что такое ordering, visibility, atomicity, happens-before, mutual exclusion. И показать на примерах volatile, AtomicInteger, synchronize{} — что из вышеперечисленного списка присутствует и при каких вариантах использования.
ordering - определяет когда один поток может увидеть out-of-order (т.е. неправильный) порядок исполнения инструкций другого потока. CPU может переупорядочивать и выполнять x86 инструкции в произвольном порядке для повышения пифоманса до тех пор пока для потока внутри не видно никаких отличий. Называется такая гарантия as-if-serial semantics. Проблемы же появляются когда нужно получать доступ из нескольких потоков к общей памяти - все эти side-эффекты вылезают. Решается с помощью механизмов публикации\синхронизации\гарантий Java Memory Model
visibility - определяет когда действия в одном потоке станут видны в другом потоке
atomicity - атомарность операций, операция выглядит как единая и неделимая операция которая либо выполнилась либо еще нет
Как правило все ошибки в многопоточном приложении попадают из за несоблюдения одного из 3х - visibility, atomicity, ordering
happens-before - логическое ограничение на порядок выполнения программы, термин используется в спеке по Java Memory Model. Например если мы говорим что запись в переменную A и последующее ее чтение связаны чз эту зависимость - то как бы не переупорядочивались инструкции в момент чтения мы должны видеть все size-эффекты от выполненной ранее операции записи.
volatile - дает гарантии happens-before на все присвоения переменных до текущего момента (так называемый read memory barrier)/li>
AtomicInteger - позволяет выполнять атомарные Compare-and-swap операции реализованные аппаратно в CPU. Основная выгода от CAS операций появляется только при условии что переключать контекст процессора с потока на поток менее выгодно чем немного покрутиться в цикле while пытаясь выполнить апдейт вида boolean compareAndSwap(oldValue, newValue). Если время потраченное в таком цикле превышает 1 квант потока то atomic переменные может быть невыгодно использовать с точки зрения производительности..
synchronize - создает mutex (взаимоисключающую блокировку) некоторого объекта, каждый поток которые не может захватить объект блокируется на неопределенное время. mutex - частный случай semaphore с единственным состоянием.
Назовите отличия synchronize{} и ReentrantLock.
synchronize - более примитивная конструкция которая обязывает нас отпустить monitor по окончании секции. Таким образом захват\освобождение всегда идут парами и всегда связаны с некоторым блоком кода
ReentrantLock - можно захватывать и освобождать мониторы в произвольном порядке, дает гибкость но сложнее сделать все правильно. Также есть опция fair - следить ли за "честным" порядком предоставления доступа\времени ожидания потоков на мониторе.
ReentrantLock - лучше масштабируется при росте числа потоков
Что из данных вызовов создает happend-before: Thread.sleep(), Thread.join(), Thread.yield(), Thread.start(), Thread.run(), Thread.isAlive(), Thread.getState()?
Только join(), start(), isAlive()
Перечислите известные Вам способы борьбы с priority inversion, назовите классы систем где они особенно опасны.
Опасны в real time системах, возникают из за особенностей планировщиков задач\прерываний. Способов предотвращения несколько -
отказ от прерываний на время выполнения критичного высокоприоритетного кода
временный подьем приоритета до максимального у каждой задачи которая захватила ресурс, чтобы предотвратить задвигание высокоприоритетных заблокированных на ресурсе задач в очереди ожидания низкоприоритетными и незаблокированными
Перечислите известные Вам способы 1)избежать 2)побороть возникшие deadlock-и (представьте, что вы пишете ядро RDBMS).
Чтобы избежать дедлоков -
Захватывать везде ресурсы в одинаковом порядке
или знать заранее какие ресурсы в каком порядке будут захвачены - строить граф переходов м-ду состояниями
Чтобы побороть дедлок
использовать тул для детекта заблокированных потоков
использовать эвристику вида - убивать один из двух потоков если оба взаимно блокируют друг друга. например можно поделить потоки на молодые и старые. более молодые потоки можно убивать при обнаружении что он пытается захватить ресурс используемый более старым потоком.
Расскажите о паттернах Reactor/Proactor?
Оба паттерна используются для высокопроизводительной обработки данных и разделения потока данных по worker-потокам. Основное отличие в том вычитывает ли listener сам данные или ждет пока это сделает callback, во многом на производительность и предпочтительный шаблон влияет наличие в ОС асинхронного ввода вывода и насколько хорошо он реализован. В Win - выигрывает Proactor, в *nix - Reactor.
Reactor - получил нотификацию что данные пришли, уведомил user callback, callback сам вычитал нужные данные, callback их обрабатывает
Proactor - полчил нотификацию что данные пришли, сам вычитал нужные данные в буфер, уведомил user callback чтобы тот забрал данные, callback их обрабатывает
Что такое "monitor"?
Объект для синхронизации. Используется для безопасного разделения ресурсов между потоками (Mutex).
Что такое "private mutex"?
Объект для синхронизации делается private, чтобы сторонний код не мог на него синхронизироваться и вдруг случайно получить deadlock.
Что такое "priority inheritance"?
Повышение приоритета текущей задачи которая захватила ресурс до максимально возможного.. чтобы избежать неправильного планирования других задач которые находятся в ожидании ресурса
Что такое "backoff protocol (exponential backoff)"?
Некоторая договоренность (алгоритм) между потоками (или нодами) что делать в случае конфликта. Например после неудачной попытки захватить ресурс интервал повторной попытки на каждом ноде должен вычисляться так чтобы минимизировать вероятность повторного конфликта\совпадения по времени с другими нодами.
Что такое "task stealing"?
Если очередь задач для потока исчерпана, поток может брать задачи у соседних потоков из очереди, выбирая , например, по времени их добавления.
Что такое "ABA problem"?
Возникает при compare-and-swap вызовах если значение переменной переполнилось (или совершило цикл\вернулось к старому значению). В этом случае механизм compare-and-swap перестает быть надежным.
Что такое "test-and-set"?
Аналогично compare-and-swap но при сравнении значение проверяется на 0.
Что такое "test-and-test-and-set"?
Перед использованием test-and-set стараемся предварительно проверить занят ли лок кем либо другим (например выполняем цикл пока некоторая shared-переменная не покажет что ресурс свободен)
Что такое "spin lock"?
Поток ждет освобождения lock'a проверяя в цикле условие\ресурс.
Что такое "sequential consistency"?
То же что и as-if-serial semantics, гарантии что в рамках одного потока побочные эффекты от всех операций будут такие, как будто все операции выполняются последовательно.
Что такое "sense-reversing barrier"?
Способ повторного использования для Barrier. В барьере хранится флаг sence, и в каждом потоке его использующем хранится аналогичный флаг в ThreadLocal переменной. Идея в том чтобы меняя эти флаги при вызове await() использовать барьер для поочередной разблокировки то одного потока то другого.
Что такое "safe publication"?
Показ объектов другим потокам из текущего, не нарушая ограничений visibility. Способы публикации в Java:
static{} инициализатор
volatile переменные
atomic переменные
сохранение в shared переменной, корректно защищенной с использованием synchronized()или Lock'и и другие конструкции создающие read/write memory barrier
final переменные в shared-объекте который был корректно проинициализирован
Что это за свойство — "reentrancy"?
Возможен повторный захват монитора, владельцем которого текущий поток уже является. Сильно упрощает код и позволяет делать рекурсивные вызовы, легче избежать deadlock'a.
Что такое "recursive parallelism"?
Разбиение задачи на подзадачи по методу разделяй-и-властвуй (divide-and-conqueer). Каждая задача решается в отдельном потоке.
Что такое "iterative parallelism"?
Разбиение задачи на независимые итерации, каждая итерация может считаться независимо в своем потоке.
Что это за вариант архитектуры "pipeline"?
Общий процессинг разбивается на стадии, каждая стадия выполняется собственным узлом; узлы связываются в конвеер так чтобы выход предыдущего узла попадал на вход следующего. Примерно так работает выполнение команд во всех современных x86 процессорах.
Что такое "poison message"?
Сообщение в очереди, которое превысило максимально допустимый срок жизни\максимальное количество попыток на повторную посылку или обработку.
Что такое "mutual exclusion"? Примеры как добиться в Java.
Критическая секция, семафор с одним состоянием; простейший пример - synchronized(obj) { ... }
Что такое "condition waiting"? Примеры как добиться в Java.
Вообще это называется guarded lock. Если поток захватил монитор и позвал wait() на нем чтобы дождаться некоторого состояния, проверка наступления этого события должна быть завернута в цикл вида
?
1
2
3
4
5
6
7
8
public synchronized guardedJoy() {
while(!joy) {
try {
wait();
} catch (InterruptedException e) {}
}
System.out.println("Joy and efficiency have been achieved!");
}
Преимущества ScheduledThreadPool перед java.util.Timer.
Timer имеет только один фоновый поток для исполнения, т.е. если задач много или они долгие - поток не справляется, время запуска других задачек сдвигается
Timer может умереть из за неожиданного RuntimeException полученного на выходе любой из TimerTask'ов
Timer криво работает если меняется системное время, т.к. он использует object.wait() чтобы дожидаться следующего момента исполнения
ScheduledThreadPool использует System.nanotime() который глючит на старых OC (winxp) и сильно зависит от версии OS и CPU
Различия между java.util.concurrent.Atomic*.compareAndSwap() и java.util.concurrent.Atomic*.weakCompareAndSwap().
weak не создает memory barrier и не дает гарантии happens-before
weak сильно зависит от нижележащего кеша\CPU, и может возвращать false без видимых причин и делать это часто
weak, как следствие, более легкая операция, но поддерживаемая далеко не всеми архитектурами и не всегда эффективная
Что в SynchronousQueue уникально для BlockingQueue.
SynchronousQueue имеет нулевой размер, используется для обмена между потоками, реализация такова что сам метод обмена хитро блокирует потоки друг на друга используя busy wait подход и затем передает объект от источника к потребителю минуя любые внутренние переменные.
Что такое "рандеву"? При помощи каких классов в Java его можно организовать?
Способ собрать запущенные потоки в "одном месте". Можно использовать Barrier, Latch, spin lock..
Что такое "false sharing". Может ли происходит в Java. Если есть, то приведите примеры и как бороться. Если нет, то как побороли разработчики JVM.
Эффект который происходит если данные\переменные нескольких потоков попадают в один cache line процессора. В этом случае на многопроцессорной системе контроллеру кеша приходится делать много лишних действий чтобы каждый раз удостовериться что линии кеша на различных CPU не рассинхронизовались. Решить проблему вроде как можно изменив layout конечной памяти\добавив данных для padding'a. В JVM вроде никак не решено.
Thread.getState() возвращает экземпляр Thread.State. Какие возможны значения?
new, runnable, waiting, time_wait, terminated, blocked
Напишите простейший ограниченный буфер для многих производителей/многих потребителей с использованием synchronize{}. С использованием ReentrantLock.
вариант с synchronized()
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
public class QueueUsingSynchronized {
private final Object[] array;
private final int maxSize;
// [Tail (cyclic adds)->] [.] [.] [Head (cyclic adds)->]
private int tail; // read from here (points to a filled element, if not null)
private int head; // add nodes here (points to a filled element, if not null)
private volatile int size = 0;
private Object isEmpty = new Object();
private Object isFull = new Object();

public QueueUsingSynchronized(int capacity) {
this.maxSize = capacity;
array = new Object[maxSize];
tail = 0;
head = 0;
size = 0; // publish
}

final int cycleInc(int index) {
return ++index == maxSize ? 0 : index;
}

public T get() throws InterruptedException {
if (size == 0) {
// get() sleeps until size becomes positive
synchronized (isEmpty) {
while (size < 1) {
isEmpty.wait();
}
}
}
try {
synchronized (this) {
final Object value = array[tail];

array[tail] = null;
if (size > 1) {
tail = cycleInc(tail);
}
size--;
return (T) value;
}
} finally {
// now we have some place for adding new values (size decreased by 1), wake up put()
synchronized (isFull) {
isFull.notify();
}
}

}

public void put(T value) throws InterruptedException {
if (value == null) {
throw new NullPointerException("Cannot add null value");
}
if (size == maxSize) {
// put sleeps until size < maxSize
synchronized (isFull) {
while (size == maxSize) {
isFull.wait();
}
}
}
synchronized (this) {
if (size == 0) {
//head == tail == null element , assign new value to head element
array[head] = value;
} else {
// increment then assign new value to head element
head = cycleInc(head);
array[head] = value;
}
size++;
}
// now we have some objects which can be retrieved by get (size increased by 1), wake up get()
synchronized (isEmpty) {
isEmpty.notify();
}
}

}

вариант с ReentrantLock
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
public class QueueUsingLock {
private volatile int size = 0;
private final Object[] array;
private final int maxSize;
// [Tail (cyclic adds)->] [.] [.] [Head (cyclic adds)->]
private int tail; // read from here (points to a filled element, if not null)
private int head; // add nodes here (points to a filled element, if not null)
private ReentrantLock lock = new ReentrantLock();
private Condition isEmpty = lock.newCondition();
private Condition isFull = lock.newCondition();

public QueueUsingLock(int capacity) {
try {
lock.lock();
this.maxSize = capacity;
array = new Object[maxSize];
tail = 0;
head = 0;
} finally {
lock.unlock(); // publish
}
}

final int cycleInc(int index) {
return ++index == maxSize ? 0 : index;
}

public T get() throws InterruptedException {
try {
lock.lockInterruptibly();
if (size == 0) {
// get() sleeps until size becomes positive
while (size < 1) {
isEmpty.await(); // release lock and sleep
}
}
final Object value = array[tail];

array[tail] = null;
if (size > 1) {
tail = cycleInc(tail);
}
size--;
// now we have some place for adding new values (size decreased by 1), wake up put()
isFull.signal();
return (T) value;
} finally {
lock.unlock();
}
}

public void put(T value) throws InterruptedException {
try {
lock.lockInterruptibly();
if (value == null) {
throw new NullPointerException("Cannot add null value");
}
if (size == maxSize) {
// put sleeps until size < maxSize
while (size == maxSize) {
isFull.await(); // release lock and wait
}
}
if (size == 0) {
//head == tail == null element , assign new value to head element
array[head] = value;
} else {
// increment then assign new value to head element
head = cycleInc(head);
array[head] = value;
}
size++;
// now we have some objects which can be retrieved by get (size increased by 1), wake up get()
isEmpty.signal();
} finally {
lock.unlock();
}
}
}
Напишите реализацию класса с неблокирующим методом BigInteger next(), который возвращает элементы последовательности: [1, 2, 4, 8, 16, ...]. Код должен корректно работать в многопоточной среде.
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class Counter {

private AtomicReference refCounter = new AtomicReference(null);

public BigInteger next() {
BigInteger oldValue;
BigInteger newValue;
do {
oldValue = refCounter.get();
newValue = oldValue==null ? BigInteger.valueOf(1) : oldValue.shiftLeft(1);
} while(!refCounter.compareAndSet(oldValue, newValue));
return newValue;
}

}
У ReentrantLock созданного с аргументом true все же один из методов захвата блоктровки — не fair. Какой? Как это обойти?
tryLock(), использовать tryLock(long,TimeUnit)
Приведите наиболее существенное отличие между CountDownLatch и Barrier.
Barrier накапливает потоке в точке вызова await() пока их количество не превысит заданное. CountDownLatch ждет пока количество вызовов countDown() не превысит нужное, и тогда разблокирует await().
Что Вы знаете о Erlang? Что в нем есть существенного связанного с многопоточностью такого, чего нет в Java?
Функциональный язык программирования, с неизменяемыми переменными, легковесными потоками, заточенный на параллелизм и многопоточность. Все "потоки" общаются посредством посылки сообщений, разделяемые переменные\память отсутствуют как класс. Разработан для коммутаторов в Ericsson. Имеет внутреннюю встроенную базу, довольно быструю и устойчивую.
Что Вы знаете о CSP? Что в нем есть существенного связанного с многопоточностью такого, чего нет в Java?
Это язык для описания паттернов взаимодействия потоков исполнения в параллельных вычислениях. В CSP есть формальный мат аппарат для описания и проверки\доказательства непротиворечивости свойств задуманной "системы" параллельной разработки .
Отличие Thread.start() и Thread.run()?
start() порождает новый поток в котором исполняет код run().

Метки:  

...

Пятница, 29 Ноября 2013 г. 09:56 + в цитатник
«Если навыки не оплачиваются — навыки уйдут в другое место».

Закончить мысль можно старой историй о Томе Найте и машине Лиспа.
Послушник пытается перезагрузить лисп-машину, выключая и включая ее. Машина не загружается. В этот время мимо студента проходит Том Найт.
— Что ты делаешь?! — восклицает Найт.
— Вот, не включается… — с грустью отвечает послушник.
— Ты не починишь машину, просто выключая и включая ее, — строго замечает Найт, — если не понимаешь, как она работает.
Найт протягивает руку, выключает машину, а затем включает ее. О, чудо! Машина заработала.
Вывод: без просветления не обойтись.
У хороших разработчиков, помимо навыков, есть немного магии. Но это не значит, что они волшебники. Простые мирские радости вроде комфорта, уважения, чёткого разграничения обязанностей и адекватной оплаты труда совершают чудеса и окупаются с лихвой.

Метки:  

Вывод

Четверг, 21 Ноября 2013 г. 16:03 + в цитатник
Prelude Data.List> let f x = mapM_ putStrLn . map (intercalate "-" . map show) . concat $ [[[1..r], [r+1,r..1]] | r<-[1,3..x]]
Prelude Data.List> f 6
1
2-1
1-2-3
4-3-2-1
1-2-3-4-5
6-5-4-3-2-1

let f x = mapM_ putStrLn . take x . map (intercalate "-" . map show) . concat $ [[[1..r], [r+1,r..1]] | r<-[1,3..x]]

http://habrahabr.ru/post/116842/

NetBeans 7 и Python

Четверг, 21 Ноября 2013 г. 15:07 + в цитатник
http://blog.esemi.ru/2011/12/netbeans-7.html

Из стандартных плагинов недоступна, однако же есть дев версия плагина.
Идём в Tools -> Plugins -> Settings
Жмакаем кнопочку Add
Называем новый источник как угодно и вставляем ссыль http://deadlock.netbeans.org/hudson/job/nbms-and-j...ct/nbbuild/nbms/updates.xml.gz
Обратно Available Plugins и жмакаем кнопочку Reload Catalog
Ищем питон и ставим как обычно

Метки:  

Задача twitter

Четверг, 21 Ноября 2013 г. 10:40 + в цитатник
http://ideone.com/JHNql7

https://gist.github.com/mkozakov/59af0fd5bddbed1a0399


http://philipnilsson.github.io/Badness10k/articles/waterflow/

И так условие :




На рисунке у нас есть стены разной высоты .
Эта картина представлена ​​на массив целых чисел ,
где значение в каждый из индексов равно высоте стены.
На рисунке массив задается как [ 2,5,1,2,3,4,7,7,6 ].


Давайте представим что идет дождь.
Сколько воды будет накапливаться в лужах между стенами ?

Считаем, что минимальный объем клеточки на графике 1х1 .

Все, что левее индекса 1 выплескивается .
Вода справа от индекса 7 также выливается .
Мы остались с лужей от 1 до 6 , а объем составляет 10 .

Метки:  

android своя мелодия на звонок nexus 4

Среда, 20 Ноября 2013 г. 09:56 + в цитатник
Если хочешь поставить нестандартную мелодию на android nexus 4- то надо скачать приложение ES Проводник и при включении будильника ( мелодии) будет запрос чем открыть приложение,открываешь через ES Проводник и ставишь любой свой рингтон,который есть на телефоне! Подсказали на форуме-думал дурят,-, нет!Работает! Просто делюсь, потому что стандартные музыки уже приелись!

Метки:  

quicksort

Четверг, 14 Ноября 2013 г. 14:03 + в цитатник
quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
where
lesser = filter (< p) xs
greater = filter (>= p) xs

Метки:  

Haskell

Четверг, 14 Ноября 2013 г. 14:03 + в цитатник
fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

Метки:  

jstl

Четверг, 24 Октября 2013 г. 23:35 + в цитатник
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<%@ taglib uri='http://java.sun.com/jstl/fmt' prefix='fmt'%>
<h3>
<sess:attribute name="userName"/>, here is your shopping cart:
</h3>
<table border="1">
<tr>
<c:forEach var="column" items="ID,Name,Quantity,Price,Total">
<th><c:out value="${column}"/></th>
</c:forEach>
</tr>
<c:forEach var="cartItem" items="${items}">
<tr>
<td><c:out value="${cartItem.itemId}" /></td>
<td><c:out value="${cartItem.itemName}" /></td>
<td><c:out value="${cartItem.quantity}" /></td>
<fmt:formatNumber type="currency" var="itemPriceAsCurrency"
value="${cartItem.itemPrice}"/>
<fmt:formatNumber type="currency" var="extendedPriceAsCurrency"
value="${cartItem.extendedPrice}"/>
<td align='right'>
<c:out value="${itemPriceAsCurrency}" />
</td>
<td align='right'>
<c:out value="${extendedPriceAsCurrency}" />
</td>
</tr>
</c:forEach>
</table>

Метки:  

AtomicReference

Понедельник, 21 Октября 2013 г. 10:39 + в цитатник
public class Singleton {
private static final AtomicReference SINGL_REF = new AtomicReference();
private Singleton() {
}
public static final Singleton getInstance() {
if (SINGL_REF.get() == null) {
SINGL_REF.compareAndSet(null, new Singleton());
}
return SINGL_REF.get();
}
}

Метки:  

VelocityEngine

Суббота, 19 Октября 2013 г. 11:18 + в цитатник
Путь к исходникам ru.isalnikov
Путь к шаблону ru.isalnikov.templates


import org.apache.velocity.app.VelocityEngine;
import org.apache.velocity.Template;
import org.apache.velocity.VelocityContext;
import java.io.StringWriter;
import java.net.URL;
import java.util.HashMap;
import java.util.Map;
import org.apache.velocity.runtime.RuntimeConstants;
import org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader;
 
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/

 
/**
*
* @author User
*/

public class Main {
private static final String TEMPLATE_NAME = "./ru/isalnikov/templates/helloworld.vm";
/**
* @param args the command line arguments
*/

public static void main(String[] args) {
VelocityEngine ve = new VelocityEngine();
 
ve.setProperty("resource.loader", "class");
ve.setProperty("class.resource.loader.class", "org.apache.velocity.runtime.resource.loader.ClasspathResourceLoader");
 
ve.init();
 
Template t = ve.getTemplate(TEMPLATE_NAME);
/* create a context and add data */
VelocityContext context = new VelocityContext();
context.put("name", "World");
 
 
context.put("Utils", Utils.class);
String s = "{key1:value1,key2:value2}";
 
context.put("s", s);
 
Map<String,String> map = new HashMap<String,String >();
map.put("k1", "11");
map.put("k2", "22");
 
 
context.put("map", map);
 
 
 
/* now render the template into a StringWriter */
StringWriter writer = new StringWriter();
t.merge(context, writer);
/* show the World */
System.out.println(writer.toString());
}
}
 





import java.util.HashMap;
import java.util.Map;
 
/**
*
* @author User
*/

public final class Utils {
 
// {key1:value1,key2:value2}
public static Map<String,String> hashMapCorvertor(String str){
Map<String, String> map = new HashMap<String,String>();
String s = str.replaceAll("\\{", "").replaceAll("\\}", "");
String[] entryes = s.split(",");
 
for (int i = 0; i < entryes.length; i++) {
String[] entry = entryes[i].split(":");
map.put(entry[0], entry[1]);
}
 
return map;
}
 
 
public static void main(String[] args) {
String s = "{key1:value1,key2:value2}";
Map<String, String> map = hashMapCorvertor(s);
System.out.println(map);
 
}
}





 Hello $name!  Welcome to Velocity!
 
## #set($map={"key1":"1","key2":"2"})
$map.k1
 
 
#set($m = $Utils.hashMapCorvertor($s))
 
$m.key1
$m.key2
 
#set( $monkey = {"banana" : "good", "roast beef" : "bad"})
$monkey.banana
 
#set( $monkey.Number = 123 )
 
$monkey.Number
 
$m.key1
 
 
$root
 

Метки:  

Без заголовка

Пятница, 18 Октября 2013 г. 09:57 + в цитатник
        int l = 2;
int r = 13;
int mid = (l+r)>>>1;

ip Address

Вторник, 15 Октября 2013 г. 23:10 + в цитатник
String ipAddress = request.getHeader("x-forwarded-for");
if (ipAddress == null) {
ipAddress = request.getHeader("X_FORWARDED_FOR");
if (ipAddress == null){
ipAddress = request.getRemoteAddr();
}
}

Метки:  

get the remote address of a client in servlet

Вторник, 15 Октября 2013 г. 23:08 + в цитатник
public static String getClientIpAddr(HttpServletRequest request) {  
String ip = request.getHeader("X-Forwarded-For");
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("WL-Proxy-Client-IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_CLIENT_IP");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getHeader("HTTP_X_FORWARDED_FOR");
}
if (ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) {
ip = request.getRemoteAddr();
}
return ip;
}

Метки:  

Random java

Четверг, 10 Октября 2013 г. 09:41 + в цитатник
       for (int i = 0; i < 100; i++) {
System.out.println(System.currentTimeMillis() | 0xFACE0FF);
System.out.println( 0xFACE0FF);
BigInteger bigInteger = BigInteger.probablePrime(100, RANDOM);
System.out.println(bigInteger);
}
 
SecureRandom random = SecureRandom.getInstance("SHA1PRNG");
 
for (int i = 0; i < 100; i++) {
System.out.println(random.nextInt(MAX)+1);
 
}

Метки:  

Поиск сообщений в ATUM
Страницы: 12 ... 10 9 [8] 7 6 ..
.. 1 Календарь