แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒ แƒชแƒฎแƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” (F3)

แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒ“แƒแƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒ แƒชแƒฎแƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ” (F3)

แƒแƒ  แƒแƒ แƒ˜แƒก แƒกแƒ˜แƒ แƒชแƒฎแƒ•แƒ˜แƒšแƒ˜ 13-แƒ–แƒ” แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒ, แƒแƒ แƒ? แƒ“แƒแƒ›แƒฌแƒงแƒ”แƒ‘แƒ˜, แƒ“แƒ แƒแƒ แƒ แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ“แƒแƒ›แƒฌแƒงแƒ”แƒ‘แƒ˜, แƒฃแƒœแƒ“แƒ แƒ”แƒชแƒแƒ“แƒแƒก แƒ“แƒแƒฌแƒ”แƒ แƒแƒก แƒกแƒแƒ™แƒฃแƒ—แƒแƒ แƒ˜ Link Tamer แƒแƒฎแƒแƒšแƒ˜ แƒฉแƒแƒ แƒฉแƒแƒก แƒจแƒ”แƒกแƒฌแƒแƒ•แƒšแƒ˜แƒกแƒแƒก. แƒ แƒแƒช แƒ›แƒ” แƒ’แƒแƒ•แƒแƒ™แƒ”แƒ—แƒ”. แƒ แƒ แƒ•แƒ—แƒฅแƒ•แƒ - แƒ›แƒ”แƒฎแƒฃแƒ—แƒ” แƒฉแƒ”แƒฅแƒ›แƒ, แƒฃแƒชแƒฎแƒ˜แƒ›แƒ แƒฉแƒแƒ แƒฉแƒ แƒ“แƒ แƒกแƒฃแƒšแƒ˜แƒก แƒœแƒแƒญแƒ”แƒ แƒ˜.

แƒแƒฅ แƒ“แƒ”แƒ›แƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ™แƒแƒ“แƒ˜. แƒฉแƒ”แƒ›แƒœแƒแƒ˜แƒ แƒ˜ แƒ›แƒ™แƒ˜แƒ—แƒฎแƒ•แƒ”แƒšแƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก ๐Ÿ˜‰

แƒฉแƒแƒ แƒฉแƒ, แƒแƒ แƒ?

แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒแƒ แƒ Laravel แƒ“แƒ แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ - แƒ“แƒฆแƒ”แƒก แƒฉแƒ•แƒ”แƒœ แƒ“แƒแƒ•แƒ™แƒ›แƒแƒงแƒแƒคแƒ˜แƒšแƒ“แƒ”แƒ‘แƒ˜แƒ— 65 แƒ™แƒ˜แƒšแƒแƒ‘แƒแƒ˜แƒขแƒ˜แƒ— FatFreeFramework. แƒ—แƒฃ แƒ—แƒฅแƒ•แƒ”แƒœ แƒ˜แƒชแƒœแƒแƒ‘แƒ— Python Flask-แƒก, แƒ’แƒ”แƒฅแƒœแƒ”แƒ‘แƒแƒ— แƒ’แƒแƒœแƒชแƒ“แƒ, แƒ แƒแƒ› แƒ”แƒก แƒฃแƒ™แƒ•แƒ” แƒกแƒแƒ“แƒฆแƒแƒช แƒ’แƒแƒ™แƒ”แƒ—แƒ“แƒ:

#ั€ะพัƒั‚ะธะฝะณ ะฒะพ ะคะปะฐัะบะต
@app.route('/')
def hello_world():
    return 'Hello, World!'
//ั€ะพัƒั‚ะธะฝะณ ะฒ ะžะฑะตะทะถะธั€ะตะฝะฝะพะผ
$f3->route('GET /',
    function() {
        echo 'Hello, world!';
    }
);

แƒ™แƒแƒ แƒ’แƒ˜, แƒ“แƒแƒ˜แƒ•แƒ˜แƒฌแƒงแƒ”. แƒฉแƒแƒ›แƒแƒขแƒ•แƒ˜แƒ แƒ—แƒ•แƒ .zip offsite-แƒ“แƒแƒœ, แƒ’แƒแƒฎแƒกแƒ”แƒœแƒ˜แƒ— แƒ˜แƒก แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ˜แƒ›แƒแƒ•แƒ” แƒ›แƒแƒ›แƒ”แƒœแƒขแƒจแƒ˜ แƒ˜แƒฎแƒกแƒœแƒ”แƒ‘แƒ แƒ—แƒฅแƒ•แƒ”แƒœแƒ˜ แƒกแƒแƒงแƒ•แƒแƒ แƒ”แƒšแƒ˜ แƒ™แƒแƒ“แƒ”แƒ‘แƒ˜แƒก แƒ แƒ”แƒ“แƒแƒฅแƒขแƒแƒ แƒจแƒ˜. แƒฌแƒ›แƒ˜แƒœแƒ“แƒ index.php แƒ“แƒ แƒแƒ›แƒแƒ˜แƒฆแƒ”แƒ— แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ /ui.

แƒแƒฅ แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒ - แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ ui แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒแƒฅแƒ•แƒก แƒงแƒ•แƒ”แƒšแƒ แƒœแƒแƒฎแƒ•แƒ, แƒแƒœ, แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒแƒ“ แƒ แƒแƒ› แƒ•แƒ—แƒฅแƒ•แƒแƒ—, แƒ’แƒแƒœแƒแƒฎแƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ HTML แƒจแƒแƒ‘แƒšแƒแƒœแƒ”แƒ‘แƒ˜, แƒ แƒแƒ›แƒšแƒ”แƒ‘แƒกแƒแƒช แƒ•แƒแƒฉแƒ•แƒ”แƒœแƒ”แƒ‘แƒ— แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒ”แƒšแƒก แƒ™แƒแƒœแƒ™แƒ แƒ”แƒขแƒฃแƒš URL-แƒ˜แƒก แƒ›แƒแƒœแƒแƒฎแƒฃแƒšแƒ”แƒ‘แƒ˜แƒกแƒแƒก.

