eFusion 29 сСнтября 2020

πŸ–ΌοΈ Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ ΠΆΠ΅Ρ€Ρ‚Π²Ρƒ: ΠΊΠ°ΠΊ Π·Π°ΡˆΠΈΡ‚ΡŒ Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ исполняСмый ΠΊΠΎΠ΄

МоТно Π»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ графичСский Ρ„Π°ΠΉΠ» с исполняСмым сцСнариСм JavaScript Π²Π½ΡƒΡ‚Ρ€ΠΈ? РассказываСм ΠΊΠ°ΠΊ.
πŸ–ΌοΈ Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ ΠΆΠ΅Ρ€Ρ‚Π²Ρƒ: ΠΊΠ°ΠΊ Π·Π°ΡˆΠΈΡ‚ΡŒ Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ исполняСмый ΠΊΠΎΠ΄

ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ публикуСтся с сокращСниями, Π°Π²Ρ‚ΠΎΡ€ ΠΎΡ€ΠΈΠ³ΠΈΠ½Π°Π»Π°: Sebastian Stamm.

***

ΠšΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ°, которая ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ являСтся ΠΊΠΎΠ΄ΠΎΠΌ Π½Π° JavaScript

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ хранятся Π² Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»Π°Ρ…, Π° сцСнарий JavaScript являСтся ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹ΠΌ тСкстом. Оба Ρ‚ΠΈΠΏΠ° Ρ„Π°ΠΉΠ»ΠΎΠ² Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ собствСнным ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ: изобраТСния ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‚ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΌΡƒ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρƒ, Π° сцСнарии JavaScript Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠΌΡƒ синтаксису. МоТно Π»ΠΈ ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ» изобраТСния, ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠΎΡ‚Π²Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ синтаксису JavaScript?

        <!DOCTYPE html>
<html lang="en">
  <head>
    <style>
      body {
        margin: 0;
        overflow: hidden;
        height: 100vh;
      }

      img {
        width: 100%;
      }
    </style>
    <title>This Image Is Also a Valid Javascript File</title>
  </head>
  <body>
    <!--
      Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½ΠΈΠΆΠ΅, являСтся Π²Π°Π»ΠΈΠ΄Π½Ρ‹ΠΌ Ρ„Π°ΠΉΠ»ΠΎΠΌ Javascript!

      ΠŸΠΎΠΆΠ°Π»ΡƒΠΉΡΡ‚Π°, Π·Π°ΠΌΠ΅Π½ΠΈΡ‚Π΅ Ρ‚Π΅Π³ изобраТСния Ρ‚Π΅Π³ΠΎΠΌ сцСнария, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ Π΅Π³ΠΎ Π² дСйствии.
    -->
    <img src="https://executable-gif.glitch.me/image.gif" />

    <!-- <script src="https://executable-gif.glitch.me/image.gif"></script> -->
  </body>
</html>

    
πŸ–ΌοΈ Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ ΠΆΠ΅Ρ€Ρ‚Π²Ρƒ: ΠΊΠ°ΠΊ Π·Π°ΡˆΠΈΡ‚ΡŒ Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ исполняСмый ΠΊΠΎΠ΄

Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Ρ‚ΠΈΠΏ изобраТСния

Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΡ содСрТат массу Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π²Ρ‹Π΄Π°Π΄ΡƒΡ‚ ΠΎΡˆΠΈΠ±ΠΊΡƒ, Ссли ΠΈΡ… ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠ°ΠΊ JavaScript. ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ ΠΈΡ… Π² ΠΎΠ΄ΠΈΠ½ большой ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ:

        /*ALL OF THE BINARY IMAGE DATA*/
    

