работа с WebSocket в Ratchet и PHPDaemon

hell0w0rd

Продвинутый новичок
@grigori, возьми typescript, он в последних версиях очень даже ничего стал. async/await не хватает, но скоро уже будет.
Как-то так на TS выглядеть это будет:
PHP:
function onchallenge (session : ClientSession, method : string, extra : ChallengeMessage) : bool {
  if (method !== "wampcra") {
    throw new Error(`don't know how to authenticate using "${method"`);
  }

  return autobahn.auth_cra.sign(process.argv[5], extra.challenge);
}
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
выглядит ниче
смущает идея писать на скриптовом языке, чтобы компилировать его в другой скриптовый язык, чтобы потом запускать это в jit runtime

основное сомнение - удобство отладки всей этой конструкции,
одно из достоинств скриптовых языков со слабой типизацией - отсутствие этапа компиляции, линковки, деплоймента и задержки на перезапуск большого приложения при разработке,
то есть синтаксис, близкий к Java, ценой всех сложностей разработки на java. отлично :)

- what are you doing up there?
- compiling!
- oh, go on

а IDE с синтаксическим анализатором и сборщиком для него есть, аналогичный PHPStorm?
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
@grigori, phpstorm последний должен все фишки поддерживать. Только у них вышел 1.6 релиз вот буквально недавно, возможно что-то поломалось.
Более того, редакторы вроде atom нормально поддерживают TS, у него в компиляторе движок автокомплита есть.
Ну и я себе давно JS без компиляции представить не могу, если честно) Принято уже давно писать на следующем стндарте js/css, а полифилят это дело автоматические, достаточно быстрые тулзы. Не говоря уже о amd(require.js)/commonjs(browserify), которые года 3-4 назад появились.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
перефразируя твои слова, чем только ни занимаются люди, лишь бы писать на js

конечно, я пишу на js, сегодня чятик делаю, но есть подозрение, что все это из-за гугла, который не смог растормошить очень консервативных питонщиков, вцепившихся зубами в умершую 5 лет назад двойку, и продвигает V8 с другими решениями по принципу "invented here"
и поэтому TS в ноде не будет

фейсбучка вот тоже рожает свою джаву из php, но ее хоть почистили, упростили, и 7ку сделали
 
Последнее редактирование:

MiksIr

miksir@home:~$
Насколько я читал - перекомпиляция там быстрая. Чуть ли не на уровне измененной дельты ts файла.
Можешь воспринимать это не как "компиляцию", а как онлайн статический анализ + макро.
С IDE кстати, все просто, ибо большинство функционала типа подсветки ошибок дает сам TS, IDE его подхватывает и отображает.
 

fixxxer

К.О.
Партнер клуба
@grigori

Транслятор пока что в любом случае нужен, если кода относительно много: поддерживать ES5-код - это очень сомнительное удовольствие.

В качестве альтернативы можно использовать babel (как транслятор es6+ -> es5, точнее, это набор трансляторов, сам бабел - это фронтенд, примерно как в gcc) + flow для анализа кода. По крайней мере, es6/es7 когда-то будет нативно реализован в V8, чего нельзя сказать о TS.

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

Если хочется всех плюшек сразу, можно совмещать babel и ts: typescript 1.5+, в принципе, поддерживает await, но не умеет его компилировать в стейт-машину. Можно компилировать typescript-ом в es6, а дальше транспайлить babel-ом :) Я пробовал, работает, не понятно только получится ли к этому прикрутить source maps.

Лично мне больше всего не хватает в этом деле reflection - без этого фиг сделашь удобный IoC, приходится костылить.

то есть синтаксис, близкий к Java, ценой всех сложностей разработки на java. отлично :)
Это да. Инкрементная компиляция есть, но все равно это все далеко не мгновенно срабатывает. Чувствуешь себя джава-программистом иногда :)
 
Последнее редактирование:

fixxxer

К.О.
Партнер клуба
Когда я увидел такое на php - понял, что с лямбдами запросто могу устроить себе нескучный вечер дебага.
Ну никто же не заставляет так писать. :) Все можно свести к нормальной стейт-машине с интерфейсами и прочим, колбэки останутся на уровне тонкой прослойки.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
Транслятор
babel + flow для анализа кода.
у flow есть существенная проблема
Если хочется всех плюшек сразу, можно совмещать babel и ts. Можно компилировать typescript-ом в es6, а дальше транспайлить babel-ом
не хватает в этом деле reflection
все далеко не мгновенно срабатывает. Чувствуешь себя джава-программистом иногда :)
что нужно для удобной разработки на PHP: сам php.
по скорости 7ка проигрывать ноде уже не будет, а объема качественного материала вроде symfony на порядок больше
не хватает стабильного event-loop расширения и generics
 
