áááºááŸáááœááºá ááá¹áá¬áá±á«áºááŸá áá¯áá¹ááá®ááá¯ááºážáá®ážáá«ážááẠáááºá¡áááºážá¡ááŒá
áºáá
áºáá¯áá±á«áºááœáẠáá¯á¶ážá
áœá²áá°áá¯ááºáá±á¬ááºááŸá¯áá»á¬ážááŸáá·áºáááºáááºááá·áº á
á¬áááºážááá¬ážáá»á¬ážááᯠá
á¯áá±á¬ááºážáá»ááºááŸááááºá á
á±á·áá±á¬áºááŸá¯ááŸá¬ ááŸááºážááŸááºážáááºážáááºážááŒá
áºááẠâ áá¯áá¹ááá®áá»á¬ážááẠáááºážááá¯á·á áá¯ááºáá¯ááº/áááºááá¯ááºááᯠáááºááá¯á·á¡áá¯á¶ážááŒá¯áá±áááºááᯠááááá¯ááŒá®áž áááºážááá¯á·áá¡áá¯á¶ážááŒá¯áá°áá»á¬ážááᯠááá¯ááá¯áá¬ážáááºááá±á¬áá±á«ááºááẠááá¯á¡ááºáá«áááºá áá¯ááºáá«áááºá áá®ááŒá¿áá¬ááá¯ááŒá±ááŸááºážááá¯á· á
á»á±ážááœááºááŸá¬ áááááá¬á¡áá»á¬ážá¡ááŒá¬ážááŸááá«ááẠ- áááºááŸáºáá¯ááºáá»á¬ážááŸáá·áº ááááºáá¯á¶á
á¶ááŒáá·áº áá±áá¬ááá¯áá±ážáá±á¬ááºááá·áº ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á
áá
áºáá»á¬ážá០(á¥ááá¬á
áá«áá±ááá·áº áááŒá±ááŸááºážááá±ážáá²á· ááŒá¿áá¬áá
áºáá¯ááᯠáá»áœááºáá±á¬áºááá¯á· ááœá±á·ááŸááá²á·áá«áááºá áá®áá±á¬á· ááœá±ážáááºá
áá»áœááºá¯ááºááá¯á·ááẠáá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯ááºáááºáá±á¬ááºááŸá¯ááᯠá¡áááºááŒá±á¬áá·áº áá®ááœááºááá·áºááááºážá
á¡á²áá«á ááá¯ážáááºáá»á±á¬áºá áá«ááá¯á· á¡áááºááá¯ááºáá¯á¶áž ááŸááºáááºáá²á·áááºá 2019 áá¯ááŸá
áºááœáẠáá»áœááºá¯ááºááá¯á·ááẠááááá¯á¶áž Customer Data Platform API ááᯠáá®ááœááºáá²á·áááºá kSenseááá¯ááá¯á¡áááºááŒá±áá±á¬áá±áá¬ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯á á¡áá¯á¶ážááŒá¯áá°áá»á¬ážá
áœá¬ááẠáá»áœááºá¯ááºááá¯á·ááá±áá¬ááœá²ááŒááºážá
áááºááŒá¬ááŸá¯ááááºáá±á¬ááºážááᯠá¡áá°ážáááŒáá·áº Google Analytics (áá±á¬ááºááœáẠGA áá¯áááºááœáŸááºážáááº) ááá¯á¡áá¯á¶ážááŒá¯áááºááᯠáá»áœááºá¯ááºááá¯á·áááááŒá¯áááá«áááºá áá¯á¶ážá
áœá²áá°á¡áá»áá¯á·ááŸáá·áº á
áá¬ážááŒá±á¬áá²á·ááŒá®áž áááºážááá¯á·ááẠGA ááᯠá¡áá¯á¶ážááŒá¯á áááŸáááá·áº áááºážááá¯á·á áá¯ááºáá¯ááºááá¯ááºáᬠááœá²ááŒááºážá
áááºááŒá¬ááŸá¯áá±áᬠááá¯á¡ááºááŒá±á¬ááºáž ááááŸááá²á·ááá±á¬áºáááºážá
áááºážááá¯á·ááẠáááºážááá¯á·á áááºáááºážááŒá áºááœáẠá¡ááá¯ááºáž javascript pixel áá áºáá¯ááᯠááá·áºááœááºážááŒá®áž áááºážááá¯á·á á¡áá¯á¶ážááŒá¯áá° á¡ááŒá¯á¡áá°áá±áá¬ááᯠáááºááŸááºáá¬ážááá·áº áá±áá¬áá±á·á Ạ(á¥ááᬠPostgres) á¡ááœááºážááá¯á· áááºáá±á¬ááºááœá¬ážáá²á·áááºá áá«áá±ááá·áº Segment ááŸá¬áááºáž á¡áá¯ááºááá¹ááá¬áá±á¬ááºáá²á· á á»á±ážááŸá¯ááºážááŸááá«áááºá á¥ááá¬á¡á¬ážááŒáá·áºá áááºá¡áááºážá¡ááŒá áºáá áºáá¯ááœáẠ90,000 MTU (áá ááºááŒá±áá¬áá¶á¡áá¯á¶ážááŒá¯áá°áá»á¬áž) ááŸááá«á ááœá±ááá¯ááºáá°áá¶ááá¯á· áá áºááá»áŸáẠ~ $1,000 áá±ážáá±á¬ááºááẠááá¯á¡ááºáá«áááºá ááááááŒá¿áá¬áááºážááŸááá«ááẠ- á¡áá»áá¯á·áá±á¬ááá±á¬ááºáᬠextension áá»á¬áž (á¥ááᬠAdBlock) ááẠááœá²ááŒááºážá áááºááŒá¬ááŸá¯á á¯áá±á¬ááºážááŸá¯ááᯠááááºááá¯á·áá¬ážáááºá browser á០http áá±á¬ááºážááá¯áá»ááºáá»á¬ážááᯠGA ááŸáá·áº Segment domains áá»á¬ážááá¯á· áá±ážááá¯á·áá²á·áááºá áá»áœááºá¯ááºááá¯á·ááá±á¬ááºáááºáá»á¬ážáááá¹áá¡áá±á«áºá¡ááŒá±áá¶á áá»áœááºá¯ááºááá¯á·ááẠáá±áá¬á¡á á¯á¶á¡áááºááᯠ(ááá°áá¬ááá«áá²) á¡ááá²á·á á¯áá±á¬ááºážááŒá®áž áá»áœááºá¯ááºááá¯á·áááá¯ááºááá¯ááºá¡ááŒá±áá¶á¡áá±á¬ááºá¡á¡á¯á¶á¡ááœáẠáá¯ááºáá±á¬ááºááá¯ááºááá·áº ááœá²ááŒááºážá áááºááŒá¬ááŸá¯áááºáá±á¬ááºááŸá¯ááᯠáááºáá®ážáá¬ážáá«áááºá
áááºáá±á¬ááºááŸá¯áááºááá¯á¡áá¯ááºáá¯ááºáá²á
áááºáá±á¬ááºááŸá¯ááœáẠá¡ááá¯ááºážáá¯á¶ážááá¯ááºážáá«áááºáááº- javascript pixel (áá±á¬ááºááá¯ááºážááœáẠáá»áœááºá¯ááºááá¯á· á á¬á á®á á¬ááá¯ááºááá¯á· ááŒááºáááºáá±ážáá¬ážáá²á·áááº)á GO áá¬áá¬á áá¬ážááŒáá·áº áá¯ááºáá±á¬ááºáá²á·áá±á¬ áá¬áá¬á¡á áááºá¡ááá¯ááºážáá áºáá¯á áááºážááẠRedshift ááŸáá·áº BigQuery ááᯠá¡áááºááœááºážáá±áá¬áá±á·á áºá¡ááŒá Ạá¡áá¯á¶ážááŒá¯ááẠá á®á ááºáá¬ážáá²á·ááẠ(áá±á¬ááºááá¯ááºážááœáẠáááºážááá¯á·ááẠPostgres á¡ááœáẠáá¶á·ááá¯ážááŸá¯ áááºáá±á¬ááºážááá·áºááœááºážáá²á·áááºá , ClickHouse ááŸáá·áº Snowflake ) á
GA ááŸáá·áº Segment ááŒá áºáááºáá»á¬ážá ááœá²á·á ááºážáá¯á¶ááẠáááŒá±á¬ááºážáá²áá² ááœááºááœá¬ááẠáá¯á¶ážááŒááºáá²á·áááºá ááá¯á¡ááºááá»áŸá¡áá¬á¡á¬ážáá¯á¶ážááẠáá»áœááºá¯ááºááá¯á·ááá±á¬ááºááœááºááœáẠpixel ááá¯ááá·áºááœááºážáá¬ážááá·áº áááºá¡áááºážá¡ááŒá áºááŸááŒá áºáááºá¡á¬ážáá¯á¶ážááᯠáááá¹áá°ááœá¬ážáááºááŒá áºáááºá ááœááºáá¬áá²á·á¡ááá¯ááºážá áá«ááá¯ááºááá¯á·ááœááºáááºá Javascript pixel ááẠáá°áááºáž GA á á¬ááŒáá·áºááá¯ááºáááºážáááºážááᯠáá»áœááºá¯ááºááá¯á·áá áá áºááŸá á¡ááŒá áºá¡áá»ááºááᯠáááºááœá¬ážá á±áá±á¬ á¡áá áºáá áºáá¯ááŒáá·áº ááœáŸááºážááá¯ážáá¬ážáááºá
//'ga' - ÑÑаМЎаÑÑМПе МазваМОе пеÑеЌеММПй Google Analytics
if (window.ga) {
ga(tracker => {
var originalSendHitTask = tracker.get('sendHitTask');
tracker.set('sendHitTask', (model) => {
var payLoad = model.get('hitPayload');
//ПÑпÑавка ПÑОгОМалÑМПгП ÑПбÑÑÐžÑ Ð² GA
originalSendHitTask(model);
let jsonPayload = this.parseQuery(payLoad);
//ПÑпÑавка ÑПбÑÑÐžÑ Ð² ÐœÐ°Ñ ÑеÑвОÑ
this.send3p('ga', jsonPayload);
});
});
}
Segment pixel ááŒáá·áºá á¡áá¬á¡á¬ážáá¯á¶ážááá¯ááá¯ááá¯ážááŸááºážáááºá áááºážááœáẠá¡áááºáááºážáá±á¬á·ááºáá²áááºážáááºážáá»á¬ážááŸáááŒá®áž áááºážááá¯á·áá²ááŸáá áºáá¯ááᯠáá»áœááºá¯ááºááá¯á·á¡áá¯á¶ážááŒá¯áá²á·áááºá
//'analytics' - ÑÑаМЎаÑÑМПе МазваМОе пеÑеЌеММПй Segment
if (window.analytics) {
if (window.analytics.addSourceMiddleware) {
window.analytics.addSourceMiddleware(chain => {
try {
//ÐŽÑблОÑПваМОе ÑПбÑÑÐžÑ Ð² ÐœÐ°Ñ ÑеÑвОÑ
this.send3p('ajs', chain.payload);
} catch (e) {
LOG.warn('Failed to send an event', e)
}
//ПÑпÑавка ПÑОгОМалÑМПгП ÑПбÑÑÐžÑ Ð² Segment
chain.next(chain.payload);
});
} else {
LOG.warn("Invalid interceptor state. Analytics js initialized, but not completely");
}
} else {
LOG.warn('Analytics.js listener is not set.');
}
á¡ááŒá áºá¡áá»ááºáá»á¬ážááᯠáá°ážáá°ááŒááºážá¡ááŒááºá áá»áœááºá¯ááºááá¯á·ááẠááááºáááᯠjson áá±ážááá¯á·ááá¯ááºááá·áº á áœááºážáááºááᯠááá·áºááœááºážáá¬ážáááº-
//ÐÑпÑавка ÑПбÑÑОй Ñ Ð¿ÑПОзвПлÑÐœÑÐŒ json ПбÑекÑПЌ
eventN.track('product_page_view', {
product_id: '1e48fb70-ef12-4ea9-ab10-fd0b910c49ce',
product_price: 399.99,
price_currency: 'USD'
product_release_start: '2020-09-25T12:38:27.763000Z'
});
áá±á¬ááºáá
áºáá¯á server side á¡ááŒá±á¬ááºážááŒá±á¬ááŒáá·áºáá¡á±á¬ááºá áá±á¬ááºáá¶áá°ááẠhttp áá±á¬ááºážááá¯ááŸá¯áá»á¬ážááᯠáááºáá¶ááá·áºáááºá áááºážááá¯á·á¡á¬áž á¡ááá¯á¡áá»ááºá¡áááºáá»á¬ážá á¥ááá¬á geodata (áá»á±ážáá°ážáááºáá«áááºá
//вÑ
ПЎÑÑОй json
{
"field_1": {
"sub_field_1": "text1",
"sub_field_2": 100
},
"field_2": "text2",
"field_3": {
"sub_field_1": {
"sub_sub_field_1": "2020-09-25T12:38:27.763000Z"
}
}
}
//ÑезÑлÑÑаÑ
{
"field_1_sub_field_1": "text1",
"field_1_sub_field_2": 100,
"field_2": "text2",
"field_3_sub_field_1_sub_sub_field_1": "2020-09-25T12:38:27.763000Z"
}
ááá¯á·áá±á¬áºá array áá»á¬ážááẠáá±á¬áá±á¬áááºááœáẠááá¯ážááá¯ážáááºážáááºážáá»á¬ážá¡ááŒá áºááá¯á· ááŒá±á¬ááºážáá²áá«áááºá áááºá ááºáá±áá¬áá±á·á áºá¡á¬ážáá¯á¶ážááẠáááºáá«ááá²áá² á¡ááœááºáá»á¬ážááᯠááá¶á·ááá¯ážáá«á á áááºááŒáá¯ááºááŒá±áá¯á¶ááœá²ááŒááºážá ááºážáá»ááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á á¡ááœááºá¡áááºáá»á¬ážááᯠááŒá±á¬ááºážáá²ááá¯ááºááẠááá¯á·ááá¯áẠáááºážááá¯á·ááᯠáááºááŸá¬ážááá¯ááºáááºá áááºážááá¯á·ááẠááá·áºá¡á¬áž ááá¯á¡ááºáá«á data schema ááá¯ááŒá±á¬ááºážáá²ááẠááá¯á·ááá¯áẠdata type áá áºáá¯ááᯠá¡ááŒá¬ážáá áºáá¯ááá¯á· áá¬á áºáá¯ááºááœáá·áºááŒá¯áááºá á¥ááá¬á json á¡ááœááºááœáẠtimestamp áá«áá±á¬ á á¬ááŒá±á¬ááºážáá áºáá¯áá«ááŸááá»áŸáẠ(field_3_sub_field_1_sub_sub_field_1 á¡áááºáá±á¬áºááŒáá« á¥ááá¬ááŸ) ááá¯á·áá±á¬áẠá¡áá»áááºáá¶ááááºááá¯ááºááŸáááºáá¬ážáá±á¬ áá±áá¬áá±á·á áºááœáẠá¡ááœááºáá áºáá¯ááᯠáááºáá®ážáááºá¡ááœááºá ááœá²á·á ááºážááŸá¯áá¯á¶á á¶ááœáẠááŒá±áá¯á¶áá±ážááœá²ááŒááºážááá¯ááºáᬠá ááºážáááºážáá»ááºáá áºáá¯ááᯠáá±ážááẠááá¯á¡ááºáááºá áá áºáááºážááá¯ááá±á¬áºá á¡ááœááºá áá±áá¬á¡áá»áá¯ážá¡á á¬ážááᯠjson áááºááá¯ážááŒáá·áº áŠážá áœá¬áá¯á¶ážááŒááºááŒá®ážá ááá¯á·áá±á¬áẠáá¬á áºááºáá¯á¶á á¶á ááºážáá»ááºáž (ááŒááºáááºáááºááŸááºáá¬ážáá»áŸááº) ááᯠá¡áá¯á¶ážááŒá¯áá«áááºá áá»áœááºá¯ááºááá¯á·ááẠá¡ááááá±áá¬á¡áá»áá¯ážá¡á á¬áž 4 áá¯ááᯠááŸá¬ááœá±ááœá±á·ááŸááá²á·áááº- STRINGá FLOAT64á INT64 ááŸáá·áº TIMESTAMPá ááŒá±áá¯á¶ááœá²ááŒááºážááŸáá·áº Casting á ááºážáá»ááºážáá»á¬ážááẠá€áá²á·ááá¯á·ááŒá áºáááº-
rules:
- "/field_1/subfield_1 -> " #пÑавОлП ÑÐŽÐ°Ð»ÐµÐœÐžÑ Ð¿ÐŸÐ»Ñ
- "/field_2/subfield_1 -> /field_10/subfield_1" #пÑавОлП пеÑеМПÑа пПлÑ
- "/field_3/subfield_1/subsubfield_1 -> (timestamp) /field_20" #пÑавОлП пеÑеМПÑа Ð¿ÐŸÐ»Ñ Ðž пÑÐžÐ²ÐµÐŽÐµÐœÐžÑ ÑОпа
áá±áá¬á¡áá»áá¯ážá¡á á¬ážááᯠáá¯á¶ážááŒááºáááºá¡ááœáẠá¡ááºáááá¯áá®áááº-
- json struct ááᯠflat struct ááá¯á·ááŒá±á¬ááºážáá«á
- áá±áá¬á¡áá»áá¯ážá¡á á¬ážááᯠáááºááá¯ážáá»á¬ážááŒáá·áº áááºááŸááºááŒááºážá
- ááŒá±áá¯á¶ááœá²ááŒááºážááŸáá·áº ááá¯ááºááœááºážááŒááºáž á ááºážáá»ááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááŒááºážá
ááá¯á·áá±á¬áẠáááºáá¬áá±á¬ json ááœá²á·á ááºážáá¯á¶ááŸá
{
"product_id": "1e48fb70-ef12-4ea9-ab10-fd0b910c49ce",
"product_price": 399.99,
"price_currency": "USD",
"product_type": "supplies",
"product_release_start": "2020-09-25T12:38:27.763000Z",
"images": {
"main": "picture1",
"sub": "picture2"
}
}
data schema ááᯠáááŸááááá·áºáááº-
"product_id" character varying,
"product_price" numeric (38,18),
"price_currency" character varying,
"product_type" character varying,
"product_release_start" timestamp,
"images_main" character varying,
"images_sub" character varying
á¡áá¯á¶ážááŒá¯áá°ááẠá¡ááŒá¬ážáááºááŸááºáá»ááºáá»á¬ážááŸáá·áºá¡áá® áá±áá¬áá±á·á
áºááœáẠá¡ááá¯ááºážááœá²ááŒááºáž ááá¯á·ááá¯áẠááœá²ááŒááºážááŒááºážááá¯á·ááᯠáááºááŸááºááá¯ááºááá·áºááŒá®áž ááá¬ážá¡áááºááᯠááááºážáá±á¡ááŒá
ẠáááºááŸááºááá¯ááºá
áœááºážááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááá¯ááºáááºáá¯áááºáž áá»áœááºá¯ááºááá¯á· áá°ááá«áááºá
tableName: '{{.product_type}}_{{._timestamp.Format "2006_01"}}'
ááá¯á·áá±á¬áºá áááºáá¬áá±á¬ááŒá áºáááºáá»á¬ážáááœá²á·á ááºážáá¯á¶ááẠruntime ááœááºááŒá±á¬ááºážáá²ááá¯ááºáááºá ááŸáááŒá®ážáá¬ážááá¬ážáá áºáá¯áááœá²á·á ááºážáá¯á¶ááŸáá·áº á¡áááºááŒá áºáááºáá áºáá¯áááœá²á·á ááºážáá¯á¶á¡ááŒá¬áž ááŒá¬ážáá¬ážáá»ááºááᯠá á áºáá±ážáááºá¡ááœáẠá¡ááºáááá¯áá®áááºáá áºáá¯ááᯠáá»áœááºá¯ááºááá¯á·á¡áá±á¬ááºá¡áááºáá±á¬áºáá±á¬ááºááœááºáá¬ážáá«áááºá ááœá²ááŒá¬ážááŸá¯ááᯠááœá±á·ááŸááá«á ááá¬ážááᯠá¡ááœááºá¡áá áºáá»á¬ážááŒáá·áº á¡ááºááááºáá¯ááºáááºááŒá áºáááºá áá«ááá¯áá¯ááºááá¯á·á patch SQL query ááá¯áá¯á¶ážáá«á
#ÐÑÐžÐŒÐµÑ ÐŽÐ»Ñ Postgres
ALTER TABLE "schema"."table" ADD COLUMN new_column character varying
áááá¯áá¬á¡áááºááá¬
áá±áá¬áá±á·á
áºááá¯á· ááá¯ááºááá¯ááºáá±ážáá¯á¶áá¬áááá² ááá¯ááºá
áá
áºááœáẠá¡ááŒá
áºá¡áá»ááºáá»á¬ážááᯠá¡áááºááŒá±á¬áá·áº áá±ážáá¬ážááẠááá¯á¡ááºááááºážá ááá·áºááœááºážááŸá¯áá»á¬ážá
áœá¬ááŒáá·áº áá±áá¬áá±á·á
áºáá»á¬ážááẠááŒáá·áºáá¬ážáá±á¬á
áœááºážáá±á¬ááºáááºááᯠá¡ááŒá²ááŒááá±á·áááŸááá« (
Open Source ááŸáá·áº á¡áá¬áááºá¡á á®á¡á ááºáá»á¬áž
áá áºáá»áááºáá»áááºááœááºá áááºáá±á¬ááºááŸá¯ááẠááŒá®ážááŒáá·áºá á¯á¶áá±á¬ áá¯ááºáá¯ááºáá áºáá¯áá²á·ááá¯á· ááŒá áºáá¬ááŒá®áž áááºážááᯠOpen Source ááœáẠááá·áºááẠáá¯á¶ážááŒááºáá²á·áááºá áá±á¬áá±á¬áááºááœááºá Postgresá ClickHouseá BigQueryá Redshiftá S3á Snowflake ááá¯á·ááŸáá·áº áá±á«ááºážá ááºážááŸá¯ááᯠá¡áá±á¬ááºá¡ááẠáá±á¬áºáá¬ážáááºá áá±á«ááºážá ááºážááŸá¯á¡á¬ážáá¯á¶ážááẠá¡áá¯ááºááá¯ááºááŸáá·áº áá±áá¬ááœáŸáá·áºáááºááŒááºážáá¯ááºááŸá áºáá¯áá¯á¶ážááᯠáá¶á·ááá¯ážáá±ážáááºá API ááŸáá áºááá·áº áá±á¬ááºážááá¯ááŸá¯áá»á¬ážá¡ááœáẠáá¶á·ááá¯ážááŸá¯ áá±á«ááºážááá·áºáá¬ážáááºá
áááºááŸááá±á«ááºážá ááºážááŸá¯á¡á á®á¡á á¥áºááẠá€áá²á·ááá¯á·ááŒá áºáááº-
áááºáá±á¬ááºááŸá¯ááᯠá¡ááŸá®á¡ááá¯áááºážá
áœá¬á¡áá¯á¶ážááŒá¯ááá¯ááºáá±á¬áºáááºáž (á¥ááá¬á Docker ááá¯á¡áá¯á¶ážááŒá¯ááŒááºáž) áá»áœááºá¯ááºááá¯á·áááºážááŸááááºá
â
â
â
EventNative ááẠááá·áºááŒá¿áá¬áá»á¬ážááᯠáá°áá®ááŒá±ááŸááºážáá±ážáááºááá¯áá«á áááºážááŒá±á¬ááºáááá«áááºá
á
á¬áááºážááœááºážá¡áá¯á¶ážááŒá¯áá°áá»á¬ážáᬠá
á
áºáááºážááœáẠáá«áááºááá¯ááºáá«áááºá
ááá·áºáá¯áá¹ááá®ááœáẠáááºááá·áºá á¬áááºážá¡ááºáž á á¯áá±á¬ááºážááŸá¯á áá áºááᯠá¡áá¯á¶ážááŒá¯ááááºážá
-
48,0%Google Analytics áá
-
4,0%á¡ááá¯ááºáž á
-
16,0%á¡ááŒá¬áž (ááŸááºáá»ááºáá»á¬ážááœááºáá±ážáá«) á
-
32,0%áááºááááºáá±á¬ááºááŸá¯ááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºáá« á
á¡áá¯á¶ážááŒá¯áá° 25 áŠáž áá²áá±ážáá²á·áááºá á¡áá¯á¶ážááŒá¯áá° 6 ááŸá±á¬ááºáá±áá²á·áá«áááºá
source: www.habr.com