አንጎል + ቪፒኤስ ለ 30 ሩብልስ =?

ሁሉም አስፈላጊ የሆኑ ጥቃቅን ነገሮች በእጃቸው ሲሆኑ በጣም ጥሩ ነው ጥሩ እስክሪብቶ እና ማስታወሻ ደብተር, የተሳለ እርሳስ, ምቹ መዳፊት, ሁለት ተጨማሪ ሽቦዎች, ወዘተ. እነዚህ የማይታዩ ነገሮች ትኩረትን አይስቡም, ነገር ግን ለሕይወት ምቾት ይጨምራሉ. ተመሳሳይ ታሪክ ከተለያዩ የሞባይል እና የዴስክቶፕ አፕሊኬሽኖች ጋር ነው፡ ለረዥም ስክሪፕቶች፣ የምስል መጠንን ለመቀነስ፣ የግል ፋይናንስን ለማስላት፣ መዝገበ ቃላት፣ ተርጓሚዎች፣ ቀያሪዎች፣ ወዘተ. አንድ አለህ? VPS - የትኛው ርካሽ ነው ፣ ሁል ጊዜ በእጅ የሚገኝ እና ብዙ ጥቅሞችን ያስገኛል? አይ, በድርጅትዎ ውስጥ ያለዎት አይደለም, ነገር ግን የእራስዎ, "ኪስ" አንድ. እ.ኤ.አ. በ 2019 ያለ ትንሽ ቪፒኤስ እንደምንም አሳዛኝ ነበር ፣ ልክ በንግግር ላይ እንደተለመደው የምንጭ ብዕር ከሌለ። ለምን አዝናለሁ? ክረምት ነው። ክረምት እንዴት ነው? የበጋ ወቅት ለአንድ የአይቲ ባለሙያ: ቤት ውስጥ ተቀምጠው, በሚወዷቸው ፕሮጀክቶች ላይ ያለ ምንም ጸጸት መስራት. በአጠቃላይ አስበን አደረግነው።

አንጎል + ቪፒኤስ ለ 30 ሩብልስ =?
ኮሙኒዝም መጣ ጓዶች።

እሱ እንደዛ ነው - የእኛ ቪፒኤስ ለሰላሳ

ከ 3-4 ዓመታት በፊት ውድ ያልሆነ VPS ለምን እንደማያስፈልግ ከጻፉት ከተወዳዳሪዎች እና ተጠቃሚዎች ብዙ ጽሑፎችን አንብበናል። ደህና ፣ ልክ ነው ፣ ከዚያ VPS “ለአንድ ሳንቲም” ንጹህ ግብይት ነበር እና መደበኛ የስራ እድሎችን መስጠት አልቻለም። ግን ጊዜዎች እየተቀያየሩ ናቸው ፣ የቨርቹዋል ሀብቶች ዋጋ ዝቅተኛ እና ዝቅተኛ እየሆነ መጥቷል ፣ እና በወር ለ 30 ሩብልስ ይህንን ለማቅረብ ዝግጁ ነን-

  • አንጎለ ኮምፒውተር፡ Intel Xeon 2 GHz (1 ኮር)
  • ሊኑክስ ሲስተም (ዴቢያን፣ ኡቡንቱ፣ ሴንትኦኤስ ለመምረጥ)
  • 1 የተወሰነ IPv4 አድራሻ
  • 10 ጂቢ የውሂብ ማከማቻ በፈጣን የድርጅት ደረጃ SSD ድራይቮች ላይ
  • ራም: 512 ሜባ
  • በሰከንድ የሂሳብ አከፋፈል
  • ያልተገደበ ትራፊክ

ታሪፉ ለተጨማሪ ቴክኒካዊ ገደቦች ተገዢ ነው, ዝርዝሮች ላይ ገጽ የእኛ ጥሩ ቅናሽ - VPS ለ 30 ሩብልስ። 

ይህ ምናባዊ አገልጋይ ለማን ተስማሚ ነው? አዎ ለሁሉም ማለት ይቻላል፡ ጀማሪዎች፣ አድናቂዎች፣ ልምድ ያላቸው ገንቢዎች፣ DIY ደጋፊዎች እና እንዲያውም አንዳንድ ኩባንያዎች።

