Archives for Tháng Sáu 2014

Tổng hợp tin tức sử dụng node.js

3.960 views

Hãy tưởng tượng rằng bạn đang chuẩn bị bắt tay vào thực hiện dự án N.GN (Next Google News) hay N.BM (Next Báo mới), bạn đang cầm một danh sách dài các chức năng, yêu cầu:

  • thu thập bài viết từ nhiều nguồn: vnexpress.net, news.zing.vn, soha.vn, …
  • tự động sắp xếp bài viết
  • phát hiện bài viết trùng lặp
  • tóm tắt nội dung bài viết
  • phân tích hình đại diện cho bài viết
  • xây dựng website

Việc xây dựng dự án trên cần có các công nghệ thích hợp: Python để thu thập bài viết, Java dùng cho việc phân tích, PHP cho website, MongoDB để lưu trữ dữ liệu … (thêm công nghệ khác của bạn vô …) trước khi quyết định chọn công nghê để bắt tay vào làm, mình đề xuất các bạn nên sử dụng node.js, lý do mình sẽ trình bày trong loạt bài viết sau đây:

  • Thu thập bài viết dùng thư viện request – node.js (TODO)
  • Trích xuất  nội dung, hình đại diện bài viết sử dụng readability –  node.js (TODO)
  • Phát hiện bài viết trùng lặp dùng với node.js (TODO)
  • Tóm tắt nội dung bài viết với node-summary – node.js (TODO)

Host ứng dụng node.js trên nền tảng Heroku

12.518 views

Bạn – một JS/node.js ninja đang viết một ứng dụng node.js, bạn muốn demo cho bạn bè xem hay bạn đang gặp lỗi trong quá trình viết và cần sự giúp đỡ của lập trình viên khác.

Bạn không thể bưng máy tính chạy vòng quanh được (thời đại internet rồi bạn ơi!), bạn cần phải up mã nguồn lên host. Đối với các ngôn ngữ phổ biến như PHP, ASP thì việc kiếm ra host là hết sức dễ dàng nhưng đối với nền tảng mới như node.js bạn sẽ up code lên đâu? Câu trả lời cho bạn là máy chủ VPS (DigitalOcean, Linode) hoặc dịch vụ PAAS (platform as a service) như Heroku, OpenShift hoặc PAAS dành riêng cho node.js như ModulusNodejitsu.

Bài viết này mình sẽ hướng dẫn các bạn host ứng dụng node.js lên Heroku và lý do mình chọn Heroku để viết bài là vì:

  • cho phép trỏ domain về (rất nhiều dịch vụ khác bắt trả phí)
  • hỗ trợ up code dùng Git, tốc độ up code rất nhanh
  • vì là cha đẻ của PAAS nên về độ ổn định của Heroku là số 1
  • chạy rất tốt với ứng dụng node.js
  • cho bạn host miễn phí 5 ứng dụng, chứng thực bằng cách nhập thông tin thẻ tín dụng vô, tăng lên 200 ứng dụng miễn phí
  • mỗi ứng dụng có thể sử dụng tới 521MB ram

Điểm trừ của Heroku

  • lưu trữ files trực tiếp trên ứng dụng sẽ bị mất, nên sử dụng Amazon S3 hay dịch vụ tương tự để lưu trữ file
  • database hỗ trợ qua dạng plugin, sử dụng hơi rắc rối
  • tốc độ chạy ứng dụng hơi chậm vì chưa có datacenter ở châu Á
  • HTTP timeout

Viết ra ứng dụng và quản lý mã nguồn sử dụng Git

Nếu bạn chưa có ứng dụng mà chỉ muốn trải nghiệm với Heroku, bạn có thể sử dụng ứng dụng mẫu mình viết ở đây https://github.com/VietJS/port-scanner

Heroku sử dụng Git như là giao thức chính để bạn up source code nên yêu cầu mã nguồn của bạn phải được quản lý bằng Git. Nếu bạn chưa dùng Git bao giờ thì hãy bắt đầu từ tryGit, mình sẽ đợi ở đây, không đi đâu hết!

Đăng ký tài khoản Heroku

Dễ dàng và nhanh chóng

  1. Truy cập https://heroku.com/
  2. Click Sign up for free
  3. Điền email
  4. Kiểm tra email, nhấn link active

Cài Heroku Toolbelt (không bắt buộc)

Heroku Toolbelt là ứng dụng command line giúp tương tác với Heroku, nếu bạn nào không quen dùng command line thì có thể sử dụng giao diện web của Heroku và bỏ qua bước này.

  1. Truy cập https://toolbelt.heroku.com/
  2. Download và cài đặt như các phần mềm thông thường

Tạo Procfile trong source code

Procfile: file bí kiếp hướng dẫn heroku chạy ứng dụng của bạn.

Tạo file Procfile trong thư mục ngoài cùng của ứng dụng với nội dung như sau

Procfile

web: node index.js

Đưa Procfile vào Git

git add Procfile
git commit Procfile -m "Add Procfile"

Tạo ứng dụng mới trên Heroku

# app_name là tên ứng dụng bạn muốn tạo, sẽ được sử dụng trên url của ứng dụng http://app_name.herokuapp.com
heroku create app_name

Dùng Git up mã nguồn lên Heroku

