Wpisy

Część wpisów wciąż znaleźć można na starej stronie. Nie wszystko jest przeniesione i nie wiem, czy kiedyś będzie 😉.

Cannot connect to the Docker daemon

Previously flawless working docker daemon was marked as not working not only in PHPStorm IDE, but also even in Docker Desktop / Settings / Builders. After some research, thanks to StackOverflow answer it appeared, that company decided to remove automatically creating /var/run/docker.sock in MacOS specific version starting with the release 4.13 of Docker Desktop. The fix provided under the permanent solution header resolves the issue:

sudo ln -s ~/Library/Containers/com.docker.docker/Data/docker.raw.sock /var/run/docker.sock

Move files between git repositories with history

From time to time it may happen usuful to move files in the project from one git repository to the other one. The simplest way to do that is of course deleting it from one repository and adding in the other one. But with such move all history of edits of such files is lost. If the classes are of a bigger size it may be valuable to keep their history. So how to do that?

We need to start with the source repository (where the files are currently) to strip it down from all other files. To do so it is best advised to create a fresh clone, for example in some C:\tmp\old-repo location. And than use git filter-repo command to strip all other files:

git filter-repo \
    --path-regex ".*ClassOne.java$" \
    --path-regex ".*ClassTwo.java$" \
    --path-regex ".*ClassOneTest.java$" \
    --path-regex ".*ClassTwoTest.java$" \
    --prune-empty always --force

After that command only needed files (in the example two classes and tests for them) will be kept in the old-repo repository with their history. We can git mv them now to the location which they should have in the target-repo.

Now its time to work with a target-repo. We can add new remote repo here, fetch it and merge allowing unrelated histories:

git remote add sourceRepoName C:\tmp\old-repo
git fetch sourceRepoName
git merge sourceRepoName/main --allow-unrelated-histories

Maven verbose dependency info

Sometimes it may be hard to find why in maven project some dependencies are resolved to specific version. In older maven versions there was a mvn dependency:tree -verbose, but it was developed for Maven 2 and may not correctly work with Maven 3 as described on plugin page.

After looking around for some alternative, it looks like maven-helper-plugin does a great job to generate a very detailed effective pom with rich XML comments describing each dependency version (and each property value) source:

mvn org.apache.maven.plugins:maven-help-plugin:3.2.0:effective-pom -Dverbose=true -Doutput=effective-pom.xml


Spring custom validator from interface

When we use layers separation it sometimes become problematic to use custom validator annotation, as to execute it we need service layer not available in data layer. After some digging around I have found a solution, to set validatedBy annotation paramter to interface class instead of implementation class and handle that in the service layer with customized validator factory code.

Trzaski w rowerze

Trzaski z korby? Trzeszcząca sztyca? Jadąc rowerem nie raz ciszę jazdy, bądź sapanie na podjeździe, zakłócają niezidentyfikowane hałasy z roweru. Na bikeradar.com pojawił się ostanio artykuł sugerujący jak sobie z nimi radzić – okazuje się, że rozwiązaniem na większość (gdy już je namierzymy) bywa cienki film ze smaru. Czy się sprawdza? Będę w najbliższym czasie weryfikował.

A jeśli i Wam coś trzeszczy w rowerze, to proponuję również sprawdzić, czy porady coś pomogą: http://www.bikeradar.com/mtb/gear/article/angryasian-silence-those-persistent-mystery-creaks-44332

GMail i Windows Phone - ogień i woda?

Google od jakiegoś czasu stara się utrudniać życie użytkownikom telefonów z systemami innymi niż Android. Jednym z tego przejawów jest nieintuicyjne działanie przycisku skasuj w skrzynce odbiorczej. Po zalogowaniu na GMaila wiadomości nadal widnieją w odebranych/wszystkich. Rozwiązać ten problem można wchodząc na adres http://m.google.com/sync/settings koniecznie z urządzenia mobilnego i modyfikując parametry synchronizacji wybranych urządzeń.

Adding custom Converters to ConversionService in Spring MVC

If somebody starts to play a little with a Sping MVC application sooner rather than later will see a message saying something like

(...) nested exception is java.lang.IllegalArgumentException: 
Cannot convert value of type [java.lang.String] to required type [sth.model.MyCustomType] for property 'propertyName': no matching editors or conversion strategy found