ይህ VPS ለምን ተስማሚ ነው?

የሃበር አንባቢዎች በእርግጠኝነት ይህንን ውቅረት የሚጠቀሙበት የራሳቸውን መንገድ ያገኛሉ ብለን እናስባለን ፣ ግን የራሳችንን የሃሳቦች ምርጫ ለመሰብሰብ ወሰንን - አንድ ሰው ቢፈልገው ፣ ግን ወንዶቹ የማያውቁት ከሆነስ?

  • የእርስዎን ቀላል ድር ጣቢያ፣ ፖርትፎሊዮ፣ ከቆመበት ቀጥል በኮድ፣ ወዘተ. እርግጥ ነው, የእራስዎ የተነደፈ ድር ጣቢያ በአሠሪው ላይ አዎንታዊ ስሜት ይፈጥራል. በእርስዎ VPS ላይ ያስቀምጡት እና ለጣቢያው ደህንነት እና መረጋጋት ተጠያቂ ይሁኑ እንጂ በመደበኛ አስተናጋጅ አቅራቢዎች ሰራተኞች አይደሉም።
  • ለትምህርታዊ ዓላማዎች VPSን ይጠቀሙ፡ ፕሮጀክትዎን ያስተናግዱ፣ የአገልጋዩን እና የአገልጋዩን ስርዓተ ክወና ባህሪያት ያጠኑ ፣ በዲ ኤን ኤስ ይሞክሩ ፣ በትንሽ የትምህርት ጣቢያ ቲንክከር።
  • ለስልክ. አንዳንድ ጊዜ አንድ ግለሰብ ሥራ ፈጣሪ፣ ፍሪላነር ወይም በጣም ትንሽ ኩባንያ የአይፒ ቴሌፎን በጣም ይፈልጋሉ፣ እና የዚህ ስልክ ኦፕሬተሮች በጣም ስግብግብ ናቸው። ቀላል ነው፡ ሰርቨራችንን እንወስዳለን፣ ከአይፒ ቴሌፎን ኦፕሬተር ቁጥር እንገዛለን፣ ቨርቹዋል ፒቢኤክስ አዘጋጅተናል እና የውስጥ ቁጥሮችን እንፈጥራለን (አስፈላጊ ከሆነ)። ቁጠባው በጣም ብዙ ነው።
  • መተግበሪያዎችዎን ለመሞከር አገልጋዩን ይጠቀሙ።
  • ከዘመናዊ የቤት ስርዓት ዳሳሾች መቆጣጠር እና መሰብሰብን ጨምሮ አገልጋዩን ለDIY ሙከራዎች ይጠቀሙ።
  • እሱን ለመጠቀም ያልተለመደ መንገድ ምናባዊ ልውውጥ የንግድ ረዳት ፣ የንግድ ሮቦት በአገልጋዩ ላይ ማስቀመጥ ነው። ለአገልጋዩ መረጋጋት እና ደህንነት ሙሉ በሙሉ ሀላፊነት ይወስዳሉ፣ ይህ ማለት በአክሲዮን ገበያዎች ላይ ለመገበያየት ቁጥጥር የሚደረግበት መሳሪያ ይቀበላሉ። ደህና፣ ማንም ፍላጎት ካለው ወይም እቅድ ቢያወጣ :)

በድርጅት ሉል ውስጥ ለእንደዚህ ያሉ ቪፒኤስ መተግበሪያዎች አሉ። ቀደም ሲል ከተጠቀሰው የስልክ አገልግሎት በተጨማሪ በርካታ አስደሳች ነገሮችን መተግበር ይችላሉ. ለምሳሌ:

  • በሩቅ ለተጓዥ ሰራተኞች ሊደረስባቸው የሚችሉ ትናንሽ የውሂብ ጎታዎችን እና መረጃዎችን ያስቀምጡ, ለምሳሌ, ftp በመጠቀም. ይህ ትኩስ ትንታኔዎችን፣ ለሽያጭ ሰዎች የዘመኑ ውቅሮችን፣ የዝግጅት አቀራረቦችን ወዘተ በፍጥነት እንድትለዋወጡ ይፈቅድልሃል።
  • ሶፍትዌሮችን ወይም ሚዲያን ለማሳየት ጊዜያዊ መዳረሻ ለተጠቃሚዎች ወይም ደንበኞች ይስጡ።

