Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΎΠ±ΡΡΠΆΠ΄Π° ΡΠ»ΡΡΠ°ΠΉ Π½Π° ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π±ΡΠ°ΡΠ·ΡΡ ΡΡΠ΅Π· Π·Π°ΠΌΡΠ½Π° Π½Π° ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡΡΠ° Π½Π° JavaScript Ρ WebAssembly.
WebAssembly - ΠΊΠ°ΠΊΠ²ΠΎ Π΅ ΡΠΎΠ²Π°?
ΠΠ°ΠΊΡΠ°ΡΠΊΠΎ, ΡΠΎΠ²Π° Π΅ Π΄Π²ΠΎΠΈΡΠ΅Π½ ΡΠΎΡΠΌΠ°Ρ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΠΈ Π·Π° ΠΏΠΎΠ΄ΡΠ΅Π΄Π΅Π½Π° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΠΌΠ°ΡΠΈΠ½Π°. Π§Π΅ΡΡΠΎ Wasm (ΡΡΠΊΡΠ°ΡΠ΅Π½ΠΎΡΠΎ ΠΈΠΌΠ΅) ΡΠ΅ Π½Π°ΡΠΈΡΠ° Π΅Π·ΠΈΠΊ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅, Π½ΠΎ Π½Π΅ Π΅ ΡΠ°ΠΊΠ°. Π€ΠΎΡΠΌΠ°ΡΡΡ Π½Π° ΠΈΠ½ΡΡΡΡΠΊΡΠΈΡΡΠ° ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Π² Π±ΡΠ°ΡΠ·ΡΡΠ° Π·Π°Π΅Π΄Π½ΠΎ Ρ JavaScript.
ΠΠ°ΠΆΠ½ΠΎ Π΅ WebAssembly Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ ΡΡΠ΅Π· ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ Π½Π° Π΅Π·ΠΈΡΠΈ ΠΊΠ°ΡΠΎ C / C ++, Rust, Go. Π’ΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΡΠ°ΡΠΈΡΡΠΈΡΠ΅ΡΠΊΠΎ ΡΠΈΠΏΠΈΠ·ΠΈΡΠ°Π½Π΅ ΠΈ ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½ΠΈΡ ΠΌΠΎΠ΄Π΅Π» Π½Π° ΠΏΠ»ΠΎΡΠΊΠ° ΠΏΠ°ΠΌΠ΅Ρ. ΠΠΎΠ΄ΡΡ, ΠΊΠ°ΠΊΡΠΎ Π±Π΅ ΡΠΏΠΎΠΌΠ΅Π½Π°ΡΠΎ ΠΏΠΎ-Π³ΠΎΡΠ΅, ΡΠ΅ ΡΡΡ ΡΠ°Π½ΡΠ²Π° Π² ΠΊΠΎΠΌΠΏΠ°ΠΊΡΠ΅Π½ Π΄Π²ΠΎΠΈΡΠ΅Π½ ΡΠΎΡΠΌΠ°Ρ, ΠΊΠΎΠ΅ΡΠΎ Π³ΠΎ ΠΏΡΠ°Π²ΠΈ ΠΏΠΎΡΡΠΈ ΡΠΎΠ»ΠΊΠΎΠ²Π° Π±ΡΡΠ·, ΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π°ΠΊΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄. Π’Π΅Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄ΠΎΠ²Π΅Π΄ΠΎΡ Π° Π΄ΠΎ ΠΏΠΎΠ²ΠΈΡΠ°Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠΏΡΠ»ΡΡΠ½ΠΎΡΡΡΠ° Π½Π° WebAssembly.
ΠΠ°ΠΏΠΎΠΌΠ½ΡΠΌΠ΅ Π²ΠΈ: Π·Π° Π²ΡΠΈΡΠΊΠΈ ΡΠΈΡΠ°ΡΠ΅Π»ΠΈ Π½Π° "Habr" - ΠΎΡΡΡΡΠΏΠΊΠ° ΠΎΡ 10 000 ΡΡΠ±Π»ΠΈ ΠΏΡΠΈ Π·Π°ΠΏΠΈΡΠ²Π°Π½Π΅ Π²ΡΠ² Π²ΡΠ΅ΠΊΠΈ ΠΊΡΡΡ Skillbox, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΏΡΠΎΠΌΠΎΡΠΈΠΎΠ½Π°Π»Π½ΠΈΡ ΠΊΠΎΠ΄ Π½Π° "Habr".
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°: ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ
βΠΠΎΠ±ΠΈΠ»Π΅Π½ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ PROβ .
Π ΠΌΠΎΠΌΠ΅Π½ΡΠ° Wasm ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π² ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ, ΠΎΡ ΠΈΠ³ΡΠΈ ΠΊΠ°ΡΠΎ Doom 3 Π΄ΠΎ ΡΠ΅Π± ΠΏΡΠ΅Π½Π΅ΡΠ΅Π½ΠΈ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΠΊΠ°ΡΠΎ Autocad ΠΈ Figma. Wasm ΡΠ΅ ΠΏΡΠΈΠ»Π°Π³Π° ΠΈ Π² ΡΠ°ΠΊΠ°Π²Π° ΠΎΠ±Π»Π°ΡΡ ΠΊΠ°ΡΠΎ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ Π±Π΅Π· ΡΡΡΠ²ΡΡ.
Π’Π°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Wasm Π·Π° ΡΡΠΊΠΎΡΡΠ²Π°Π½Π΅ Π½Π° ΡΠ΅Π± ΡΡΠ»ΡΠ³Π° Π·Π° Π°Π½Π°Π»ΠΈΠ·. ΠΠ° ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠ° ΡΡΠ½ΠΎΡΠ° Π²Π·Π΅Ρ ΠΌΠ΅ ΡΠ°Π±ΠΎΡΠ΅ΡΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ Π½Π° C, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ° Π² WebAssembly. Π Π΅Π·ΡΠ»ΡΠ°ΡΡΡ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½ Π·Π° Π·Π°ΠΌΡΠ½Π° Π½Π° Π½ΠΈΡΠΊΠΎΠ΅ΡΠ΅ΠΊΡΠΈΠ²Π½ΠΈ JS ΡΠ΅ΠΊΡΠΈΠΈ.
Π’ΡΠ°Π½ΡΡΠΎΡΠΌΠ°ΡΠΈΡ Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ
ΠΡΠΈΠΌΠ΅ΡΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π±ΡΠ°ΡΠ·ΡΡ ΡΡΠ»ΡΠ³Π°ΡΠ° fastq.bio, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΡΠ΅Π΄Π½Π°Π·Π½Π°ΡΠ΅Π½Π° Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠΈ. ΠΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡΡ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΠΎΡΠ΅Π½ΠΈΡΠ΅ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΠΠ ΡΠ΅ΠΊΠ²Π΅Π½ΠΈΡΠ°Π½Π΅ΡΠΎ (Π΄Π΅ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ΡΠΎ).
ΠΡΠΎ Π΅Π΄Π½ΠΎ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅:
ΠΠ΅ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ Π΄Π°Π²Π°Ρ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ Π·Π° ΠΏΡΠΎΡΠ΅ΡΠ°, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ΅ ΡΠ° Π΄ΠΎΡΡΠ° ΡΠ»ΠΎΠΆΠ½ΠΈ Π·Π° Π½Π΅ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΡΡΠΈ, Π½ΠΎ Π½Π°ΠΊΡΠ°ΡΠΊΠΎ, ΡΡΠ΅Π½ΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π³ΠΎΡΠ½Π°ΡΠ° ΠΈΠ½ΡΠΎΠ³ΡΠ°ΡΠΈΠΊΠ°, Π·Π° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ°Ρ Π΄Π°Π»ΠΈ ΠΏΡΠΎΡΠ΅ΡΡΡ Π½Π° ΡΠ΅ΠΊΠ²Π΅Π½ΠΈΡΠ°Π½Π΅ Π½Π° ΠΠΠ Π΅ ΠΏΡΠ΅ΠΌΠΈΠ½Π°Π» Π³Π»Π°Π΄ΠΊΠΎ ΠΈ ΠΊΠ°ΠΊΠ²ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΠ° Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Π»ΠΈ.
Π’Π°Π·ΠΈ ΡΡΠ»ΡΠ³Π° ΠΈΠΌΠ° Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²ΠΈ, Π΄Π΅ΡΠΊΡΠΎΠΏ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈ. ΠΠΎ fastq.bio Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° ΡΡΠΊΠΎΡΠΈΡΠ΅ Π½Π΅ΡΠ°ΡΠ°, ΠΊΠ°ΡΠΎ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°ΡΠ΅ Π΄Π°Π½Π½ΠΈΡΠ΅. Π ΠΏΠΎΠ²Π΅ΡΠ΅ΡΠΎ Π΄ΡΡΠ³ΠΈ ΡΠ»ΡΡΠ°ΠΈ ΡΡΡΠ±Π²Π° Π΄Π° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄, Π½ΠΎ Π½Π΅ Π²ΡΠΈΡΠΊΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠΈ ΠΈΠΌΠ°Ρ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡ ΠΎΠΏΠΈΡ.
ΠΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΏΡΠΎΡΡΠΎ. ΠΡ ΠΎΠ΄Π½ΠΈΡΠ΅ Π΄Π°Π½Π½ΠΈ ΡΠ° ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π΅Π½ΠΈ ΠΊΠ°ΡΠΎ ΡΠ΅ΠΊΡΡΠΎΠ² ΡΠ°ΠΉΠ». Π’ΠΎΠ·ΠΈ ΡΠ°ΠΉΠ» ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΎΡ ΡΠΏΠ΅ΡΠΈΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ Π·Π° ΡΠ΅ΠΊΠ²Π΅Π½ΠΈΡΠ°Π½Π΅. Π€Π°ΠΉΠ»ΡΡ ΡΡΠ΄ΡΡΠΆΠ° ΡΠΏΠΈΡΡΠΊ Ρ ΠΠΠ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΠΈ ΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π·Π° Π²ΡΠ΅ΠΊΠΈ Π½ΡΠΊΠ»Π΅ΠΎΡΠΈΠ΄. Π€Π°ΠΉΠ»ΠΎΠ²ΠΈΡΡ ΡΠΎΡΠΌΠ°Ρ Π΅ .fastq, ΠΎΡΠΊΡΠ΄Π΅ΡΠΎ ΠΈΠ΄Π²Π° ΠΈ ΠΈΠΌΠ΅ΡΠΎ Π½Π° ΡΡΠ»ΡΠ³Π°ΡΠ°.
ΠΠ½Π΅Π΄ΡΡΠ²Π°Π½Π΅ Π² JavaScript
ΠΡΡΠ²Π°ΡΠ° ΡΡΡΠΏΠΊΠ° Π·Π° ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»Ρ ΠΏΡΠΈ ΡΠ°Π±ΠΎΡΠ° Ρ fastq.bio Π΅ Π΄Π° ΠΈΠ·Π±Π΅ΡΠ΅ ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡΠΈΡ ΡΠ°ΠΉΠ». ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ ΠΎΠ±Π΅ΠΊΡΠ° File, ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ ΡΠ΅ΡΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½Π° ΠΈΠ·Π²Π°Π΄ΠΊΠ° ΠΎΡ Π΄Π°Π½Π½ΠΈ ΠΎΡ ΡΠ°ΠΉΠ»Π° ΠΈ ΠΎΠ±ΡΠ°Π±ΠΎΡΠ²Π° ΡΠ°Π·ΠΈ ΠΏΠ°ΡΡΠΈΠ΄Π°. ΠΠ°Π΄Π°ΡΠ°ΡΠ° Π½Π° JavaScript ΡΡΠΊ Π΅ Π΄Π° ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΡΠΎΡΡΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Ρ Π½ΠΈΠ·ΠΎΠ²Π΅ ΠΈ Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° Π΅ΠΊΡΠΏΠΎΠ½Π΅Π½ΡΠΈ. ΠΠ΄ΠΈΠ½ ΠΎΡ ΡΡΡ Π΅ Π±ΡΠΎΡΡ Π½Π° Π½ΡΠΊΠ»Π΅ΠΎΡΠΈΠ΄ΠΈΡΠ΅ A, C, G ΠΈ T Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΠΠ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈ.
Π‘Π»Π΅Π΄ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΈΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»ΠΈ, ΡΠ΅ ΡΠ΅ Π²ΠΈΠ·ΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Ρ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Plotly.js ΠΈ ΡΡΠ»ΡΠ³Π°ΡΠ° Π·Π°ΠΏΠΎΡΠ²Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π½ΠΎΠ²Π° ΠΈΠ·Π²Π°Π΄ΠΊΠ° ΠΎΡ Π΄Π°Π½Π½ΠΈ. Π Π°Π·Π΄Π΅Π»ΡΠ½Π΅ΡΠΎ Π½Π° ΡΡΠ°Π³ΠΌΠ΅Π½ΡΠΈ ΡΠ΅ ΠΏΡΠ°Π²ΠΈ, Π·Π° Π΄Π° ΡΠ΅ ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈ ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° UX. ΠΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈΡΠ΅ Ρ Π²ΡΠΈΡΠΊΠΈ Π΄Π°Π½Π½ΠΈ Π½Π°Π²Π΅Π΄Π½ΡΠΆ, ΠΏΡΠΎΡΠ΅ΡΡΡ ΡΠ΅ Π²ΠΈΡΠΈ Π·Π° ΠΈΠ·Π²Π΅ΡΡΠ½ΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Ρ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π·Π°Π΅ΠΌΠ°Ρ ΡΡΠΎΡΠΈΡΠΈ Π³ΠΈΠ³Π°Π±Π°ΠΉΡΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²ΠΎ ΠΏΡΠΎΡΡΡΠ°Π½ΡΡΠ²ΠΎ. Π£ΡΠ»ΡΠ³Π°ΡΠ°, ΠΎΡ Π΄ΡΡΠ³Π° ΡΡΡΠ°Π½Π°, Π²Π·Π΅ΠΌΠ° ΡΠ΅ΠΊΡΠΈΠΈ Ρ Π΄Π°Π½Π½ΠΈ Ρ ΡΠ°Π·ΠΌΠ΅Ρ ΠΎΡ 0,5 Π΄ΠΎ 1 MB ΠΈ ΡΠ°Π±ΠΎΡΠΈ Ρ ΡΡΡ ΡΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ°, ΠΈΠ·Π³ΡΠ°ΠΆΠ΄Π°ΠΉΠΊΠΈ Π³ΡΠ°ΡΠΈΡΠ½ΠΈ Π΄Π°Π½Π½ΠΈ.
ΠΠΎΡ ΠΊΠ°ΠΊ ΡΠΎΠ²Π° ΡΠ°Π±ΠΎΡΠΈ:
Π§Π΅ΡΠ²Π΅Π½ΠΈΡΡ ΠΏΡΠ°Π²ΠΎΡΠ³ΡΠ»Π½ΠΈΠΊ ΡΡΠ΄ΡΡΠΆΠ° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π·Π° ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅ Π·Π° ΡΠ΅Π½Π΄ΠΈΡΠ°Π½Π΅. Π’ΠΎΠ²Π° Π΅ Π½Π°ΠΉ-Π½Π°ΡΠΎΠ²Π°ΡΠ΅Π½Π°ΡΠ° ΠΎΡ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ ΡΠ°ΡΡ ΠΎΡ ΡΡΠ»ΡΠ³Π°ΡΠ°. Π‘ΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΠΎΠΏΠΈΡΠ°ΡΠ΅ Π΄Π° Π³ΠΎ Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ Ρ Wasm.
Π’Π΅ΡΡΠ²Π°Π½Π΅ Π½Π° WebAssembly
ΠΠ° Π΄Π° ΠΎΡΠ΅Π½ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Wasm, Π΅ΠΊΠΈΠΏΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π·Π°ΠΏΠΎΡΠ½Π° Π΄Π° ΡΡΡΡΠΈ Π³ΠΎΡΠΎΠ²ΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΡ Π·Π° ΡΡΠ·Π΄Π°Π²Π°Π½Π΅ Π½Π° QC ΠΌΠ΅ΡΡΠΈΠΊΠ° (QC - ΠΊΠΎΠ½ΡΡΠΎΠ» Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ) Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° fastq ΡΠ°ΠΉΠ»ΠΎΠ²Π΅. Π’ΡΡΡΠ΅Π½Π΅ΡΠΎ Π±Π΅ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ΅Π½ΠΎ ΡΡΠ΅Π΄ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π½Π° C, C ++ ΠΈΠ»ΠΈ Rust, ΡΠ°ΠΊΠ° ΡΠ΅ Π΄Π° Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΠΏΡΠ΅Π½Π°ΡΡΠ½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄Π° ΠΊΡΠΌ WebAssembly. ΠΡΠ²Π΅Π½ ΡΠΎΠ²Π° ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΡΡ Π½Π΅ ΡΡΡΠ±Π²Π° Π΄Π° Π΅ "ΡΡΡΠΎΠ²", ΠΈΠ·ΠΈΡΠΊΠ²Π° ΡΠ΅ ΡΡΠ»ΡΠ³Π°, ΠΊΠΎΡΡΠΎ Π²Π΅ΡΠ΅ Π΅ ΡΠ΅ΡΡΠ²Π°Π½Π° ΠΎΡ ΡΡΠ΅Π½ΠΈΡΠ΅.
Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΈΠ·Π±ΠΎΡΡΡ Π±Π΅ΡΠ΅ Π½Π°ΠΏΡΠ°Π²Π΅Π½ Π² ΠΏΠΎΠ»Π·Π° Π½Π°
ΠΡΠ΅Π΄ΠΈ Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ°ΡΠ΅ ΠΊΡΠΌ Wasm, ΡΡΡΠ±Π²Π° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΡΠ΅ ΠΏΡΠΈΠ½ΡΠΈΠΏΠ° Π½Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½Π΅ Π½Π° seqtk Π·Π° ΡΠ°Π±ΠΎΡΠ½ΠΈΡ ΠΏΠ»ΠΎΡ. Π‘ΠΏΠΎΡΠ΅Π΄ Makefile, Π΅ΡΠΎ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ:
# Compile to binary
$ gcc seqtk.c
-o seqtk
-O2
-lm
-lz
ΠΠΎ ΠΏΡΠΈΠ½ΡΠΈΠΏ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°ΡΠ΅ seqtk Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° Emscripten. ΠΠΊΠΎ Π³ΠΎ Π½ΡΠΌΠ°, ΡΠ΅ ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΠΌ.
$ docker pull robertaboukhalil/emsdk:1.38.26
$ docker run -dt --name wasm-seqtk robertaboukhalil/emsdk:1.38.26
ΠΠΊΠΎ ΡΠ΅ ΠΆΠ΅Π»Π°Π΅,
ΠΡΡΡΠ΅ Π² ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΌΠΎΠΆΠ΅ΡΠ΅ Π»Π΅ΡΠ½ΠΎ Π΄Π° Π²Π·Π΅ΠΌΠ΅ΡΠ΅ emcc ΠΊΠ°ΡΠΎ Π°Π»ΡΠ΅ΡΠ½Π°ΡΠΈΠ²Π° Π½Π° gcc:
# Compile to WebAssembly
$ emcc seqtk.c
-o seqtk.js
-O2
-lm
-s USE_ZLIB=1
-s FORCE_FILESYSTEM=1
ΠΠΈΠ½ΠΈΠΌΠ°Π»Π½ΠΈ ΠΏΡΠΎΠΌΠ΅Π½ΠΈ:
ΠΠΌΠ΅ΡΡΠΎ Π΄Π° ΠΈΠ·Π²Π΅ΠΆΠ΄Π° Π² Π΄Π²ΠΎΠΈΡΠ΅Π½ ΡΠ°ΠΉΠ», Emscripten ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° .wasm ΠΈ .js Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΠΊΠΎΠΈΡΠΎ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Π·Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ Π½Π° ΠΌΠΎΠ΄ΡΠ»Π° WebAssemby.
Π€Π»Π°Π³ΡΡ USE_ZLIB ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° zlib. ΠΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΡΠ΅ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π° ΠΈ ΠΏΡΠ΅Π½Π°ΡΡ ΠΊΡΠΌ WebAssembly, Π° Emscripten Ρ Π²ΠΊΠ»ΡΡΠ²Π° Π² ΠΏΡΠΎΠ΅ΠΊΡΠ°.
ΠΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ° Emscriptpten Π΅ Π°ΠΊΡΠΈΠ²ΠΈΡΠ°Π½Π°. Π’ΠΎΠ²Π°
ΠΠ° Π΄Π° ΡΠ°Π·Π±Π΅ΡΠ΅ΡΠ΅ Π·Π°ΡΠΎ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠ° Π²ΠΈΡΡΡΠ°Π»Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ°, ΡΡΡΡΠ²Π° ΡΠΈ Π΄Π° ΡΡΠ°Π²Π½ΠΈΡΠ΅ Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΡΠ΅ seqtk ΠΎΡ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΈΡ ΡΠ΅Π΄ Ρ Π½Π°ΡΠΈΠ½Π°, ΠΏΠΎ ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π°ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΠΈΡΠ°Π½ ΠΌΠΎΠ΄ΡΠ» WebAssembly.
# On the command line
$ ./seqtk fqchk data.fastq
# In the browser console
> Module.callMain(["fqchk", "data.fastq"])
ΠΠΎΠ»ΡΡΠ°Π²Π°Π½Π΅ΡΠΎ Π½Π° Π΄ΠΎΡΡΡΠΏ Π΄ΠΎ Π²ΠΈΡΡΡΠ°Π»Π½Π°ΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ, Π·Π° Π΄Π° Π½Π΅ ΡΠ΅ ΠΏΡΠ΅Π½Π°ΠΏΠΈΡΠ²Π° seqtk Π·Π° Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° Π½ΠΈΠ·, Π° Π½Π΅ Π²ΡΠ²Π΅ΠΆΠ΄Π°Π½Π΅ Π½Π° ΡΠ°ΠΉΠ». Π ΡΠΎΠ·ΠΈ ΡΠ»ΡΡΠ°ΠΉ ΡΡΠ°Π³ΠΌΠ΅Π½ΡΡΡ ΠΎΡ Π΄Π°Π½Π½ΠΈ ΡΠ΅ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΊΠ°ΡΠΎ ΡΠ°ΠΉΠ» data.fastq Π²ΡΠ² Π²ΠΈΡΡΡΠ°Π»Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π° ΡΠΈΡΡΠ΅ΠΌΠ° Ρ ΠΈΠ·Π²ΠΈΠΊΠ²Π°Π½Π΅ Π½Π° main() seqtk Π²ΡΡΡ Ρ Π½Π΅Π³ΠΎ.
ΠΡΠΎ Ρ Π½ΠΎΠ²Π°ΡΠ° Π°ΡΡ ΠΈΡΠ΅ΠΊΡΡΡΠ°:
Π€ΠΈΠ³ΡΡΠ°ΡΠ° ΠΏΠΎΠΊΠ°Π·Π²Π°, ΡΠ΅ Π²ΠΌΠ΅ΡΡΠΎ Π΄Π° ΠΈΠ·ΡΠΈΡΠ»ΠΈ Π² ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π½ΠΈΡΠΊΠ° Π½Π° Π±ΡΠ°ΡΠ·ΡΡΠ°, ΡΠΎΠΉ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°
ΠΠΎΠΌΠ°Π½Π΄Π°ΡΠ° seqtk ΡΠ΅ ΠΈΠ·ΠΏΡΠ»Π½ΡΠ²Π° Ρ Worker Π½Π° ΠΌΠΎΠ½ΡΠΈΡΠ°Π½ ΡΠ°ΠΉΠ». Π‘Π»Π΅Π΄ ΠΏΡΠΈΠΊΠ»ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ, Π Π°Π±ΠΎΡΠ½ΠΈΠΊΡΡ ΠΈΠ·Π΄Π°Π²Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΎΠ±Π΅ΡΠ°Π½ΠΈΠ΅. ΠΠΎΠ³Π°ΡΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π±ΡΠ΄Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° Π½ΠΈΡΠΊΠ°, ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° Π°ΠΊΡΡΠ°Π»ΠΈΠ·ΠΈΡΠ°Π½Π΅ Π½Π° Π³ΡΠ°ΡΠΈΠΊΠΈΡΠ΅. Π ΡΠ°ΠΊΠ° Π½Π°ΡΠ°ΡΡΠΊ Π² ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΠΎΠ²ΡΠΎΡΠ΅Π½ΠΈΡ.
ΠΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΠΊΠ°ΠΆΠ΅ΡΠ΅ Π·Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° WebAssembly?
ΠΠ° Π΄Π° ΡΠ΅ ΠΎΡΠ΅Π½ΠΈ ΠΏΡΠΎΠΌΡΠ½Π°ΡΠ° Π² ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ°, Π΅ΠΊΠΈΠΏΡΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π·Π° ΡΠ΅ΡΠ΅Π½Π΅ Π·Π° ΡΠ΅ΠΊΡΠ½Π΄Π°. ΠΡΠ΅ΠΌΠ΅ΡΠΎ Π·Π° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎ ΡΠ΅ΡΡΠ°Π½Π΅ Π½Π΅ ΡΠ΅ Π²Π·Π΅ΠΌΠ° ΠΏΡΠ΅Π΄Π²ΠΈΠ΄, ΡΡΠΉ ΠΊΠ°ΡΠΎ JavaScript ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΈ Π² Π΄Π²Π΅ΡΠ΅ ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΠΈ.
ΠΡΠΈ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° Π³ΠΎΡΠΎΠ²ΠΎΡΠΎ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π±Π΅ΡΠ΅ Π΄Π΅Π²Π΅Ρ ΠΏΡΡΠΈ.
Π’ΠΎΠ²Π° Π΅ ΠΎΡΠ»ΠΈΡΠ΅Π½ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ, Π½ΠΎ, ΠΊΠ°ΠΊΡΠΎ ΡΠ΅ ΠΎΠΊΠ°Π·Π°, ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ΅ ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ°. Π€Π°ΠΊΡ Π΅, ΡΠ΅ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ ΠΎΡ QC Π°Π½Π°Π»ΠΈΠ·ΠΈ Π½Π΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ ΠΎΡ seqtk, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·ΡΡΠΈΡΠΈ. ΠΠΊΠΎ ΡΠΎΠ²Π° ΡΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈ, ΡΠ΅Π·ΡΠ»ΡΠ°ΡΡΡ Π΅ 13 ΠΏΡΡΠΈ ΠΏΠΎ-Π΄ΠΎΠ±ΡΡ, ΠΎΡΠΊΠΎΠ»ΠΊΠΎΡΠΎ Π² JS.
Π’ΠΎΠ²Π° Π±Π΅ΡΠ΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°ΡΠΎ ΡΡΠ΅Π· ΠΏΡΠΎΡΡΠΎ ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠΌΠ°Π½Π΄ΠΈΡΠ΅ printf().
ΠΠΎ ΡΠΎΠ²Π° Π½Π΅ Π΅ Π²ΡΠΈΡΠΊΠΎ. ΠΡΠΏΡΠΎΡΡΡ Π΅, ΡΠ΅ Π½Π° ΡΠΎΠ·ΠΈ Π΅ΡΠ°ΠΏ fastq.bio ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ ΠΎΡ Π°Π½Π°Π»ΠΈΠ·Π°, ΠΊΠ°ΡΠΎ ΠΈΠ·Π²ΠΈΠΊΠ²Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π½Π° C. ΠΡΡΠΊΠ° ΠΎΡ ΡΡΡ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΡΠ²ΠΎΠΉ ΡΠΎΠ±ΡΡΠ²Π΅Π½ Π½Π°Π±ΠΎΡ ΠΎΡ Ρ Π°ΡΠ°ΠΊΡΠ΅ΡΠΈΡΡΠΈΠΊΠΈ, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΠ΅ΠΊΠΈ ΡΡΠ°Π³ΠΌΠ΅Π½Ρ ΠΎΡ ΡΠ°ΠΉΠ»Π° Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΡΠ΅ΡΠ΅Π½ Π΄Π²Π° ΠΏΡΡΠΈ.
ΠΠ° Π΄Π° ΡΠ΅ ΠΏΡΠ΅ΠΎΠ΄ΠΎΠ»Π΅Π΅ ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌ, Π±Π΅ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΎ Π΄Π²Π΅ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π΄Π° ΡΠ΅ ΠΊΠΎΠΌΠ±ΠΈΠ½ΠΈΡΠ°Ρ Π² Π΅Π΄Π½Π°. Π ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π° ΡΠΎΠ²Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΡΠ΅ ΡΠ²Π΅Π»ΠΈΡΠ°Π²Π° 20 ΠΏΡΡΠΈ.
Π’ΡΡΠ±Π²Π° Π΄Π° ΡΠ΅ ΠΎΡΠ±Π΅Π»Π΅ΠΆΠΈ, ΡΠ΅ ΡΠ°ΠΊΡΠ² ΠΈΠ·ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π΅Π½ ΡΠ΅Π·ΡΠ»ΡΠ°Ρ Π½Π΅ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΠΎΡΡΠΈΠ³Π½Π°Ρ. Π Π½ΡΠΊΠΎΠΈ ΡΠ»ΡΡΠ°ΠΈ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° ΠΏΠ°Π΄Π°, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠΈ ΡΡΡΡΠ²Π° Π΄Π° ΠΎΡΠ΅Π½ΠΈΡΠ΅ Π²ΡΠ΅ΠΊΠΈ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ ΡΠ»ΡΡΠ°ΠΉ.
ΠΠ°ΡΠΎ Π·Π°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ, ΡΠ΅ Wasm ΠΏΡΠ΅Π΄ΠΎΡΡΠ°Π²Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡΠ΅Π»Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΡΠΎ, Π½ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΡΠ°Π·ΡΠΌΠ½ΠΎ.
Skillbox ΠΏΡΠ΅ΠΏΠΎΡΡΡΠ²Π°:
- ΠΠ²ΡΠ³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΏΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΊΡΡΡ
βΠΠ· ΡΡΠΌ PRO ΡΠ΅Π± ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊβ .- ΠΠ½Π»Π°ΠΉΠ½ ΠΊΡΡΡ
βC# ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡ 0β .- ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ Π³ΠΎΠ΄ΠΈΡΠ΅Π½ ΠΊΡΡΡ
βPHP ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊ ΠΎΡ 0 Π΄ΠΎ PROβ .
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com