Android рдЪрд╛рд░реНрдЯрд┐рдВрдЧ: sl4a, python рдФрд░ flot

рд╢реБрдн рджрд┐рди,% рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╛рдо%!

рдкрд░рд┐рдЪрдп


рдЪрд╛рд░реНрдЯ рдЬрд╛рдирдХрд╛рд░реА рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рджреГрд╢реНрдп рддрд░реАрдХрд╛ рд╣реИред рдПрдХ рддрд╕реНрд╡реАрд░ рдПрдХ рд╣рдЬрд╛рд░ рд╢рдмреНрджреЛрдВ рдХреЗ рд▓рд╛рдпрдХ рд╣реИ, рдФрд░ рдХреБрдЫ рдорд╛рдорд▓реЛрдВ рдореЗрдВ рдПрдХ рдЧреНрд░рд╛рдл рдЕрдХреНрд╕рд░ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдПрдХ рдкреНрд░рдпреЛрдЧ, рднреМрддрд┐рдХ рдпрд╛ рдХрдореНрдкреНрдпреВрдЯреЗрд╢рдирд▓ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдЕрдВрдд рдореЗрдВ, рдореБрдЭреЗ рдЧреНрд░рд╛рдлрд┐рдХреНрд╕ рдкрд╕рдВрдж рд╣реИрдВред

рдПрдХ рдмрд╛рд░ рдореИрдВрдиреЗ рдЦреБрдж рдХреЛ рдРрд╕реА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд╛рдпрд╛ рдХрд┐ рд╕рд╛рдЬрд┐рд╢ рд░рдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдбреЗрдЯрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╣рд╛рде рдореЗрдВ рдХреЛрдИ рдХрдВрдкреНрдпреВрдЯрд░ рдирд╣реАрдВ рд╣реИред рд▓реЗрдХрд┐рди рдПрдХ рд╕реНрдорд╛рд░реНрдЯрдлреЛрди рдРрд╕реЗ рдХрд╛рд░реНрдп рд╕реЗ рд╕рд╛рдордирд╛ рдХрд░ рд╕рдХрддрд╛ рд╣реИ! рдЗрд╕рд▓рд┐рдП рдореИрдВ Google рд╕реЗ рдЖрдзреЗ-рдЕрдзреВрд░реЗ рдкрд╛рдЗрдерди рдХреЛрд░реНрд╕ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдЬреНрдЮрд╛рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдФрд░ sl4a рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЦреБрдж рдХреЛ рдордЬрдмреВрд░ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдерд╛, рдЬреЛ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЖрднрд╛рд╕реА рдзреВрд▓ рд╕реЗ рдврдВрдХрдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣рд╛ рдерд╛ред рддреЛ, рдХрд╛рдо рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ sl4a рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреА (рдЬрд┐рд╕рдиреЗ рдРрд╕рд╛ рд╕рдВрдХреНрд╖рд┐рдкреНрдд рдирд╛рдо рдирд╣реАрдВ рд╕реБрдирд╛ рд╣реИ, рдЗрд╕реЗ рдкрдврд╝реЗрдВ, рдпрд╣ рдФрд░ рдпрд╣ ) + рдкреНрд▓реЙрдЯ (js рдкрд░ рдкреНрд▓реЙрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рднреА рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЙрдкрдпреБрдХреНрдд рд╣реИ)ред