የ VPS የሙከራ ድራይቭ ለ 30 ሩብልስ - ለእርስዎ ተከናውኗል

30 ሬብሎች በጣም ትንሽ ስለሆነ ለመክፈል እና ለመፈተሽ ካርድ ለማውጣት እንኳን አይፈልጉም. እኛ አንዳንድ ጊዜ በጣም ሰነፍ ነን፣ ግን በዚህ ጊዜ ሁሉንም ነገር አደረግንልዎ። አገልጋዮቹን ወደ ጦርነት ከማስጀመርዎ በፊት ሁሉንም ዝርዝሮች ለመፈተሽ እና አገልጋዮቹ በዚህ ታሪፍ ምን እንደሚችሉ ለማሳየት ሙከራ አድርገናል። የበለጠ አስደሳች ለማድረግ ጽንፍ ጨምረን እና መጠኑ እና ጭነቱ ካስቀመጥናቸው እሴቶች በላይ ከሆነ ይህ ውቅር እንዴት እንደሚሠራ አረጋግጠናል። 

አስተናጋጁ በአቀነባባሪው ላይ የተለያዩ ስራዎችን ባከናወኑ እና የዲስክ ንዑስ ስርዓትን በንቃት በሚጠቀሙ የበርካታ ምናባዊ ማሽኖች ጭነት ስር ነበር። ግቡ ከፍተኛ መጠን ያለው አቀማመጥ እና ከጦርነት ጋር የሚወዳደር ወይም የሚበልጥ ሸክም ማስመሰል ነው።

ከቋሚ ጭነት በተጨማሪ sysbench ን በመጠቀም የሰው ሰራሽ መለኪያዎችን የሚሰበስቡ 3 ቨርቹዋል ማሽኖችን ተጭነን ነበር አማካይ ውጤታቸው ከዚህ በታች ተሰጥቷል እና 50 ተጨማሪ ጭነት የፈጠሩ ቨርቹዋል ማሽኖችን ጫንን። ሁሉም የሙከራ ቨርቹዋል ማሽኖች አንድ አይነት ውቅር ነበራቸው (1 ኮር፣ RAM 512 ጂቢ፣ ኤስኤስዲ 10 ጂቢ)፣ መደበኛው የዴቢያን 9.6 ምስል እንደ ኦፕሬቲንግ ሲስተም ተመርጧል፣ ይህም በRUVDS ላይ ለተጠቃሚዎች ይቀርባል።

ጭነቱ በተፈጥሮ የተመሰለው እና መጠኑ ከጦርነት ጋር ሊወዳደር የሚችል ነው፡-

  • አንዳንድ ምናባዊ ማሽኖች በዝቅተኛ ጭነት ተጀምረዋል።
  • አንዳንድ ማሽኖች በአቀነባባሪው ላይ ያለውን ጭነት (መገልገያውን በመጠቀም) በማስመሰል የሙከራ ስክሪፕት አሂድ ነበር። ውጥረት)
  • በቀሪው የቨርቹዋል ማሽኖቹ ክፍል ላይ pv ን በመጠቀም ውሂቡን ወደ ዲስክ ለመቅዳት dd የሚጠቀም ስክሪፕት እንሰራ ነበር (ምሳሌዎች ሊታዩ ይችላሉ) እዚህ и እዚህ).

እንዲሁም፣ እንደምታስታውሱት፣ ሰው ሠራሽ መለኪያዎችን የሚሰበስቡ ሦስት ማሽኖች ነበሩን።

በእያንዳንዱ ማሽን ላይ አንድ ስክሪፕት በየ15 ደቂቃው ሳይክሊል ይፈጸማል፣ ይህም ለፕሮሰሰር፣ ሚሞሪ እና ዲስክ መደበኛ የሲሳይቤንች ሙከራዎችን ያደርጋል።

ስክሪፕት sysbench.sh