แƒแƒฅ แƒแƒ แƒ˜แƒก แƒฉแƒ•แƒ”แƒœแƒ˜ "แƒแƒžแƒšแƒ˜แƒ™แƒแƒชแƒ˜แƒ˜แƒก" แƒฉแƒแƒœแƒฉแƒฎแƒ˜:

<?php
//ะคะฐะนะป: index.php

// Kickstart the framework
$f3=require('lib/base.php');
$f3->set('DEBUG', 1);
if ((float)PCRE_VERSION<8.0)
    trigger_error('PCRE version is out of date');
$f3->config('config.ini');

//ะ’ะ•ะกะฌ ะžะกะขะะ›ะฌะะžะ™ ะšะžะ” ะ‘ะฃะ”ะ•ะœ ะŸะ˜ะกะะขะฌ ะ—ะ”ะ•ะกะฌ

$f3->run();

แƒ”แƒก แƒแƒ แƒ˜แƒก แƒงแƒ•แƒ”แƒšแƒแƒคแƒ”แƒ แƒ˜ แƒ แƒแƒช แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ˜แƒชแƒแƒ“แƒ”แƒ— แƒ“แƒแƒกแƒแƒฌแƒงแƒ”แƒ‘แƒแƒ“. แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ™แƒแƒ“แƒ˜แƒ แƒ”แƒ‘แƒ!

[แƒ’แƒแƒœแƒ•แƒ˜แƒ—แƒแƒ แƒ”แƒ‘แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ” แƒšแƒแƒ™แƒแƒšแƒฃแƒ แƒ˜ XAMPP Windows-แƒ–แƒ” แƒ“แƒ VS Code-แƒ–แƒ”, แƒœแƒแƒฃแƒจแƒ”แƒœแƒจแƒ˜ แƒ“แƒแƒฌแƒ”แƒ แƒ˜แƒšแƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒ]

แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜แƒ—. แƒšแƒแƒ’แƒ˜แƒ™แƒฃแƒ แƒ˜แƒ, แƒแƒ แƒ?

//ะคะฐะนะป: index.php

$f3->route('GET /',
    function($f3) { //ั‡ั‚ะพะฑั‹ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ั„ัƒะฝะบั†ะธะธ F3 ะฟะตั€ะตะดะฐะตะผ ะตะณะพ ะฒ ั€ะพัƒั‚
                $view = new View; // ัะพะทะดะฐะตะผ ะฒัŒัŽัˆะบัƒ
        echo $view->render('home.htm'); //ั€ะตะฝะดะตั€ะธะผ ัˆะฐะฑะปะพะฝ
    }
);

แƒแƒฎแƒšแƒ แƒ—แƒฅแƒ•แƒ”แƒœ แƒฃแƒœแƒ“แƒ แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒ”แƒก แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜. แƒกแƒ˜แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ” bootstrap v5 alpfa.

แƒแƒ  แƒ“แƒแƒ’แƒแƒ•แƒ˜แƒฌแƒงแƒ“แƒ”แƒ— แƒกแƒแƒฅแƒแƒฆแƒแƒšแƒ“แƒ”แƒจแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒงแƒ•แƒ”แƒšแƒ แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ ui, แƒฌแƒ˜แƒœแƒแƒแƒฆแƒ›แƒ“แƒ”แƒ’ แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒแƒจแƒ˜ แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒแƒ แƒ แƒฎแƒ˜แƒšแƒฃแƒšแƒ˜ แƒฉแƒแƒ แƒฉแƒแƒกแƒ—แƒ•แƒ˜แƒก

<!-- ะคะฐะนะป: ui/home.htm -->

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="<?php echo $ENCODING; ?>" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>ะŸะธัˆะตะผ (ะบะพะด), ัะพะบั€ะฐั‰ะฐะตะผ (ััั‹ะปะบะธ)!</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css" integrity="sha384-r4NyP46KrjDleawBgD5tp8Y7UzmLA05oM1iAEQ17CSuDqnUK2+k9luXQOfXJCJ4I" crossorigin="anonymous">
    </head>
    <body class="text-center bg-dark text-light"> <!-- ั‚ะตะผะฝะฐั ั‚ะตะผะฐ ;) -->

        <!-- ะผะตะฝัŽัˆะบะฐ -->
        <nav class="m-2">
            <ul class="nav nav-pills justify-content-center">
                <li class="nav-item">
                    <a class="nav-link active" aria-current="page" href="#">ะ“ะปะฐะฒะฝะฐั</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">ะกั‚ะฐั‚ัŒั ะฝะฐ ะฅะฐะฑั€ะต</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="https://nikonovs.ru">ะกะพะทะดะฐั‚ะตะปัŒ</a>
                </li>
            </ul>
        </nav>

        <div class="container">
        <h1>ะšะพั€ะพั‚ะบะธะต ััั‹ะปะบะธ ัƒะถะต ะทะดะตััŒ.</h1>

        <!-- ะ‘ัƒะดะตะผ ะพั‚ะฟั€ะฐะฒะปัั‚ัŒ ะดะฐะฝะฝั‹ะต POST-ะทะฐะฟั€ะพัะพะผ ะฝะฐ /newLink -->
        <form class="mt-5 mb-3" action="/ka/newLink/" method="POST">
            <div class="row justify-content-center">
                <div class="col-auto">
                <label for="inputLink" class="col-form-label">ะ’ะฒะตะดะธ ััั‹ะปะบัƒ:</label>
                </div>
                <div class="col-auto">
                <input required placeholder="https://" type="url" name="link" id="inputLink" class="form-control mb-1" aria-describedby="inputLink">
                </div>
                <div class="col-auto">
                <button type="submit" class="btn btn-outline-primary">ะกะพะบั€ะฐั‚ะธั‚ัŒ!</button>
                </div>
            </div>
        </form>

        <!-- ะฝะตะผะฝะพะณะพ -->
        <p class="text-left m-auto mb-5" style="max-width: 30rem;">Lorem ipsum dolor sit, amet consectetur adipisicing elit. Omnis illum molestiae hic fugiat molestias nemo, architecto beatae repellat ullam exercitationem non ab, necessitatibus maxime quod iure ipsa quam quos! Reprehenderit. Lorem ipsum dolor, sit amet consectetur adipisicing elit. Necessitatibus eos sapiente voluptates veniam sequi delectus totam tenetur praesentium obcaecati. Repudiandae quisquam, ipsa ullam corrupti molestiae minima optio nihil est modi?</p>

        <footer class="m-2">ะกะดะตะปะฐะฝะพ ั <img width="20" height="20" src="https://image.flaticon.com/icons/svg/833/833472.svg" alt="ะปัŽะฑะพะฒัŒัŽ">, <a href="https://v5.getbootstrap.com/">ะฟัั‚ั‹ะผ Bootstrap'ะพะผ</a>    ะธ <a href="https://fatfreeframework.com/">ะฑะตะท ะถะธั€ะฐ</a></footer>
        </div>
    </body>
