แแ แแ แแก แกแแ แชแฎแแแแ 13-แแ แแแฃแแแแแก แจแแแแแแแแ, แแ แ? แแแแฌแงแแแ, แแ แแ แ แแฎแแแแ แแแแฌแงแแแ, แฃแแแ แแชแแแแก แแแฌแแ แแก แกแแแฃแแแ แ Link Tamer แแฎแแแ แฉแแ แฉแแก แจแแกแฌแแแแแกแแก. แ แแช แแ แแแแแแแแ. แ แ แแแฅแแ - แแแฎแฃแแ แฉแแฅแแ, แฃแชแฎแแแ แฉแแ แฉแ แแ แกแฃแแแก แแแญแแ แ.
แแฅ
แฉแแ แฉแ, แแ แ?
แ แ แแฅแแ แฃแแแ, แแ แ Laravel แแ แแกแแแแกแ - แแฆแแก แฉแแแ แแแแแแแงแแคแแแแแแแ 65 แแแแแแแแขแแ
#ัะพััะธะฝะณ ะฒะพ ะคะปะฐัะบะต
@app.route('/')
def hello_world():
return 'Hello, World!'
//ัะพััะธะฝะณ ะฒ ะะฑะตะทะถะธัะตะฝะฝะพะผ
$f3->route('GET /',
function() {
echo 'Hello, world!';
}
);
แแแ แแ, แแแแแแฌแงแ. แฉแแแแขแแแ แแแ
แแฅ แงแแแแแคแแ แ แซแแแแแ แแแ แขแแแแ - แกแแฅแแฆแแแแแจแ 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();
แแก แแ แแก แงแแแแแคแแ แ แ แแช แแฅแแแ แฃแแแ แแชแแแแ แแแกแแฌแงแแแแ. แแแแแฌแงแแ แแแแแ แแแ!
[แแแแแแแแ แแแแกแแแแก แแแแแแแงแแแ แแแแแแฃแ แแแแแแแ แ
แแแแแฌแงแแ แแแแแแ แ แแแแ แแแ. แแแแแแฃแ แแ, แแ แ?
//ะคะฐะนะป: index.php
$f3->route('GET /',
function($f3) { //ััะพะฑั ะธัะฟะพะปัะทะพะฒะฐัั ััะฝะบัะธะธ F3 ะฟะตัะตะดะฐะตะผ ะตะณะพ ะฒ ัะพัั
$view = new View; // ัะพะทะดะฐะตะผ ะฒัััะบั
echo $view->render('home.htm'); //ัะตะฝะดะตัะธะผ ัะฐะฑะปะพะฝ
}
);
แแฎแแ แแฅแแแ แฃแแแ แแแฌแแ แแ แแก แจแแแแแแ. แกแแแแ แขแแแแกแแแแก แแแแแแแงแแแ
แแ แแแแแแแฌแงแแแ แกแแฅแแฆแแแแแจแ แแ แกแแแฃแแ แงแแแแ แจแแแแแแแก แจแแฅแแแ 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 แแแแ แแแแแแฃแแ แแแฃแแแกแแแแก:
- แแแแ แแ แแก แจแแแแฎแแแแแแ 4 แกแแแแแแ แแแแแแแก แจแแแแแ, แ แแแแแก แแแจแแแแแแแแช แแแฎแแแแ แแแแแแแกแแแแ แแแแ, แแแ แแแแแแแแ.com/ABC1
- แฒแแฃแแ - แแ แแ แแก แแแแแแแแแฃแแ แแแฃแแ.
- แฐแแขแแแ - แแแฌแแแแฃแแแแแก แ แแแแแแแแ แจแแแแแแแแฃแ แแแฃแแแ.
แแแแแแ แแแขแงแแแ แแแแแชแแแแ แแแแแกแแแ แแฃแจแแแแแก แแ แแแชแแแก, แชแฎแแแแก แแแ แแจแ.
<?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('/');
}
}
);
แแแแแแ! แกแแแแแแแแแแจแ, แแก แแแ แขแแแ แแงแ.
แแแแแแแกแแแแ แแแแ
แกแฃแ แชแแขแ แแแ แฉแ แแแกแแแแแแแแแ:
- แแแแฆแแ แแแ แแแแขแ แ URL-แแแ
- แจแแแแแฌแแแ แแแกแ แแ แกแแแแแ แแแแแชแแแแ แแแแแจแ
- แแแแฆแแ แจแแกแแแแแแกแ แแแฃแแ แแแแแชแแแแ แแแแแแแ
- แแแแฎแแแ แแแแแก แแแแแแแกแแแแ แแแแ
- แแแแแแ
แฉแแแ แแแแ แซแแแแแ แแแแแก แฌแแ แแก แแแแ แแแ แจแ แฃแขแแก แจแแแแแ.
$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('/'); //ะฐ ะตัะปะธ ัะฐะบะพะน ัััะปะบะธ ะฝะตั - ะผะธะปะพััะธ ะฟัะพัะธะผ ะฝะฐ ะณะปะฐะฒะฝัั
}
}
);
แแฅแแแ แจแแแซแแแแ แจแแแแฉแแแแ แแก แแแ แจแ แฃแขแจแ แแ แแแแแ แแฎแแแ แแแฃแแ, แแ แแแแแ แแแ แจแ แฃแขแจแ แแแแแ แแฅแแแแ แแแแกแแแฆแแ แฃแแ - แแแแแก แแ แแแแแก
$f3โ run()!
แฒแแแแแแ แฌแแแแแฎแแแกแแแแก!
แแแฎแแ แฃแแ แแแฅแแแแ, แแฃ แแแฌแแ แ แแแแแแขแแ แก แแ แแแแแแแกแฌแแ แแแ, แแฃ แ แแแ แแ แแกแฌแแ แแ.
แแ แ แแแแ แช แกแแจแแแแ แแแแแแแแ แแ แแแขแแ แแก (แแ) แกแแแแ แแแชแแก แแแแแกแขแฃแ แแแ, แแ แแขแแแแ แกแแแก, แ แแกแ แแแแแแแแแช แจแแแซแแแแ. แฏแแแแ แกแแฅแแแ แแกแฌแแแแ!
- แแก, แ แ แแฅแแ แฃแแแ, แแแแแแแแ แกแแแแ แแฃแแแ, แแแแ แแ แแแแแ แแ แแแแกแแก $g_code แจแแแซแแแแ แแแแแแแ แแแก, แแแแขแแ แแแ แฉแแแ แแแฌแแ แแ แคแฃแแฅแชแแ, แ แแแแแแช แจแแแแแฌแแแแก แแแแก.
- แแฅแแแ แแกแแแ แจแแแแซแแแแ แแแแแแแแ แแแ แแแแฃแ แ แกแขแแขแแกแขแแแ แแ แแฉแแแแแ แแกแแแ แแแแแ แแแแก แจแแแแแ /@code/stats
- แแแแ แซแแแแก แแแฃแแแแแก แจแแฅแแแ แแแแแ แแแฃแแแก แจแแแแแแแแแก แกแแ แแแกแแ, แจแแฅแแแแแ แจแแแชแแ แแแแกแแแ โแแแชแฃแแโ แ แแกแฃแ แกแแแแก แกแแ.
-
แแแขแแแแ แแฃแแแ แแแ แฉแแแ, แ แแ แแฃแแแแช แแกแแ แแชแแ แ แกแแแแแฎแจแ, แจแแแงแแแแแ แจแแงแแแแแก แแแแแแแชแแ แกแแ แแแ แแก แแฎแแ แแก, แจแแกแแแแแแกแ แจแแชแแแแแแแก แแแแแฉแแแแ, แแ แแแแงแ แแแแ แจแแงแแแแแก แแแแจแ แกแแญแแ แ แแขแ แแแฃแขแแก แแ แขแแแแก = โurlโ แแแแแขแแแแก.
RedComrade -
แจแแแแแแแแแแแแ แแแแแแขแแ แแแจแ...
แฒแแแจแแ แจแ)
แฌแงแแ แ: www.habr.com