#!/bin/bash
date +"%Y-%m-%d %H:%M:%S" >> /root/sysbench/results.txt
sysbench --test=cpu run >> /root/sysbench/results.txt
sysbench --test=memory run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=seqwr run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=seqrd run >> /root/sysbench/results.txt
sysbench --test=fileio --file-test-mode=rndrw run >> /root/sysbench/results.txt

ውጤቶቹ ለምቾት በ sysbench ቅርጸት ቀርበዋል ፣ ግን የጠቅላላው የሙከራ ጊዜ አማካኝ ዋጋዎች ከሁሉም ማሽኖች ተወስደዋል ፣ ውጤቱ እዚህ ሊታይ ይችላል-

Sysbanch-አማካይ.txtsysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing CPU performance benchmark

Threads started!
Done.

Maximum prime number checked in CPU test: 10000

Test execution summary:
total time: 19.2244s
total number of events: 10000
total time taken by event execution: 19.2104
per-request statistics:
min: 1.43ms
avg: 1.92ms
max: 47.00ms
approx. 95 percentile: 3.02ms

Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 19.2104/0.00

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Doing memory operations speed test
Memory block size: 1K

Memory transfer size: 102400M

Memory operations type: write
Memory scope type: global
Threads started!
Done.

Operations performed: 104857600 (328001.79 ops/sec)

102400.00 MB transferred (320.32 MB/sec)

Test execution summary:
total time: 320.9155s
total number of events: 104857600
total time taken by event execution: 244.8399
per-request statistics:
min: 0.00ms
avg: 0.00ms
max: 139.41ms
approx. 95 percentile: 0.00ms

Threads fairness:
events (avg/stddev): 104857600.0000/0.00
execution time (avg/stddev): 244.8399/0.00

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing sequential write (creation) test
Threads started!
Done.

Operations performed: 0 Read, 131072 Write, 128 Other = 131200 Total
Read 0b Written 2Gb Total transferred 2Gb (320.1Mb/sec)
20251.32 Requests/sec executed

Test execution summary:
total time: 6.9972s
total number of events: 131072
total time taken by event execution: 5.2246
per-request statistics:
min: 0.01ms
avg: 0.04ms
max: 96.76ms
approx. 95 percentile: 0.03ms

Threads fairness:
events (avg/stddev): 131072.0000/0.00
execution time (avg/stddev): 5.2246/0.00

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing sequential read test
Threads started!
Done.

Operations performed: 131072 Read, 0 Write, 0 Other = 131072 Total
Read 2Gb Written 0b Total transferred 2Gb (91.32Mb/sec)
5844.8 Requests/sec executed

Test execution summary:
total time: 23.1054s
total number of events: 131072
total time taken by event execution: 22.9933
per-request statistics:
min: 0.00ms
avg: 0.18ms
max: 295.75ms
approx. 95 percentile: 0.77ms

Threads fairness:
events (avg/stddev): 131072.0000/0.00
execution time (avg/stddev): 22.9933/0.00

sysbench 0.4.12: multi-threaded system evaluation benchmark

Running the test with following options:
Number of threads: 1

Extra file open flags: 0
128 files, 16Mb each
2Gb total file size
Block size 16Kb
Number of random requests for random IO: 10000
Read/Write ratio for combined random IO test: 1.50
Periodic FSYNC enabled, calling fsync() each 100 requests.
Calling fsync() at the end of test, Enabled.
Using synchronous I/O mode
Doing random r/w test
Threads started!
Done.

Operations performed: 6000 Read, 4000 Write, 12800 Other = 22800 Total
Read 93.75Mb Written 62.5Mb Total transferred 156.25Mb (1341.5Kb/sec)
85.61 Requests/sec executed

Test execution summary:
total time: 152.9786s
total number of events: 10000
total time taken by event execution: 14.1879
per-request statistics:
min: 0.01ms
avg: 1.41ms
max: 210.22ms
approx. 95 percentile: 4.95ms

Threads fairness:
events (avg/stddev): 10000.0000/0.00
execution time (avg/stddev): 14.1879/0.00

ውጤቶቹ አመላካች ናቸው፣ ግን አሁንም እንደ QoS መወሰድ የለባቸውም። 

ተጨማሪ ጭነት የሚፈጥሩ ማሽኖች

