Π’Ρ…ΠΎΠ΄ Π‘Π»ΠΎΠ³
Π‘Ρ‚Ρ€ΠΎΠΈΡ‚Π΅Π»ΡŒΡΡ‚Π²ΠΎ ΠΈ Ρ€Π΅ΠΌΠΎΠ½Ρ‚
Π Π΅ΠΏΠ΅Ρ‚ΠΈΡ‚ΠΎΡ€Ρ‹
ΠšΡ€Π°ΡΠΎΡ‚Π°
ЀрилансСры
Π Π°Π·Π½Ρ‹Π΅ спСциалисты
Π’Ρ€Π΅Π½Π΅Ρ€Ρ‹
Π£Ρ…ΠΎΠ΄ Π·Π° ΠΆΠΈΠ²ΠΎΡ‚Π½Ρ‹ΠΌΠΈ
Автоинструкторы

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Java β€” удалённая Ρ€Π°Π±ΠΎΡ‚Π° Π² МосквС

Π”Π°Ρ‚Π°: 2025-02-12
Π”Π΅Ρ‚Π°Π»ΠΈ
Π Π΅Π³ΠΈΠΎΠ½
Москва
Π—Π°Π½ΡΡ‚ΠΎΡΡ‚ΡŒ
дистанционно
Π‘Ρ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ
договорная
Π”Π°Ρ‚Π° ΠΏΡƒΠ±Π»ΠΈΠΊΠ°Ρ†ΠΈΠΈ
2025-02-12
ОписаниС
НСобходимо внСсти нСбольшиС измСнСния Π² ΠΊΠΎΠ΄. НСобходимо ΠΈΠ·ΠΌΠ΅Π½ΠΈΡ‚ΡŒ ΠΈΠ»ΠΈ Π½Π° ΠΎΠ±ΠΎΡ€ΠΎΡ‚ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΏΠ΅Ρ€Ρ‹ΠΉ этап Π²Ρ…ΠΎΠ΄Π° Аппка Π½Π΅ запускаСтся ΠΏΠΎΠΊΠ° Π½Π΅ Π²Ρ‹Π±Π΅Ρ€Π΅ΡˆΡŒ ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ Π½Π° Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½Π΅, послС Ρ‡Π΅Π³ΠΎ загруТаСтся Π°ΠΏΠΏΠΊΠ° ΠΈ ΡƒΠΆΠ΅ Ρ‚Π΅Π»Π΅Ρ„ΠΎΠ½ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ доступ ΠΊ ΠΊΠ°ΠΌΠ΅Ρ€Π΅. НуТно: - Π»ΠΈΠ±ΠΎ ΡƒΠ±Ρ€Π°Ρ‚ΡŒ этап Π²Ρ‹Π±ΠΎΡ€Π° ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ ΠΈ Π½Π°Π·Π½Π°Ρ‡Π°Ρ‚ΡŒ заднюю ΠΊΠ°ΠΌΠ΅Ρ€Ρƒ ΠΏΠΎ Π΄Π΅Ρ„ΠΎΠ»Ρ‚Ρƒ (соотвСтсвСнно Ρ‡Ρ‚ΠΎΠ± страница Π·Π°ΠΏΡƒΡΠΊΠ°Π»Π°ΡΡŒ с loader bar ΠΈ запрос Π½Π° доступ ΠΊ ΠΊΠ°ΠΌΠ΅Ρ€Π΅, послС Ρ‡Π΅Π³ΠΎ инициализация ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹) - Π»ΠΈΠ±ΠΎ ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ Π²Ρ‹Π±ΠΎΡ€ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠ² user ΠΈ environment Π² соотвСтствии с Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ сСйчас стоит ΠΌΠ΅Ρ‚ΠΎΠ΄ environment ΠΈ ΠΏΡ€ΠΈ Π²Ρ‹Π±ΠΎΡ€Π΅ ΠΊΠ°ΠΌΠ΅Ρ€Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄Π½Π΅Π³ΠΎ Π²ΠΈΠ΄Π°, Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ всС Ρ€Π°Π²Π½ΠΎ задняя var initialize = async() =>{ var unityCanvas = document.querySelector(“#unity-canvas“); var videoCanvas = document.querySelector(“#video-canvas“); window.arCamera = new ARCamera(unityCanvas, videoCanvas); window.iTracker = new ImageTracker(arCamera); try{ await window.iTracker.initialize(); console.log(“ImageTracker initialized!“); } catch{ console.error(“Failed to initialize ImageTracker. Are you missing opencv.js? “ + error); ShowError(“Failed to initialize the experience.“); return; } await LoadWebcams(); document.getElementById(“startARButton“).style.display = “block“; } initialize(); var container = document.querySelector(“#unity-container“); var canvas = document.querySelector(“#unity-canvas“); var loadingBar = document.querySelector(“#unity-loading-bar“); var progressBarFull = document.querySelector(“#unity-progress-bar-full“); function StartAR() { canvas.style.width = window.innerWidth + “px“; canvas.style.height = window.innerHeight + “px“; document.getElementById(“startARDiv“).style.display = “none“; createUnityInstance(document.querySelector(“#unity-canvas“), { dataUrl: “Build/AR Arts.data“, frameworkUrl: “Build/AR Arts.framework.js“, codeUrl: “Build/AR Arts.wasm“, streamingAssetsUrl: “StreamingAssets“, companyName: “DefaultCompany“, productName: “AR Web“, productVersion: “0.1“, //webglContextAttributes: { “preserveDrawingBuffer“: true }, // matchWebGLToCanvasSize: false, // Uncomment this to separately control WebGL canvas render size and DOM element size. // devicePixelRatio: 1, // Uncomment this to override low DPI rendering on high DPI displays. }, (progress) => { progressBarFull.style.width = 100 * progress + “%“; } ).then((unityInstance) => { window.unityInstance = unityInstance; RequestWebcam(); loadingBar.style.display = “none“; }); loadingBar.style.display = “block“; } //Set Facing Mode here ('environment', 'user', '') window.unityFacingMode = “environment“ window.WEBCAM_SETTINGS = { video: { facingMode: unityFacingMode, }, audio: false }; window.requestingForPermissions = false; async function RequestWebcam(){ window.requestingForPermissions = true; try{ window.webcamStream = await navigator.mediaDevices.getUserMedia(window.WEBCAM_SETTINGS); console.log(“Webcam access granted“); requestingForPermissions = false; } catch (err) { //user denied camera permission - show error panel console.error(“getUserMedia error - “ , err); ShowError(“Failed to start the experience. Camera permission was denied“); window.requestingForPermissions = false; } } async function StartWebcam(){ console.log(“StartWebcam“) while (window.requestingForPermissions) { // Wait until requestingForPermissions becomes true. console.log(“Waiting for permissions...“); await new Promise(resolve => setTimeout(resolve, 100)); // Adjust the delay time as needed. } console.log(“Got Permissions“); if(window.webcamStream) { const video = document.querySelector(“#webcam-video“); video.srcObject = webcamStream; try { await arCamera.startWebcam(video); console.log(“Webcam started successfully“); window.unityInstance.SendMessage('ARCamera', 'OnStartWebcamSuccess'); } catch(err){ console.error(“Webcam failed to start - “, err); window.unityInstance.SendMessage('ARCamera', 'OnStartWebcamFail'); } } else{ console.error(“Webcam failed to start - permission not yet granted“); window.unityInstance.SendMessage('ARCamera', 'OnStartWebcamFail'); } } async function LoadWebcams(){ let camDevices = []; // let backCams = []; let devices = await navigator.mediaDevices.enumerateDevices(); var ctr = 0; devices.forEach(mediaDevice => { if (mediaDevice.kind === 'videoinput') { if(window.unityFacingMode == 'environment' && !mediaDevice.label.includes('facing front')){ //back cam only camDevices.push(mediaDevice); } else if(window.unityFacingMode == 'user' && mediaDevice.label.includes('facing front')){ //front cam only camDevices.push(mediaDevice); } else{ //back and front camDevices.push(mediaDevice); } ctr++; } }); var select = document.getElementById(“chooseCamSel“); select.style.display = “block“; var count = 0; //reverse array because some Android phones can't distinguish front and back cams at first load //and when this happens, most of the time, front cam goes first and back cam goes last camDevices = camDevices.reverse(); camDevices.forEach(mediaDevice => { const option = document.createElement('option'); option.value = mediaDevice.deviceId; let label = `Camera ${count}`; if (mediaDevice.label) { label = mediaDevice.label } const textNode = document.createTextNode(label); option.appendChild(textNode); select.appendChild(option); count++; }); iTracker.WEBCAM_NAME = select.options[select.selectedIndex].innerHTML; } function SelectCam(){ var select = document.getElementById(“chooseCamSel“); window.deviceId = select.value; window.WEBCAM_SETTINGS.video['deviceId'] = deviceId; //console.log(window.WEBCAM_SETTINGS); iTracker.WEBCAM_NAME = select.options[select.selectedIndex].innerHTML; } async function FlipCam(){ arCamera.stopWebcam(); window.WEBCAM_SETTINGS.video.deviceId = ''; if(window.WEBCAM_SETTINGS.video.facingMode == 'user'){ window.WEBCAM_SETTINGS.video.facingMode = 'environment'; arCamera.setFlipped(false); } else{ window.WEBCAM_SETTINGS.video.facingMode = 'user'; arCamera.setFlipped(true); } window.webcamStream = await navigator.mediaDevices.getUserMedia(window.WEBCAM_SETTINGS); const video = document.querySelector(“#webcam-video“); video.srcObject = webcamStream; await arCamera.startWebcam(video); } function ShowError(error){ document.getElementById(“errorDiv“).style.display = “flex“; document.getElementById(“errorText“).innerHTML = error; } function ShowScreenshot(dataUrl){ document.getElementById(“screenshotDiv“).style.display = “flex“; document.getElementById(“screenshotImg“).src = dataUrl; document.getElementById(“screenshotImg“).style.width = “80vw“; document.getElementById(“screenshotImg“).style.height = 80 / window.innerWidth * window.innerHeight + “vw“; } function ShowConfirmUrl(url){ document.getElementById(“confirmUrlDiv“).style.display = “flex“; window.newUrlString = url; document.getElementById(“confirmUrlText“).innerText = “Are you sure you want to visit “ + url; } window.ITRACKER_GLOBALS = { //place global settings here INTERNAL_SMOOTHFACTOR_POS: .075, }.
ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ Π·Π°ΠΊΠ°Π·Ρ‹

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Java

дистанционно
договорная
НуТСн ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½Π° сСсию ΠΏΠΎ java.ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ называСтся унивСрситСтский Π±Π»ΠΎΠ³.БСгодня ΡƒΠΆΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π³ΠΎΡ‚ΠΎΠ².
Москва ЀрилансСры

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Java

дистанционно
договорная
ПоТСлания ΠΈ особСнности: ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π½ΡƒΠΆΠ½Π° для сСссии.НазываниС ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° унивСрситСтский Π±Π»ΠΎΠ³.
Москва ЀрилансСры

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Java

дистанционно
договорная
ПоТСлания ΠΈ особСнности: НуТно ΡΠΎΠ·Π΄Π°Ρ‚ΡŒ Π»Π°ΡƒΠ½Ρ‡Π΅Ρ€ с ΠΌΠΎΠ΄Π°ΠΌΠΈ, сСрвСр, ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ систСму ΠΎΠΏΠ»Π°Ρ‚Ρ‹. НС знаю сколько это стоит.
Π’ΠΎΠ»Π³ΠΎΠ³Ρ€Π°Π΄ ЀрилансСры

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Java

дистанционно
договорная
Fabric / Minecraft Mod Developer (Java) β€” ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎ Π˜Ρ‰Π΅ΠΌ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° Π² Π΄Π΅ΠΉΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ β€” кастомный Minecraft-сСрвСр Π½Π° Fabric (RPG / срСднСвСковая концСпция). ΠŸΡ€ΠΎΠ΅ΠΊΡ‚ находится Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ эксплуатации, Π΅ΡΡ‚ΡŒ ΡΡ‚Π°Π±ΠΈΠ»ΡŒΠ½ΠΎΠ΅ ΠΊΠΎΠΌΡŒΡŽΠ½ΠΈΡ‚ΠΈ ΠΈ рСгулярныС обновлСния. Π Π°Π±ΠΎΡ‚Π°Π΅ΠΌ ΠΊΠ°ΠΊ нСбольшая распрСдСлённая ΠΊΠΎΠΌΠ°Π½Π΄Π° (Россия / НидСрланды), выстраиваСм ΡƒΡΡ‚ΠΎΠΉΡ‡ΠΈΠ²ΡƒΡŽ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ ΠΈ процСссы. Π—Π°Π΄Π°Ρ‡ΠΈ: * Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΈ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠ° ΠΌΠΎΠ΄ΠΎΠ² Π½Π° Fabric (Java) * Ρ€Π°Π±ΠΎΡ‚Π° с ΠΈΠ³Ρ€ΠΎΠ²ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΎΠΉ (экономика, прогрСссия, ΠΌΠ΅Ρ…Π°Π½ΠΈΠΊΠΈ) * исправлСниС Π±Π°Π³ΠΎΠ² ΠΈ стабилизация сСрвСра * Ρ€Π°Π·Π±ΠΎΡ€ ΠΈ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΠ΅ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π³ΠΎ ΠΊΠΎΠ΄Π° * участиС Π² Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠΈ Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Ρ‹ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° ВрСбования: * ΡƒΠ²Π΅Ρ€Π΅Π½Π½ΠΎΠ΅ Π·Π½Π°Π½ΠΈΠ΅ Java * ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Minecraft (Fabric / ΠΌΠΎΠ΄Ρ‹ ΠΈΠ»ΠΈ Π±Π»ΠΈΠ·ΠΊΠΈΠΉ ΠΎΠΏΡ‹Ρ‚) * ΡƒΠΌΠ΅Π½ΠΈΠ΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ Π² Ρ‡ΡƒΠΆΠΎΠΌ ΠΊΠΎΠ΄Π΅ * ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ ΠΊΠ»ΠΈΠ΅Π½Ρ‚-сСрвСрной Π»ΠΎΠ³ΠΈΠΊΠΈ * ΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²Π΅Π½Π½ΠΎΡΡ‚ΡŒ ΠΈ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½Π°Ρ коммуникация Π‘ΡƒΠ΄Π΅Ρ‚ плюсом: * ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Fabric API / mixins * ΠΎΠΏΡ‹Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ собствСнных ΠΌΠΎΠ΄ΠΎΠ² * ΠΏΠΎΠ½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π³Π΅ΠΉΠΌΠ΄ΠΈΠ·Π°ΠΉΠ½Π° ΠΈ ΠΈΠ³Ρ€ΠΎΠ²Ρ‹Ρ… систСм * Ρ€Π°Π±ΠΎΡ‚Π° с Π±Π°Π·Π°ΠΌΠΈ Π΄Π°Π½Π½Ρ‹Ρ… Π€ΠΎΡ€ΠΌΠ°Ρ‚ Ρ€Π°Π±ΠΎΡ‚Ρ‹: * ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ ΡƒΠ΄Π°Π»Ρ‘Π½Π½ΠΎ, ΠΌΠΎΠΆΠ½ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ ΠΈΠ· любой страны * распрСдСлённая ΠΊΠΎΠΌΠ°Π½Π΄Π° * Π³ΠΈΠ±ΠΊΠΈΠΉ Π³Ρ€Π°Ρ„ΠΈΠΊ, ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ * асинхронная коммуникация Условия: * ΠΎΠΏΠ»Π°Ρ‚Π° обсуТдаСтся (фикс + бонусы) * участиС Π² Ρ€Π°Π·Π²ΠΈΡ‚ΠΈΠΈ ΠΏΡ€ΠΎΠ΄ΡƒΠΊΡ‚Π°, Π° Π½Π΅ β€œΡ нуля” * мСнторство ΠΎΡ‚ Ρ‚ΠΈΠΌΠ»ΠΈΠ΄Π° (Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°, ΠΊΠΎΠ΄-Ρ€Π΅Π²ΡŒΡŽ) * Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Π²Π»ΠΈΡΡ‚ΡŒ Π½Π° тСхничСскиС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Π’Π°ΠΆΠ½ΠΎ: * вся Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° вСдётся Ρ‡Π΅Ρ€Π΅Π· ΠΎΠ±Ρ‰ΠΈΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ (Git) * ΠΊΠΎΠ΄ ΠΈ Π΄ΠΎΡ€Π°Π±ΠΎΡ‚ΠΊΠΈ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ * знания Ρ„ΠΈΠΊΡΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ * Ρ€Π°Π±ΠΎΡ‚Π° Π½Π° долгосрочной основС ΠžΡ‚ΠΊΠ»ΠΈΠΊ: ΠΠ°ΠΏΠΈΡˆΠΈΡ‚Π΅ ΠΊΡ€Π°Ρ‚ΠΊΠΎ: 1. ΠΎΠΏΡ‹Ρ‚ с Minecraft / Java 2. ΠΊΠ°ΠΊΠΈΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρ‹ Π΄Π΅Π»Π°Π»ΠΈ 3. Π΅ΡΡ‚ΡŒ Π»ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Ρ‹ ΠΊΠΎΠ΄Π° ΠΈΠ»ΠΈ GitHub.
Москва ЀрилансСры

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Java

дистанционно
договорная
ПоТСлания ΠΈ особСнности: Π‘Π΄Π΅Π»Π°Ρ‚ΡŒ Π»ΠΈΡ‡Π½Ρ‹ΠΉ ΠΊΠ°Π±ΠΈΠ½Π΅Ρ‚ Ρ‡Ρ‚ΠΎΠ± ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρ‹ Ρ‡Π΅Ρ€Π΅Π· свой Π»ΠΈΡ‡Π½Ρ‹ΠΉ Π°ΠΊΠΊΠ°ΡƒΠ½Ρ‚ ΠΌΠΎΠ³Π»ΠΈ сами Ρ€ΠΈΡΠΎΠ²Π°Ρ‚ΡŒ счСта ΠΈ Π±Ρ‹Π» Π²ΠΈΠ΄Π΅Π½ ΠΈΡ… баланс , соотвСтствСнно Ρ‡Ρ‚ΠΎΠ± Π±Π°Π½ΠΊ с 1с ΠΈ сайтом ΠΈΠ½Ρ‚Π΅Π³Ρ€ΠΈΡ€ΠΎΠ²Π°Π»ΠΈ.
Π•ΠΊΠ°Ρ‚Π΅Ρ€ΠΈΠ½Π±ΡƒΡ€Π³ ЀрилансСры

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Java

дистанционно
договорная
НуТна ΠΏΠΎΠΌΠΎΡ‰ΡŒ с объяснСниСм ΠΏΡ€ΠΈΠ½Ρ†ΠΈΠΏΠ° Ρ€Π°Π±ΠΎΡ‚Ρ‹ Π½Π° Java, Π° Ρ‚Π°ΠΊΠΆΠ΅ ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π΅ΡˆΠ°Ρ‚ΡŒ Π·Π°Π΄Π°Ρ‡ΠΈ Π² институтС (1 курс).
Москва ЀрилансСры

Π Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ° Π½Π° Java

дистанционно
договорная
НуТно ΠΏΠΎΠΌΠΎΡ‡ΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ практичСскоС Π·Π°Π΄Π°Π½ΠΈΠ΅ с ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π½Π° java.
Москва ЀрилансСры