ΠΠ΄ΡΠ°Π²ΠΎ Π½Π° ΡΠΈΡΠ΅ β ΠΎΠ²Π° Π΅ ΠΏΠ΅ΡΡΠ° ΠΎΠ±ΡΠ°Π²Π° ΠΎΠ΄ Π½Π°ΡΠ°ΡΠ° ΡΠ΅ΡΠΈΡΠ° Quarkus! (ΠΠ°ΡΠ΅ΠΌ, Π³Π»Π΅Π΄Π°ΡΡΠ΅ Π³ΠΎ Π½Π°ΡΠΈΠΎΡ Π²Π΅Π±ΠΈΠ½Π°Ρ
Π
ΠΠ΅ΡΠ΅ΡΠ΅ΡΠΎ Π½Π° ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅ Π΅ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΎΡΠ½ΠΎΠ²Π° Π·Π° ΡΠ΅ΡΠΈΡΠΈ ΡΠ΅ΠΊΠΎΡΠ° Π½Π°Π΄Π³ΡΠ°Π΄Π±Π°, Π° ΠΈΠ·Π²Π΅ΡΡΡΠ²Π°ΡΠ΅ΡΠΎ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ° Π΅ Π²Π°ΠΆΠ΅Π½ Π΄Π΅Π» ΠΎΠ΄ ΠΏΡΠΎΡΠ΅ΡΠΎΡ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π° Π½Π° ΠΏΠ΅ΡΡΠΎΡΠΌΠ°Π½ΡΠΈΡΠ΅. ΠΠ΅Π½Π΅Ρ ΡΠ΅ Π³ΠΈ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ΅Π»Π΅Π²Π°Π½ΡΠ½ΠΈΡΠ΅ ΠΌΠ΅ΡΠ½ΠΈ Π°Π»Π°ΡΠΊΠΈ ΠΊΠΎΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΊΠΎΡΠΈΡΡΠ°Ρ Π·Π° ΠΊΠ²Π°Π½ΡΠΈΡΠΈΡΠΈΡΠ°ΡΠ΅ Π½Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°ΡΠ°ΡΠ° ΠΏΠΎΡΡΠΈΠ³Π½Π°ΡΠΈ ΡΠΎ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° Java Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅.
ΠΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΈ Π·Π° ΠΌΠ΅ΡΠ΅ΡΠ΅ Π½Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ°, Π²ΠΈΠ΄Π΅ΡΠ΅ Π³ΠΎ ΡΠΏΠ°ΡΡΡΠ²ΠΎΡΠΎ Π·Π° Quarkus ΡΠΎ Π½Π°ΡΠ»ΠΎΠ²
ΠΠΎΠ΄ΠΎΠ»Ρ Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½ΠΎ ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΈ ΡΠΏΠΎΡΠ΅Π΄ΠΈΠΌΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈΡΠ΅ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ° ΠΏΠΎΠΌΠ΅ΡΡ ΡΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΠΏΠΎΠ²ΠΈ Π½Π° Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ (JBoss EAP, JAR ΠΏΠ°ΠΊΠ΅Ρ ΠΈ ΠΈΠ·Π²ΡΡΠ½Π°) ΡΠΎ ΡΠΎΠ±ΠΈΡΠ°ΡΠ΅ Π½Π° ΠΎΠ²ΠΈΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π½Π° Linux ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° Π°Π»Π°ΡΠΊΠΈΡΠ΅ pmap ΠΈ ps.
JBoss EAP
Π‘ΡΠ°ΡΡΡΠ²Π°ΠΌΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΊ ΠΎΠ΄ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° JBoss EAP (Π²ΠΈΠ΄Π΅ΡΠ΅ Π³ΠΎ Π΄Π΅Π»ΠΎΡ βΠΠ° ΡΠ΅ ββΡΠ°ΡΠΏΠΎΡΠ΅Π΄ΠΈ helloworldβ Π²ΠΎ
$ pgrep -lf jboss
7268 java
ΠΠ°Π±Π΅Π»Π΅ΡΠΊΠ°. ΠΠΏΡΠΈΡΠ°ΡΠ° βa Π²ΠΈ ΠΎΠ²ΠΎΠ·ΠΌΠΎΠΆΡΠ²Π° Π΄Π° ΡΠ° ΠΈΠ·Π²Π»Π΅ΡΠ΅ΡΠ΅ ΡΠ΅Π»ΠΎΡΠ½Π°ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½Π° Π»ΠΈΠ½ΠΈΡΠ° (Ρ.Π΅.: $ pgrep -af jboss).
Π‘Π΅Π³Π° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ PID 7268 Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ps ΠΈ pmap.
ΠΠ²Π΅ ΡΠ°ΠΊΠ°:
$ ps -o pid,rss,command -p 7268
PID RSS COMMAND
7268 665348 java -D[Standalone] -server -verbose:gc -Xloggc:/home/mrizzi/Tools/jboss-eap-7.2.0/jboss-eap-7.2/standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1303m -Xmx1303m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferI
Π Π²Π°ΠΊΠ°:
$ pmap -x 7268
7268: java -D[Standalone] -server -verbose:gc -Xloggc:/home/mrizzi/Tools/jboss-eap-7.2.0/jboss-eap-7.2/standalone/log/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=3M -XX:-TraceClassUnloading -Xms1303m -Xmx1303m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=256m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=org.jboss.byteman -Djava.awt.headless=true -Dorg.jboss.boot.log.file=/home/mrizzi/Tools/jboss-eap-7.2.0/jboss-eap-7.2/standa
Address Kbytes RSS Dirty Mode Mapping
00000000ae800000 1348608 435704 435704 rw--- [ anon ]
0000000100d00000 1035264 0 0 ----- [ anon ]
000055e4d2c2f000 4 4 0 r---- java
000055e4d2c30000 4 4 0 r-x-- java
000055e4d2c31000 4 0 0 r---- java
000055e4d2c32000 4 4 4 r---- java
000055e4d2c33000 4 4 4 rw--- java
[...]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 3263224 672772 643024
ΠΠ° Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π²ΡΠ΅Π΄Π½ΠΎΡΡΠ° Π½Π° RSS ΠΈ Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° JBoss EAP ΡΡΠΎΡΠΈ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ½ΠΎ 650 MB ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°.
JAR ΠΏΠ°ΠΊΠ΅Ρ
ΠΠ° ΡΡΠ°ΡΡΡΠ²Π°ΠΌΠ΅ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΡΠ°ΡΠ° JAR (Π²ΠΈΠ΄Π΅ΡΠ΅ Π³ΠΎ Π΄Π΅Π»ΠΎΡ βΠ‘ΡΠ°ΡΡΡΠ²Π°Ρ helloworld ΡΠΏΠ°ΠΊΡΠ²Π°Π½ Π²ΠΎ JARβ Π²ΠΎ
$ java -jar ./target/helloworld-<version>-runner.jar
ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ Π³ΠΎ Π³Π»Π΅Π΄Π°ΠΌΠ΅ PID ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ ΡΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° pgrep (ΠΎΠ²ΠΎΡ ΠΏΠ°Ρ ΡΠ° ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ ΠΎΠΏΡΠΈΡΠ°ΡΠ° -a ΠΎΠΏΠΈΡΠ°Π½Π° ΠΏΠΎΠ³ΠΎΡΠ΅):
$ pgrep -af helloworld
6408 java -jar ./target/helloworld-<version>-runner.jar
Π Π°Π±ΠΎΡΠΈΠΌΠ΅ ps ΠΈ pmap Π·Π° Π΄Π° ΡΠ° ΠΈΠ·ΠΌΠ΅ΡΠΈΠΌΠ΅ ΡΠΏΠΎΡΡΠ΅Π±Π°ΡΠ° Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ°, Π½ΠΎ ΡΠ΅Π³Π° Π·Π° ΠΏΡΠΎΡΠ΅ΡΠΎΡ 6408.
ΠΠ²Π΅ ΡΠ°ΠΊΠ°:
$ ps -o pid,rss,command -p 6408
PID RSS COMMAND
6408 125732 java -jar ./target/helloworld-quarkus-runner.jar
Π Π²Π°ΠΊΠ°:
$ pmap -x 6408
6408: java -jar ./target/helloworld-quarkus-runner.jar
Address Kbytes RSS Dirty Mode Mapping
00000005d3200000 337408 0 0 rw--- [ anon ]
00000005e7b80000 5046272 0 0 ----- [ anon ]
000000071bb80000 168448 57576 57576 rw--- [ anon ]
0000000726000000 2523136 0 0 ----- [ anon ]
00000007c0000000 2176 2088 2088 rw--- [ anon ]
00000007c0220000 1046400 0 0 ----- [ anon ]
00005645b85d6000 4 4 0 r---- java
00005645b85d7000 4 4 0 r-x-- java
00005645b85d8000 4 0 0 r---- java
00005645b85d9000 4 4 4 r---- java
00005645b85da000 4 4 4 rw--- java
[...]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 12421844 133784 115692
ΠΠΎΠ²ΡΠΎΡΠ½ΠΎ Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π½Π° RSS ΠΈ Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° JAR ΠΏΠ°ΠΊΠ΅ΡΠΎΡ ΡΡΠΎΡΠΈ ΠΏΡΠΈΠ±Π»ΠΈΠΆΠ½ΠΎ 130 MB.
ΠΠ·Π²ΡΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ°
ΠΠ° ΡΡΠ°ΡΡΡΠ²Π°ΠΌΠ΅ ΠΌΠ°ΡΠΈΡΠ½Π°ΡΠ° (Π²ΠΈΠ΄Π΅ΡΠ΅ Π³ΠΎ Π΄Π΅Π»ΠΎΡ βΠΠΎΠ΄Π΅ΡΠ΅ Π½Π° ΠΌΠ°ΡΠΈΡΠ½Π°ΡΠ° ΠΈΠ·Π²ΡΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° helloworldβ Π²ΠΎ
$ ./target/helloworld-<version>-runner
ΠΡΠ΄Π΅ ΠΏΠΎΠ²ΡΠΎΡΠ½ΠΎ Π΄Π° Π³ΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌΠ΅ Π½Π΅Π³ΠΎΠ²ΠΈΠΎΡ PID:
$ pgrep -af helloworld
6948 ./target/helloworld-<version>-runner
Π ΡΠΎΠ³Π°Ρ Π³ΠΎ ΠΊΠΎΡΠΈΡΡΠΈΠΌΠ΅ Π΄ΠΎΠ±ΠΈΠ΅Π½ΠΈΠΎΡ ΠΏΡΠΎΡΠ΅Ρ ID (6948) Π²ΠΎ ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ ps ΠΈ pmap.
ΠΠ²Π΅ ΡΠ°ΠΊΠ°:
$ ps -o pid,rss,command -p 6948
PID RSS COMMAND
6948 19084 ./target/helloworld-quarkus-runner
Π Π²ΠΎΡ ΡΠ°ΠΊ:
$ pmap -x 6948
6948: ./target/helloworld-quarkus-runner
Address Kbytes RSS Dirty Mode Mapping
0000000000400000 12 12 0 r---- helloworld-quarkus-runner
0000000000403000 10736 8368 0 r-x-- helloworld-quarkus-runner
0000000000e7f000 7812 6144 0 r---- helloworld-quarkus-runner
0000000001620000 2024 1448 308 rw--- helloworld-quarkus-runner
000000000181a000 4 4 4 r---- helloworld-quarkus-runner
000000000181b000 16 16 12 rw--- helloworld-quarkus-runner
0000000001e10000 1740 156 156 rw--- [ anon ]
[...]
ffffffffff600000 4 0 0 r-x-- [ anon ]
---------------- ------- ------- -------
total kB 1456800 20592 2684
ΠΠΎ Π³Π»Π΅Π΄Π°ΠΌΠ΅ RSS-ΠΎΡ ΠΈ Π³Π»Π΅Π΄Π°ΠΌΠ΅ Π΄Π΅ΠΊΠ° ΠΈΠ·Π²ΡΡΠ½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π·Π°ΡΠ°ΡΠ° ΠΎΠΊΠΎΠ»Ρ 20 MB ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°.
Π‘ΠΏΠΎΡΠ΅Π΄ΡΠ²Π°ΡΠ΅ Π½Π° ΠΏΠΎΡΡΠΎΡΡΠ²Π°ΡΠΊΠ°ΡΠ° Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°
ΠΠ½Π°ΡΠΈ, Π³ΠΈ Π΄ΠΎΠ±ΠΈΠ²ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ Π±ΡΠΎΡΠΊΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ°:
- JBoss EAP - 650 MB.
- JAR ΠΏΠ°ΠΊΠ΅Ρ β 130 MB.
- ΠΠ·Π²ΡΡΠ½Π° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° - 20 MB.
ΠΡΠΈΠ³Π»Π΅Π΄Π½ΠΎ, ΠΈΠ·Π²ΡΡΠ½Π°ΡΠ° Π΄Π°ΡΠΎΡΠ΅ΠΊΠ° Π·Π°ΡΠ°ΡΠ° ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΠΌΠ°Π»ΠΊΡ ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°.
ΠΡΠ΄Π΅ Π΄Π° Π³ΠΈ ΡΡΠΌΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΡΡΠΎΠ²ΠΈΡΠ΅ 4 ΠΈ 5
ΠΠΎ ΠΎΠ²ΠΎΡ ΠΈ ΠΏΡΠ΅ΡΡ ΠΎΠ΄Π½ΠΈΡΠ΅ ΠΎΠ±ΡΠ°Π²ΠΈ, ΡΠ°Π·Π³Π»Π΅Π΄Π°Π²ΠΌΠ΅ ΠΌΠΎΠ΄Π΅ΡΠ½ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π½Π° Java Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈΡΠ΅ ΡΠΎ ΠΏΠΎΠΌΠΎΡ Π½Π° ΡΠ΅Ρ Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ ΠΏΠΎΠ΄Π΄ΡΠΆΠ°Π½ΠΈ Π²ΠΎ Quarkus (CDI ΠΈ Servlet 3), ΠΊΠ°ΠΊΠΎ ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π½Π°ΡΠΈΠ½ΠΈ Π·Π° ΡΠ°Π·Π²ΠΎΡ, ΠΈΠ·Π³ΡΠ°Π΄Π±Π° ΠΈ ΡΡΠ°ΡΡΡΠ²Π°ΡΠ΅ Π½Π° ΡΠ°ΠΊΠ²ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ. ΠΠΎΠΊΠ°ΠΆΠ°Π²ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° ΡΠΎΠ±ΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ΄Π°ΡΠΎΡΠΈ Π·Π° ΠΊΠΎΡΠΈΡΡΠ΅ΡΠ΅ΡΠΎ Π½Π° ΠΌΠ΅ΠΌΠΎΡΠΈΡΠ°ΡΠ° Π·Π° Π΄Π° Π³ΠΈ ΠΎΡΠ΅Π½ΠΈΠΌΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°ΡΠ°ΡΠ° ΠΏΠΎΡΡΠΈΠ³Π½Π°ΡΠΈ ΡΠΎ ΡΠ°ΠΊΠ²Π°ΡΠ° Π½Π°Π΄Π³ΡΠ°Π΄Π±Π°. ΠΠ²ΠΈΠ΅ ΡΡΠ°ΡΠΈΠΈ Π²ΠΈ ΠΏΠΎΠΌΠ°Π³Π°Π°Ρ Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ ΠΊΠ°ΠΊΠΎ ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° Quarkus ΠΈ Π·ΠΎΡΡΠΎ Π΅ ΠΊΠΎΡΠΈΡΠ΅Π½ - Π±Π΅Π· ΡΠ°Π·Π»ΠΈΠΊΠ° Π΄Π°Π»ΠΈ Π·Π±ΠΎΡΡΠ²Π°ΡΠ΅ Π·Π° Π΅Π΄Π½ΠΎΡΡΠ°Π²Π½Π°ΡΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° helloworld Π²ΠΎ Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΈΠΌΠ΅ΡΠΈ ΠΈΠ»ΠΈ ΠΌΠ½ΠΎΠ³Ρ ΠΏΠΎΡΠ»ΠΎΠΆΠ΅Π½ΠΈ Π°ΠΏΠ»ΠΈΠΊΠ°ΡΠΈΠΈ ΠΎΠ΄ ΡΠ΅Π°Π»Π½ΠΈΠΎΡ ΠΆΠΈΠ²ΠΎΡ.
ΠΠ΅ ΡΠ΅ Π²ΡΠ°ΡΠΈΠΌΠ΅ Π·Π° Π΄Π²Π΅ Π½Π΅Π΄Π΅Π»ΠΈ ΡΠΎ ΠΏΠΎΡΠ»Π΅Π΄Π΅Π½ ΠΏΠΎΡΡ Π·Π° Quarkus - ΡΠ΅ Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ°ΠΌΡ!
ΠΠΎ Π½Π°ΡΠ°ΡΠ° ΠΏΠΎΡΠ»Π΅Π΄Π½Π° ΠΎΠ±ΡΠ°Π²Π°, ΡΠ΅ ΠΏΠΎΠΊΠ°ΠΆΠ΅ΠΌΠ΅ ΠΊΠ°ΠΊΠΎ Π΄Π° Π³ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°ΠΌΠ΅ AMQ Online ΠΈ Quarkus Π·Π° Π΄Π° ΠΈΠ·Π³ΡΠ°Π΄ΠΈΠΌΠ΅ ΠΌΠΎΠ΄Π΅ΡΠ΅Π½ ΡΠΈΡΡΠ΅ΠΌ Π·Π° ΠΏΠΎΡΠ°ΠΊΠΈ Π±Π°Π·ΠΈΡΠ°Π½ Π½Π° OpenShift ΠΊΠΎΡΠΈΡΡΠ΅ΡΡΠΈ Π΄Π²Π΅ Π½ΠΎΠ²ΠΈ ΡΠ΅Ρ
Π½ΠΎΠ»ΠΎΠ³ΠΈΠΈ Π·Π° ΠΏΠΎΡΠ°ΠΊΠΈ. ΠΡΠΎΠ΄ΠΎΠ»ΠΆΠΈ Π΄Π° ΡΠΈΡΠ°Ρ
ΠΠ·Π²ΠΎΡ: www.habr.com