рдлрд░рд╕реАрд╕рд╛ рдЕрдХреНрд╖ рдХреЗ рд╕рд╛рде, рд╣рдо рдордирд╛рдпрд╛ рдЧрдпрд╛ рдорд╛рддреНрд░рд╛ рдХреА рд╕рдВрдЦреНрдпрд╛ рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗ, рд╕рд╛рде рд╣реА рд╕рд╛рде рд╕рдордиреНрд╡рдп рдЕрдХреНрд╖, рдЗрд╕рдХрд╛ рдореВрд▓реНрдпред рдорд╛рдиреЛрдВ рдХреА рдЧрдгрдирд╛ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рд╕реЗ рдХреА рдЬрд╛рддреА рд╣реИ: "рдорд╛рди = 0.1 0.2 0.15 0.12 ..." рдлреЙрд░реНрдо рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рд╡рд╛рд▓реЗ 30 рд▓реЙрдЧ рд╣реИрдВ, рдЬрд╣рд╛рдВ "0.1 0.2 ..." рдорд╛рди рд╣реИрдВ, "рдорд╛рди" рдорд╛рди рдХрд╛ рдирд╛рдо рд╣реИред рдорд╛рди "1" рд╕рдВрдмрдВрдзрд┐рдд рд▓реЙрдЧ рд▓рд╛рдЗрдиреЛрдВ (рдЙрджрд╛рд╣рд░рдг рд░реЗрдЦрд╛ рдореЗрдВ "0.1) рд╕реЗ рд╕рднреА рдкрд╣рд▓реЗ рдирдВрдмрд░реЛрдВ рдХрд╛ рдФрд╕рдд рд╣реИ," 2 "- рд╕рднреА рджреВрд╕рд░реЗ рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЖрджрд┐ред рдкрд░рд┐рдгрд╛рдо рдПрдо * рдПрди рдХрд╛ рдПрдХ рджреЛ-рдЖрдпрд╛рдореА рдореИрдЯреНрд░рд┐рдХреНрд╕ рд╣реИ, рдЬрд╣рд╛рдВ рдПрдо рд▓реЙрдЧ рдореЗрдВ рд▓рд╛рдЗрдиреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИ, рдПрди рд▓рд╛рдЗрди рдореЗрдВ рд╕рдВрдЦреНрдпрд╛рдУрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред рдпрд╣ рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдХрд┐ рд▓реЙрдЧ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛рдПрдБ рдФрд░ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛рдПрдБ рд╣реЛрддреА рд╣реИрдВред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдкреНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдл рдкреНрд░рджрд░реНрд╢рди

рдкреНрд▓реЙрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП jquery рдХреЗ рд▓рд┐рдП рдкреНрд▓реЙрдЯ рдкреНрд▓рдЧрдЗрди рдЬрд┐рдореНрдореЗрджрд╛рд░ рд╣реИред рдбреЗрд╡рд▓рдкрд░реНрд╕ рд╕рд╛рдЗрдЯ рд╕реЗ рдкреВрд░реНрдг рд╕реЗрдЯ рд╕реЗ, рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП, рдХреЗрд╡рд▓ jquery.flot.js рдФрд░ jquery.js рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрдЧреАред Log_manager.html рдХреЛрдб рд╕реНрд╡рдпрдВ:

<html> <head> <title>Plot</title> <link href="layout.css" rel="stylesheet" type="text/css"> <script src="jquery.js"></script> <script src="jquery.flot.js"></script> </head> <body> <div id="placeholder" style="width:535px;height:270px;"></div> <script> var plotData = function(d) {$.plot($("#placeholder"), [ {label: "flux", data: eval(d.data), color: "rgb(255, 100, 100)" }] );}; var droid = new Android(); droid.registerCallback("plotData", plotData); </script> </body> </html> 


рдкрдВрдХреНрддрд┐ 13 - рдкреНрд▓реЙрдЯ рдХреЗ рд╕рд╛рде рд╕рд╛рдЬрд┐рд╢ рдХрд░рдирд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ

 $.plot($("#placeholder"), [ {label: "flux", data: [[0,0],[1,1],[2,4],[3,9],[4,16]], color: "rgb(255, 100, 100)" }] ); 


рдФрд░ рдЧреНрд░рд╛рдл рдкрд░ рдкреИрд░рд╛рдмреЛрд▓рд╛ рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдореЗрдВ рдлреЙрд░реНрдо [[x0, y0], [X1, y1], [x2, y2], [x3, y3], ...] рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред рдореЗрд░реЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рдЖрд╕рд╛рди рддрд░реАрдХрд╛ рдерд╛ рдХрд┐ рдЙрдиреНрд╣реЗрдВ рдмрд┐рд▓реНрдХреБрд▓ рдЙрд╕реА рддрд░рд╣ рдХреА рдПрдХ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдореЗрдВ рдПрдХ рдЕрдЬрдЧрд░ рд▓рд┐рдкрд┐ рдореЗрдВ рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдП рдФрд░ рдЗрд╕реЗ eval () рдореЗрдВ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рдкреЗрдЯ рджрд┐рдпрд╛ рдЬрд╛рдП, рдЬреЛ рдкрд╛рд░рд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░реЗрдЧрд╛ рдЬреИрд╕реЗ рдХрд┐ рдпрд╣ рдХреЛрдб рдХрд╛ рдПрдХ рдЯреБрдХрдбрд╝рд╛ рдерд╛ред рдЕрдЧрд▓рд╛, рдореИрдВ рдЗрд╕ рд╡рд┐рд╢реЗрд╖ рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред

рдореМрдЬреВрджрд╛ рдХреЛ рд╕рдВрд╢реЛрдзрд┐рдд рдХрд░рдирд╛ рдФрд░ рдПрдХ рдЧреНрд░рд╛рдл рдкрд░ рдШрдЯрддрд╛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдирдП рдЧреБрдгреЛрдВ рдХреЛ рдЬреЛрдбрд╝рдирд╛ рд╕рд░рд▓ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╡рдХреНрд░ рдХреЗ рдиреАрдЪреЗ рдЫрд╛рдпрд╛ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдмрд╕ "рд╢реИрдбреЛрд╕рд╛рдЗрдЬрд╝: 0" рдЬреЛрдбрд╝реЗрдВ:

 $.plot($("#placeholder"), [ {label: "flux", data: [[0,0],[1,1],[2,4],[3,9],[4,16]], shadowSize: 0, color: "rgb(255, 100, 100)" }] ); 


рдПрдХ рд╣реА рдЧреНрд░рд╛рдл рдкрд░ рджреЛ рдШрдЯрддрд╛:

 $.plot($("#placeholder"), [ {label: "flux", data: [[0,0],[1,1],[2,4],[3,9],[4,16],[5,25]], shadowSize: 0, color: "rgb(255, 100, 100)" }, {label: "flux", data: [[0,0],[5,25]], shadowSize: 0, color: "rgb(255, 100, 100)" }] ); 


рд▓рд╛рдЗрди 14 рдПрдВрдбреНрд░реЙрдЗрдб рдПрдкреАрдЖрдИ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдмрдирд╛рддрд╛ рд╣реИ (рдЗрд╕реЗ рдПрдВрдбреНрд░реЙрдЗрдб () sl4a рдореЗрдВ рдирд┐рд░реНрдорд┐рдд рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛ рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред

рдкрдВрдХреНрддрд┐ 15 рдмрддрд╛рддреА рд╣реИ рдХрд┐ "рдкреНрд▓реЙрдЯрдбреИрдЯрд╛" рдирд╛рдо рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рдкреНрдд рдШрдЯрдирд╛ рдХреЛ рдХреИрд╕реЗ рд╕рдВрднрд╛рд▓рдирд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдЗрд╕ рдирд╛рдо рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддреА рд╣реИ, "рдкреНрд▓реЙрдЯрдбреИрдЯрд╛" рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рд╛рде рдкреНрд░рд╕рд╛рд░рд┐рдд рдбреЗрдЯрд╛ (рд╕рд░рдгреА-рд╕реНрдЯреНрд░рд┐рдВрдЧ) <function input_variable_name> .data рдореЗрдВ рд╣реЛрдЧрд╛ред

рдпрд╣ рдХреЗрд╡рд▓ рдПрдХ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдЬреЛ рдлрд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝реЗрдЧрд╛, рдПрдХ рд▓рд╛рдЗрди рддреИрдпрд╛рд░ рдХрд░реЗрдЧрд╛ рдФрд░ рдЗрд╕реЗ рднреЗрдЬреЗрдЧрд╛ред рдпрд╣ рдЕрдЧрд▓рд╛ рднрд╛рдЧ рд╣реИред

рдкрд╛рдпрдерди рдбреЗрдЯрд╛ рддреИрдпрд╛рд░реА

рдХреЛрдб log_manager.py:

 #!/usr/python ## Import libraries # android for access to Android API # time for sleep(sec) import android, time # Filename is "<FileCounter>-of-<NumberOfFiles>.log" filename = "/sdcard/864x864x30-0-of-30.log" # Get number of files N = int(filename.split("/")[-1].split("-")[-1].split(".")[0]) # Read first file file = open(filename,"r") value = [] for line in file.readlines(): if "value =" in line: value.append([]) for val in line.split(" "): try: value[-1].append(float(val)) except: continue # Read other files for f in range(1, N): file = open(filename.replace("-0-","-"+str(f)+"-")) i = 0 for line in file.readlines(): if "value =" in line: j = 0 for val in line.split(" "): try: value[i][j] += float(val) j += 1 except: continue i += 1 # Prepare string for flot toBePlotted = "[" for i in range(0, len(value[-1])): toBePlotted += "[" + str(i) + "," + str(value[-1][i]) + "]," toBePlotted += "]" # Get droid object to use Android API droid = android.Android() # Set web view droid.webViewShow('file:///sdcard/sl4a/scripts/log_manager.html') # Wait 3 seconds while web view starts time.sleep(3) # Post event 'plotData' to web view droid.eventPost('plotData', toBePlotted) 


рдпрд╣ рдХреЛрдб рдЦрд░рд╛рдм рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рд▓рд┐рдЦрдирд╛ рдирд╣реАрдВ рдЪрд╛рд╣рд┐рдПред рд▓реЗрдХрд┐рди рд╡рд╣ рдЕрдкрдиреЗ рдХрд╛рд░реНрдп рдХреЛ рдкреВрд░рд╛ рдХрд░рддрд╛ рд╣реИ: рдЙрд╕реЗ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рдВрдмрдВрдзрд┐рдд рд▓реЙрдЧ рдФрд╕рдд рд╣реЛрддрд╛ рд╣реИред

рд▓рд╛рдЗрдиреНрд╕ 1-43 рд▓рд╛рдЗрдиреЛрдВ рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдЯреВ-рдбрд╛рдпрдореЗрдВрд╢рдирд▓ рдПрд░реЗ рдСрдл рд╡реИрд▓реНрдпреВ рдореЗрдВ рдкрдврд╝рддрд╛ рд╣реИред 44-48 рдореЗрдВ, рд░реЗрдЦрд╛ рдХреЛ рдкреНрд▓реЙрдЯ рдореЗрдВ рдкреНрд▓реЙрдЯрд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рддреИрдпрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред 50-60 рдореЗрдВ, рдПрдХ webView рдкреЗрдЬ log_manager.html (54) рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ, рд╣рдо 3 рд╕реЗрдХрдВрдб рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВ, рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреГрд╖реНрда рдХреЗ рд▓реЛрдб рд╣реЛрдиреЗ рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ (рдПрдХ рдмреБрд░рд╛ рддрд░реАрдХрд╛!) (57), рдФрд░ рдкреНрд▓реЙрдЯрд┐рдВрдЧ (60) рдХреЗ рд▓рд┐рдП рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдПрдХ рдШрдЯрдирд╛ рднреЗрдЬрддрд╛ рд╣реИред

рдкрд░рд┐рдгрд╛рдо


рд▓рд┐рдЦрд┐рдд рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ / sdcard / sl4a / рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ log_manager.py, log_manager.html, jquery.flot.js рдФрд░ jquery.js рдбрд╛рд▓рдирд╛ рд╣реЛрдЧрд╛ред "864x864x30-0-of-30.log" ... "864x864x30-29-рдСрдл-30.log" рдирд╛рдо рдХреА рдлрд╛рдЗрд▓реЗрдВ рдореЗрдореЛрд░реА рдХрд╛рд░реНрдб рдХреА рдЬрдбрд╝ рдореЗрдВ рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдПред рдкреНрд░рддреНрдпреЗрдХ рд▓реЙрдЧ рдореЗрдВ рдлреЙрд░реНрдо рдХреА рдкрдВрдХреНрддрд┐рдпреЛрдВ рдХреА рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛ "рдорд╛рди = 0.2 0.34 0.343 ..." рд╣реЛрдиреА рдЪрд╛рд╣рд┐рдП рдЬрд┐рд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рд╕рдорд╛рди рд╕рдВрдЦреНрдпрд╛рдПрдВ рд╣реЛрдВред рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЙрдЧреНрд╕ рдХреА рдЕрдВрддрд┐рдо рд▓рд╛рдЗрдиреЛрдВ рдФрд░ рдлреЙрд░реНрдо рдХреЗ рдФрд╕рдд рдорд╛рдиреЛрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рдПрдХ рдЧреНрд░рд╛рдл рдмрдирд╛рдПрдЧреА:



рд▓реЗрдЦ рдореЗрдВ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдлрд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдкреБрд░рд╛рд▓реЗрдЦ ред рдЖрд░реНрдХрд╛рдЗрд╡ рдореЗрдВ рдлреНрд▓реЛрдЯ рд╕рд╛рдЗрдЯ рд╕реЗ рдХрд┐рдЯ рд╕реЗ jquery.js рдФрд░ jquery.flot.js рднреА рд╣реИрдВред

Source: https://habr.com/ru/post/In139417/


All Articles