воскресенье, ноября 14, 2010

Load Java properties in natural order.

Some times you need iterate Java properties file in the same order as the properties are declared in .properties file. To avoid making logical copy of java.util.Properties class a simple hack could be used:

InputStream is = ...;

final Map map = new LinkedHashMap();

Properties p = new Properties() {
@Override
public Object put(Object key, Object value) {
map.put(key.toString(), value.toString());
return super.put(key, value);
}
};
p.load(is);


What the code do:
1. Constructs an instance of LinkedHashMap - map which hlds elements in putting order.
2. Overrided method of Properties class stores parsed items into the map as well as into itself. Note that put(Object, Object) method invoked after each parsed properties line. So our map will be filled sequently line-by-line and will hold the filling order.

After loading properties file, the Properties object is no longer needed - the LinkedHashMap will be used instead.

Thats all.
Enjoy.

пятница, октября 15, 2010

Как держать логи в чистоте

Встала задача - ежемесячно "подчищать за собой" в папке логов: переносить в архив старые лог-файлы. Ситуация усугубляется тем, что целевая система - Windows. Если в *nix-подобных системах shell достаточно продвинутая, то в Windows приходится использовать дополнительные инструменты.

И так. Понадобится 7-zip (или другой архиватор на личный вкус) и утилита date (из пакета CoreUtil), так любезно портированная с GNU утилит.

При таком минимальном наборе можно уже жить и автоматизировать процесс.

Предусловие:
Пусть файлы утилит находятся по следующим путям: c:\Program Files\7-Zip\7z.exe и C:\tools\date.exe.

и файлы логов имеют формат logfilename-YYYY-MM-DD.log

Что требуется от автоматического скрипта? Чтобы он собрал все файлы за предыдущий месяц в архив и дал соответствующее название архиву. В моём случае имя архива выглядит так: logfilename.logs.till.YYYYMMDD.7z

Сам скрипт:

@echo off

REM Make pattern. Assume that we want to collect all the files of previous month.
FOR /F "usebackq" %%p IN (`C:\tools\date.exe +"*%%Y-%%m-*" -d"-1 month"`) DO SET PATTERN=%%p
REM Obtain the first day of current month for future calculation
FOR /F "usebackq delims=" %%f IN (`C:\tools\date.exe +"%%Y-%%m-01 -1 day"`) DO SET FIRST_DAY="%%f"
REM Obtain the last date of previous month to name logs archive
FOR /F "usebackq" %%l IN (`C:\tools\date.exe +"%%Y%%m%%d" -d%FIRST_DAY%`) DO SET LAST_DAY=%%l

cd %1
REM Perform archiving
"c:\Program Files\7-Zip\7z.exe" a "%2.logs.till.%LAST_DAY%.7z" -i!"%PATTERN%" -mx9 -ms -mmt -y

REM Removing compressed files
ERASE /F /Q %PATTERN%


Полученный скрипт принимает два параметра:
  1. папка, где находятся файлы логов для обработки
  2. основное имя архива.
и вызывается следующим образом:

archive.cmd c:\util\logs utils

в результате работы скрипта, в папке c:\utils\logs все лог-файлы за предыдущий месяц будут перемещены в архив utils.logs.till.20100930.7z

Осталось добавить вызов полученного скрипта в Windows Scheduller и установить время запуска задачи на первое число каждого месяца. Всё. Папки с лог-файлами теперь не будут катастрофически расти.

четверг, июля 15, 2010

Настройки комфорта

Путём подсмотра на форумах, создал список параметров JVM для более-менее комфортной работы с JetBrains Idea.

Собственно, для компьютера с 2 Gb и выше, следующие настройки должны дать преимущество перед стандартными.

Да. Подразумевается, что используется JRE 1.6.

idea.exe.vmoptions

-Xms768m
-Xmx1024m
-XX:MaxPermSize=250m
-XX:NewRatio=9
-XX:SurvivorRatio=3

-XX:+UnlockExperimentalVMOptions
-XX:+UseG1GC
-XX:+TieredCompilation
-XX:+DoEscapeAnalysis
-XX:+AggressiveOpts
-XX:+UseCompressedOops
-XX:+UseAdaptiveSizePolicy
-XX:+CMSClassUnloadingEnabled
-XX:+CMSPermGenSweepingEnabled

-Dsun.java2d.d3d=true
-Dsun.java2d.noddraw=false
-Dswing.aatext=true

пятница, апреля 23, 2010

Как почистить текст от умляутов.

Вот такой кусок кода для JavaScript:



function cleanUTF8(str) {
var utf8 = 'ŠŒŽšœžŸ¥µÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝßàáâãäåæçèéêëìíîïðñòóôõöøùúûüýÿ';
var ascii = 'SOZsozYYuAAAAAAACEEEEIIIIDNOOOOOOUUUUYsaaaaaaaceeeeiiiionoooooouuuuyy';

var res = '';

for (var i = 0; i < str.length; i++) {
var c = str.charAt(i);
if (utf8.indexOf(c) >= 0) {
res += ascii[utf8.indexOf(c)];
} else {
res += c;
}
}

return res;
}



Вот так. Дёшево и сердито.