git push heroku master

Chạy ứng dụng Heroku

Dùng Heroku Toolbelt

heroku ps:scale web=1 -a app_name

Dùng giao diện web Heroku Dashboard -> App -> Dyno: web = 1

Heroku App

Xem thành quả

Truy cập http://app_name.herokuapp.com

Xử lý khi có lỗi

heroku logs -a app_name

 

 

Quét cổng mạng siêu nhanh với evilscan – node.js

3.851 views

Quét cổng (port scanning) là công việc thường xuyên của người quản trị mạng, web developer và hacker dù là mũ trắng hay đen. node.js cùng với cơ chế vòng lặp sự kiện là môi trường cũng như công cụ hoàn hảo để lập trình ứng dụng mạng nhanh, mạnh.

Hôm nay VietJS giới thiệu với các bạn bộ thư viện evilscan quét cổng cực nhanh và mạnh cho node.js.

evilscan hỗ trợ sử dụng dưới dạng module cho node.js hoặc chạy độc lập, các chức năng bao gồm

  • quét một IP hoặc dãy IP. Ví dụ: 172.16.0.1, 172.16.0.1-172.16.0.255, 172.16.0.0/16
  • quét một cổng, nhiều cổng, dãy cổng. Ví dụ: 22, 20-22
  • đọc biểu ngữ của cổng. Ví dụ: khi scan port 22 của Ubuntu server sẽ trả về biểu ngữ OpenSSH_5.9p1 Debian-5ubuntu1.1
  • IAC negotiation (?)
  • truy ngược domain từ một IP (reverse dns lookup)
  • truy ngược thông tin định vị của IP (geolocation)

Sử dụng evilscan như ứng dụng độc lập

# cài đặt evilscan toàn cục (-g)
npm install -g evilscan

# xem hướng dẫn sử dụng
evilscan --help

# scan toàn bộ port trong mạng LAN với dãy IP 192.168.0.0/24 và in ra biểu ngữ
evilscan 172.16.0.0/24 --port=0-65535 --banner

Sử dụng evilscan dưới dạng module

Để hiểu cách sử dụng evilscan dưới dạng module, cách tốt nhất chúng ta sẽ viết ứng dụng API scan port đơn giản

Mã nguồn: http://github.com/vietjs/port-scanner

Demo: http://port-scanner.herokuapp.com/port/scan?ip=74.125.225.167&port=80

Thực hiện

  • Tạo thư mục chứa mã nguồn dự án
mkdir port-scanner
  • Khởi tạo node.js project tại thư mục vừa tạo
cd port-scanner
npm init
  • Download module express, evilscan và ghi thông tin phụ thuộc vô file package.json (–save), sử dụng express để đơn giản hóa việc xử lý truy vấn HTTP
npm install express evilscan --save
  • Tạo file index.js và viết code cho ứng dụng

index.js

// khai báo require module evilscan
var evilscan = require('evilscan')
// khai báo require module express
,   express = require('express');

// khởi tạo ứng dụng express
var app = express();

// ứng dụng port-scanning tự giới thiệu về mình
app.get('/', function(req, res){
  res.send('<h1>Tui tên là port-scanning.<br>'+
    'Tui chạy rất nhanh và rất nguy hiểm.<br>'+
    '<a href="http://vietjs.com/?p=9">http://vietjs.com/2014/06/01/quet-cong-mang-sieu-nhanh-su-dung-node-js/</a></h1>');
});

// ứng dụng port-scanning làm việc
app.get('/port/scan', function (req, res) {
  var ips = req.query.ip
  ,   ports = req.query.port
  ,   options = {}
  ,   results = [];

  // kiểm tra lỗi và trả về thông báo khi thiếu thông tin
  if (!ips || !ports) {
    res.send(400, 'Missing ip or port params. Correctly URL is /port/scan?ip=192.168.0.1&port=22');
    return;
  }

  // khai báo options cho evilscan
  // xem thông tin đầy đủ tại https://github.com/eviltik/evilscan
  options = {
    target: ips, // địa chỉ IP, dãy IP
    port: ports, // cổng
    status:'TROU', // ?
    banner: true, // hiển thị biểu ngữ của cổng kết nối
    concurrency: 255, // số lượng kết nối đồng thời
    timeout: 2000, // thời gian chờ kết nối (ms)
    geo: true, // xác định vị trí địa lý của địa chỉ IP
    reverse: true // hiển thị thông tin reverse dns
  };;

  // khởi tạo evilscan scanner
  var scanner = new evilscan(options, function () {
    // khởi tạo xong scanner
  });

  // khi quét có kết quả, lưu kết quả vào biến results
  scanner.on('result', function (data) {
    results.push(data);
  });

  // khi có lỗi, trả về thông báo lỗi
  scanner.on('error', function (err) {
    res.send(500, 'evilscan error: ' + err);
  });

  // khi quét xong, kết thúc xử lý cho truy vấn này và trả về kết quả
  scanner.on('done', function () {
    res.send(results);
  });

  // chạy evilscan scanner
  scanner.run();
});

var HTTP_PORT = process.env.PORT || 3000;
app.listen(HTTP_PORT);
console.log('port-scanning application listening at 0.0.0.0:' + HTTP_PORT);
  • Chạy ứng dụng
node index.js