Π­Ρ‚ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» JavaScript. Однако Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ со спСцифичного для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°. НапримСр, Ρ„Π°ΠΉΠ»Ρ‹ PNG Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ΡΡ с ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Π±Π°ΠΉΡ‚ΠΎΠ² 89 50 4E 47 0D 0A 1A 0A. Если ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π°Ρ‡ΠΈΠ½Π°Π»ΠΎΡΡŒ с /*, ΠΎΠ½ΠΎ пСрСстанСт Π±Ρ‹Ρ‚ΡŒ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½Ρ‹ΠΌ.

Π—Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Ρ„Π°ΠΉΠ»Π° ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ мысли: Ρ‡Ρ‚ΠΎ, Ссли эту ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ Π±Π°ΠΉΡ‚ΠΎΠ² ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π² качСствС ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ ΠΈ ΠΏΡ€ΠΈΡΠ²ΠΎΠΈΡ‚ΡŒ Π΅ΠΉ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ Π΄Π»ΠΈΠ½Π½ΠΎΠΉ строки:

        PNG=`ALL OF THE BINARY IMAGE DATA`;
    

Π—Π΄Π΅ΡΡŒ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ ΡˆΠ°Π±Π»ΠΎΠ½Π½Ρ‹Π΅ строки вмСсто ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Ρ… Β« " Β» ΠΈΠ»ΠΈ Β« ' Β», ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΌΠΎΠ³ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ Ρ€Π°Π·Ρ€Ρ‹Π²Ρ‹ строк.

Π‘ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠ² содСрТат нСдопустимыС Π² ΠΈΠΌΠ΅Π½Π°Ρ… ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… символы, Π½ΠΎ Π΅ΡΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ: GIF. Π‘Π»ΠΎΠΊ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ° GIF ΠΈΠΌΠ΅Π΅Ρ‚ Π²ΠΈΠ΄ 47 49 46 38 39 61 ΠΈ ΡƒΠ΄ΠΎΠ±Π½ΠΎ прСобразуСтся Π² ASCII-строку GIF89a.

Π’Ρ‹Π±ΠΈΡ€Π°Π΅ΠΌ Ρ€Π°Π·ΠΌΠ΅Ρ€ изобраТСния

Π’Π΅ΠΏΠ΅Ρ€ΡŒ, ΠΊΠΎΠ³Π΄Π° ΠΌΡ‹ нашли Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‰ΠΈΠΉΡΡ с допустимого ΠΈΠΌΠ΅Π½ΠΈ ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ изобраТСния, Π½ΡƒΠΆΠ½ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ символы Β« = Β» ΠΈ Β« ` Β». Π’Π°ΠΊΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ, ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π±Π°ΠΉΡ‚Π° Ρ„Π°ΠΉΠ»Π° Π±ΡƒΠ΄ΡƒΡ‚ 3D 09 60 04:

πŸ–ΌοΈ Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ ΠΆΠ΅Ρ€Ρ‚Π²Ρƒ: ΠΊΠ°ΠΊ Π·Π°ΡˆΠΈΡ‚ΡŒ Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ исполняСмый ΠΊΠΎΠ΄

Π’ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ GIF ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π·Π° Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠΎΠΌ Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ Π±Π°ΠΉΡ‚Π° ΠΎΠΏΡ€Π΅Π΄Π΅Π»ΡΡŽΡ‚ Ρ€Π°Π·ΠΌΠ΅Ρ€Ρ‹ изобраТСния. ΠœΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° 3D (Π·Π½Π°ΠΊ равСнства) ΠΈ 60 (ΠΎΠ±Ρ€Π°Ρ‚Π½Ρ‹ΠΉ апостроф). Π§Ρ‚ΠΎΠ±Ρ‹ изобраТСния Π±Ρ‹Π»ΠΈ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ мСньшС, 3D ΠΈ 60 слСдуСт Ρ…Ρ€Π°Π½ΠΈΡ‚ΡŒ Π² Π½Π°ΠΈΠΌΠ΅Π½Π΅Π΅ Π·Π½Π°Ρ‡ΠΈΠΌΡ‹Ρ… Π±Π°ΠΉΡ‚Π°Ρ….

Π’Ρ‚ΠΎΡ€ΠΎΠΉ Π±Π°ΠΉΡ‚ ΡˆΠΈΡ€ΠΈΠ½Ρ‹ изобраТСния Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ символом ΠΏΡ€ΠΎΠ±Π΅Π»Π°, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ это Π±ΡƒΠ΄Π΅Ρ‚ ΠΏΡ€ΠΎΠ±Π΅Π» ΠΌΠ΅ΠΆΠ΄Ρƒ Π·Π½Π°ΠΊΠΎΠΌ равСнства ΠΈ Π½Π°Ρ‡Π°Π»ΠΎΠΌ строки Β«GIF89a= `...Β» . ΠŸΠΎΠΌΠ½ΠΈΡ‚Π΅, Ρ‡Ρ‚ΠΎ ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ символов Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ ΠΊΠ°ΠΊ ΠΌΠΎΠΆΠ½ΠΎ мСньшС, ΠΈΠ½Π°Ρ‡Π΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ получится ΠΎΠ³Ρ€ΠΎΠΌΠ½Ρ‹ΠΌ.

НаимСньший ΠΏΡ€ΠΎΠ±Π΅Π»ΡŒΠ½Ρ‹ΠΉ символ – 09 (символ Π³ΠΎΡ€ΠΈΠ·ΠΎΠ½Ρ‚Π°Π»ΡŒΠ½ΠΎΠΉ табуляции). Π­Ρ‚ΠΎ Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ ΡˆΠΈΡ€ΠΈΠ½Ρƒ изобраТСния 3D09 ΠΈΠ»ΠΈ 2365.

Для Π²Ρ‚ΠΎΡ€ΠΎΠ³ΠΎ Π±Π°ΠΉΡ‚Π° высоты ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Π²Ρ‹Π±Ρ€Π°Ρ‚ΡŒ символ, ΡΠΎΠ·Π΄Π°ΡŽΡ‰ΠΈΠΉ Ρ…ΠΎΡ€ΠΎΡˆΠ΅Π΅ ΡΠΎΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠ΅ сторон. НапримСр 04 Π΄Π°Π΅Ρ‚ Π½Π°ΠΌ высоту 60 04 ΠΈΠ»ΠΈ 1120.

Π‘ΠΎΠ·Π΄Π°Π΅ΠΌ скрипт

БСйчас наш исполняСмый GIF Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π΄Π΅Π»Π°Π΅Ρ‚. Он просто присваиваСт Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ строку глобальной ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ GIF89a. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ Π΄Π°Π½Π½Ρ‹Ρ… Π²Π½ΡƒΡ‚Ρ€ΠΈ GIF ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π° для кодирования изобраТСния, поэтому, Ссли ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° ΠΊΠΎΠ΄ JavaScript, Ρ‚ΠΎ, вСроятно, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½Π½ΠΎΠ΅ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Однако Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ содСрТит ΠΎΠ±Π»Π°ΡΡ‚ΡŒ, Π½Π°Π·Ρ‹Π²Π°Π΅ΠΌΡƒΡŽ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½ΠΈΠ΅ΠΌ коммСнтария ΠΈ ΠΏΡ€Π΅Π΄Π½Π°Π·Π½Π°Ρ‡Π΅Π½Π½ΡƒΡŽ для хранСния Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΠ΅Ρ‚Π°Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΡ€Π΅Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒΡΡ Π΄Π΅ΠΊΠΎΠ΄Π΅Ρ€ΠΎΠΌ GIF.

Π­Ρ‚Π° ΠΎΠ±Π»Π°ΡΡ‚ΡŒ ΠΈΠ΄Π΅Ρ‚ сразу послС Ρ‚Π°Π±Π»ΠΈΡ†Ρ‹ Ρ†Π²Π΅Ρ‚ΠΎΠ² GIF. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ Π² силах ΠΏΠΎΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ Ρ‚ΡƒΠ΄Π° любой ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, ΠΌΠΎΠΆΠ½ΠΎ Π·Π°ΠΊΡ€Ρ‹Ρ‚ΡŒ строку GIF89a, Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вСсь наш сцСнарий, Π° Π·Π°Ρ‚Π΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ многострочный Π±Π»ΠΎΠΊ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π², Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΡΡ‚Π°Π»ΡŒΠ½Π°Ρ Ρ‡Π°ΡΡ‚ΡŒ изобраТСния Π½Π΅ мСшала синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Π°Ρ‚ΠΎΡ€Ρƒ.

Π‘ΠΊΡ€ΠΈΠΏΡ‚ ΠΌΠΎΠΆΠ΅Ρ‚ Π²Ρ‹Π³Π»ΡΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΌ ΠΎΠ±Ρ€Π°Π·ΠΎΠΌ:

        GIF89a= ` BINARY COLOR TABLE DATA ... COMMENT BLOCK:

`;alert("Javascript!");/*

REST OF THE IMAGE */
    