ሶፍትዌር

  • apt-get ዝማኔ
  • አሻሽል
  • apt-get install python-pip
  • ፒፕ መጫን mysql-connector-python-rf

የተጫነው MariaDB፣ እንዴት እዚህ:

apt-get install libmariadbclient-dev
mysql -e "INSTALL PLUGIN blackhole SONAME 'ha_blackhole.so';" -- нужно для test_employees_sha

የሙከራ መሠረት ተወስዷል እዚህ:

የመረጃ ቋቱ በተገለፀው መሰረት ተዘርግቷል። እዚህ:

mysql -t < employees.sql
mysql -t < test_employees_sha.sql

አነስተኛ የሙከራ መሠረት;

ጠረጴዛ 

የረድፎች ብዛት 

የውሂብ መጠን (ሜባ)

የመረጃ ጠቋሚ መጠን (KB)

ዲፓርትመንት 

9

0.02

16.00

dept_em 

331143 

11.52

5648.00

ዲፕት_አስተዳዳሪ 

24 

0.02

16.00

ሰራተኞች 

299379 

14.52

0.00

ሰራተኞች 

2838426 

95.63

0.00 

ርዕሶች 

442783 

19.56

0.00

የጥንታዊ የሙከራ አገልግሎት በፓይዘን ውስጥ በጉልበቱ ላይ ተጽፏል፤ አራት ስራዎችን ያከናውናል፡-

  1. getState: ሁኔታውን ይመልሳል
  2. ተቀጣሪ፡ ሰራተኞችን (+ደሞዝ፣ +ርዕስ) ከመረጃ ቋቱ ይመልሳል
  3. patchEmployee: የሰራተኛ መስኮችን ይለውጣል
  4. ገቢ ደመወዝ፡ ደሞዝ ያስገባል።

የአገልግሎት ምንጭ (dbtest.py)

#!/usr/bin/python
import mysql.connector as mariadb
from flask import Flask, json, request, abort
from mysql.connector.constants import ClientFlag

app = Flask(__name__)

def getFields(cursor):
    results = {}
    column = 0
    for d in cursor.description:
        results[d[0]] = column
        column = column + 1
    return results

PAGE_SIZE = 30

@app.route("/")
def main():
    return "Hello!"

@app.route("/employees/<page>", methods=['GET'])
def getEmployees(page):
    offset = (int(page) - 1) * PAGE_SIZE
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees')
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM employees LIMIT {} OFFSET {}".format(PAGE_SIZE, offset))
    return {'employees': [i[0] for i in cursor.fetchall()]}

@app.route("/employee/<id>", methods=['GET'])
def getEmployee(id):
    id = int(id)
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees')
    cursor = connection.cursor()
    cursor.execute("SELECT * FROM employees WHERE emp_no = {}".format(id))
    fields = getFields(cursor)
    employee = {}
    found = False
    for row in cursor.fetchall():
        found = True
        employee = {
            "birth_date": row[fields["birth_date"]],
            "first_name": row[fields["first_name"]],
            "last_name": row[fields["last_name"]],
            "gender": row[fields["gender"]],
            "hire_date": row[fields["hire_date"]]
        }
    if not found:
        abort(404)
    cursor.execute("SELECT * FROM salaries WHERE emp_no = {}".format(id))
    fields = getFields(cursor)
    salaries = []
    for row in cursor.fetchall():
        salary = {
            "salary": row[fields["salary"]],
            "from_date": row[fields["from_date"]],
            "to_date": row[fields["to_date"]]
        }
        salaries.append(salary)
    employee["salaries"] = salaries
    cursor.execute("SELECT * FROM titles WHERE emp_no = {}".format(id))
    fields = getFields(cursor)
    titles = []
    for row in cursor.fetchall():
        title = {
            "title": row[fields["title"]],
            "from_date": row[fields["from_date"]],
            "to_date": row[fields["to_date"]]
        }
        titles.append(title)
    employee["titles"] = titles
    return json.dumps({
        "status": "success",
        "employee": employee
    })

def isFieldValid(t, v):
    if t == "employee":
        return v in ["birdth_date", "first_name", "last_name", "hire_date"]
    else:
        return false

