пятница, 22 марта 2013 г.

Написання клієнта для snake dojo на node.js

Одного разу спробувавши coding dojo не можливо відірватись. Хочеться внести якийсь свій вклад в розвиток проекту. Клієнт для JavaScript надасть змогу програмістам використовувати усі перевани динамічнох типізації.

JavaScript дуже потужний інструмент. Не дуже багато готових операцій для всіх типів даних він містить, але його гнучкість дозволяє реалізовувати велосипеди будь-якої складності та конфігурації, а базові елементи в правильних руках можуть показувати елегантні рішення. 

Отже, що ми маємо? Сервер гри розсилає зараєстрованим гравцям HTTP GET запити, в яких міститься властивість "board" з інформацією про ігровий світ, а у відповідь на цей запит отримує text/plain, в якому у рядковому вигляді міститься інформація про напрям при наступній операції.
Порядок дій:
1.  Створюєм веб - сервер, який буде слухати усі запити, на стандартному порту, перевіряєм запити на адекватість:
  • Чи містить запит властивість "board".
  • Чи  "board" є пропорційною визначеному розміру поля.
  • Якщо перевірки не проходять, арвертаєм відповідь, що все погано.
var http = require('http');
var BOARD_SIZE = 15;

http.createServer(function (req, res) {
  
    var request = require('url').parse(req.url, true);
    board = request.query.board;
 
    if(!board){
      res.writeHead(400, {'Content-Type': 'text/html'});
      res.end("
No board parameter!");
      return;
    };
    if(board.length % BOARD_SIZE) {
      res.writeHead(400, {'Content-Type': 'text/html'});
      res.end("
Bad board parameter!");
      return;
    };
  
  });

}).listen(8888, '127.0.0.1');
2.  Спочатку був застосований тривіальний синхронний підхід, але оскільки node.js дозволяє неблокуючі операції вводу - виводу - асинхронні самураї не можуть цим не скористатися.
  • В тілі нашого "сервлета" звертаємось до функції , яка форматує ігровий світ - "board",  асинхронно виводить цей ігровий світ у консоль, а коли буде отримана відповідь, її буде записано у відповідь нашого клієнта.
  split(board, function(board) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(answer.getAnswer(board));
  });
3.  А ось і сама функція яка буде займатись вище зазначеними діями:

  var split = function (board, callback) {
  var splitBoard = function(board, callback) {
    var result = '';
    var temp = board;
      for(var i = 0; i < BOARD_SIZE; i++) {
        result = result + temp.substring(0,BOARD_SIZE) + '\n';
        temp = temp.substring(BOARD_SIZE);
      } 
    callback(result);
    return result;
  }
  //Anonymous function for asynchronous printing formatted board to console;
  board = splitBoard(board, function(board) {
    console.log(board);
  });
  callback(board); 
}
4.  Відповідь для розвантаження підключаєм з іншого файлу, базово реалізуємо повороти в різних напрямах:
answer.js
  
var direction = require('./direction');
//implementation of simple random response
exports.getAnswer = function (board) {
 var random = Math.floor(Math.random()*4)+1;
 if (random === 1) {
  return direction.RIGHT;
 } 
 if (random === 2) {
  return direction.LEFT;
 } 
 if (random === 3) {
  return direction.UP;
 } 
 if (random === 4) {
  return direction.DOWN;
 } 
}

5.  Константи зберігаєм у файлі:
directions.js 
  
//Directional constants;
exports.UP = "UP";
exports.DOWN = "DOWN";
exports.LEFT = "LEFT";
exports.RIGHT = "RIGHT";


Результатом нашого дійства ствло отаке от представлення.*


От і все, дякую за увагу, програма працює, цілісні ресурси можна знайти на github:  snake-dojo-jsclient

*в залежності від налаштувань командного рядка можуть бути різні картини.

понедельник, 18 марта 2013 г.

Тіні забутих предків, або капсула нащадкам.

"Жодну систему неможливо зрозуміти, не вийшовши за її межі" 
Вчитель хімії, 11 клас.
Як не парадоксально, але не можна систему зрозуміти і ззовні, не побувавши всередині. Тренінг GL, як не крути, є візуалізацією системи - не чорного ящика, а біологічним організмом, зі своєю лінню, героями, планетами та риторичними запитаннями.

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

Хотілось би показати як відбувається знайомство з тренінгом для новачка і на що їм звернути увагу:
  1. Після додаванняння менторів (сим. означення)  у skype, в нас з'явився чудовий email та пароль до нього, а отже і доступ до репозиторію, куди можна заливати код на конструктивний аналіз.
  • через web-інтерфейс неможна завантажувати файли, тільки створювати папки.
  • web-інтерфейс для перегляду, клацати по дивним не зрозумілим посиланням немає сенсу.
  • на даному етапі саме головне не спішити і не хвилюватись тим, хто вперше бачить google code.
      2.  Перш за все потрібно зайти на пошту і згадати все подивитись листи, все що там є - було колись  надіслано вашим і нашим попередникам.
  • найголовніше подивитись відео в перших листах, яке відразу відкриє вам на все очі та позбавить сотні запитань для менторів.
  • старий code review спочатку можна не дивитись, але взагалом дуже конкретний навчальний матеріал.
     3.  Читати вчасно роздані методички.
  • методички є дуже потужним матеріалом для саморозвитку, кожне слово несе важливий зміст та викинути його неможна.
  • як поводитись з репозиторієм, ссилки на матеріали теж тут.
  • текст методичок краще занотовувати і передавати дітям у спадок перечитувати через деякий час для кращого запам'ятовування.
     4. Писати свій і читати чужий код для рев'ю,  рев'ю,  рев'ю,   рев'ю...
  • продуктивніше почитати чужого коду, потім взяти ручку та зошит і придумати свою архітектуру з блек-джеком та дівчатами.
     5.  Спробуйте писати на блозі тренінга, який з самого початку буде вам відомий!

Цікаво хто вони і де вони - наші далекі предки?  Де будемо ми, коли наступне покоління прочитає ці слова.
Дякую за увагу, наступного разу буде щось практичніше і філософське.