БущСствуСт нСбольшоС ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅: хотя сам Π±Π»ΠΎΠΊ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π² ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ любого Ρ€Π°Π·ΠΌΠ΅Ρ€Π°, ΠΎΠ½ состоит ΠΈΠ· Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… ΠΏΠΎΠ΄Π±Π»ΠΎΠΊΠΎΠ², ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΠΌΠ΅Π΅Ρ‚ ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Π΄Π»ΠΈΠ½Ρƒ Π² 255 Π±Π°ΠΉΡ‚. ΠœΠ΅ΠΆΠ΄Ρƒ ΠΏΠΎΠ΄Π±Π»ΠΎΠΊΠ°ΠΌΠΈ находится ΠΎΠ΄ΠΈΠ½ Π±Π°ΠΉΡ‚, хранящий Π΄Π»ΠΈΠ½Ρƒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ΄Π±Π»ΠΎΠΊΠ°, поэтому сцСнарий Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΌΠ΅Π»ΠΊΠΈΠ΅ части:

        alert('Javascript');/*0x4A*/console.log('another subblock');/*0x1F*/...
    

ШСстнадцатСричныС ΠΊΠΎΠ΄Ρ‹ Π² коммСнтариях – это Π±Π°ΠΉΡ‚Ρ‹, ΡƒΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠ΅ Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΏΠΎΠ΄Π±Π»ΠΎΠΊΠ°. Они Π½Π΅ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΡ ΠΊ Javascript, Π½ΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡ‹ для Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π° GIF-Ρ„Π°ΠΉΠ»Π° ΠΈ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ Π·Π°ΠΊΠ»ΡŽΡ‡Π΅Π½Ρ‹ Π² ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ влияниС Π½Π° ΠΎΡΡ‚Π°Π»ΡŒΠ½ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΊΠΎΠ΄Π°. НиТС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½ нСбольшой скрипт, ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ Ρ„Ρ€Π°Π³ΠΌΠ΅Π½Ρ‚Ρ‹ ΠΈ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‰ΠΈΠΉ ΠΈΡ… Π½Π° ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ:

        const fs = require("fs");