@app.route("/employee/<id>", methods=['PATCH'])
def setEmployee(id):
    id = int(id)
    content = request.json
    print(content)
    setList = ""
    data = []
    for k, v in content.iteritems():
        if not isFieldValid("employee", k):
            continue
        if setList != "":
            setList = setList + ", "
        setList = setList + k + "=%s"
        data.append(v)
    data.append(id)
    print(setList)
    print(data)
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees', client_flags=[ClientFlag.FOUND_ROWS])
    cursor = connection.cursor()
    cursor.execute("UPDATE employees SET {} WHERE emp_no = %s".format(setList), data)
    connection.commit()
    if cursor.rowcount < 1:
        abort(404)
    return json.dumps({
        "status": "success"
    })

@app.route("/salary", methods=['PUT'])
def putSalary():
    content = request.json
    print(content)
    connection = mariadb.connect(user='admin', password='q5XpRomdSr', database='employees', client_flags=[ClientFlag.FOUND_ROWS])
    cursor = connection.cursor()
    data = [content["emp_no"], content["salary"], content["from_date"], content["to_date"]]
    cursor.execute("INSERT INTO salaries (emp_no, salary, from_date, to_date) VALUES (%s, %s, %s, %s)", data)
    connection.commit()
    return json.dumps({
        "status": "success"
    })


@app.route("/state", methods=['GET'])
def getState():
    return json.dumps({
        "status": "success",
        "state": "working"
    })

if __name__ == '__main__':
    app.run(host='0.0.0.0',port='5002')

እባክዎ ልብ ይበሉ! በምንም አይነት ሁኔታ ይህ አገልግሎት እንደ ምሳሌ ወይም መመሪያ መወሰድ የለበትም!

ጥሩ የድሮ JMeter በመጠቀም ሙከራዎች ይከናወናሉ. ከ15 ደቂቃ እስከ 2 ሰአታት የሚፈጅ ተከታታይ ሙከራዎች ተጀምረዋል፣ ያለምንም መቆራረጥ፣ የጥያቄዎች መቶኛ ልዩነት፣ እና አጠቃቀሙ በደቂቃ ከ300 እስከ 600 ጥያቄዎች ይለያያል። ከ 50 እስከ 500 የክርዎች ብዛት.

የመረጃ ቋቱ በጣም ትንሽ በመሆኑ ትዕዛዙ፡-

mysql -e "SHOW ENGINE INNODB STATUS"

የሚያሳየው፡-

Buffer pool hit rate 923 / 1000, young-making rate 29 / 1000 not 32 / 1000

ከታች ያሉት ለጥያቄዎች አማካኝ ምላሽ ሰአቶች ናቸው፡

ምልክት

አማካይ

ሚዲያን

90% መስመር

95% መስመር

99% መስመር

ዝቅተኛ

ከፍተኛ

ተቀጣሪ

37.64

12.57

62.28

128.5

497.57

5

4151.78

ጌትስቴት

17

7.57

30.14

58.71

193

3

2814.71

ጠጋኝ ሰራተኛ

161.42

83.29

308

492.57

1845.14

5

6639.4

ደመወዝ

167.21

86.93

315.34

501.07

1927.12

7

6722.44

ይህ ቪፒኤስ ለእርስዎ ልዩ ተግባራት ምን ያህል ተስማሚ እንደሆነ ከነዚህ ከተዋሃዱ ውጤቶች ለመገመት አስቸጋሪ ሊሆን ይችላል እና በአጠቃላይ የተዘረዘሩት ዘዴዎች በአንድ ወይም በሌላ መልኩ ልንፈጽማቸው በነበሩት ጉዳዮች ላይ ብቻ የተገደቡ ናቸው ። ስለዚህ ዝርዝራችን ነው። በግልጽ አያጠቃልልም. የእራስዎን መደምደሚያ እንዲሰጡ እና አገልጋዩን በእውነተኛ አፕሊኬሽኖችዎ እና ተግባሮችዎ ላይ ለ 30 ሩብልስ እንዲሞክሩ እንጋብዝዎታለን እና በአስተያየቶቹ ውስጥ ለዚህ ውቅር አማራጮችዎን ይጠቁማሉ።

ምንጭ: hab.com

አስተያየት ያክሉ