There are a lot of spnippets around how to create a converter, name it StringToMyCustomTypeConverter (I can recommend this one: http://www.javabeat.net/2011/02/introduction-to-spring-converters-and-formatters/), and also how to add it in the xml configuration:

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
  <property name="converters">
    <list>
      <bean id="StringToMyCustomTypeConverter" class="sth.converter.StringToMyCustomTypeConverter" />
    </list>
  </property>
</bean>

In my spring familiarization project I've decided to use java config to some extend. So I spent time looking around how to add custom converters in code. I easly run into problem with two ConversionService(s) registerd which ended with no explicit bean with name 'conversionService' error. Finally I found working (and very easy indeed) solution. My configuration class e.g. AppConfig (annotated with @Configuration), has to extend WebMvcConfigurerAdapter (or implement WebMvcConfigurer interface) and just override addFormatters method (you can register converters there also):

@Override
public void addFormatters(FormatterRegistry formatterRegistry) {
    formatterRegistry.addConverter(new StringToMyCustomTypeConverter());
}

Łożyska Mavic Crossmax SL

Mavic CrossMax 29er oraz CrossRide 29er

Nowsze modele kół Mavic'a, wyposażone w zmodyfikowany bębenek ITS-4. Sam bębenek pomiędzy modelami różni się ilością zapadek (i wycięć na nie), natomiast poza tym konstrukcja jest bliźniacza. Nie wiem, czy to ja mam takiego pecha, czy producent przyoszczędził na łożyskach, ale w obu posiadanych przeze mnie bębenkach padły one bardzo szybko – jeden faktycznie był intensywnie użytkowany, natomiast drugi jest dla mnie zupełną zagadką. 

Oba łożyska w bębenku są wymienne – oznaczone 6803 – ale trzeba to robić ostrożnie (znam przypadek pęknięcia bębenka przy wymianie). Zadania nie ułatwia fakt, że jedno z łożysk osadzone jest dosyć głęboko, więc zarówno przy wybijaniu jak i wbijaniu przydatne będą różnego rodzaju podkładki (u mnie sprawdziły się m.in. nakładki do klucza nasadowego ze sprzęgłem).

Mavic CrossMax SL (26")

Choć zwykle koła te służą długo i bezproblemowo, to jednak nadchodzi moment, gdy trzeba pomyśleć o wymianie łożysk.

Z przodu w wersji disc kręcą się dwa łożyska 61903 (6903), a w wersji ceramic ???.

Natomiast z tyłu w bębenku użyte jest łożysko 608 (z drugiej strony jest ślizg, zamiennik występuje na ebay). Na osi z jednej strony również jest 608, natomiast z drugiej 61903 (6903).

Jeszcze jedno miejsce autostartu programu

Wydawało mi się, że jedynymi miejscami w których konfigurowane są programy uruchamiane przy starcie systemu to:

  1. w przypadku „mniej sprytnych” programów: Start->Wszystkie programy->Autostart
  2. dla tych „bardziej sprytne”: klucze Run w rejestrze systemu windows dostępne wygodnie, zbiorczo, po uruchomieniu msconfig.

Po zainstalowaniu ASUS AI Suite II spotkała mnie jednak niespodzianka, ponieważ program startował wraz z systemem, choć w żadnej z powyższych lokalizacji go nie było. Krótka chwila googlania pozwoliła znaleźć odpowiedź — program ten rejestruje się w narzędziu systemowym Harmonogram zadań (w wersji ang. Task Manager) jako uruchamiany przy zdarzeniu jakim jest start sytemu. Wyłączenie go tam rozwiązało problem przymulania startu systemu, a ja dowiedziałem się o jeszcze jedno miejscu, które można sprawdzić, gdy nie wiadomo skąd pojawił się auto-startujący program.

Windows domyślny w GRUB2

Aby trwale ustawić Windows jako domyślny w grub2, najlepiej jest podać wartość domyślną GRUB_DEFAULT jako ciąg znaków identyfikujący system (podając numer pozycji na liście, po aktualizacji dystrybucji linuxa przeważnie przybywają kolejne wpisy w menu, więc ponownie trzeba by było zmieniać domyślną pozycję). W tym celu trzeba: