String base64Encoded = Base64.encodeToString(pubkey.getEncoded(), Base64.DEFAULT). replaceAll("\n", "");
2016-12-30
Convert public certificate to Base64
2016-12-29
Testy logów z log4j
import org.apache.log4j.AppenderSkeleton; import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.apache.log4j.spi.LoggingEvent; import java.util.ArrayList; import java.util.List; public class LogsHistorySaver extends AppenderSkeleton { private ListI korzystamy w niej w teście w spoób następujący:logs; public void setUp() { logs = new ArrayList<>(); Logger.getRootLogger().addAppender(this); } public void tearDown() { Logger.getRootLogger().removeAppender(this); } public List getLogs() { return logs; } @Override protected void append(LoggingEvent event) { logs.add(new Event(event.getLevel(), String.valueOf(event.getMessage()))); } @Override public void close() { } @Override public boolean requiresLayout() { return false; } public class Event { private Level level; private String message; Event(Level level, String message) { this.level = level; this.message = message; } public Level getLevel() { return level; } public String getMessage() { return message; } @Override public String toString() { final StringBuilder sb = new StringBuilder("Event{"); sb.append("level=").append(level); sb.append(", message='").append(message).append('\''); sb.append('}'); return sb.toString(); } } }
public class KaboomTest { private Kaboom sut; private LogsHistorySaver logsHistorySaver = new LogsHistorySaver(); @Before public void setUp() throws Exception { logsHistorySaver.setUp(); } @Test public void log() throws Exception { //when sut.build(); //then Listlogs = logsHistorySaver.getLogs(); assertThat(logs.size()).isEqualTo(3); assertThat(logs.get(0).getLevel()).isEqualTo(Level.INFO); assertThat(logs.get(0).getMessage()).isEqualTo("First log"); assertThat(logs.get(1).getLevel()).isEqualTo(Level.INFO); assertThat(logs.get(1).getMessage()).isEqualTo("Second log"); assertThat(logs.get(2).getLevel()).isEqualTo(Level.INFO); assertThat(logs.get(2).getMessage()).isEqualTo("Third log"); } }
2016-12-28
Mockito - mock final class
Mockito w wersji 2.4.2 umożliwia mockowanie finalnych klas (oraz metod).
Wystarczy dodać pliksrc/test/resources/mockito-extensions/org.mockito.plugins.MockMakerzawierający jedną linię tekstu:
mock-maker-inlineMaven dependency:
org.mockito mockito-core 2.4.2
Stream zamiast forEach
private ListUżywając streama możemy tworzenie listy obiektów pominąć:buildTransactions(AccountNumber accountNumber) { List transactions = new ArrayList<>(); accountNumber .getAccountHistoryList() .forEach(accountHistory -> transactions.add(transactionBuilder.build(accountHistory))); return transactions; }
private ListUpdate: Można jeszcze bardziej elegancko:buildTransactions(AccountNumber accountNumber) { return accountNumber .getAccountHistoryList() .stream() .map(accountHistory -> transactionBuilder.build(accountHistory)) .collect(Collectors.toList()); }
private ListbuildTransactions(AccountNumber accountNumber) { return accountNumber .getAccountHistoryList() .stream() .map(transactionBuilder::build) .collect(Collectors.toList()); }
Optional.ofNullable().orElseThrow()
Przykład wykorzystania klasy Optional dostępnej od Java 8.
public void test(Task task) throws VerificationException { if (task.getCustomer() == null) { logger.error(CUSTOMER_NOT_FOUND); throw BmVerificationException.badRequest(CUSTOMER_NOT_FOUND); } }
public void test(Task task) throws VerificationException { Optional.ofNullable(task.getCustomer()).orElseThrow(this::getException); } private VerificationException getException() { logger.error(CUSTOMER_NOT_FOUND); return VerificationException.badRequest(CUSTOMER_NOT_FOUND); }
2016-12-27
AssertJ - assertThatExceptionOfType
public class FooTest { @Rule public MockitoRule mockitoRule = MockitoJUnit.rule(); @Mock private Validator validator; @InjectMocks private Foo sut; private HistoryRequest historyRequest; @Before public void setUp() throws Exception { historyRequest = new HistoryRequest(); } @Test public void getHistoryThrowsExceptionDueToAccessDenied() throws Exception { when(validator.validate(historyRequest)).thenReturn(new Client()); assertThatExceptionOfType(BloggerException.class) .isThrownBy(() -> sut.getHistory(historyRequest)) .withMessage("Access denied"); } }
2016-12-20
GSON - ignorowanie pól przy pomocy własnej adnotacji
Tworzymy własną adnotację:
import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface Exclude { }
Klasę implementującą ExclusionStrategy:
import com.google.gson.ExclusionStrategy; import com.google.gson.FieldAttributes; public class AnnotationExclusionStrategy implements ExclusionStrategy { @Override public boolean shouldSkipField(FieldAttributes f) { return f.getAnnotation(Exclude.class) != null; } @Override public boolean shouldSkipClass(Class clazz) { return false; } }
Wykorzystujemy utworzoną adnotację w POJO:
public abstract class ExampleRequest { protected Long requestTime; protected String clientCode; @Exclude protected String hash; }
Budujemy gsona np w taki sposób:
public class TestFacade { private static final Gson GSON; static { JsonDeserializerNajważniejsza w tym przykładzie jest metoda setExclusionStrategies(new AnnotationExclusionStrategy()) dzięki której cała magia działa. źródło: http://stackoverflow.com/a/27986860/767529longToDateAdapter = (json, typeOfT, context) -> new Date(json.getAsJsonPrimitive().getAsLong()); GSON = new GsonBuilder() .setDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSZ") .registerTypeAdapter(Date.class, longToDateAdapter) .setExclusionStrategies(new AnnotationExclusionStrategy()) .create(); } }
2016-06-24
Git z konsoli
Podstawowe polecenia
źródło: http://zeroturnaround.com/
Dodatkowe polecenia
Usunięcie lokalnego brancha
git branch -d the_local_branch
Log w postaci drzewa
git log --graph --decorate --oneline
git log --graph --full-history --all --color --pretty=format:"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s"
Definiowanie własnych aliasów
git config --global alias.tree "log --graph --full-history --all --color --pretty=format:\"%x1b[31m%h%x09%x1b[32m%d%x1b[0m%x20%s\""
2016-05-10
Tesseract pod Centos - JNA problem
Problem:
Caused by: java.lang.UnsatisfiedLinkError: /tmp/jna-1347637353/jna2637488223705099160.tmp: /tmp/jna-1347637353/jna2637488223705099160.tmp: failed to map segment from shared object: Operation not permitted at java.lang.ClassLoader$NativeLibrary.load(Native Method) [rt.jar:1.8.0_77] at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941) [rt.jar:1.8.0_77] at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824) [rt.jar:1.8.0_77] at java.lang.Runtime.load0(Runtime.java:809) [rt.jar:1.8.0_77] at java.lang.System.load(System.java:1086) [rt.jar:1.8.0_77] at com.sun.jna.Native.loadNativeDispatchLibraryFromClasspath(Native.java:851) [jna-4.2.2.jar:4.2.2 (b0)] at com.sun.jna.Native.loadNativeDispatchLibrary(Native.java:826) [jna-4.2.2.jar:4.2.2 (b0)] at com.sun.jna.Native.(Native.java:140) [jna-4.2.2.jar:4.2.2 (b0)] at net.sourceforge.tess4j.TessAPI1. (TessAPI1.java:41) [tess4j-3.1.0.jar:3.1.0]
Rozwiązanie problemu:
Taki problem występuje ponieważ katalog /tmp jest noexec. Są dwa sposoby na rozwiązanie tego problemu. Można usunąć noexec z /tmp albo zdefiniować inne miejsce zapisu dla tmp natywnych bibliotek. Ja wybrałem ten drugi sposób i ładnie działa. Wystarczy dopisać:
-Djava.io.tmpdir=/jakis_katalog/tmp
źródło: cloudbees.zendesk.com
2016-05-09
Java z automatyczną akceptacją licencji
Instalacja Java pod Ubuntu z automatyczną akceptacją licencji. Taka możliwość może być przydatna przy instalacji składników ze skryptu - np. przy stawianiu systemu w środowisku Docker'a (w Dockerfile).
echo "oracle-java8-installer shared/accepted-oracle-license-v1-1 select true" | sudo debconf-set-selections sudo apt-get install -y oracle-java8-installer
2016-05-06
Git: aktualizacja listy branchy na lokalnej maszynie
# list all branches, local and remote $ git branch -av # update remote list $ git remote update origin --prune
Instalacja Python 2.7.10 pod CentOS
yum install gcc cd /usr/src wget https://www.python.org/ftp/python/2.7.10/Python-2.7.10.tgz tar xzf Python-2.7.10.tgz cd Python-2.7.10 ./configure make altinstall # python2.7 -V Python 2.7.10
2016-05-05
2016-05-02
Odpalenie curl'em POST'a
curl -i -H "Accept: application/json" -H "Content-type: application/json" -X POST -d '{}' http://test.pl/kabooom
2016-04-27
Docker: podstawowe polecenia
Lista lokalnych obrazów
Warto czasem zobaczyć jakie mamy obrazy na dysku:
$ docker images REPOSITORY TAG IMAGE ID CREATED SIZE dpz/wildfly-blueocr latest 22af6d6fe20c 41 hours ago 4.791 GB dpz/opencv latest 7124e8b011a8 41 hours ago 4.765 GB dpz/wildfly latest 00f0de2d3fdc 41 hours ago 1.397 GB dpz/system latest f1ef0b164424 41 hours ago 1.098 GB centos 7 778a53015523 4 weeks ago 196.7 MB trigsoft/wildfly latest a251fdfa8320 10 weeks ago 635.4 MB
Usunięcie obrazów i kontenerów
Pracując z Dockerem możesz natknąć się na problem z dużą liczbą obrazów i kontenerów. Aby je wszystkie usunąć jedną komendą wystarczy:
# Delete all containers docker rm $(docker ps -a -q) # Delete all images docker rmi $(docker images -q)
Jeśli chcesz usunąć nieoznaczone obrazy wystarczy:
#!/bin/bash # Delete untagged images (dangling) docker rmi -f $(docker images -q --filter "dangling=true")
Wyszukiwanie obrazów
Wyszukiwanie obrazów z repo Dockera
$ docker search wildfly NAME DESCRIPTION STARS OFFICIAL AUTOMATED jboss/wildfly WildFly application server image 185 [OK] openshift/wildfly-8-centos DEPRECATED - see openshift/wildfly-81-centos7 6 [OK] piegsaj/wildfly WildFly 10.0.0.Final on Java 8 4 [OK] centos/wildfly 3 [OK] andreptb/wildfly Debian Jessie based image with JBoss Wildf... 2 [OK] emedeiros/wildfly WildFly 9.0.2.Final with OpenJDK 8 1 [OK] sewatech/wildfly Debian + WildFly, in HA mode 1 [OK] trigsoft/wildfly WildFly 10.0.0 + Java 8 + PostgreSQL 9.4 1 [OK] ceagan/wildfly JBoss Wildfly with XMLStarlet 1 [OK] hpehl/wildfly-domain WildFly domain with one domain controller ... 1 [OK] projectomakase/wildfly Docker image for WildFly 0 [OK] huggosantos/wildfly-mysql wildfly-mysql 0 [OK] dthuilot/wildfly-admin wildfly with admin console enabled. 0 [OK] huggosantos/wildfly Wildfly version 9.0.2.Final 0 [OK] khipu/wildfly Wildfly 10 / openjdk 8 / alpine 3 and cust... 0 [OK] vereshus/wildfly Wildfly application server with Java 8. 0 [OK] caltha/wildfly Self contained WildFly application server 0 [OK] ifbaeunapolis/wildfly wildfly 0 [OK] cnry/wildfly WildFly Application Server 0 [OK] sledsoft/wildfly 0 [OK] bitnami/wildfly Bitnami WildFly Docker Image 0 [OK] jamesnetherton/wildfly A minimalistic Docker image for WildFly ru... 0 [OK] dcm4che/wildfly wildfly based on 8-jre for dcm4che/archive 5 0 [OK] mihahribar/wildfly Dockerfile for Wildfly running on Ubuntu 1... 0 [OK] dolphindev/wildfly OpenDolphin application server created on ... 0 [OK]
Pobieranie obrazu z repo
Aby pobrać przykładowe repo trigsoft/wildfly, na którym jest WildFly 10.0.0 + Java 8 + PostgreSQL 9.4 wystarczy użyć prostej komendy:
$ docker pull trigsoft/wildfly Using default tag: latest latest: Pulling from trigsoft/wildfly a3ed95caeb02: Pull complete a07226856d92: Pull complete 17a00fa8d5c0: Pull complete 132e3c60d9a9: Pull complete f60acd56d870: Pull complete 271ea3c24483: Pull complete 0ad07189dd16: Pull complete a3d975cb837d: Pull complete d7102d6afcc6: Pull complete 688ac970b5ea: Pull complete c30a372a098b: Pull complete 07c3dd598370: Pull complete cf3cecce1b1d: Pull complete b29101bafc07: Pull complete Digest: sha256:a2c25fdbc4a37afa9c2ee559a3eceacbfe7128eacf0a5dc7c846f54542043ff3 Status: Downloaded newer image for trigsoft/wildfly:latest
źródło: techoverflow.net
2016-02-28
JavaEE - Annotation Type Schedule
Za pomocą adnotacji @Schedule istnieje możliwość odpalenia kawałka kodu w określonych odcinkach czasu - jest to coś podobnego do Cron'a na serwerach linuksowych.
Poniżej przestawiam przykład, w którym widać zastosowanie tej adnotacji - Metoda init() będzie uruchamiana co 5 minut.
package pl.marceen.schedule; import org.apache.log4j.Logger; import javax.ejb.Schedule; import javax.ejb.Singleton; import javax.ejb.Startup; /** * @author Marcin Zaremba */ @Singleton @Startup public class ScheduleTest { private static final Logger logger = Logger.getLogger(ScheduleTest.class); @Schedule(persistent = false, hour = "*", minute = "*/5") public void init() { logger.info("Method init() started."); } }
Więcej możliwościach tej adnotacji: docs.oracle.com