const scriptChunks = [
  `\`;document.body.innerHTML='<div style="text-align: center;"><h1 style="margin-top: 45vh; transform: translate(0,-50%); font-family: monospace;">Click Button to play Snake! (Control with WASD)</h1></div>';`,
  `document.querySelector('div').innerHTML += '<button id="play" style="font-size: 32px;">Start Game</button>';`,
  `document.querySelector("#play").addEventListener("click",()=>{const e=document.querySelector("h1");document.querySelector("#play").style.display="none",e.textContent="3",e.style.fontSize="3em";const t=document.createElement("style");`,
  `t.innerHTML=\`@-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } }\n  @-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } }\n  @keyframes spin { 100% { -webkit-transform: rotate(360deg); transform:rotate(360deg);}}\`;`,
  `document.head.appendChild(t),document.body.style.overflow="hidden",setTimeout(()=>{e.textContent="2",e.style.fontSize="4em"},1e3),setTimeout(()=>{e.textContent="1",e.style.fontSize="5em"},2e3);setTimeout(()=>{`,
  `document.body.innerHTML=\`<iframe width="100%" height="100%" src="https://www.youtube.com/embed/dQw4w9WgXcQ?controls=0&autoplay=1" frameborder="0" allow="accelerometer; autoplay; encrypted-media; gyroscope; picture-in-picture"></iframe>\`;`,
  `document.body.innerHTML+='<div id="lol-as-if-i-would-let-you-turn-it-off-blocker-div" style="position: absolute; top: 0; bottom:0; left: 0; right: 0;"></div>';},3e3);`,
  `setTimeout(()=>{const e=document.createElement("div");e.textContent="I was too lazy to write a snake game.";`,
  `e.setAttribute("style","position: absolute;top: 45%;color: white;text-align: center;width: 100%;font-size: 3vw;text-shadow: 2px 2px 2px black; animation:spin 6s linear infinite;"),document.body.appendChild(e)},4500)});`,
  `alert("Script works! Press the Button to play a game of Snake!");`,
];

