jmap -J-d64 -dump:format=b,file=Потом этот дамп анализируется с помощью специальных интсрументов.
вторник, 26 марта 2013 г.
Как отыскивать меморилики JVM
четверг, 21 марта 2013 г.
среда, 20 марта 2013 г.
Заменить чего-нибудь в колонке на что-то другое
Появился у меня таск, что нужно было в хмлях, которые в одной из строковых колонок находились заменить одну подстроку на другую, я начал мудрить с хранимками, но все оказалось на много проще. Благодаря Олегу Анедченко, простота пришла в мир:
mysql> update Portletpreferences set someColumn = replace(someColumn, "from", "to");И это все:)
Liferay, FrendlyUrlServlet, Struts, PortalUtil
В лайфрее запросы попадают в FrendlyUrlServlet, там он с помошью PortalUtil переводит их в реальные понимаемые Struts и если нужно делает редирект.
Если страница/лейаунт типа link_to_page, то урл строится определенного вида, шаблон этого урла определяется для этого типа страницы в portal.properties, там на каждый тип много чего определяется.
По шаблону этого урла через struts-config.xml проиходит привязка на конкретный экшин, в этом случае Что-то-тамLayoutAction.
PortalUtil вяжется к интрефейсу Portal, а через его реализацию PortalImpl и решаются вопросы.
Если страница/лейаунт типа link_to_page, то урл строится определенного вида, шаблон этого урла определяется для этого типа страницы в portal.properties, там на каждый тип много чего определяется.
По шаблону этого урла через struts-config.xml проиходит привязка на конкретный экшин, в этом случае Что-то-тамLayoutAction.
PortalUtil вяжется к интрефейсу Portal, а через его реализацию PortalImpl и решаются вопросы.
Ярлыки:
Liferay,
Liferay 6,
Liferay 6.0.6
Редирект который отправляет тело поста, которое пришло в поточном запросе
response.sendRedirect("http://anyserver/page?" + request.getQueryString());
Работает отправляя браузеру 302, и потом браузер отправляет ГЕТ запрос на указанный урл редиректа.
Если мы хотим переслать пост с уже переданным телом в первом запросе, то делаем вот что:
response.setStatus(HttpServletResponse.SC_TEMPORARY_REDIRECT );
response.addHeader("Location","http://anyserver/page");
При этом браузер скорее всего высветит диалог, что сервер хочет переотправить введенные им данные на другой сервер, спрашивая можно ли позволить ему это сделать.
Ярлыки:
Java Web
вторник, 19 марта 2013 г.
Бинарные файлы(mysql-bin.0*) mysql зачем они нужны
/opt/local/mysql/data/
Туда записывается все что выполняется/происходит с базой. Все эти файлы групируются файлом mysql-bin.index, в нем внутри находится список всех файлов в порядке создания истории mysql-bin.0*.
По этим файлам реплики подтягивают свои актуальноси к мастеру.
Туда записывается все что выполняется/происходит с базой. Все эти файлы групируются файлом mysql-bin.index, в нем внутри находится список всех файлов в порядке создания истории mysql-bin.0*.
По этим файлам реплики подтягивают свои актуальноси к мастеру.
Ярлыки:
MySQL
понедельник, 18 марта 2013 г.
Сохранить в гите юзерней и пароль в случае http
git remote set-url origin http://username:password@gitsubdomain.domain:{port}/dir/reponame.git
Ярлыки:
git
пятница, 15 марта 2013 г.
Серилизация
public interface Serializable {
}
Метим интерфейсом Serializable (а посути маркеторм, потому что этот интерфейс пустой). После этого мы можем пихать такой обьект в ObjectOutputStream. С помощью рефлексии обьект запихается в поток (серилизуется) . Процесс десерилизации -- следующий: под обьект выделяется память, и в его поля загружаются значения из потока, никакие контруктора не вызываются при этом. Если же класс наследует родителя у которого нет интрефейса Serializable, то вызывается конструктор родителя без аргументов, поэтому если у родетеля не будет такого контруктора дисерилизация упадет. Возможно несовпадение верисии класса, если мы изменили класс и пытаемся его десерилизировать из сохраненной старой версии, то произойдет ексепшин:java.io.InvalidClassException: test.ser2.ChildExt;
local class incompatible: stream classdesc serialVersionUID = 8218484765288926197,
local class serialVersionUID = 1465687698753363969
Ярлыки:
Java,
Serialization
четверг, 14 марта 2013 г.
Linux jobs
jobs - list the current jobs
fg - resume the job that's next in the queue
fg [number] - resume job [number]
bg - Push the next job in the queue into the background
bg [number] - Push the job [number] into the background
kill %[number] - Kill the job numbered [number]
kill -[signal] %[number] - Send the signal [signal] to job number [number]
в kill % очень важен, именно он указывает, что нужно удалить джоб, а не процесс
Ctrl+Z - приостанавливает процесс поточной выполняемой команды в терминале.
Если вызовем bg, то процесс продолжится, но уже в фоне, такой процесс мы и называем джобой.
Мы можем свернуть-приостановить много процессов, какой именно продолжить в фоне мы решаем указав порядковый номер в очереди джобов.
fg(foreground) в отличии от bg(background) все делает не в фоне(бекенде), а в терминале.
Вот реальный пример применения
> find / >foundfiles.txt Нажимаем Ctrl+Z [1]+ Stopped find / >foundfiles.txt Процесс приостановлен. Теперь можно продолжить его выполнение в фоне, если нужно. > bgНо мы можем и сразу выполнять команду в фоне:
> find / >foundfiles.txt &
fg полезнее всего для одновременной работы с нескольками файлами открытых Vi.
Ярлыки:
Linux,
Linux jobs,
Vi
среда, 13 марта 2013 г.
Моленкие тонкости Java
http://habrahabr.ru/post/132241/
s = s + fileds[i]; //s - StringРеально заменяется на компилятором на
s = new StringBuilder(s).append(fields[i]).toString();
вторник, 12 марта 2013 г.
Servlet API 3.0
Новинки:
1) Мы можем определять сервлеты со всеми параметрами и их мапинги с помощью аннотаций. Приоритетом все-равно остается дескриптор, но все же. Но в дескрипторе нужно указать что сканировать.
2) Также мы можем создаться веб-фрагменты, те же веб дескрипторы, но они все обьединяются сервлетом под крышу одного дескриптора, зато это дает нам серьезное преимущество модульности.
3) Асинхронное выполнение обработки запросов
1) Мы можем определять сервлеты со всеми параметрами и их мапинги с помощью аннотаций. Приоритетом все-равно остается дескриптор, но все же. Но в дескрипторе нужно указать что сканировать.
2) Также мы можем создаться веб-фрагменты, те же веб дескрипторы, но они все обьединяются сервлетом под крышу одного дескриптора, зато это дает нам серьезное преимущество модульности.
3) Асинхронное выполнение обработки запросов
Ярлыки:
Servlets
воскресенье, 3 марта 2013 г.
Ehcache. Cache Consistency Options
Все это основано на стандартной теории распределенных систем.
Есть формула определения стойкости распределенной системы, автор Gifford (1979).
Пусть у нас есть N реплик, которые и реализуют нашу систему. На W единиц мы пишем, с R - читаем.
Чтобы назвать систему стойкой должно соблюдаться условие:
W+R > N
W>N/2
Теракота эррей состоит их mirror-group, с одного нада мы читаем, а второй является страховочным зеркалом первого, тоесть пишем мы как во второй так и в первый. Чтобы узнать стойкость эррея, достаточно посчитать стойкость одного зеркальной группы.
W=2
R=1
N=2
2+1>2
2>2/2
И так условия формулы совпадают наш эррей получается стойкой распределенной системой.
Есть формула определения стойкости распределенной системы, автор Gifford (1979).
Пусть у нас есть N реплик, которые и реализуют нашу систему. На W единиц мы пишем, с R - читаем.
Чтобы назвать систему стойкой должно соблюдаться условие:
W+R > N
W>N/2
Теракота эррей состоит их mirror-group, с одного нада мы читаем, а второй является страховочным зеркалом первого, тоесть пишем мы как во второй так и в первый. Чтобы узнать стойкость эррея, достаточно посчитать стойкость одного зеркальной группы.
W=2
R=1
N=2
2+1>2
2>2/2
И так условия формулы совпадают наш эррей получается стойкой распределенной системой.
Standard Client-Side Consistency Modes
Strong consistency. После того как апдейт закончен, любое последующее обращение к такому ключу вернет на всех нодах(из разных потоков одного нода) это значение.
Weak consistency. Система не гарантирует, что значение будет последним при обращении.
Eventual consistency. Это специфичная форма слабой связности. После апдейта возможен варинат, когда на каком-то из нодов вренется не последнее значение.
Время, во время коготоро нет гарантии связности на всех нодах, называется "окно ненесвязности", оно зависит от многих факторов: задержек коммуникации,
загруженности системы, количества реплик задействованных в репликационной схеме.
В ehcache может быть две модели звязности:
<cache name="sampleCache1" ... /> <terracotta consistency="strong" /> </cache>
<cache name="sampleCache1" ... /> <terracotta consistency="eventual" /> </cache>Понятие Sticky sessions и Non-sticky sessions. Первый вариант это когда лоад-балансер гарантирует, что клиент с активной сессией постоянно будет попадать на нод, к которому он первый раз обратился, создав сессию. Второй- это когда скорей всего клиент будет каждый раз попадать на разные ноды.
Ehcache Usage Patterns
cache-aside (прямая манипуляция) - у нас обьект кеширования находится в объекте предоставляющем System Of a Record, и в методе возвращающем значение, мы сначала проверяем в кеше есть ли значение под переданный ключ и случае успеха возвращаем его. В записи мы записываем как в кеш так и в SOR,
cache-as-sor (комбинация read-through и write-through или write-behind)
read-through - работа ведется с объектом кеша, только вот нам нужно создать для него реализацию CacheEntryFactory, которая подскажет как и откуда считать значение если произошел кеш-мис.
write-through - работа ведется через объект кеша, нужно реализовать CacheWriter. Запись в SOR происходит в том же потоке.
write-behind (or write-back) - почти все тоже что и предыдущий пункт, но запись в кеш происходит в отдельном потоке через очередь.
cache-as-sor (комбинация read-through и write-through или write-behind)
read-through - работа ведется с объектом кеша, только вот нам нужно создать для него реализацию CacheEntryFactory, которая подскажет как и откуда считать значение если произошел кеш-мис.
write-through - работа ведется через объект кеша, нужно реализовать CacheWriter. Запись в SOR происходит в том же потоке.
write-behind (or write-back) - почти все тоже что и предыдущий пункт, но запись в кеш происходит в отдельном потоке через очередь.
Cache-aside example
public class MyDataAccessClass
{
private final Ehcache cache;
public MyDataAccessClass(Ehcache cache)
{
this.cache = cache;
}
// read some data, check cache first, otherwise read from sor
public V readSomeData(K key)
{
Element element;
if ((element = cache.get(key)) != null) {
return element.getValue();
}
// note here you should decide whether your cache
// will cache 'nulls' or not
if (value = readDataFromDataStore(key)) != null) {
cache.put(new Element(key, value));
}
return value;
}
// write some data, write to sor, then update cache
public void writeSomeData(K key, V value)
{
writeDataToDataStore(key, value);
cache.put(new Element(key, value);
}
}
cache-as-sor example
public class MyDataAccessClass {
private final Ehcache cache;
public MyDataAccessClass(Ehcache cache)
{
cache.registerCacheWriter(new MyCacheWriter());
this.cache = new SelfPopulatingCache(cache);
}
//read some data - notice the cache is treated as an SOR.
//the application code simply assumes the key will always be available
public V readSomeData(K key)
{
return cache.get(key);
}
//write some data - notice the cache is treated as an SOR, it is
//the cache's responsibility to write the data to the SOR.
public void writeSomeData(K key, V value)
{
cache.put(new Element(key, value);
}
// Implement the CacheEntryFactory that allows the cache to provide
// the read-through strategy
private class MyCacheEntryFactory implements CacheEntryFactory
{
public Object createEntry(Object key) throws Exception
{
return readDataFromDataStore(key);
}
}
//Implement the CacheWriter interface which allows the cache to provide
//the write-through or write-behind strategy.
private class MyCacheWriter implements CacheWriter
public CacheWriter clone(Ehcache cache) throws CloneNotSupportedException;
{
throw new CloneNotSupportedException();
}
public void init() { }
void dispose() throws CacheException { }
void write(Element element) throws CacheException;
{
writeDataToDataStore(element.getKey(), element.getValue());
}
void writeAll(Collection elements) throws CacheException
{
for (Element element : elements) {
write(element);
}
}
void delete(CacheEntry entry) throws CacheException
{
deleteDataFromDataStore(element.getKey());
}
void deleteAll(Collection entries) throws CacheException
{
for (Element element : elements) {
delete(element);
}
}
}
}
Содрежание JVM памяти
JVM может занять часть памяти ОС для себя, понятно, что это не может быть вся доступная память. В Windows 32bit может иметь максимум 4 GB оперативной памяти.
Кроме того JVM нужно не просто свободная память под свою кучу, свободная память должна быть также последовательно единой.
Кроме того JVM нужно не просто свободная память под свою кучу, свободная память должна быть также последовательно единой.
Ярлыки:
Java
пятница, 1 марта 2013 г.
Аннотация которая позволяет создавать PropertyEditor на ходу
@Controller
public class MyController {
....
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(int.class, "fieldNameOfSomeModelAttribute", new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
if (StringUtils.isEmpty(text)) {
super.setValue(0);
} else {
setValue(Integer.valueOf(text.trim()));
}
}
});
}
@ActionMapping(params = "action=headerMsgsConfigSave")
public void save(ActionRequest request, ActionResponse response, @ModelAttribute("someModelClass") SomeModelClass model) {
.....
}
Можно привязать не к конкретному полю модели, а вообще на ходу сделать пропертиедитор:
...
@InitBinder
protected void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(HeaderRegViewModel.LinkAction.class, new PropertyEditorSupport() {
@Override
public void setAsText(String text) throws IllegalArgumentException {
setValue(HeaderRegViewModel.LinkAction.getFromString(text));
}
});
}
Ярлыки:
Java,
Java Web,
Spring,
Spring MVC
Когда закомитил с неправильным коментарием
Это перетирает последний комит, если он не был запушен, если был то в истории будут оба комита с теми же самыми изменениями
git commit --amend -m "correct message"
Ярлыки:
git
Подписаться на:
Сообщения (Atom)