แแแแถแแแถแแแแแถแแแขแแแแแแปแแแถแแแถแแแแแแแแแถแแแแ แขแถแแป แกแฃ แแแแแ? แขแแแแ แถแแแแแแพแแแแแผแ แแทแแแทแแแแแนแแแแแถแขแแแแ แถแแแแแแพแแแแแผแแแแปแแแแแแแ แแฝแแแแแแแถแแถแแแแแแ Link Tamer แแแแถแแแแแแฝแแแแแแแถแแ แแแแแแแแแแแแแปแแแทแแแแถแแแแแแแแแแแแแธแแฝแแ แแแฝแแ แแแแแถแขแแแธแแแแแแแปแแแถแแแแแพแ แแพแแแแปแแขแถแ แแทแแถแแขแแแธแแถแ - แแแแแแแพแแแแแแแธแแแแถแ แแแแแแแแแแแถแแทแแแแถแแแแถแ แแทแแแแแแแแแแแแแนแแ
แแ
แแธแแแ
Framework แแแแแ?
แแถแแถแแแทแแแถแแแแทแแแแ 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/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="/km/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 แแแแแถแแแแธแแแแแแแแถแแแแแแผแแแแแแแนแแแพแแกแพแ แแผแ แแถ example.com/ABC1
- แแแแแแแถแแ โ แแทแแแถแแแถแแแแแแแ แแแแ
- Hits - แ แแแฝแแแแแถแแ แปแ แแ แแพแแแแแแแถแแแแแแธแ
แแแแปแแแนแแแแแถแแแขแแแแแแแแแแแแแขแแแธแแแแแถแแแแแแแถแแแแแพแแถแแแถแแฝแแแผแแแแแถแแแทแแแแแแแแแแแแแถแแแแแถแแแ
<?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="/km/">ะะปะฐะฒะฝะฐั</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="/km/" 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 โ แแแ()!
แขแแแปแแแแแแถแแแแถแแขแถแ!
แแแแปแแแนแแแธแแแถแแแแแแทแแแพแขแแแแแแแแแแแทแแแแแแแทแแแแแแแแผแแแแแปแแแแแแทแแแพแแถแแขแแแธแแปแแ
แ แพแแแถแแทแ แแ แแถแแแแแแฌแแแแแปแแถแแแแแถแแแแแทแแแแแแขแแแแแทแแแแ (แแแแปแ) แแแแปแแแปแแแแแแธแแแขแแแธแแแแขแถแ แแแแพแแถแแ แแแโแแแโแแแแพโแแถโแแแขโแแถแโ!
- แแแแแถแแถแแแทแแแถแแแแทแแแแแแแแแแปแแแแแแ แแแแแแแแพแ $g_code แขแถแ แแพแแกแพแแแแแแแแ แแผแ แแแแแแแแปแแแแแพแฑแแแขแแแแแแแแแแปแแแถแแแแแแนแแแทแแทแแแแแพแแแถแ
- แขแแแแแแขแถแ แแแแแพแแแแแทแแทแแแแแแถ แแทแแแแแ แถแแแฝแแแถแแแแแถแแแแธแแแแผแแแ /@code/แแแแทแแท
- แ แถแแแถแแแแถแแแแแแพแแแแแแแแถแแแแ แแถแแแแแแถแแถแแแแแแแแแแแแแแแแแฝแแฏแ แแแแแพแแแแแแธแแแแถแ "แแถแแแถแ" แแธแแถแแแแแพแฑแแแแแแธ
-
แแแแปแแแผแแแแแถแแแแถแแแปแแแถแแแถ แแผแแแแธแแแแแแปแแแฟแแแผแ แแถแ แแแแแแแแแแแ แขแแแแแแแพแแถแแแแแ แผแแแปแแแแถแแแ แแพแแแแแแแแถแแแธแแแ แแถแแฝแแแนแแแแ แปแแแแแแแแผแแแแแถแแแแผแแแถแแแแแ แถแ แขแแแแแทแแแฝแแแนแแแแขแแแแพแแถแแแแแแแแแปแแแแแแแแแแแแแแผแแแถแ แ แพแแแถแ = "url" แแ แแถแแแแแ แผแแแแแแแ
RedComrade -
แแแแแแแแแแแแ แแแแปแแแแทแแแแแ ...
แแแแถแแแแแแ)
แแแแแ: www.habr.com