• Как определить, что клиент зашел на сайт через браузер iPhone?

    searching on the net there are two common ways of achieving this. My favorite though is in PHP its just so clean? wow. :D

    In PHP you can write

    <?php function isIphone($user_agent=NULL) { if(!isset($user_agent)) { $user_agent = isset($_SERVER[′HTTP_USER_AGENT′]) ? $_SERVER[′HTTP_USER_AGENT′] : ′′; } return (strpos($user_agent, ′iPhone′) !== FALSE); } if(isIphone()) { header(′Location: http://www.yourwebsite.com/phone′); exit(); } // ...THE REST OF YOUR CODE HERE ?>

    and in javascript you can write

    var agent = navigator.userAgent; var isIphone = ((agent.indexOf(′iPhone′) != -1) || (agent.indexOf(′iPod′) != -1)) ; if (isIphone) { window.location.href = ′http://www.yourwebsite.com/phone′; }



  • Unity3D: Вводная в синтаксис

    Представлен систаксис на Javascript

    Игровой объект


    Создание нового игрового объекта с именем MyObject.

    var myObject = new GameObject("MyObject");

    Созданный объект будет доступен по ссылку myObject.

    Поиск объекта по его имени.

    var myObject = GameObject.Find("MyObject");



    Теги можно использовать для помечания группы объектов со сходными свойствами, либо использующиеся в единой сцене.
    Поиск объекта по тегу, возвращает единственный объект:

    var myObject = GameObject.FindWithTag("MyTag");



    Возвращает список всех объектов с указанным тегом:

    var objectList = GameObject.FindGameObjectsWithTag("MyTag");



    Проверка на наличие у объекта требуемого тега. Возвращает true, если у указанного объекта имеется тег MyTag:

    var isCompare = GameObject.CompareTag("MyTag");



    Уничтожение объекта:

    Destroy(myObject);



    Уничтожение объекта через минуту, после его создания:

    Destroy(myObject, 60);



  • Клонирование объекта в Javascript

    Метод Object.assign() используется для копирования значений всех собственных перечисляемых свойств из одного или более исходных объектов в целевой объект. После копирования он возвращает целевой объект.

    Метод Object.assign() копирует из исходных объектов в целевой объект только перечисляемые и собственные свойства. Он использует внутренний метод [[Get]]на исходных объектах и внутренний метод [[Set]] на целевом объекте, так что он также вызывает геттеры и сеттеры. Именно поэтому он присваивает свойства вместо простого копирования или определения новых свойств. Это поведение может сделать метод непригодным для вливания новых свойств в прототип, если вливаемые исходные объекты содержат геттеры. Вместо него для копирования в прототипы определений свойств, включая признак их перечисляемости, следует использовать методы Object.getOwnPropertyDescriptor()и Object.defineProperty().

    Копируются свойства типов как String, так и Symbol.

    В случае возникновения ошибки, например, когда свойство является незаписываемым, возбуждается исключение TypeError, а целевой объект targetостаётся неизменным.

    Обратите внимание, что метод Object.assign() не выкидывает исключения, если в качестве исходных значений выступают null или undefined.


    Пример: клонирование объекта

    var obj = { a: 1 };
    var copy = Object.assign({}, obj);
    console.log(copy); // { a: 1 }

    Пример: слияние объектов

    var o1 = { a: 1 };
    var o2 = { b: 2 };
    var o3 = { c: 3 };
    var obj = Object.assign(o1, o2, o3);
    console.log(obj); // { a: 1, b: 2, c: 3 }
    console.log(o1); // { a: 1, b: 2, c: 3 }, изменился и сам целевой объект.

    Больше информации тут



  • Редизайн сайта

    Наконец-то у меня дошли руки и до своего собственного сайта. А то, как говорится, "сапожник без сапог". Смешно, конечно, но так оно и было. Переделал всю структуру, сделал сайт в форме блога. Портфолио вынес отдельным разделом, а новостная лента теперь - непосредственно блог.

    Удачной идеей мне показалось сделать привязку каждой записи к одной или нескольким подкатегориям, чтобы в дальнейшем можно было фильтровать результаты отображения записей по нужной теме, например, "Программирование".

    Добавил также систему комментариев к записям. Пока простенькую, но на этапе тестирования сойдет.

    Осталось сделать регистрацию и авторизацию, а также раздел "Всякоразности", в котором буду собирать информацию о промежуточных проектах, выполненных мною.



  • Фриланс для программистов: подборка лучших сайтов

    Взято с сайта https://proglib.io - https://proglib.io/p/freelance/

    Многие ищут фриланс для программистов, но далеко не все знают, где искать. Мы составили список ресурсов, которые вас заинтересуют.

    Разберемся, что представляет из себя фриланс для программистов, и как быстро освоиться на приведенных ниже сайтах.

    1. FL

    Говорят, что фрилансеры здесь варятся в собственном соку. И это отчасти правда, ведь те, кто успел запрыгнуть в ТОП с самого начала работы сайта, прочно там засели. У вас, естественно, не будет столько заказов, сколько у «избранных», что, тем не менее, не означает отсутствие работы у «простых смертных».

    Для фрилансеров существует множество категорий, так что каждый найдет свою специализацию. Другое дело, что FL с давних пор платный. Если изначально лишь некоторые заказчики делали заказы доступными для исполнителей с PRO-аккаунтами, то теперь, чтобы оставить комментарий под любым заказом, нужно этот самый аккаунт иметь. А это ни много ни мало почти 1700 руб./мес. И ведь не факт, что отобьются…

    Куда комфортнее себя чувствуют работодатели: можно брать PRO, а можно и не брать. Ответов по проекту в любом случае будет море. Да и дешевле обходятся вебмастерам все эти PRO-плюшки.

    Несправедливо, да. Но привыкайте: золотое правило фриланса – заказчик всегда прав.

    Остальное - под катом )



  • Правильная обработка касаний экрана при разработке мобильного приложения на Javascript

    Проблем с этим, на самом деле, много. А в интернете, что очень странно, информации довольно мало.

    Поясню ситуацию, чтобы было понятнее... Имеется 2 div-а. Один вложен в другой и больше родителя размерами. Внутренний div имеет свойство draggable (Jquery UI), чтобы можно было его "перетаскивать" внутри родительского div-а.

    Встала задача - получить координаты нажатия на внутренний div. Функция $( "#inner" ).click() с задачей справляется, но есть подводные камни, особенно для мобильных устройств:

    1. При касании экрана на долю секунды появляется синее выделение нажимаемого элемента. Довольно некрасиво.
    2. Время срабатывания события долгое. То есть, от касания до получения клик-слушателем данных проходит некоторое время. Это, может быть, не так критично для разработки простых приложений, но очень заметно при программировании игр или программ, требующих немедленной обработки нажатия, например, калькулятора.

    Как убрать синее выделение элемента при касании экрана?

    Для начала напишем следующие строчки в CSS-файл нашего приложения:

    {
      -webkit-tap-highlight-color: rgba(2552552550);
      -webkit-focus-ring-color: rgba(2552552550);
      outline: none;
      -moz-user-select: -moz-none;
      -o-user-select: none;
      -khtml-user-select: none;
      -webkit-user-select: none;
      user-select: none;
      -webkit-text-size-adjust: none;
    }

    В код программы добавляем:

    if (document.addEventListener) {
      document.addEventListener("touchstart"function () {
      }, true);

    }

    Если нажимаемые элементы - кнопки, добавляем для них такие стили:

    .some_button:focus.some_button:focus:active {
      background-color: rgba(0000);
    }

    Лично мне такое решение помогло.

    Долгое время отклика при касании экрана на мобильных устройствах

    К сожалению, перепробовав кучу JQuery-плагинов, я убедился в том, что адекватное время отклика дает только слушатель tap, который входит в комплект JQuery Mobile. Также является большим плюсом то, что он не мешает событию drag-а. Так как мне для моих приложений не нужны все встроенные функции JQM, я использую кнопку Custom Download, которая позволяет скачать только те компоненты, которые мне нужны. Сжатая версия библиотеки, включающей в себя только средства обработки touch-событий, "весит" всего 8 килобайт.

    Но теперь возникла другая проблема: получить точные координаты клика на вложенном элементе. Дело в том, что возвращаются координаты нажатия относительно позиции не нажатого элемента, а всего экрана. Почему так - непонятно. Для себя я эту проблему решил путем математического расчета:

    var screenWidth = $( document ).width(); // ширина экрана
    var screenHeight = $( document ).height(); // высота экрана
    var outerPosition = $( "#outer" ).offset(); // координаты родительского контейнера относительно координат экрана
    var innerPosition = $( "#inner" ).position(); // координаты вложенного контейнера относительно родителя
    var touchCoords = false; // координаты касания
    var realTouchCoords = false; // расчетные координаты касания относительно координат вложенного контейнера
    $( "#inner" ).on( "tap", function( e ) {
      e.preventDefault();
      e.stopPropagation();
      touchCoords = {
        x: e.pageX,
        y: e.pageY
      };
      var left, top;
      if ( innerPosition.left < 0 ) {
        left = Math.abs( innerPosition.left ) + ( touchCoords.x - outerPosition.left );
      } else if ( innerPosition.left > 0 ) {
        left = touchCoords.x - innerPosition.left - outerPosition.left;
      } else {
        left = touchCoords.x - outerPosition.left;
      }
      if ( innerPosition.top < 0 ) {
        top = Math.abs( innerPosition.top ) + ( touchCoords.y - outerPosition.top );
      } else if ( innerPosition.top > 0 ) {
        top = touchCoords.y - innerPosition.top - outerPosition.top;
      } else {
        top = touchCoords.y - outerPosition.top;
      }
      realTouchCoords = {
        x: left,
        y: top
      };
    } );

    Вот такие танцы с бубном... Зато проблема решена. Если кто-нибудь знает способ попроще, напишите мне, не сочтите за труд! Всем удачи и пока!



  • Полезные плагины для cordova

    Привожу краткое описание, ссылку и строку добавления плагина в консоли.


    Cordova Clipboard

    Clipboard management plugin for Cordova/PhoneGap that supports iOS, Android, and Windows Phone 8.

    Плагин, позволяющий работать с буфером обмена

    cordova plugin add https://github.com/VersoSolutions/CordovaClipboard

    cordova-plugin-admob

    AdMob Cordova Plugin, provides a way to request AdMob ads natively from JavaScript.

    Работа с баннерной системой AdMob

    cordova plugin add com.rjfun.cordova.plugin.admob

    cordova-plugin-iad

    Present Apple iAd in Mobile App/Games natively from JavaScript.

    Работа с баннерной системой IAd

    cordova plugin add https://github.com/floatinghotpot/cordova-plugin-iad.git

    cordova-plugin-splashscreen

    This plugin displays and hides a splash screen during application launch.

    Плагин показывает сплеш-скрин и прячет его после запуска приложения

    cordova plugin add org.apache.cordova.splashscreen

    cordova-plugin-apprate

    This plugin provide the rate this app functionality into your Cordova/Phonegap application

    Плагин позволяет пользователю поставить оценку приложению

    cordova plugins add https://github.com/pushandplay/cordova-plugin-apprate.git

    cordova-plugin-social-message

    Cordova Plugin to utilise native share features. Developed for Apache Cordova CLI >= 3.0.0. Share text, images and urls to Facebook, Twitter and more.

    Плагин позволяет пользователю поделиться каким-либо сообщением (включая текст, изображения и URL) с друзьями в социальных сетях.

    cordova plugin add https://github.com/leecrossley/cordova-plugin-social-message.git

    cordova-plugin-globalization

    This plugin obtains information and performs operations specific to the user`s locale, language, and timezone. Note the difference between locale and language: locale controls how numbers, dates, and times are displayed for a region, while language determines what language text appears as, independently of locale settings. Often developers use locale to set both settings, but there is no reason a user couldn`t set her language to "English" but locale to "French", so that text is displayed in English but dates, times, etc., are displayed as they are in France. Unfortunately, most mobile platforms currently do not make a distinction between these settings.

    Плагин предоставляет информацию о родном языке пользователя и часовой зоне. Это позволяет приложению без лишних вопросов настраиваться на нужную локализацию. Формат ответа плагина: "ru-RU", "en-US" и т.п.

    cordova plugin add org.apache.cordova.globalization

    cordova-plugin-statusbar

    Плагин позволяет скрыть панель статуса с индикатором батареи, часами и т.д. Полезно, ибо ее отключение в среде разработки и в конфигах порой ничего не дает.

    cordova plugin add org.apache.cordova.statusbar


    Это так, навскидку. Позже буду обновлять список.




  • Дизайн и программирование мобильного игрового приложения 4 Board Game для платформы iOS

    Наконец-то окончил работу над приложением для iOS.

    Приложение является неким аналогом "дорожных шахмат". Вам нравится возить с собой повсюду шахматную доску? Уверен, что нет. Но теперь эта проблема решена. В нашем приложении вы найдете все необходимое, чтобы поиграть с другом или коллегой в одну из четырех замечательных настольных игр:

    1. Уголки (Халма) - с расположением фигур в виде угла
    2. Уголки (Халма) - с расположением фигур в виде прямоугольника
    3. Шашки
    4. Шахматы

    Приложение может запоминать позицию ваших фигур, чтобы вы смогли продолжить партию в другой раз. 

    [Купить приложение на iTunes]



  • Мобильное приложение на Javascript. Проверка доступности игрового сервера с помощью AJAX

    У нас есть игровой сервер, на 80-м порту которого крутится socket.io. Возникла необходимость проверять перед запуском игры доступность этого сервера. Поскольку кросс-доменная политика браузеров вставляет палки в колеса, был проведен поиск путей ее обхода. Не буду приводить все свои попытки, приведу лишь ту, результат которой меня вполне устраивает.

    $( function() {

        var ServerCreate = function() {

            var __public = {};
            var __private = {};

            __private.timer = false;
            __private.serverstatus = false;
            __private.url = "http://server:port";

            __private.wait = function( callback ) {
                __private.timer = setTimeout( function() {
                    callback( __private.serverstatus );
                }, 5000 );
            }

            __public.check = function( callback ) {
                __private.wait( callback );
                $.ajax( {
                    type: "GET",
                    dataType: "jsonp",
                    url: __private.url,
                    error: function( data ) {
                    if ( data.statusText == "success" ) {
                        __private.serverstatus = true;
                        clearTimeout( __private.timer );
                        callback( __private.serverstatus );
                    }
                } );
            }

            return __public;

        }

        var Server = ServerCreate(); 

        Server.check( function( status ) {
            switch ( status ) {
                case true:
                    console.log( "Сервер доступен. " + status );
                break;
                case false:
                    console.log( "Сервер недоступен. " + status );
                break;
            }
        } );

    } );

    Надеюсь, что это кому-нибудь поможет.





Загрузка...

Войти на сайт

Регистрация