sobota, 3 września 2016

Groovy - podstawy

Ciekawe elementy z groovy które szybko można zrobić

Odpalenie groovy jako skrypt

Do lini trzeba dodać 
#!/usr/bin/env groovy

Parsowanie parametrów CLI 

Przydatny fagment programu wsadowego który może być przy praktycznie każdym skrypcie CLI

def cli = new CliBuilder(
 usage: scriptFileName,
 header: 'Description\nAvailable options (use -h for help):\n',
 footer: '')
cli.with
{
 h(longOpt: 'help', 'Help - Usage Information')
 opt1(longOpt: 'Option 1', 'Option 1 description')
}
def opt = cli.parse(args)
if (!opt) return
if (opt.h) {
 cli.usage()
 return
}
// ciag dalszy programu


TreeSet z ignore case

Przydatny gdy chcemy sortować bez Case Sensitive
def IGNORE_CASE = new Comparator<String>() {
    public int compare(String s1, String s2) {
        return s1.compareToIgnoreCase(s2);
    }
};
def set1 = new TreeSet<String>(IGNORE_CASE)


Przeszukiwanie rekursywne katalogu

import static groovy.io.FileType.FILES
...
def dir = new File("/sciezka do katalogu")
dir.eachFileRecurse(FILES) {
    if(it.name.endsWith("nazwa-pliku")) {

    // robota do zrobienia jak jest plik
    }
}


Czytanie z pliku (iterator lini)

def file1 = new File("sciezka")
file1.eachLine { line ->
 println line
}



niedziela, 8 maja 2016

iSeries DB2 - reverse enginering składowych DB2 z poziomu SQL

Podczas pierwszego uruchomienia iSeries Navigator-a jest zakładana w schemacie QIWS procedura QZDGDBGS która pozwala odczytywać kod źródłowy zdefiniowanych elementów. W zależności od wersji systemu iSeries ma różna ilość parametrów. Procedura jest wywoływana z poziomu navigatora do generacji kodu. Nie jest bezpośrednio opisana w dokumentacji.

  • name - nazwa obiektu
  • schema - nazwa schemy
  • type - TABLE, VIEW, INDEX, ALIAS, FUNCTION, PROCEDURE, TYPE, CONSTRAINT, SCHEMA, TRIGGER, SEQUENCE

Ważne aby podany element do generacji oddzielić znakiem \0

Dla starszych wersji < 5.4 ma postać z 20 parametrami IN:
  • 01 - '02','01'
  • 02 - output file
  • 03 - output schema
  • 04 - output member
  • 05 - 0,1 isAppend 
  • 06 - 0,1 is format statement
  • 07 - date format
  • 08 - date separator
  • 09 - time format
  • 10 - time separator
  • 11 - decimal separator
  • 12 - 0,1 is as400 Extensions
  • 13 - naming convention
  • 14 - 0,1 is as400 Extensions & is label on
  • 15 - = 14
  • 16 - 0,1 is drop statements
  • 17 - '000','010' is info messages
  • 18 - 1 ?
  • 19 - '00001' ?
  • 20 - element selector
CALL QIWS.QZDGDBGS(
'01', '', '', '', '1',
'1', 'ISO', '-', 'ISO', '.',
'.', '0', 'SQL', '1', '1',
'0', '000' ,'1', '00001', '${name}\0${schema}\0${type}')


W nowszych wersjach > 7.x ma 25 parametrów IN (5 dodatkowych)
  • 21 - systemName
  • 22 - triggers
  • 23 - triggers
  • 24 - sql privileges
  • 25 - ?

CALL QIWS.QZDGDBGS(
'01', '', '', '', '1',
'1', 'ISO', '-', 'ISO', '.',
'.', '0', 'SQL', '1', '1',
'0', '000' ,'1', '00001', '${name}\0${schema}\0${type}',
'0', '1' ,'1', '1', '0'
)

Procedura wywołuje natywne mechanizmy na iSeries do pozyskania źródła elementu. Jedne z lepszych sposobów na pozyskanie poprawnych znaków w opisach elementów.

Rezultat wynikowy to kod źródłowy w postaci tekstu.

Niewiele o tym piszą którka wzmianka w http://newsolutions.de/forum-systemi-as400-i5-iseries/archive/index.php/t-19498.html

Od wersji 7.1.9 dstępne jako QSYS2.GENERATE_SQL w wersji z 33 parametry IN (specific name QSQGENSQL)

Na podstawie cwbundbf.jar DBG_GenerateSQLBean

piątek, 1 stycznia 2016

Minecraft - wersje - instalacja forge - różnice

Zostałem przez przypadek poproszony o pomoc w uruchomieniu Forge do Minecraft-a
Okazało się to całkiem fajne zadanie debugerskie - zakończone sukcesem
Opisałem to pod adresem http://minecraft-kczerw.blogspot.com/2016/01/minecraft-wersje-instalacja-forge.html

poniedziałek, 2 listopada 2015

Groovy

