• Алгоритм обращения программы к API VKontakte

    Часто бывает мы хотим автоматизировать то или иное действие. Порой спешка или просто лень не дает нам возможности ознакомиться со всей документацией(по API VK).
    Разработать программу для работы с API ВКонтакте проще чем кажется. Подойдет любой язык, умеющий отправлять http get запросы (соответственно получать ответ). Например: Delphi, shell, C, Perl, PHP, Python и т. п.
    image
    Читать дальше →
  • Поддержка OAuth 2.0 платформой ВКонтакте

      Вчера во ВКонтакте появилась поддержка открытого стандарта авторизации OAuth 2.0. Теперь интегрировать сайты и клиентские приложения с социальной сетью стало значительно проще.

      Читать дальше →
    • Кастомные социальные кнопки

      Недавно участвовал в разработке одного проекта — фото конкурса. По задумке, рейтинг фото альбомов должен формироваться из суммы всех публикаций в социальных сетях: Facebook, Вконтакте, Twitter. Т.е. общий рейтинг фотоальбома расчитывается:
      Рейтинг фотоальбома = кол-во «Share» в Facebook + кол-во «Сохранить» в Вконтакте + кол-во «Retweet» в Twitter

      На макетах, вид кнопок несколько отличался от предоставляемых социальными сетями плагинов, формируемых функциями api. В частности вид счетчиков:
      image
      Помимо несоответствий с дизайном, каждый плагин формирует излишний хтмл код, а хотелось бы лаконичный.

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

      Итак:
      • количество лайков будем получать от REST сервисов каждой социалки
      • кнопки рисуем свои и обрабатываем событие click

      Читать дальше →
    • Очень быстрый и эффективный способ расслабления глаз

        Предисловие


        imageНе знаю, все ли программисты всесторонне любознательные люди, но я всегда пытаюсь получить фундаментальные знания во всех областях, которые могут быть практически полезны. В то время, когда мне в голову пришла эта идея я изучал анатомию и физиологию по журналам «Тело человека. Снаружи и внутри», ну а по работе я занимался стерео-варио фотографиями (для тех кто не знает — были такие советские календарики с ребристой поверхностью, где картинка либо казалась объемной, либо менялась). Так вот, в один из вечеров мне пришла в голову замечательная идея, которую я на протяжении уже 4х лет использую для поддержания своего зрения.
        Обещаю, что эффект почувствуете сразу!
        Читать дальше →
      • Классы в lua, или избавляемся от двоеточия

          Как всем известно, в lua нет как таковых классов и объектов. Однако есть метатаблицы и синтаксический сахар.
          С помощью указанных механизмов достаточно просто реализовать подобие классов.
          В итоге и получается нечто такое:
          Самый простой класс
          local MyClass = {} -- the table representing the class, which will double as the metatable for the instances
          MyClass.__index = MyClass -- failed table lookups on the instances should fallback to the class table, to get methods
          
          -- syntax equivalent to "MyClass.new = function..."
          function MyClass.new(init)
            local self = setmetatable({}, MyClass)
            self.value = init
            return self
          end
          
          function MyClass.set_value(self, newval)
            self.value = newval
          end
          
          function MyClass.get_value(self)
            return self.value
          end
          
          local i = MyClass.new(5)
          -- tbl:name(arg) is a shortcut for tbl.name(tbl, arg), except tbl is evaluated only once
          print(i:get_value()) --> 5
          i:set_value(6)
          print(i:get_value()) --> 6
          

          (взято с lua-users.org/wiki/ObjectOrientationTutorial)

          Всё это конечно хорошо, даже при определённой сноровке можно реализовать наследование…
          Но где public и private члены класса? Дефакто в этом примере они все public. Да ещё и надо помнить, где использовать двоеточие:
          MyClass:myFunc()
          

          а где просто одну точку:
          MyClass.myOtherFunc()
          

          А статические члены класса? Неужели придётся отказываться?
          Вот я и не захотел отказываться, и начал колхозить...
        • Возможности метатаблиц в Lua на примере реализации классов

          • Tutorial
          В Lua ООП нет. И оно, в общем-то и не нужно: удобной модульности и функций первого класса достаточно для реализации многих вещей. На этом можно было бы и закончить, но пост не про это. В данном случае я распишу работу с метатаблицами, где в качестве примера шаг за шагом будет реализовываться системка по работе с классами в несколько таком python-стиле. Для понимания нужен хотя бы основной базис языка: таблицы, upvalues.

          Больше Lua на Хабре!
        • Интерактивная сетевая игра на HTML, CSS и JavaScript

          Как-то поиграв в оффисе в hexbug, зародилась идея написать игрушку по схожим мотивам.
          По текущему роду деятельности я веб разработчик и поэтому захотелось чтобы в игре использовался только HTML, JavaScript и CSS — средства знакомые каждому вебразработчику. Никакого вам flash или даже canvas. Звучит хардкорно, но на самом деле сейчас HTML + CSS3 это очень мощные и гибкие средства визуализации, а писать игровой код на JavaScript — одно удовольствие. Вдобавок захотелось чтобы игра была с сетевым мультиплеером, притом интерактивной — никаких там шашек, карточных игр, пошаговых стратегий, все должно быть в действии и движении.

          Вот что получилось в итоге:



          В статье я оставлю набор заметок возникших при написании прототипа игрушки, нацеленных больше на подход «как сделать попроще и побыстрее». Думаю статья может сгодиться как некое подспорье для новичков в этом увлекательном деле.

          Читать дальше →
        • Всё, что вы должны знать о прототипах, замыканиях и производительности

          • Translation
          • Tutorial

          Не всё так просто


          На первый взгляд, JavaScript может показаться достаточно простым языком. Возможно, это из-за достаточно гибкого синтаксиса. Или из-за схожести с другими известными языками, например, с Java. Ну или из-за достаточно малого количества типов данных, по сравнению с Java, Ruby, или .NET.

          Но в действительности, синтаксис JavaScript гораздо менее прост и очевиден чем может поначалу показаться. Некоторые наиболее характерные черты JavaScript до сих пор неправильно воспринимаются и до конца не поняты, особенно среди опытных разработчиков. Одна из таких черт — производительность при получении данных (свойств и переменных) и возникающие при этом проблемы с производительностью.

          В JavaScript поиск данных зависит от двух вещей: прототипного наследования и цепочек областей видимости. Для разработчика понимание этих двух механизмов совершенно необходимо, ибо ведет к улучшению структуры, а, зачастую, ещё и производительности кода.
          Читать дальше →
        • Замыкания в Javascript [Часть 1]

          Перевод статьи Ричарда Корнфорда Javascript Closures.

          • Введение
          • Разрешение имен свойств объектов
            • Присваивание значений
            • Чтение значений

          • Разрешение имен идентификаторов, контексты исполнения и цепь областей видимости
            • Контекст исполнения
            • Цепь областей видимости и свойство [[scope]]
            • Разрешение имен идентификаторов

          • ...

          Введение


          Замыкание
          Замыкание — это выражение (обычно функция), которое может иметь свободные переменные, вместе со средой, которая привязывает эти переменные (т.е. “замыкает” это выражение).

          Замыкания относятся к наиболее мощным особенностям ECMAScript (javascript), но они не могут быть применены должным образом без понимания. Несмотря на то, что их легко создать, даже случайно, их создание может иметь пагубные последствия, в частности, в некоторых относительно распространенных окружениях браузеров. Чтобы избежать случайных столкновений с недостатками и использовать преимущества замыканий, необходимо понимать их механизм. Это сильно зависит от роли цепи областей видимости в разрешении имен идентификаторов (identifier resolution) и от разрешения имен свойств в объектах.

          Самое простое объяснение замыкания в том, что ECMAScript допускает вложенные функции, определения функций и функции-выражения (function expressions) внутри тел других функций. И эти вложенные функции имеют доступ ко всем локальным переменным, параметрам и функциям, находящихся внутри их внешней функции (внешних функций). Замыкание образуется, когда одна из этих вложенных функций становится доступной вне той функции, в которую она была включена, таким образом, она может быть выполнена после завершения внешней функции. В этот момент она все еще имеет доступ к локальным переменным, параметрам и внутренним декларациям функций (function declarations) своей внешней функции. Эти локальные переменные, параметры и декларации функций (изначально) имеют те же значения, которые были во время завершения внешней функции и могут взаимодействовать с внутренней функцией.

          К сожалению, правильное понимание замыканий требует понимания механизмов, которые стоят за ними, и немало технических подробностей. Хотя некоторые из алгоритмов, определенных в ECMA 262, затронуты в начале последующего объяснения, большинство не могут быть опущены или просто приведены к упрощенному виду. Если вы знакомы с разрешением имен свойств объектов, то можете пропустить этот раздел, но только люди, уже знакомые с замыканиями, могут позволить себе пропустить последующие разделы и прямо сейчас перестать читать и вернуться к их использованию.
          Читать дальше →
        • Правильный захват контекста в Javascript

            Довольно часто во многих статьях я вижу, как люди захватывают контекст this для использования в анонимной функции и удивляюсь — то, что уже стало стандартом — просто ужасная практика, которая противоречит всем канонам программирования. Вам знакома такая запись?
            var self this;
            Может вам тоже стоит переосмыслить этот аспект?
            Читать дальше →
          • Работаем асинхронно в PHP или история ещё одного чата

            Меня очень радует, как бурно развивается PHP последние несколько лет. Наверное и вас тоже. Появляются постоянно новые возможности, удерживающие энтузиастов оставаться на данной платформе. Чего только стоит недавняя новость о релизе Hack.

            Наверняка кто-то прочитав даже заголовок этой статьи ухмыльнется и подумает: «Мсье знает толк в извращениях!». Споры о крутости того или иного языка никогда не утихают, но как бы там ни было, лично я для себя вижу не так уж и много условий смены языка, поскольку люблю выжимать все возможности, прежде чем радикально сменить весь стек. Недавно была публикация о создании чата на Tornado и мне захотелось рассказать о том, как похожую задачу я решал при помощи PHP.

            Предыстория

            В один прекрасный день решил я познакомиться с WebSockets. Меня заинтриговала технология, хотя не сказать бы, что она появилась только вчера, и это совпало с запуском одного чат-сервиса соционической тематики, который страдал массой недостатков. Это придало мне азарт принять участие в конкурентной гонке. Использование веб-сокетов выглядело принципиально новым и многообещающим решением.
            Читать дальше →
          • Игровой сервер за один день на Node.js + Socket.io

            В конце рабочего дня в пятницу, обдумывая текущую задачу, в воспаленном мозгу неожиданно возникла мысль — а не попробовать ли мне написать свой игровой сервер?

            В мыслях проскакивали картины одна краше другой, изобретались механики будущей игры, спецэффекты. В голове игра была практически готова, осталось всего ничего, подготовить концепт, начать работу над дизайн документом, найти художников, сценаристов, звукооператоров, программистов… Горестно вздохнув, очередной раз отправил идею на свалку.

            Но по-видимому, заноза прочно засела в голове, поэтому проснувшись в субботу я принялся творить.
            Читать дальше →
            • +12
            • 40.3k
            • 5
          • Lua за 15 минут

              image

              Для всех, кто хотел разобраться с Lua (скриптовый язык для разработки игр и не только, список), но никак не находил времени, Tyler Neylon приготовил небольшой подарок:

              http://tylerneylon.com/a/learn-lua/

              Посвящается всем, кто предпочитает один большой список из говорящих самих за себя сниппетов кода (с небольшими комментариями к 95% case'ов) длинным мануалам с огромной иерархией. Очень удобно для тех, кто уже умеет программировать и просто хотел бы разобраться с новым для себя языком. Весь «мега-сниппет» на английском, но примеры несложно читаются.

              P.S. А для всего остального есть Hyperpolyglot.
            • Алгоритм BM25

              Впервые данный алгоритм встретил на Википедии и не обратил на него особого внимания. Позже изучая научные труды сотрудников Яндекса, я обратил внимание на то, что они ссылаются на него, например, в статье Сегаловича об алгоритмах определения нечетких дубликатов, поэтому решил разобраться, в чем смысл его использования. Постараюсь на простых примерах это объяснить. Итак, для чего этот алгоритм?
              Читать дальше →
            • Вебсокеты на PHP. Часть 3. От чата до игры: Battle City

                В предыдущих двух частях (Делаем вебсокеты на PHP с нуля и Межпроцессное взаимодействие) в качестве демонстрации я использовал чаты, но в этой статье на примере онлайн-игры я покажу, что сфера применения вебсокетов может быть гораздо шире.

                Как обычно, в конце статьи ссылки на демонстрационную игру и исходный код на гитхабе.

                Содержание:
                • Поддержка вебсокетов браузерами
                • Разработка онлайн-игры
                • Благодарности
                • Демка и исходный код

                Читать дальше →
              • Делаем вебсокеты на PHP с нуля

                Некоторое время назад я выбирал библиотеку для работы с вебсокетами. На просторах интернета я натыкался на статьи по интеграции node.js с yii, а почти все статьи о вебсокетах на хабре ограничивались инструкциями к тому, как использовать phpdaemon.

                Я изучал библиотеки phpdaemon и ratchet, они достаточно монструозны (причём используя ratchet для отправки сообщения конкретному пользователю рекомендовано дополнительно использовать wamp). Мне не совсем было понятно для чего использовать таких монстров, которые требуют установку других монстров. Почитав исходники этих, а также других библиотек, я разобрался как всё устроено и мне захотелось написать простой вебсокет-сервер на php самостоятельно. Это помогло мне закрепить изученный материал и наткнуться на некоторые подводные камни, о которых я не имел представления.

                Так я решил написать необходимый для меня функционал с нуля.

                Получившийся код и ссылка на демонстрационный чат в конце статьи.
                Читать дальше →
              • Изучить Github за 15 минут

                  TryGit — интерактивный обучающий курс по Github в стиле Codecademy. Курс состоит из 25 мини-уроков, которые знакомят пользователя с базовыми понятиями и основными командами git, при этом ученик своими руками вводит команды в консоль, смотрит результат и читает сопровождающие надписи с объяснением происходящего.



                  Вот таким в будущем должно стать обучение в школах!

                  Конечно, 15-минутное введение не заменит полноценного учебника. Для обучения можно рекомендовать бесплатную книгу Pro Git и видеокурс Getting Git.
                • Горизонтальное масштабирование PHP приложений. Часть 1

                  • Translation

                  Итак вы сделали сайт. Всегда интересно и волнительно наблюдать как счетчик посещений медленно, но верно ползет вверх, с каждым днем показывая все лучшие результаты. Но однажды, когда вы этого не ждете, кто-то запостит ссылку на ваш ресурс на каком-нибудь Reddit или Hacker News (или на Хабре — прим. пер.), и ваш сервер ляжет.

                  Вместо того, что бы получить новых постоянных пользователей, вы останетесь с пустой страницей. В этот момент, ничего не поможет вам восстановить работоспособность сервера, и трафик будет утерян навсегда. Как же избежать таких проблем? В этой статье мы поговорим об оптимизации и масштабировании.
                  Читать дальше →
                • Отказываемся от коллбэков: Генераторы в ECMAScript 6

                  • Translation
                  Я постоянно слышу людей, ноющих об асинхронных коллбэках в JavaScript. Держать в голове порядок исполнения в этом языке немного трудно (это тот случай, который называют «Callback Hell» или «The Pyramid of Doom»), если до этого ты имел дело с синхронным программированием. Моим обычным ответом было «тебе придется как-то с этим обходиться». В конце концов, ожидаем ли мы, что все языки программирования будут выглядеть и ощущаться одинаково? Конечно нет.

                  Все поменял недавний обзор черновика ECMAScript 6, в котором описываются генераторы — возможность языка, которая целиком изменит наш способ написания и серверного, и клиентского JavaScript. С помощью генераторов мы можем превратить вложенные коллбэки в похожий на синхронный код без блокирования нашей единственной event loop.
                  Например, этот код:
                      setTimeout(function(){
                          _get("/something.ajax?greeting", function(err, greeting) {
                              if (err) { console.log(err); throw err; }
                              _get("/else.ajax?who&greeting="+greeting, function(err, who) {
                                  if (err) { console.log(err); throw err; }
                                  console.log(greeting+" "+who);
                              });
                          });
                      }, 1000);
                  

                  может быть написан так:
                      sync(function* (resume) {
                          try (e) {
                              yield setTimeout(resume, 1000);
                              var greeting = yield _get('/something.ajax?greeting', resume)
                              var who = yield _get('/else.ajax?who&greeting=' + greeting, resume)
                              console.log(greeting + ' ' + who)
                          }
                          catch (e) {
                              console.log(e);
                              throw e;  
                          } 
                      });
                  

                  Интересно, не правда ли? Централизованная обработка исключений и понятный порядок исполнения.
                  Читать дальше →