</html>

แƒกแƒฃแƒš แƒ”แƒกแƒแƒ, แƒฉแƒ•แƒ”แƒœแƒ˜ แƒ›แƒ—แƒแƒ•แƒแƒ แƒ˜ แƒ’แƒ•แƒ”แƒ แƒ“แƒ˜ แƒฃแƒ™แƒ•แƒ” แƒ›แƒฃแƒจแƒแƒแƒ‘แƒก. แƒคแƒแƒ แƒ›แƒ แƒแƒ’แƒ–แƒแƒ•แƒœแƒ˜แƒก POST แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒ‘แƒ›แƒฃแƒšแƒ˜แƒ—, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ“แƒ”แƒก.
แƒแƒฎแƒšแƒ แƒ›แƒแƒ“แƒ˜แƒก แƒกแƒแƒฎแƒแƒšแƒ˜แƒกแƒ แƒœแƒแƒฌแƒ˜แƒšแƒ˜ (แƒแƒ แƒ).

แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ

แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ - MySQL. แƒ—แƒฃ แƒ“แƒแƒ˜แƒœแƒกแƒขแƒแƒšแƒ˜แƒ แƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ’แƒแƒฅแƒ•แƒ— PhpMyAdmin, แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒแƒฎแƒแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ.แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜แƒ“แƒ แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ แƒ’แƒแƒฃแƒจแƒ•แƒ˜แƒ— แƒ”แƒก SQL:

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";