const chunks = scriptChunks.map((chunk, i) => {
  if (i > 0) {
    chunk = "*/" + chunk;
  }
  chunk += "/*";
  return chunk;
});

const scriptContent = [];
for (let i = 0; i < chunks.length; i++) {
  const chunk = chunks[i];
  scriptContent.push(chunk.length);
  for (let j = 0; j < chunk.length; j++) {
    scriptContent.push(chunk.charCodeAt(j));
  }
}

fs.writeFileSync("out.js", Buffer.from(scriptContent));

fs.readFile("image.gif", function (err, buffer) {
  const data = [...buffer];

  for (let i = 0; i < data.length; i++) {
    if (data[i] === 33 && data[i + 1] === 254) {
      // found comment section
      const currentCommentLength = data[i + 2];

      data.splice.apply(data, [
        i + 2,
        currentCommentLength + 1, // remove current comment
        ...scriptContent, // add script as new comment
      ]);

      fs.writeFileSync("out.gif", Buffer.from(data));
      break;
    }
  }
});
    

ΠžΡ‡ΠΈΡ‰Π°Π΅ΠΌ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅

Когда Ρƒ нас Π΅ΡΡ‚ΡŒ базовая структура, слСдуСт ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π΅ Ρ€Π°Π·Ρ€ΡƒΡˆΠ°ΡŽΡ‚ синтаксис сцСнария. Π€Π°ΠΉΠ» состоит ΠΈΠ· Ρ‚Ρ€Π΅Ρ… Ρ€Π°Π·Π΄Π΅Π»ΠΎΠ²: ΠΏΠ΅Ρ€Π²Ρ‹ΠΉ – присвоСниС ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎΠΉ GIF89a, Π²Ρ‚ΠΎΡ€ΠΎΠΉ – ΠΊΠΎΠ΄ JavaScript ΠΈ Ρ‚Ρ€Π΅Ρ‚ΠΈΠΉ – многострочный ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ.

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΠ΅Ρ€Π²ΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ:

        GIF89a= ` BINARY DATA `;
    

Если Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ символ ` ΠΈΠ»ΠΈ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΡŽ символов ${, Ρƒ нас Π²ΠΎΠ·Π½ΠΈΠΊΠ½ΡƒΡ‚ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹: Π»ΠΈΠ±ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ строка шаблона, Π»ΠΈΠ±ΠΎ ΠΌΡ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠΌ нСдопустимоС Π²Ρ‹Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Π˜ΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ это ΠΌΠΎΠΆΠ½ΠΎ, Π·Π°ΠΌΠ΅Π½ΠΈΠ² Π΄Π²ΠΎΠΈΡ‡Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅: Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, вмСсто символа Β« ` Β» (ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ 60) ΠΌΡ‹ ΠΌΠΎΠ³Π»ΠΈ Π±Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ символ Β« a Β» (ΡˆΠ΅ΡΡ‚Π½Π°Π΄Ρ†Π°Ρ‚Π΅Ρ€ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ΄ 61). ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ эта Ρ‡Π°ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Π° содСрТит Ρ‚Π°Π±Π»ΠΈΡ†Ρƒ Ρ†Π²Π΅Ρ‚ΠΎΠ², это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ†Π²Π΅Ρ‚Π° Π±ΡƒΠ΄ΡƒΡ‚ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ (Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ), Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€: #286148 вмСсто #286048.

БорСмся с искаТСниями

