Содержание
Pyramid Head
[info]codedot

Содержание по основным темам журнала:

Tags:

Uniweb in Cloud9
Daria Morgendorffer
[info]codedot

The HTTP/WebSocket server project of mine is now hosted in Cloud9 IDE:

http://c9.io/codedot/uniweb


Облачная разработка
Carrie Bradshaw
[info]codedot

Внезапно облачное будущее настало. Mac стал не очень нужным файловым хранилищем.

  • Почта (на своем домене) в Google.
  • Код на GitHub (приватные репозитарии за символическую плату, если надо).
  • Программируешь в Cloud9 IDE на одном лишь языке как для клиента, так и для сервера (Node.js в их терминале доступен, плюс режим редактора Vim встроен).

Ну все, теперь можно пересесть за Chromebook. Счастливо оставаться!


Реализация Dasher на Uniweb
Carrie Bradshaw
[info]codedot
Сделал из двух своих Node.js пакетов один и почистил репозитарий. Теперь там только единственная версия, которая вряд ли будет уже меняться. Проверил ее на одном своем домене, для которого есть SSL-сертификат. Работает нормально.

На основе этой игрушки интересно было бы реализовать вариант Dasher для Web. В современном ее виде это не очень удобная штука. Однако, есть основания полагать, что подобный ввод текста в комбинации с идеей donclick.it-интерфейса мог бы быть пригодным для ввода-вывода в форме очков или, даже лучше, контактных линз, показывающих Web-страницу и использующих положение глаза как курсор.

Относительно универсальности такой схемы, естественно, возникает много вопросов. Меня, в частности, интересует, как реализовать терминал к UNIX с вводом текста через Dasher, существует ли удобная форма такого интерфейса, да и вообще, возможно ли это технически.

Мой второй Node.js-пакет
Daria Morgendorffer
[info]codedot

А вот этого я уже в других языках программирования как-то не видал. Эдакая «лиспо-лямбда» получается:

alexo@codedot:~$ wscat -c ws://localhost:8080/

connected (press CTRL+C to quit)

< (function () {
			socket.say = function(data) {
				data = JSON.stringify(data);
				this.send(data);
			};
		})(undefined)

< (function () {
			socket.say("Hello World!");
		})(undefined)
> "Hello World!"

< (function (data) {
			window.alert(data);
		})("Hello World!")

disconnected

alexo@codedot:~$

Кстати, wscat вчера починили.


Мой первый Node.js-пакет
Daria Morgendorffer
[info]codedot

Опубликовал свой первый пакет на свалке Node.js. Теперь запустить пример с «Hello World!», который будет доступен по локальному адресу, можно следующим образом:

alexo@codedot:/tmp$ npm install uniweb
npm http GET https://registry.npmjs.org/uniweb
npm http 200 https://registry.npmjs.org/uniweb
npm http GET https://registry.npmjs.org/ws
npm http 304 https://registry.npmjs.org/ws

> ws@0.4.13 preinstall /private/tmp/node_modules/uniweb/node_modules/ws
> make

node-waf configure build
Checking for program g++ or c++          : /usr/bin/g++ 
Checking for program cpp                 : /usr/bin/cpp 
Checking for program ar                  : /usr/bin/ar 
Checking for program ranlib              : /usr/bin/ranlib 
Checking for g++                         : ok  
Checking for node path                   : ok /usr/local/lib/node_modules 
Checking for node prefix                 : ok /usr/local 
'configure' finished successfully (0.183s)
Waf: Entering directory `/private/tmp/node_modules/uniweb/node_modules/ws/build'
[1/4] cxx: src/validation.cc -> build/Release/src/validation_1.o
[2/4] cxx: src/bufferutil.cc -> build/Release/src/bufferutil_2.o
[3/4] cxx_link: build/Release/src/validation_1.o -> build/Release/validation.node
[4/4] cxx_link: build/Release/src/bufferutil_2.o -> build/Release/bufferutil.node
Waf: Leaving directory `/private/tmp/node_modules/uniweb/node_modules/ws/build'
'build' finished successfully (1.050s)
npm http GET https://registry.npmjs.org/commander
npm http GET https://registry.npmjs.org/options
npm http 304 https://registry.npmjs.org/commander
npm http 304 https://registry.npmjs.org/options
uniweb@1.1.1 ./node_modules/uniweb
└── ws@0.4.13 (options@0.0.3, commander@0.5.2)
alexo@codedot:/tmp$ npm test uniweb

> uniweb@1.1.1 test /private/tmp/node_modules/uniweb
> node hello.js

Не считая примера, код пакета занимает всего 62 строки. Ниже комбинированный HTTP/HTTPS/WebSocket-сервер на его основе, который работает под рутом, так как использует порты 80 и 443, и ожидает SSL-сертификат в файлах key.pem и cert.pem:

var start = require("uniweb");
var read = require("fs").readFileSync;

function hello(socket) {
	socket.on("message", function(msg) {
		socket.send("alert(\"" + msg + "\");");
	});
	socket.send("socket.send(\"Hello World!\");");
}

start({
	handler: hello,
	domain: "example.com",
	key: read("key.pem"),
	cert: read("cert.pem")
});

Combined HTTP/HTTPS/WebSocket Server
Daria Morgendorffer
[info]codedot

Below are index.html and server.js sources. The server expects the index.html file as well as SSL key.pem and cert.pem to be located in the current directory.

<!doctype html>
<meta charset="utf-8">
<title></title>

<script>
var socket = new WebSocket("ws://localhost/");

socket.onmessage = function(msg) {
	eval(msg.data);
};
</script>

