Přes víkend jsem zhltnul první díl výborné Přemyslovské epopeje od Vladislava Vondrušky.
Další díl jsem si chtěl koupit v iBook storu, ale pešek! Je vydaná jen papírově! Není to žádná anorektická slečinka, ale pořádná 600ti stránková šťabajzna. Když se podívám na svůj noční stolek, jak se pod náporem jí podobných prohýbá, uvítal bych možnost koupě v elektronické podobě. Přece jen můj iPad má v tomto ohledu větší nosnost než sektorový nábytek.
Nakladatelé, přestaňte knížky tisknout a začněte je vydávat!
pondělí 29. října 2012
úterý 23. října 2012
Kradu jako umělec
Na iTunes
jsem narazil na další pecku nakladatelství Melvil.
Jde o brutálně zjednodušenný výtah rad k odblokování tvůrčího ducha.
Jednu radu jsem hned aplikoval, vytáhl blok, pastelky a design rezervačního formuláře pro náš produkt jdemenato jsem vysmrkl ručně.
Vykradl (nechal se inspirovat) jsem kalendář Googlu, iCalu a Outlooku. Konkurenční systémy jsem ani vykrást nemohl, neb opakující se rezervace vůbec nepodporují.
Pastelky, ořezávátko a papíry jsou už nedílnou součástí mého analogového stolu.
A co vy? Pamatujete si ještě ze školky co jsou to pastelky?
Jde o brutálně zjednodušenný výtah rad k odblokování tvůrčího ducha.
Jednu radu jsem hned aplikoval, vytáhl blok, pastelky a design rezervačního formuláře pro náš produkt jdemenato jsem vysmrkl ručně.Vykradl (nechal se inspirovat) jsem kalendář Googlu, iCalu a Outlooku. Konkurenční systémy jsem ani vykrást nemohl, neb opakující se rezervace vůbec nepodporují.
Pastelky, ořezávátko a papíry jsou už nedílnou součástí mého analogového stolu.
A co vy? Pamatujete si ještě ze školky co jsou to pastelky?
pondělí 12. března 2012
Upgrade maven libraries
Na klasickém maven projektu používáme stabilní verze pluginů – hlavně kvůli stabilitě buildu. Kvůli drobné chybce v pluginu wsimport jsme používali workaround, který upravuje vygenerované zdrojáky. Projížděním konkurenčních blogů jsem zjistil, že tato chyba je od nějaké verze už opravená. To jak jsem to ale zjistil, není vůbec systémové. Jak tedy zjistit, jaké nové verze pluginů nebo knihoven jsou k dispozici, aniž bych musel trávit hodiny na internetu?
Jak už to tak na světě bývá, nejsem první, kdo něco podobného potřebuje. K tomuto účelu dobře poslouží versions plugin. Používal jsem ho dříve jen na zvedání verzí, dnes mi je zvedá teamcity spolu s release pluginem.
Versions plugin toho ale umí mnohem víc.
Např.
vám řekne, jak jste na tom se závislostmi, jestli nevyšel nový spring, hibernate, joda-time apod.
vám zase prozradí, jak jste na tom s aktuálností pluginů.
Pak už záleží jen na vás, jestli upgrade provedete nebo ne.
Upgradu zdar.
Jak už to tak na světě bývá, nejsem první, kdo něco podobného potřebuje. K tomuto účelu dobře poslouží versions plugin. Používal jsem ho dříve jen na zvedání verzí, dnes mi je zvedá teamcity spolu s release pluginem.
Versions plugin toho ale umí mnohem víc.
Např.
mvn versions:display-dependency-updates vám řekne, jak jste na tom se závislostmi, jestli nevyšel nový spring, hibernate, joda-time apod.
mvn versions:display-plugin-updatesvám zase prozradí, jak jste na tom s aktuálností pluginů.
Pak už záleží jen na vás, jestli upgrade provedete nebo ne.
Upgradu zdar.
středa 19. října 2011
úterý 18. října 2011
Validace vstupních parametrů metod.
Všechny vstupní parametry metod je vhodné validovat na jejich korektnost dříve než se s nimi začne pracovat.
V 90% případů mi stačí zkontrolovat, že vstupní parametr není
Joshua Bloch radí vyhodit
Kód by mohl vypadat třeba takto
První možností je třída
V 90% případů mi stačí zkontrolovat, že vstupní parametr není
null.Joshua Bloch radí vyhodit
NullPointerException, ale já, a troufám si tvrdit že i velká část java komunity, preferuje IllegalArgumentException.Kód by mohl vypadat třeba takto
public void foo(final String request) {
if (request == null) {
throw new IllegalArgumentException("Parameter 'request' can't be null.");
}
}
Protože nejsem na světě sám, co potřebuje validovat vstupní parametry, existuje spousta knihoven, které lze pro tyto účely využít (psát vlastní validační knihovnu považuji jen za zvyšování chaosu ve vesmíru).První možností je třída
org.apache.commons.lang.Validate z knihovny Apache Commons Lang.
public void foo(final String request) {
Validate.notNull(request, "Parameter 'request' can't be null.");
}
Místo původních třech řádků jen jeden.
Na skoro všech projektech ale používám i Spring, tak proč nepoužít třídu org.springframework.util.Assert, která je hodně podobná org.apache.commons.lang.Validate?
public void foo(final String request) {
Assert.notNull(request, "Parameter 'request' can't be null.");
}
Samotní autoři nedoporučují použít tuto třídu! Citace z javadocu:
Mainly for internal use within the framework; consider Jakarta's Commons Lang >= 2.0 for a more comprehensive suite of assertion utilities.Další možnou variantou je knihovna Guava.
public void foo(final String request) {
Preconditions.checkNotNull(request, "Parameter 'request' can't be null.");
}
Na té se mi ale nelíbí, že vyhazuje NullPointerException a varianta checkArgument, která vyhazuje IllegalArgumentException má vytaženou podmínku ven z metody, čímž se kontrola lehce komplikuje.
public void foo(final String request) {
Preconditions.checkArgument(request != null, "Parameter 'request' can't be null.");
}
Já osobně zůstanu u třídy Validate.
Jak validujete parametry metod vy?
úterý 10. května 2011
YouTrack v jPower8
Při spouštění firmy jsme potřebovali vyřešit problém issue trackingu. Přestože je v open source komunitě spousta řešení, šáhli jsme nakonec po komerčním řešení. Co nás přesvědčilo?
- Webové rozhraní - dostupnost i z domova i z práce.
- Extrémně jednoduché ovládání – ostatně jako u všech produktů jetbrains.
- Integrace na IntelliJ IDEA – umí dokonce i Jíru nebo PivotalTracker.
- Integrace do TeamCity – u každého issue vidíme, v jakých buildech se na úkolu pracovalo.
- Integrace na firemní LDAP.
- Neomezený počet projektů i uživatelů.
- Detailní možnosti nastavení přístupových práv.
- Restové rozhraní pro import i export dat.
- Přidávání custom políček a tagů.
- Rychlost vyhledávání.
Interně používáme youtrack na řízení všech úkolů, které ve firmě řešíme. Dokonce naši zákazníci zapisují své připomínky a návrhy také do youtracku, kde průběžně vidí, jak se na nich pracuje. Šetříme tak čas svůj i zákazníka – prostě win-win strategie.
Používáme youtrack i jako vykazovací systém, ale o tom až příště.
čtvrtek 17. června 2010
WorkManager on WLS 10.3 with Spring 3.0
Yesterday I played with asynchronous job processing on WebLogic server 10.3. It is quite easy to use solution with is directly supported by Oracle(BEA) - commonj.
Also the integration to the spring 3.0 was straightforward.
At first, define the workmanager inside weblogic-application.xml
Add resource reference to the web.xml.
Spring configuration is connected to the JDNI name.
Example, how to run three jobs in parallel and stop current processing thread until all jobs are complete.
Also the integration to the spring 3.0 was straightforward.
At first, define the workmanager inside weblogic-application.xml
<work-manager>
<name>test_work_manager</name>
<min-threads-constraint>
<name>test-minimum-10</name>
<count>10</count>
</min-threads-constraint>
<max-threads-constraint>
<name>test-maximum-20</name>
<count>20</count>
</max-threads-constraint>
</work-manager>
Add resource reference to the web.xml.
<resource-ref>
<res-ref-name>test_work_manager</res-ref-name>
<res-type>commonj.work.WorkManager</res-type>
<res-auth>Container</res-auth>
<res-sharing-scope>Shareable</res-sharing-scope>
</resource-ref>
Spring configuration is connected to the JDNI name.
<bean id="taskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor">
<property name="workManagerName" value="test_work_manager"/>
<property name="resourceRef" value="true"/>
</bean>
Example, how to run three jobs in parallel and stop current processing thread until all jobs are complete.
package com.blogspot.pcharvat.workmanager;
import commonj.work.Work;
import org.apache.commons.lang.StringEscapeUtils;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.concurrent.atomic.AtomicInteger;
public class MyJob implements Work {
private final Logger log = LoggerFactory.getLogger(getClass());
private static final AtomicInteger COUNTER = new AtomicInteger();
@Override
public void run() {
log.debug("Running in ... " + COUNTER.incrementAndGet());
}
@Override
public void release() {
}
@Override
public boolean isDaemon() {
return false;
}
}
package com.blogspot.pcharvat.workmanager;
import commonj.work.WorkException;
import commonj.work.WorkItem;
import commonj.work.WorkManager;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Required;
import java.util.ArrayList;
import java.util.List;
public class AsyncCall {
private final Logger log = LoggerFactory.getLogger(getClass());
private WorkManager workManager;
public void runInParallel() {
try {
final MyJob jobA = new MyJob();
final MyJob jobB = new MyJob();
final MyJob jobC = new MyJob();
final Listjobs = new ArrayList ();
jobs.add(workManager.schedule(jobA));
jobs.add(workManager.schedule(jobB));
jobs.add(workManager.schedule(jobC));
final boolean result = workManager.waitForAll(jobs, 30000);// waits 30 seconds
log.debug("AsyncCall.runInParallel result={}", result);
} catch (WorkException e) {
log.error(e.getMessage(), e);
} catch (InterruptedException e) {
log.error(e.getMessage(), e);
}
}
@Required
public void setWorkManager(final WorkManager workManager) {
this.workManager = workManager;
}
}
Přihlásit se k odběru:
Příspěvky (Atom)