Π’ ΠΊΠΎΠ½Ρ†Π΅ ΠΊΠΎΠ΄Π° ΠΌΡ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ многострочный ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ. НуТно ΡƒΠ±Π΅Π΄ΠΈΡ‚ΡŒΡΡ, Ρ‡Ρ‚ΠΎ Π±ΠΈΠ½Π°Ρ€Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠΈ Π½Π΅ ΠΌΠ΅ΡˆΠ°ΡŽΡ‚ синтаксичСскому Π°Π½Π°Π»ΠΈΠ·Ρƒ:

        alert("Script done");/*BINARY IMAGE DATA ...
    

Если Π΄Π°Π½Π½Ρ‹Π΅ изобраТСния Π±ΡƒΠ΄ΡƒΡ‚ ΡΠΎΠ΄Π΅Ρ€ΠΆΠ°Ρ‚ΡŒ ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ символов Β« */ Β», ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡΡ ΠΏΡ€Π΅ΠΆΠ΄Π΅Π²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ нСкоррСктности Ρ„Π°ΠΉΠ»Π°. Π—Π΄Π΅ΡΡŒ придСтся ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΎΠ΄ΠΈΠ½ ΠΈΠ· Π΄Π²ΡƒΡ… символов, ΠΊΠ°ΠΊ ΠΎΠΏΠΈΡΡ‹Π²Π°Π»ΠΎΡΡŒ Ρ€Π°Π½Π΅Π΅. Однако, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΌΡ‹ сСйчас находимся Π² Ρ€Π°Π·Π΄Π΅Π»Π΅ Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Ρ… ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΉ, это ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Ρ‚ ΠΊ Π΅Π³ΠΎ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΡŽ, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€:

πŸ–ΌοΈ Π˜Π·ΠΎΠ±Ρ€Π°ΠΆΠ°Ρ ΠΆΠ΅Ρ€Ρ‚Π²Ρƒ: ΠΊΠ°ΠΊ Π·Π°ΡˆΠΈΡ‚ΡŒ Π² ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ исполняСмый ΠΊΠΎΠ΄

Π’ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… случаях ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΠ° Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ ΠΌΠΎΠ³Π»Π° ΠΎΡ‚Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒΡΡ. ЭкспСримСнтируя с ΠΏΠΎΠ²ΠΎΡ€ΠΎΡ‚Π°ΠΌΠΈ Π±ΠΈΡ‚ΠΎΠ², я смог свСсти ΠΊ ΠΌΠΈΠ½ΠΈΠΌΡƒΠΌΡƒ Β«ΠΏΠΎΠ»ΠΎΠΌΠΊΡƒΒ» изобраТСния. К ΡΡ‡Π°ΡΡ‚ΡŒΡŽ Π±Ρ‹Π»ΠΎ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ нСсколько случаСв появлСния Π²Ρ€Π΅Π΄Π½ΠΎΠΉ ΠΊΠΎΠΌΠ±ΠΈΠ½Π°Ρ†ΠΈΠΈ Β« */ Β» ΠΈ Π² ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠΌ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠΈ всС Π΅Ρ‰Π΅ Π΅ΡΡ‚ΡŒ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ, Π²ΠΈΠ΄ΠΈΠΌΡ‹Ρ…, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π² Π½ΠΈΠΆΠ½Π΅ΠΉ части строки Β«Valid Javascript FileΒ», Π½ΠΎ Π² Ρ†Π΅Π»ΠΎΠΌ я Π²ΠΏΠΎΠ»Π½Π΅ Π΄ΠΎΠ²ΠΎΠ»Π΅Π½ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ΠΎΠΌ.

Π—Π°Π²Π΅Ρ€ΡˆΠ°Π΅ΠΌ Ρ„Π°ΠΉΠ»

ПослСдняя манипуляция – Ρ„Π°ΠΉΠ» Π΄ΠΎΠ»ΠΆΠ΅Π½ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π±Π°ΠΉΡ‚Π°ΠΌΠΈ Β«00 3BΒ», поэтому ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ Π½ΡƒΠΆΠ½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠΈΡ‚ΡŒ Ρ€Π°Π½ΡŒΡˆΠ΅. ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ это ΠΊΠΎΠ½Π΅Ρ† Ρ„Π°ΠΉΠ»Π°, любоС ΠΏΠΎΡ‚Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠ΅ ΠΏΠΎΠ²Ρ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π±ΡƒΠ΄Π΅Ρ‚ Π½Π΅ сильно Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ, просто Π΄ΠΎΠ±Π°Π²ΠΈΠΌ однострочный ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π½Π΅ Π²Ρ‹Π·Π²Π°Ρ‚ΡŒ Π½ΠΈΠΊΠ°ΠΊΠΈΡ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ ΠΏΡ€ΠΈ синтаксичСском Π°Π½Π°Π»ΠΈΠ·Π΅:

        /* BINARY DATA*/// 00 3B
    

ЗаставляСм Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сцСнарий