var read = require("fs").readFileSync;

function server(socket)
{
	socket.on("message", function(msg) {
		socket.send("alert(\"" + msg + "\");");
	});
	socket.send("socket.send(\"Hello World!\");");
}

function client(ws)
{
	var html = read("index.html", "utf8");

	return function(request, response) {
		response.writeHead(200, {
			"Content-Type": "text/html"
		});
		response.end(html.replace("ws", ws));
	};
}

function uniweb(host, ws, port)
{
	(new (require("ws").Server)({
		server: host
	})).on("connection", server);
	host.on("request", client(ws));
	host.listen(port);
}

uniweb(require("http").createServer(), "ws", 80);
uniweb(require("https").createServer({
	key: read("key.pem"),
	cert: read("cert.pem")
}), "wss", 443);

Ода стандарту ISO 16262
Brian Molko
[info]codedot
Далеко не сразу нашелся, что ответить, почему это меня вдруг ни с того, ни с сего, заинтересовал JavaScript. Действительно, сидел себе с Си и Шеллом, а тут на тебе. А после еще одной беседы на эту тему, вроде бы созрел ответ.

Наверное, многие замечали, как часто я высказываю свое «фи» на вещи, которые отклоняются от общепринятых стандартов, немедленно обзываясь «непозиксом». С этой точки зрения у данного языка, который есть чуть более, чем в каждом браузере, проблем нет: это просто диалект стандартного ECMAScript (ECMA-262 и ISO/IEC 16262). Только с некоторым количеством предопределенных объектов, которые, в свою очередь, регламентируются множеством стандартов W3C: HTML5 DOM, WebGL (чуть менее, чем полностью дублирующий OpenGL ES 2.0), Web Storage, WebSocket и др. Таким образом, набор документов W3C занимает в точности то же место по отношению к ECMAScript, что IEEE 1003.1 — по отношению к C99.

Да и сам язык ECMAScript гораздо ближе к Си, чем может показаться, если быть близко знакомым лишь с Си или, наоборот, только с JavaScript. Прежде всего, там, по большому счету, только один тип — объект. Почти как в бестиповой λ. Даже функция — и та объект. Это уже само по себе хорошо. Да и этот объект практически эквивалентен сишным обычным структурам struct { … }. Методы здесь просто функции, присвоенные значениям полей, что не чуждо и самому Си: в частности, это повсюду в ядре Linux и много где еще.

Однако, JavaScript, в отличие от Си, освобождает от управления памятью. Поля структур можно дополнять во время исполнения. Сильно упрощены построение и модификация структур данных — все-таки объектами не очень хочется их называть, — не особенно отклоняясь от сишного синтаксиса. Это практически идеальный язык, на мой взгляд. Я это говорю серьезно и именно что оглядываясь как на POSIX, так и на λ-исчисление. Кстати о последнем: по-моему, безымянным функциям самое место в браузере, ибо нефиг пространство имен засорять зазря, оно ведь одно на весь документ! Опять же, в отличие от того же Си, где нейм-спейсов во-первых несколько по разным типам сущностей. Плюс, всегда можно изолироваться, по крайней мере, внутри модуля, ограничившись статическими функциями и переменными.

А вот про то, что, при всей моей симпатии к современному Web, XML — зло, и как с ним я бы предложил бороться, позже подробно напишу. Хотя ранее я уже как бы намекал.

Minimal Universal Secure Web Client
Daria Morgendorffer
[info]codedot
<!doctype html>
<meta charset="utf-8">
<title></title>

<script>
var socket = new WebSocket("wss://127.0.0.1:8888/");

socket.onmessage = function(msg) {
	eval(msg.data);
};
</script>

The above HTML5 code successfully validated by W3C, unlike the previous one, uses the secure WebSocket protocol. One can easily create a Node.js-based secure WebSocket server for such a client as follows. We assume files named key.pem and cert.pem to contain the private key and the corresponding certificate both PEM-formatted, and that server.js contains the source code from below. If you have the ws package installed using npm install ws, running node server.js will then start the server.

var fs = require("fs");
var https = require("https");
var ws = require("ws");

var host = {
	server: https.createServer({
		key: fs.readFileSync("key.pem"),
		cert: fs.readFileSync("cert.pem")
	})
};

(new ws.Server(host)).on("connection", function(socket) {
	socket.on("message", function(msg) {
		socket.send("window.alert(\"" + msg + "\");");
	});
	socket.send("socket.send(\"Hello World!\");");
});

host.server.listen(8888);

JFP-2012-0015 Rejected
Family Values
[info]codedot
Dear Mr. Salikhmetov:

I am writing to you in regards to manuscript # JFP-2012-0015 entitled “Blind graph rewriting systems” which you submitted to the Journal of Functional Programming.

As the EIC in charge, I have read your paper twice over the last two days. While I am somewhat familiar with the area (especially the first three references, plus a bit of the fourth one), I will admit that I could barely follow the flow of ideas in your paper. Unlike regular submissions or other pearl submissions, your paper jumps right into the middle of a topic, using difficult to understand notation, and giving only the barest of context. I expect that an EIC with my background should be able to follow a paper in this area with much less effort; a pearl should be immediately accessible to an even wider audience (somewhat lacking in background).

Instead of assigning your paper to a Managing Editor, I am therefore taking the liberty to reject your submission immediately. I urge you to read some of the recent theoretical publications in JFP and to compare/contrast with your own submission.

Sincerely,
Dr. Matthias Felleisen
Journal of Functional Programming

You are viewing [info]codedot's journal