Последнее редактирование:

grigori

( ͡° ͜ʖ ͡°)
Команда форума
кстати, я тут разобрался с pip - это менеджер пакетов для питона вроде pear, и понял, как нам всем повезло, что pear загнулся, и смог родиться composer.
в питоне чтобы поставить зависимости рядом с приложением, а не в системные папки, используется виртуализация окружения, которую надо включать командой в консоли, запускать приложение, а потом выключать

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

fixxxer

К.О.
Партнер клуба
не хватает стабильного event-loop расширения
А что не так с тем же ext/event?

кстати, я тут разобрался с pip - это менеджер пакетов для питона вроде pear, и понял, как нам всем повезло, что pear загнулся, и смог родиться composer.
Это скорее следствие бардака с кучей несовместимых версий как самого питона, так и библиотек. Если бы composer на каждую попытку добавить зависимость в проект выдавал конфликт, и тут бы появился свой virtualenv.
 

fixxxer

К.О.
Партнер клуба
Под нее ничего не собирается, везде надо код править. :) Подожди полгодика
 

fixxxer

К.О.
Партнер клуба
А толку от этого говна после type erasure?

Надо во время компиляции метаданные о типах собирать. В принципе, я даже понимаю, как это сделать babel-ом.
 

hell0w0rd

Продвинутый новичок
@fixxxer, babel-ом можно сделать все что угодно, в зависимости от того, сколько у тебя времени. В реакт компонентах есть propTypes, ну знаешь, способ описать интерфейс. Это делается кодом:
Код:
propTypes: {
  name: React.PropTypes.string.isRequired,
  enabled: React.PropTypes.bool.isRequired
}
Если process.env.NODE_ENV === production, проверка не выполняется и этот код лежит мертвым грузом.

В общем я написал плагин, который выпиливает это свойство. Все что он делает - ищет propTypes и проверяет, что это относится к реакту, а не к чему-то еще. Такой простой плагин у меня занял часа 3-4, просто потому что нет доков.
Вот код, который это делает. Выглядит элементарно:
PHP:
Property: {
  exit(node) {
    if (node.computed || node.key.name !== 'propTypes') {
      return;
    }

    const parent = this.findParent((parent) => {
      if (parent.type !== 'CallExpression') {
        return false;
      }

      return parent.get('callee').matchesPattern('React.createClass');
    });

    if (parent) {
      this.dangerouslyRemove();
    }
  }
},
А все потому, что доки под babel почти отсутствуют
 
Последнее редактирование:

hell0w0rd

Продвинутый новичок
А, кстати. Flow - тормозной. А вот под babel есть плагин: https://github.com/codemix/babel-plugin-typecheck#what
Вот пример:
Код:
function sendMessage (to: User, message: string): boolean {
  return socket.send(to, message);
}
Код:
function sendMessage(to, message) {
  var _socket$send;

  if (!(to instanceof User)) throw new TypeError("Value of argument 'to' violates contract.");
  if (typeof message !== "string") throw new TypeError("Value of argument 'message' violates contract.");
  _socket$send = socket.send(to, message);
  if (typeof _socket$send !== "boolean") throw new TypeError("Function 'sendMessage' return value violates contract.");
  return _socket$send;
}
 

fixxxer

К.О.
Партнер клуба
Нафига мне типизация по классам? Типизация нужна по интерфейсам, а о них в райнтайме никакой информации нет.
 

hell0w0rd

Продвинутый новичок
Тогда лучше flow или typescript полноценно использовать
 

fixxxer

К.О.
Партнер клуба
Тогда лучше flow или typescript полноценно использовать
Пока что у flow есть существенная проблема - он не понимает конструкцию implements (можно вместо этого писать extends, но это работает, пока интерфейс только один). Сами по себе интерфейсы, кстати, понимает, хоть это и не задокументировано.
С тайпскриптом же другая проблема - там нет инфраструктуры плагинов, и не получится емитить метаданные для рантайм рефлексии без патчей на компилятор.

Что-то рабочее можно получить по схеме all( babel [emit metadata], typescript (->es6) -> babel (->es5) ). Но это как-то жесть.
 

hell0w0rd

Продвинутый новичок
А typescript не дает возможности писать плагины? Вообще в babel ты можешь рантайм достать объявления интерфейсов, и засунуть в рантайм в любом виде.
Но на мой взгляд, если все вот это тебе нужно, чтобы написать какой-то чатик - лучше возьми java, или скалу, там это все есть без наворотов, из коробки и поддерживается всеми бибилотеками, потому что по другому нельзя.
 
Сверху