Π£ нас Π½Π°ΠΊΠΎΠ½Π΅Ρ†-Ρ‚ΠΎ Π΅ΡΡ‚ΡŒ графичСский Ρ„Π°ΠΉΠ», ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ являСтся сцСнариСм JavaScript-Ρ„Π°ΠΉΠ»ΠΎΠΌ. Π’ΠΎΠ·Π½ΠΈΠΊΠ°Π΅Ρ‚ Π΅Ρ‰Π΅ ΠΎΠ΄Π½Π° ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°: Ссли Π·Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ΡŒ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π½Π° сСрвСр ΠΈ ΠΏΠΎΠΏΡ‹Ρ‚Π°Ρ‚ΡŒΡΡ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π΅Π³ΠΎ Π² Ρ‚Π΅Π³Π΅ <script>, скорСС всСго ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ Ρ‚Π°ΠΊΡƒΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ:

Refused to execute script from 'http://localhost:8080/image.gif' because its MIME type ('image/gif') is not executable.

Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ ΠΏΠΎ ΠΏΡ€Π°Π²Ρƒ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚: Β«Π­Ρ‚ΠΎ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅! Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»Π½ΡΡ‚ΡŒ!Β». Π’ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π΅ случаСв это Π²ΠΏΠΎΠ»Π½Π΅ умСстно, Π½ΠΎ ΠΌΡ‹ Ρ…ΠΎΡ‚ΠΈΠΌ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚ΡŒ сцСнарий – просто Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π³ΠΎΠ²ΠΎΡ€ΠΈΡ‚ΡŒ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Ρƒ, Ρ‡Ρ‚ΠΎ это ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅. Для этого я написал нСбольшой сСрвСр, ΠΏΠ΅Ρ€Π΅Π΄Π°ΡŽΡ‰ΠΈΠΉ ΠΈΠ·ΠΎΠ±Ρ€Π°ΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΊΠ°.

Π‘Ρ€Π°ΡƒΠ·Π΅Ρ€ Π² этом случаС Π΄Π΅Π»Π°Π΅Ρ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π»ΡƒΡ‡ΡˆΠ΅ всСго соотвСтствуСт контСксту: ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°Π΅Ρ‚ Π΅Π³ΠΎ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΊΡƒ Π² Ρ‚Π΅Π³Π΅ <img> ΠΈΠ»ΠΈ выполняСт Π΅Π³ΠΎ JavaScript Π² Ρ‚Π΅Π³Π΅ <script>.

Π—Π°Ρ‡Π΅ΠΌ это всС?

Π­Ρ‚ΠΎΠ³ΠΎ я ΠΏΠΎΠΊΠ° Π½Π΅ понял. РСшСниС ΠΏΠΎΠ΄ΠΎΠ±Π½ΠΎΠΉ Π·Π°Π΄Π°Ρ‡ΠΈ β€” отличная Ρ€Π°Π·ΠΌΠΈΠ½ΠΊΠ° для ΡƒΠΌΠ°, Π½ΠΎ Ссли ΠΏΡ€ΠΈΠ΄ΡƒΠΌΠ°Π΅Ρ‚Π΅ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ ΠΌΠ΅Ρ‚ΠΎΠ΄ ΠΌΠΎΠΆΠ΅Ρ‚ Π±Ρ‹Ρ‚ΡŒ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Π½Π΅ΠΏΡ€Π΅ΠΌΠ΅Π½Π½ΠΎ сообщитС!

***

По сообраТСниям бСзопасности ΠΌΡ‹ Π½Π΅ стали ΠΏΡƒΠ±Π»ΠΈΠΊΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ сСрвСра. Π‘ Π²Π°ΠΌΠΈ Π±Ρ‹Π»Π° Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° программиста. Π£Π΄Π°Ρ‡ΠΈ Π² Ρ…Π°ΠΊΠΈΠ½Π³Π΅ ΠΊΠ°Ρ€Ρ‚ΠΈΠ½ΠΎΠΊ!


Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ

ΠœΠ•Π ΠžΠŸΠ Π˜Π―Π’Π˜Π―

ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

Π’ΠΠšΠΠΠ‘Π˜Π˜

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ вакансию

Π›Π£Π§Π¨Π˜Π• БВАВЬИ ПО Π’Π•ΠœΠ•