CREATE TABLE IF NOT EXISTS `links` (
  `code` varchar(4) NOT NULL,
  `link` varchar(1000) NOT NULL,
  `hits` int(255) NOT NULL DEFAULT '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

ALTER TABLE `links`
  ADD UNIQUE KEY `code` (`code`);

แƒฉแƒ•แƒ”แƒœ แƒ’แƒ•แƒ”แƒฅแƒœแƒ”แƒ‘แƒ 3 แƒ•แƒ”แƒšแƒ˜ แƒ—แƒ˜แƒ—แƒแƒ”แƒฃแƒšแƒ˜ แƒ‘แƒ›แƒฃแƒšแƒ˜แƒกแƒ—แƒ•แƒ˜แƒก:

  1. แƒ™แƒแƒ“แƒ˜ แƒแƒ แƒ˜แƒก แƒจแƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒ•แƒ˜แƒ—แƒ˜ 4 แƒกแƒ˜แƒ›แƒ‘แƒแƒšแƒ แƒ“แƒแƒ›แƒ”แƒœแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’, แƒ แƒแƒ›แƒšแƒ˜แƒก แƒ›แƒ”แƒจแƒ•แƒ”แƒแƒ‘แƒ˜แƒ—แƒแƒช แƒ›แƒแƒฎแƒ“แƒ”แƒ‘แƒ แƒ’แƒแƒ“แƒแƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ, แƒ›แƒแƒ’ แƒ›แƒแƒ’แƒแƒšแƒ˜แƒ—แƒ˜.com/ABC1
  2. แฒ‘แƒ›แƒฃแƒšแƒ˜ - แƒแƒ  แƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒ‘แƒ›แƒฃแƒšแƒ˜.
  3. แƒฐแƒ˜แƒขแƒ”แƒ‘แƒ˜ - แƒ“แƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒ แƒจแƒ”แƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒฃแƒš แƒ‘แƒ›แƒฃแƒšแƒ–แƒ”.

แƒ›แƒแƒ™แƒšแƒ”แƒ“ แƒ’แƒ”แƒขแƒงแƒ•แƒ˜แƒ— แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒกแƒ—แƒแƒœ แƒ›แƒฃแƒจแƒแƒแƒ‘แƒ˜แƒก แƒžแƒ แƒ˜แƒœแƒชแƒ˜แƒžแƒก, แƒชแƒฎแƒ˜แƒ›แƒ˜แƒก แƒ’แƒแƒ แƒ”แƒจแƒ”.

<?php
//ัะฝะฐั‡ะฐะปะฐ ะฝัƒะถะฝะพ ะฟะพะดะบะปัŽั‡ะธั‚ัŒัั ะบ ะ‘ะ”
$db = new DBSQL(
    'mysql:host=localhost;port=3306;dbname=linker',
    'root',
    ''
);

//ะ”ะฐะปัŒัˆะต ะตัั‚ัŒ ะดะฒะฐ ะฒะฐั€ะธะฐะฝะดะฐ ั€ะฐะฑะพั‚ั‹ ั ะดะฐะฝะฝั‹ะผะธ:

//ะœะพะถะฝะพ ัƒัั‚ะฐะฝะพะฒะธั‚ัŒ ะฟะตั€ะตะผะตะฝะฝัƒัŽ ะฒ ะคั€ะตะนะผะฒะพั€ะบ c ะฟะพะผะพั‰ัŒัŽ ะพะฑั‹ั‡ะฝะพะณะพ SQL-ะทะฐะฟั€ะพัะฐ:
$f3->set('result', $db->exec('SELECT * FROM wherever')); 
//ะพะฝะธ ะฑัƒะดัƒั‚ ะดะพัั‚ัƒะฟะฝั‹ ะฒ ัˆะฐะฑะปะพะฝะฐั…, ะบะฐะบ <?= $resul ? >

//ะ ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ ะฒัั‚ั€ะพะตะฝะฝั‹ะน SQL Mapper:
$row = new DBSQLMapper($db, 'links');

$row->load(array('link="https://habrahabr.ru"')); //ั‚ะตะฟะตั€ัŒ ะธะท ัั‚ะพะณะพ ะพะฑัŠะตะบั‚ะฐ ะดะพัั‚ัƒะฟะฝั‹ ะฒัะต ะบะพะปะพะฝะบะธ ัั‚ั€ะพะบะธ, ะณะดะต ััั‹ะปะบะฐ ะฝะฐ ะฅะฐะฑั€:
$row_value = $row->somerow; //ะ’ะพั‚ ั‚ะฐะบ

// ะ•ัั‚ะตััั‚ะฒะตะฝะฝะพ ะผะพะถะฝะพ ะธะทะผะตะฝัั‚ัŒ ะทะฝะฐั‡ะตะฝะธั:
$row->link = 'https://habr.com';
$row->save(); //ะธะทะผะตะฝะตะฝะธั ะฝัƒะถะฝะพ ัะพั…ั€ะฐะฝะธั‚ัŒ, ะฐ ั‡ั‚ะพ ะฒั‹ ะดัƒะผะฐะปะธ

// ะฑะพะปัŒัˆะต ะธะฝั„ะพั€ะผะฐั†ะธะธ ะฟะพ ั€ะฐะฑะพั‚ะต ั ะ‘ะ” ะดะพัั‚ัƒะฟะฝะพ ะทะดะตััŒ: https://a.nikonovs.ru/MPHR ะะฐัั‚ะพัั‚ะตะปัŒะฝะพ ั€ะตะบะพะผะตะฝะดัƒัŽ ะฟั€ะพั‡ะธั‚ะฐั‚ัŒ, ั…ะพั‚ัะฑั‹ ั ะฟะพะผะพั‰ัŒัŽ ะฟะตั€ะตะฒะพะดั‡ะธะบะฐ, ะฒัั‚ั€ะพะตะฝะฝะพะณะพ ะฒ ะฑั€ะฐัƒะทะตั€.
?>

แƒ“แƒแƒ•แƒ˜แƒฌแƒงแƒแƒ— แƒจแƒ”แƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒ.

แƒ›แƒ˜แƒ›แƒ“แƒ˜แƒœแƒแƒ แƒ”แƒแƒ‘แƒก แƒแƒฎแƒแƒšแƒ˜ แƒ‘แƒ›แƒฃแƒšแƒ˜แƒก แƒ“แƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒ

แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒแƒฎแƒแƒšแƒ˜ แƒฎแƒ”แƒ“แƒ˜ แƒ˜แƒœแƒ“แƒ”แƒฅแƒกแƒ˜, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒ“แƒแƒแƒ›แƒฃแƒจแƒแƒ•แƒ”แƒ‘แƒก แƒ›แƒแƒ—แƒฎแƒแƒ•แƒœแƒแƒก แƒ›แƒ—แƒแƒ•แƒแƒ  แƒ’แƒ•แƒ”แƒ แƒ“แƒ–แƒ” แƒแƒ แƒกแƒ”แƒ‘แƒฃแƒšแƒ˜ แƒคแƒแƒ แƒ›แƒ˜แƒ“แƒแƒœ.

แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜, แƒ›แƒแƒ“แƒ˜แƒ— แƒจแƒ”แƒ•แƒฅแƒ›แƒœแƒแƒ— แƒแƒฎแƒแƒšแƒ˜, แƒ›แƒแƒ’แƒ แƒแƒ› แƒซแƒแƒšแƒ˜แƒแƒœ แƒ›แƒกแƒ’แƒแƒ•แƒกแƒ˜ แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ (home.htm) แƒจแƒแƒ‘แƒšแƒแƒœแƒ˜ - "newLink.htm".
แƒ˜แƒฅ แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒแƒฉแƒ”แƒœแƒ— แƒฃแƒ™แƒ•แƒ” แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒฃแƒš แƒ‘แƒ›แƒฃแƒšแƒก แƒ“แƒ แƒ›แƒแƒกแƒ–แƒ” แƒ“แƒแƒฌแƒ™แƒแƒžแƒฃแƒœแƒ”แƒ‘แƒ˜แƒก แƒ แƒแƒแƒ“แƒ”แƒœแƒแƒ‘แƒแƒก (แƒแƒ› โ€žแƒกแƒขแƒแƒขแƒ˜แƒกแƒขแƒ˜แƒ™แƒ˜แƒกโ€œ แƒฎแƒ”แƒšแƒแƒฎแƒšแƒ แƒกแƒแƒœแƒแƒฎแƒแƒ•แƒแƒ“, แƒ—แƒฅแƒ•แƒ”แƒœ แƒ™แƒ•แƒšแƒแƒ• แƒฃแƒœแƒ“แƒ แƒจแƒ”แƒแƒ›แƒชแƒ˜แƒ แƒแƒ— แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ‘แƒ›แƒฃแƒšแƒ˜ - แƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ˜ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ“แƒแƒ แƒฉแƒ”แƒ‘แƒ).
แƒ’แƒแƒ›แƒแƒกแƒแƒ•แƒšแƒ˜แƒก แƒจแƒ”แƒกแƒแƒฅแƒ›แƒœแƒ”แƒšแƒแƒ“, แƒฉแƒ•แƒ”แƒœ แƒ’แƒแƒ›แƒแƒ•แƒ˜แƒงแƒ”แƒœแƒ”แƒ‘แƒ— "แƒชแƒ•แƒšแƒแƒ“แƒ˜ แƒ’แƒแƒ•แƒšแƒ˜แƒก" แƒฎแƒ แƒ˜แƒ™แƒก:

<?php
//ะคะฐะนะป: ะฝะตั‚ (ะฟั€ะธะผะตั€)

//ัƒัั‚ะฐะฝะฐะฒะปะธะฒะฐะตะผ ะฟะตั€ะตะผะตะฝะฝัƒัŽ ะฒ index'ะต ะธ ั€ะตะฝะดะตั€ะธะผ ัˆะฐะฑะปะพะฝ
$f3->set('link', $shorted_link);
$view = new View;
echo $view->render('newLink.htm');
//ั‚ะตะฟะตั€ัŒ ะฒ ัˆะฐะฑะปะพะฝะต ะผะพะถะฝะพ ะธัะฟะพะปัŒะทะพะฒะฐั‚ัŒ:
<?= $link ?>

แƒ“แƒ แƒแƒฅ แƒแƒ แƒ˜แƒก แƒฉแƒแƒ›แƒแƒœแƒแƒ—แƒ•แƒแƒšแƒ˜ newLink.html:

<!-- ะคะฐะนะป: newLink.htm -->

<!DOCTYPE html>
<html lang="en">
    <head>
        <meta charset="<?php echo $ENCODING; ?>" />
        <meta name="viewport" content="width=device-width, initial-scale=1">
        <title>ะŸะธัˆะตะผ (ะบะพะด), ัะพะบั€ะฐั‰ะฐะตะผ (ััั‹ะปะบะธ)!</title>
        <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/5.0.0-alpha1/css/bootstrap.min.css" integrity="sha384-r4NyP46KrjDleawBgD5tp8Y7UzmLA05oM1iAEQ17CSuDqnUK2+k9luXQOfXJCJ4I" crossorigin="anonymous">
    </head>
    <body class="text-center bg-dark text-light">
        <nav class="m-2">
            <ul class="nav nav-pills justify-content-center">
                <li class="nav-item">
                    <a class="nav-link" aria-current="page" href="/ka/">ะ“ะปะฐะฒะฝะฐั</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="#">ะกั‚ะฐั‚ัŒั ะฝะฐ ะฅะฐะฑั€ะต</a>
                </li>
                <li class="nav-item">
                    <a class="nav-link" href="https://nikonovs.ru">ะกะพะทะดะฐั‚ะตะปัŒ</a>
                </li>
            </ul>
        </nav>

        <div class="container">
        <h1>ะšะพั€ะพั‚ะบะธะต ััั‹ะปะบะธ ัƒะถะต ะทะดะตััŒ.</h1>

        <!-- ะฃะฑะธั€ะฐะตะผ ะธะท ั„ะพั€ะผั‹ ั„ัƒะฝะบั†ะธะพะฝะฐะป ั„ะพั€ะผั‹ ะธ ะฒั‹ะฒะพะดะธะผ ะฟะตั€ะตะผะตะฝะฝั‹ะต -->
        <form class="mt-5 mb-3">
            <div class="row justify-content-center">
                <div class="col-auto">
                    <label for="inputLink" class="col-form-label">ะกะพะบั€ะฐั‚ะธะปะธ:</label>
                </div>
                <div class="col-auto">
                    <input disabled required type="url" name="link" id="inputLink" class="form-control disabled" aria-describedby="inputLink" value="<?= $link ?>">
                </div>
            </div>
            <p class="m-2 text-secondary">ะŸะพ ัั‚ะพะน ััั‹ะปะบะต ะฟะตั€ะตัˆะปะธ: `<?= $hits ?>`</p>
        </form>

        <a href="/ka/" class="mt-3 mb-5 btn btn-primary btn-lg">ะ’ะ•ะ ะะฃะขะฌะกะฏ ะะ ะ“ะ›ะะ’ะะฃะฎ</a>

        <footer class="m-2">ะกะดะตะปะฐะฝะพ ั <img width="20" height="20" src="https://image.flaticon.com/icons/svg/833/833472.svg" alt="ะปัŽะฑะพะฒัŒัŽ">, <a href="https://v5.getbootstrap.com/">ะฟัั‚ั‹ะผ Bootstrap'ะพะผ</a>    ะธ <a href="https://fatfreeframework.com/">ะฑะตะท ะถะธั€ะฐ</a></footer>
        </div>
    </body>
</html>

แƒฉแƒ•แƒ”แƒœ แƒ—แƒ•แƒ˜แƒ—แƒแƒœ แƒ•แƒฌแƒ”แƒ แƒ— แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒก.

$f3->route('GET|POST /newLink', //ะผั‹ ะฑัƒะดะตะผ ะพะฑั€ะฐะฑะฐั‚ั‹ะฒะฐั‚ัŒ ะธ POST ะธ GET
    function($f3) {

            $db = new DBSQL( //ะŸะพะดะบะปัŽั‡ะตะฝะธะต ะบ ะ‘ะ” ะฝะพะฒะพะต ะฒ ะบะฐะถะดะพะผ ะ ะพัƒั‚ะต
                'mysql:host=localhost;port=3306;dbname=linker',
                'root',
                ''
            );

            //ะฟั€ะตะบั€ะฐัะฝะฐั ั„ัƒะฝะบั†ะธั ะณะตะฝะตั€ะฐั†ะธะธ ั€ะฐะดะพะผะฝั‹ั… ัะธะผะฒะพะปะพะฒ:
            $permitted_chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
            function generate_string($input, $strength = 4) {
                $input_length = strlen($input);
                $random_string = '';
                for($i = 0; $i < $strength; $i++) {
                    $random_character = $input[mt_rand(0, $input_length - 1)];
                    $random_string .= $random_character;
                }

                return $random_string;
            }

            //ะฟั€ะพะฒะตั€ะบะฐ ะฝะฐ ะฟะพะฒั‚ะพั€ะตะฝะธะต link - ะฝะฐะผ ะถะต ะฝะต ะฝัƒะถะฝะพ ั‡ั‚ะพะฑั‹ ะบะฐะถะดั‹ะน ั€ะฐะท ะณะตะฝะตั€ะธั€ะพะฒะฐะปะธััŒ ะฝะพะฒั‹ะต ััั‹ะปะบะธ. link - ัƒะฝะธะบะฐะปัŒะฝั‹ะน.
            $check = new DBSQLMapper($db,'links');
            $check->load(array('link="'. $link .'"'));
            if ($check->dry()) {
                $g_code = generate_string($permitted_chars);
                $row = new DBSQLMapper($db,'links');
                $row->reset();
                $row->code = $g_code;
                $row->link = $link;
                $row->save();
            } else {
                $g_code = $check->code; //ะตัะปะธ link ะฟะพะฒั‚ะพั€ัะตั‚ัั, ั‚ะพ ะฟะพะบะฐะทั‹ะฒะฐะตะผ ัั‚ะฐั€ั‹ะน ะบะพะด
            }

            $short_link = 'https://'. $_SERVER['HTTP_HOST'] . '/' . $g_code; //ัะพะฑะธั€ะฐะตะผ ะบะพะฝะตั‡ะฝัƒัŽ ััั‹ะปะบัƒ

            //ะฟะฐั€ะฐะผะตั‚ั€ั‹ ะธะท $_POST ะผะพะถะฝะพ ะฟะพะปัƒั‡ะธั‚ัŒ ั ะฟะพะผะพั‰ัŒัŽ $f3->get('POST'), ะฟะพะดะดะตั€ะถะธะฒะฐะตั‚ัั ั‚ะพั‡ะตั‡ะฝะฐั ะฝะพั‚ะฐั†ะธั (ะฟะพะฟั€ะฐะฒัŒั‚ะต, ะตัะปะธ ะฝะตะฟั€ะฐะฒะธะปัŒะฝะพ ะฝะฐะทั‹ะฒะฐัŽ): ะฟะฐั€ะฐะผะตั‚ั€ "link" ะผะพะถะฝะพ ะฟะพะปัƒั‡ะธั‚ัŒ ั‚ะฐะบ: 
            $link = $f3->get('POST.link');

            if ( !empty($f3->get('POST')) ) { //ะ’ั‹ะดะฐะตะผ HTML, ั‚ะพะปัŒะบะพ ะตัะปะธ POST ะฝะต ะฟัƒัั‚ะพะน.

            $f3->set('link', $short_link);
            $f3->set('hits', $check->hits);
            $view = new View;
            echo $view->render('newLink.htm');

            } else { //ะธะฝะฐั‡ะต - ั€ะตะดะธั€ะตะบั‚ ะฝะฐ ะณะปะฐะฒะฝัƒัŽ
                $f3->$f3->reroute('/');
            }

        }
);

แƒ›แƒ–แƒแƒ“แƒแƒ! แƒกแƒ˜แƒœแƒแƒ›แƒ“แƒ•แƒ˜แƒšแƒ”แƒจแƒ˜, แƒ”แƒก แƒ›แƒแƒ แƒขแƒ˜แƒ•แƒ˜ แƒ˜แƒงแƒ.

แƒ’แƒแƒ“แƒแƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ

แƒกแƒฃแƒš แƒชแƒแƒขแƒ แƒ“แƒแƒ แƒฉแƒ แƒ’แƒแƒกแƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒ”แƒšแƒ˜:

  1. แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— แƒžแƒแƒ แƒแƒ›แƒ”แƒขแƒ แƒ˜ URL-แƒ“แƒแƒœ
  2. แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ— แƒ›แƒ˜แƒกแƒ˜ แƒแƒ แƒกแƒ”แƒ‘แƒแƒ‘แƒ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒแƒจแƒ˜
  3. แƒ›แƒ˜แƒ˜แƒฆแƒ”แƒ— แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒ‘แƒ›แƒฃแƒšแƒ˜ แƒ›แƒแƒœแƒแƒชแƒ”แƒ›แƒ—แƒ แƒ‘แƒแƒ–แƒ˜แƒ“แƒแƒœ
  4. แƒ›แƒแƒ›แƒฎแƒ›แƒแƒ แƒ”แƒ‘แƒšแƒ˜แƒก แƒ’แƒแƒ“แƒแƒ›แƒ˜แƒกแƒแƒ›แƒแƒ แƒ—แƒ”แƒ‘แƒ
  5. แƒ›แƒแƒ’แƒ”แƒ‘แƒ

แƒฉแƒ•แƒ”แƒœ แƒ•แƒแƒ’แƒ แƒซแƒ”แƒšแƒ”แƒ‘แƒ— แƒ™แƒแƒ“แƒ˜แƒก แƒฌแƒ”แƒ แƒแƒก แƒ‘แƒแƒšแƒ แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’.

$f3->route('GET /@code', //ัƒะบะฐะทั‹ะฒะฐะตะผ ะฟะฐั€ะฐะผะตั‚ั€ ะฟะพัะปะต "@", ะพะฝ ะฟะพะฟะฐะดะตั‚ ะฒ PARAMS
    function($f3) {

        //ัะฝะพะฒะฐ ะพะฟั€ะตะดะตะปัะตะผ $db
        $db = new DBSQL(
            'mysql:host=localhost;port=3306;dbname=linker',
            'root',
            ''
        );

        $code = $f3->get('PARAMS.code'); //ะฟะพะปัƒั‡ะฐะตะผ ะฟะฐั€ะฐะผะตั‚ั€

        $link = new DBSQLMapper($db,'links'); 

        //ะตัะปะธ ะฟะพะปัƒั‡ะฐะตั‚ัั ะฟะพะปัƒั‡ะธั‚ัŒ ััั‹ะปะบัƒ ะธะท ะ‘ะ” - ะฟะพะปัƒั‡ะฐะตะผ, ัƒะฒะตะปะธั‡ะธะฒะฐะตะผ ะบะพะปะธั‡ะตัั‚ะฒะพ ะฟะตั€ะตั…ะพะดะพะฒ ะธ ะฟะตั€ะตะฝะฐะฟั€ะฐะฒะปัะตะผ
        if ($link->load(array('code="'.$code.'"', 'link=?'))) {
            $link->hits++;
            $link->save();

            $f3->reroute($link->link);
        } else {
            $f3->reroute('/'); //ะฐ ะตัะปะธ ั‚ะฐะบะพะน ััั‹ะปะบะธ ะฝะตั‚ - ะผะธะปะพัั‚ะธ ะฟั€ะพัะธะผ ะฝะฐ ะณะปะฐะฒะฝัƒัŽ
        }
    }
);

แƒ—แƒฅแƒ•แƒ”แƒœ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒจแƒ”แƒแƒ›แƒฉแƒœแƒ˜แƒ”แƒ— แƒ”แƒก แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒจแƒ˜ แƒ“แƒ แƒ’แƒ–แƒแƒ–แƒ” แƒแƒฎแƒแƒšแƒ˜ แƒ‘แƒ›แƒฃแƒšแƒ˜, แƒ“แƒ แƒ–แƒ”แƒ›แƒแƒ— แƒ›แƒแƒ แƒจแƒ แƒฃแƒขแƒจแƒ˜ แƒ˜แƒ’แƒ˜แƒ•แƒ” แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜ - แƒ‘แƒแƒšแƒแƒก แƒ“แƒ แƒ‘แƒแƒšแƒแƒก แƒ™แƒแƒ“แƒ˜ แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ”แƒ›แƒ—แƒฎแƒ•แƒ”แƒแƒ“แƒ”แƒก "newLink"-แƒก (แƒ”แƒก แƒแƒ  แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ, แƒ’แƒ”แƒœแƒ”แƒ แƒแƒขแƒแƒ แƒ˜ แƒจแƒ”แƒ˜แƒชแƒแƒ•แƒก แƒ›แƒฎแƒแƒšแƒแƒ“ แƒ“แƒ˜แƒ“ แƒแƒกแƒแƒ”แƒ‘แƒก), แƒ›แƒแƒ’แƒ แƒแƒ› แƒ แƒแƒ“แƒ’แƒแƒœ แƒ˜แƒก แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜แƒ แƒ’แƒแƒœแƒกแƒแƒ–แƒฆแƒ•แƒ แƒฃแƒšแƒ˜, แƒžแƒ˜แƒ แƒ•แƒ”แƒšแƒ˜ แƒจแƒ”แƒกแƒ แƒฃแƒšแƒ“แƒ”แƒ‘แƒ.

$f3โ†’ run()!

แฒ›แƒแƒ“แƒšแƒแƒ‘แƒ แƒฌแƒแƒ™แƒ˜แƒ—แƒฎแƒ•แƒ˜แƒกแƒ—แƒ•แƒ˜แƒก!
แƒ›แƒแƒฎแƒแƒ แƒฃแƒšแƒ˜ แƒ•แƒ˜แƒฅแƒœแƒ”แƒ‘แƒ˜, แƒ—แƒฃ แƒ“แƒแƒฌแƒ”แƒ แƒ— แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒก แƒ“แƒ แƒ’แƒแƒ›แƒแƒ›แƒ˜แƒกแƒฌแƒแƒ แƒ”แƒ‘แƒ—, แƒ—แƒฃ แƒ แƒแƒ›แƒ” แƒแƒ แƒแƒกแƒฌแƒแƒ แƒ˜แƒ.

แƒ“แƒ แƒ แƒแƒ’แƒแƒ แƒช แƒกแƒแƒจแƒ˜แƒœแƒแƒ แƒ“แƒแƒ•แƒแƒšแƒ”แƒ‘แƒ แƒแƒœ แƒแƒ•แƒขแƒแƒ แƒ˜แƒก (แƒ›แƒ”) แƒกแƒ˜แƒ–แƒแƒ แƒ›แƒแƒชแƒ˜แƒก แƒ“แƒแƒ“แƒแƒกแƒขแƒฃแƒ แƒ”แƒ‘แƒ, แƒ›แƒ” แƒ•แƒขแƒแƒ•แƒ”แƒ‘ แƒกแƒ˜แƒแƒก, แƒ แƒ˜แƒกแƒ˜ แƒ’แƒแƒ™แƒ”แƒ—แƒ”แƒ‘แƒแƒช แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ. แƒฏแƒแƒ‘แƒ˜แƒ แƒกแƒแƒฅแƒ›แƒ˜แƒ— แƒ˜แƒกแƒฌแƒแƒ•แƒšแƒ!

  • แƒ”แƒก, แƒ แƒ แƒ—แƒฅแƒ›แƒ แƒฃแƒœแƒ“แƒ, แƒœแƒแƒ™แƒšแƒ”แƒ‘แƒแƒ“ แƒกแƒแƒ•แƒแƒ แƒแƒฃแƒ“แƒแƒ, แƒ›แƒแƒ’แƒ แƒแƒ› แƒ’แƒ”แƒœแƒ”แƒ แƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒแƒก $g_code แƒจแƒ”แƒ˜แƒซแƒšแƒ”แƒ‘แƒ แƒ’แƒแƒœแƒ›แƒ”แƒแƒ แƒ“แƒ”แƒก, แƒแƒ›แƒ˜แƒขแƒแƒ› แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ— แƒ“แƒแƒฌแƒ”แƒ แƒแƒ— แƒคแƒฃแƒœแƒฅแƒชแƒ˜แƒ, แƒ แƒแƒ›แƒ”แƒšแƒ˜แƒช แƒจแƒ”แƒแƒ›แƒแƒฌแƒ›แƒ”แƒ‘แƒก แƒแƒ›แƒแƒก.
  • แƒ—แƒฅแƒ•แƒ”แƒœ แƒแƒกแƒ”แƒ•แƒ” แƒจแƒ”แƒ’แƒ˜แƒซแƒšแƒ˜แƒแƒ— แƒ’แƒแƒแƒ™แƒ”แƒ—แƒแƒ— แƒœแƒแƒ แƒ›แƒแƒšแƒฃแƒ แƒ˜ แƒกแƒขแƒแƒขแƒ˜แƒกแƒขแƒ˜แƒ™แƒ แƒ“แƒ แƒแƒฉแƒ•แƒ”แƒœแƒแƒ— แƒ˜แƒกแƒ˜แƒœแƒ˜ แƒ’แƒแƒ“แƒแƒ แƒ—แƒ•แƒ˜แƒก แƒจแƒ”แƒ›แƒ“แƒ”แƒ’ /@code/stats
  • แƒแƒ˜แƒ™แƒ แƒซแƒแƒšแƒแƒก แƒ‘แƒ›แƒฃแƒšแƒ”แƒ‘แƒ˜แƒก แƒจแƒ”แƒฅแƒ›แƒœแƒ แƒ—แƒแƒ•แƒแƒ“ แƒ‘แƒ›แƒฃแƒšแƒ˜แƒก แƒจแƒ”แƒ›แƒแƒ™แƒšแƒ”แƒ‘แƒ˜แƒก แƒกแƒ”แƒ แƒ•แƒ˜แƒกแƒ–แƒ”, แƒจแƒ”แƒฅแƒ›แƒ”แƒœแƒ˜แƒ— แƒจแƒ”แƒ›แƒชแƒ˜แƒ แƒ”แƒ‘แƒ˜แƒกแƒ’แƒแƒœ โ€žแƒ“แƒแƒชแƒฃแƒšแƒ˜โ€œ แƒ แƒ”แƒกแƒฃแƒ แƒกแƒ”แƒ‘แƒ˜แƒก แƒกแƒ˜แƒ.
  • แƒ™แƒแƒขแƒ”แƒ’แƒแƒ แƒ˜แƒฃแƒšแƒแƒ“ แƒ’แƒ˜แƒ แƒฉแƒ”แƒ•แƒ—, แƒ แƒแƒ› แƒ—แƒฃแƒœแƒ“แƒแƒช แƒแƒกแƒ”แƒ— แƒ›แƒชแƒ˜แƒ แƒ” แƒกแƒแƒ™แƒ˜แƒ—แƒฎแƒจแƒ˜, แƒจแƒ”แƒ˜แƒงแƒ•แƒแƒœแƒแƒ— แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒก แƒ•แƒแƒšแƒ˜แƒ“แƒแƒชแƒ˜แƒ แƒกแƒ”แƒ แƒ•แƒ”แƒ แƒ˜แƒก แƒ›แƒฎแƒแƒ แƒ”แƒก, แƒจแƒ”แƒกแƒแƒ‘แƒแƒ›แƒ˜แƒกแƒ˜ แƒจแƒ”แƒชแƒ“แƒแƒ›แƒ”แƒ‘แƒ˜แƒก แƒ’แƒแƒ›แƒแƒฉแƒ”แƒœแƒ˜แƒ—, แƒแƒ  แƒ“แƒแƒ”แƒงแƒ แƒ“แƒœแƒแƒ— แƒจแƒ”แƒงแƒ•แƒแƒœแƒ˜แƒก แƒ•แƒ”แƒšแƒจแƒ˜ แƒกแƒแƒญแƒ˜แƒ แƒ แƒแƒขแƒ แƒ˜แƒ‘แƒฃแƒขแƒ˜แƒก แƒ“แƒ แƒขแƒ˜แƒžแƒ˜แƒก = โ€œurlโ€ แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒแƒก.
    RedComrade

  • แƒจแƒ”แƒ›แƒแƒ’แƒ•แƒ—แƒแƒ•แƒแƒ–แƒ”แƒ— แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ”แƒ‘แƒจแƒ˜...

    แฒ™แƒแƒ•แƒจแƒ˜แƒ แƒจแƒ˜)

แƒฌแƒงแƒแƒ แƒ: www.habr.com

แƒแƒฎแƒแƒšแƒ˜ แƒ™แƒแƒ›แƒ”แƒœแƒขแƒแƒ แƒ˜แƒก แƒ“แƒแƒ›แƒแƒขแƒ”แƒ‘แƒ