Czy groovy jest faktycznie taki boski
Na moje zdanie po kodowaniu ileś tam czasu w javie to nie czuję że tak jest.
Gdy napisałem te parę linijek nie czuję tej zajebistości a raczej mętlik. Zamiast wsparcia IDE to trzeba się domyślać jaką funkcję lub zajebistość można użyć. Pewnie przy napisaniu 1000 skryptu to już wchodzi w nawyk

Dziwactwo straszne dziwactwo

Wynalazki które szybko napisać ale cholera wie co robią

Extraktowanie zip-a aby sprawdzić zawartość pliku
W tym przypadku wykorzystane do sprawdzenia zmiennych w META-INF/context.xml

W moim wypadku w META-INF/context.xml są zapisane zmienne
<Context path="/ap-kolce-adm" ...
 <Resource...
  username="${ap-kolce-adm.auth.db.user}" ...
  password="${ap-kolce-adm.auth.db.pass}"


Aby je wylistować można wykorzystać skrypt poniżej
Wywołanie przy założenie że groovy jest w path a ContextParser.groovy oraz ap-mzwi-adm.war są w bieżącym katalogu:
groovy ContextParser.groovy ap-mzwi-adm.war
Zawartość ContextParser.groovy
def file = args[0]
println "file:" + file

def zipFile = new java.util.zip.ZipFile(new File(file))

zipFile.entries().findAll { !it.directory }.each {
    def f = String.valueOf(it)

    if (f.startsWith("META-INF/context.xml")) {
        def str = zipFile.getInputStream(it).text
        def set1 = new TreeSet()
        try {
            str.eachLine { line ->
                def matcher = (line =~/\$\{([^\}]+)\}/)
                while (matcher.find()) {
                    def key = matcher.group(1)
                    set1.add(key)
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        set1.each  { i1 -> println "$i1" }
    }
}

Wypluty rezultat
ap-mzwi-adm.amqbroker.url
ap-mzwi-adm.db.ip
ap-mzwi-adm.db.pass
ap-mzwi-adm.db.user
ap-mzwi-adm.esb.http.url
ap-mzwi-adm.ws-broker-server-sikch-auth.url
as400.address_base
as400.login_base
as400.pass_base
mgr.service.url

sobota, 10 października 2015

Java - static block

Ciekawostka Java - niby prosta ale można się przejechać.
Pytanie co się wyświetli true czy false?
W sumie wydaje się że powinno być true bo jawnie utawiam C2.varStatic = true; Ale blok static z C2 się uruchamia wtedy kiedy jest ładowana klasa C2. W moim mniemaniu dostęp do zmiennej varStatic w C2 wymaga obecności klasy C2 bo ta zmienna należy do C2. Więc niestety sekcja static w C2 odpali się zanim cokolwiek ustawie... i w tym problem ze wyświetli się false

// file C2.java
public class C2 {
 public static boolean varStatic;
 static {
   System.out.println(varStatic);
 }
}

public class C1 {
 public static void main(String[] a) {
  C2.varStatic = true;
  C2 c2 = new C2(); 
 }
}


wtorek, 6 października 2015

Java template Engine

Już temat mocno wyświechtany.... ale przez własną ciekawość chciałem sprawdzić możliwości dodania nowego engine template do starego webowego framework-a.
Zależało mi na utrzymaniu starej funkcjonalności i jako opcję wykorzystanie nowej funkcjonalności oferowanej przez inne template engine.

Co ciekawe przy wykorzystaniu starego mechanizmu replace przy pomocy regexp lub indexof jest wcale niezła podstawowa wydajność template i w zasadzie tym się broni tylko to zabytkowe rozwiązanie - wydajnością.

Jakoś nie mogłem znaleźć obrazków do tego.
Na porównanie wybrałem sobie 2 łatwe do wdrożenia rozwiązania:

http://rythmengine.org/

http://freemarker.org/

W zakresie podstawowym sprawdzałem wydajność zastępowania template zawierającego 1 - n wystąpień tej samej zmiennej w szablonie w formacie odpowiednio dla engine <#var>, $var, ${var}, @var

Wydajność testowałem w 4 wątkach na procesorze i5. Odpowiednio w zestawieniu mam 1, 10, 100, 1000 wystąpień zmiennej


  • velocity1 - engine velocity (tu 1.4)
  • ksb - StringBuffer z replace przez regexp w formacie Velocity 
  • ktpl - template lokalnie rozwijane przy pomocy indexOf
  • rythm
  • freemarker
* Wydajność mierzona jako liczba konwersji na sekundę sumarycznie przez 4 równoległe wątki






Tak jak powiedziałem ze względu na ograniczoną funkcjonalność zależało mi na utrzymaniu wydajności podstawowej. Wygląda na to że regexp w podstawowym zakresie daje radę! Przewagę widać tylko przy małych template. Powyżej 10 szanse już się wyrównują, ale przy dużych template indexof wykorzystany w liniowym parsowaniu ktpl jest skuteczny.

Zaskakująco wolno wypadł freemarker

> Velocity
Warunki uproszczone
#if($plural)were#{else}was#end

http://velocity.apache.org/engine/devel/user-guide.html#conditionals