Kamil Dąbrowski



  • [marzec, kwiecień, maj] . size = 3 miesiące
  • projekt open source (@ GitHub)
  • blogowanie o projekcie: 2 razy w tygodniu

The Console


JavaScript'owalny shell każdego?

The Idea

  1. recurring operations
    • currency exchange rates
    • calculate md5 hash of text or file
    • reminder
    • ...everything else!
    • it's best to script it
  2. something handy...

something handy

Proof of Concept

The Console

Features:

  • currency.js file = currency command
  • API
  • auto-reload
  • command invocation history
  • command aliasing
  • multiple tabs
  • no command? invoke JS one-liner
  • modules similiar to those in nodejs
  • Command Line Argument Completion
  • custom REPL (Read-Eval-Print Loop)

The Console

help.js

console.log(
	"|\n" +
	"|  Welcome to command line of The Console\n" +
	"|\n" +
	"|   ---- the only console you'll need\n" +
	"|\n\n" +
	"Hit TAB to see command list.\n"
);

The Console

single-file script vs module

script

// some JS code
console.log("Hello")

module

module.exports = {
    onload: function() { },
    onunload: function() { },

    commands: { },

    completeArgument: function(arg) { }

    commandLineHandler: {   // this is REPL
        initContext: function() { },
        handleCompletion: function(input) { },
        handleExecution: function(input, utils, context) { },
        dispose: function() { }
    }
}

currency.js

assertInfo(args.length != 0,
    "Usages:\n" +
    " - currency 12 gbp eur\n" +
    " - currency gbp eur"
)

var amount = args.length == 3 ? args[0] : 1.0
var from = args[args.length == 3 ? 1 : 0]
var to = args[args.length == 3 ? 2 : 1]

var url = "http://finance.yahoo.com/d/quotes.csv?e=.csv&f=sl1d1t1&s="
 + from.toUpperCase() + to.toUpperCase() + '=X'
var csv = Utils.requestUrl(url)
console.log(csv.split(',')[1] * amount)

currency module

module.exports.commands = {
  currency: function(args) {
    // TODO: put same code as for single-file script
  }
}

filesystem module

var currentDir = "C:/"

exports.commands = {
	pwd: function(args) {
		console.log(currentDir)
	},
	cd: function(args) {
		// TODO: change directory
	},
	ls: function(args) {
		// TODO list files in current directory
	},
	cat: function(args) {
		// TODO: print whole file from given path
		// TODO: the path is relative OR absolute
	}
}

(custom) Argument Completion

module.exports = {
    completeArgument: function(arg) {
    	return Utils.completePath(arg)
    }
}

completeArgument(arg):

  • receives text between caret position and previous space
  • should return an array of results

REPL

module.exports = {
    commandLineHandler: {
        // optional
        initContext: function() { /* ... */ },

        // optional
        dispose: function() { /* ... */ },

        // optional
        handleCompletion: function(input) {
            // TODO: auto-complete
        },

        handleExecution: function(input, utils, context) {
            // TODO: execute given input
        }
    }
}

REPL: JavaScript eval()

exports.commandLineHandler = {
	handleExecution: function(input, utils, context) {
		this.context.output.addInputEntry(input)
		this.context.output.addTextEntry("" + eval(input))
	}
}

REPL: reversed polish notation

exports.commandLineHandler = {
	handleExecution: function(input, utils, context) {
		context.getOutput().addInputEntry(input)
		context.getOutput().addTextEntry(rpn(input))
	}
}

function rpn(input) {
  var ar = input.split( /\s+/ ), st = [], token
  while (token = ar.shift()) {
    if (token == +token) {
      st.push( token )
    }
    else {
      var n2 = st.pop(), n1 = st.pop()
      st.push( eval( n1 + token + ' ' + n2 ) )
    }
  }
  return st.pop()
}

REPL: bash

var InputStreamReader = Java.type("java.io.InputStreamReader")
var BufferedReader = Java.type("java.io.BufferedReader")
var ProcessBuilder = Java.type("java.lang.ProcessBuilder")
var Thread = Java.type("java.lang.Thread")

var CYGWIN_DIR = "N:/.babun/cygwin/"

var pb, process, inputThread, keepAlive

exports.commandLineHandler = {
	init: function() {
		pb = new ProcessBuilder(CYGWIN_DIR + "bin/bash.exe")
		pb.redirectErrorStream(true)

		var env = pb.environment()
		env.put('Path', env.get('Path') + ";" + CYGWIN_DIR + "bin")

		process = pb.start()

		keepAlive = true
		inputThread = new Thread(listenToInput.bind(null, this.context))
		inputThread.start()
	},

	handleExecution: function(input, utils, context) {
		var os = process.getOutputStream()

		// display in console what a user typed in
		context.output.addInputEntry(input)

		// send input text to bash
		os.write(input.getBytes())
		os.write(10) // ENTER
		os.flush()
	},

	dispose: function() {
		keepAlive = false
		inputThread = null
	}
}

function listenToInput(consoleContext) {
    var input = new BufferedReader(new InputStreamReader(process.getInputStream(), "UTF-8"))
    var output = consoleContext.getOutput()

    while (keepAlive) {
        if (!process.isAlive()) {
            // this can be achieved by invoking `exit` command
            output.addErrorEntry("bash process is dead.")

            // bring back standard handler
            consoleContext.commandLineService.resetHandler()
            return
        }

        while (input.ready()) {
            output.addTextEntry(input.readLine())
        }

        // don't consume too much CPU
        Thread.sleep(50)
    }
}

API

args.length
args[0], args[1], ...
Utils.exec(filePath)
Utils.execAsync(filePath)
Utils.getClassName(object)
Utils.openUrl(encodeURI(someUrl))
Utils.requestUrl(url) //HTTP GET
Utils.completePath(absolutePath)
console.log(text)
console.log(text, color)
console.error(text)
console.clear()
console.hide()
console.window
assert(bool, string)
assertInfo(bool, string)
JavaClass(className) // Java: Class.forName(className);
System // Java: System.class

+ Nashorn API

Tech

  • Java 8, Nashorn
  • JavaFx
  • Xtend lang

Nashorn

Xtend

  • promotes itself as a better syntax for JVM
  • transpiles to Java, not bytecode


www.eclipse.org/xtend/




github.com/Namek/TheConsole

(Wiki included)

(Feedback appreciated)

Projekty

słowem: przeróżne

  • aplikacje mobilne, webowe
  • emulatory
  • CMS-y (blogi)
  • elektronika / IoT
  • gry
  • eksperymenty z algorytmami
  • magisterka
  • meta projekt!


Gala Finałowa

Prezentacje

Prezentacje

  • niektóre osoby debiutowały w prezentowaniu, "a było bardzo dobrze"
  • mix: tech / personal

mBank / Piotr Stapp

“Czy DevOps w bankowości jest możliwy? Czyli słów kilka o wdrażaniu oprogramowania”

SoftwareHut / Kamil Mijacz

“M jak Mijacz. M jak mikroserwisy”

Jakub Dziworski

“Własny język programowania na platformę JVM w 10 tygodni”

Dariusz Pawlukiewicz

“Aurelia.io & Materialize CSS: Heaven and Hell”

Karol Szczepański

“URSA – It is time to rest”

Emilia Szymańska

“Logika temporalna, gry i blogowanie – czyli jak łączyć przyjemne z pożytecznym”

Bartłomiej Rogowski

“So Clojure, Yet so far – RL Engine Retrospektywa”

Piotr Gankiewicz

“Po co się męczyć? Warden Cię wyręczy!”

Sebastian Gierłowski

“Od bloga do emulatora”

Aneta Bielska

“Ruby, react i ja”

Rafał Hryniewski

“SignalR: ‘R’ is for Real Time”

Marcin Drobik

“Krótki wstęp do nauczania maszynowego”

Patryk Nowacki

“ToTu – Wizualizacja informacji pasażerskiej w czasie rzeczywistym. Projekt DSP w obcych technologiach.”

Krzysztof Jończyk

“O wychodzeniu z piwnicy zwinnymi krokami”

Kamil Dąbrowski

“JavaScript’owalny shell dla każdego”

Piotr Wandycz

“Dlaczego jeszcze nie piszesz gier?”

Marcin Kruszyński

“Mobilna dyskoteka z Android, iOS oraz Windows 10 IoT Core (Raspberry Pi) – słów kilka”

Marcin Kruszyński

“Mobilna dyskoteka z Android, iOS oraz Windows 10 IoT Core (Raspberry Pi) – słów kilka”

a później After Party...

Nagrody

Piotr Gankiewicz

Piotr Gankiewicz

zwyzięzca

The gala was wonderful. I've met cool people, seen great presentations and felt pretty comfortable between devs.
- ja na blogu

Rezultat?

  • finaliści: 70 z 296 uczestników
  • blisko 3000 postów w polskiej blogosferze IT

Dałem się poznać!

  • nowe ciekawe osoby/kontakty
  • liczne wyjścia z piwnicy - otwarcie na nowe eventy
  • niektórzy wciąż prowadzą blogi
  • albo lansują swoje projekty ;)
  • "portfolio"

Ona też dała się poznać!


To było niesamowite wyzwanie a rezultat dał mi teraz tak pozytywnego kopa, o jakim nawet nie marzyłam. Mam nadzieję, że ta pozytywna energia zostanie ze mną na długo i uda mi się ją zainwestować w nowe fajne wyzwania.
- Iwona Lalik

Twój Projekt

Twój Projekt

  • nie gry
  • eksperymenty są OK ale szybko prototypuj
  • silnik bloga?
  • im bardziej "życiowe"/zrozumiałe tym lepsze dla nagród

Blog

jeden język! PL / EN

Blog

EN

Show Yourself / Get To Know / Get Yourself Known

Blog

Forma(t)

  • meta-dane dla sociali (Facebook, Twitter)
  • nie najbardziej standardowy szablon z Wordpressa
  • statystyki
  • można gh-pages (Jekyll) ale może jednak domena?
  • krótkie "o mnie" bocznym panelu + fotka
  • + Twitter / GitHub

Blog

Posty

  • zajawka widoczna na głównej stronie
  • obrazek do każdego posta!
  • linkowanie faktów
  • pogrubianie słów kluczowych i podkreślanie istotnych zdań
  • 1 obrazek = tysiąc słów ⇒ 1 gif to nawet więcej

Blog

Posty a Projekt

post jako temat a nie kawałek kiepskiego dnia

Blog

Posty a Świat

  • Twitter
  • FB Fanpage
  • Reddit
  • HackerNews
  • Slack!
  • wzajemny feedback uczestników

Blog

Post podsumowujący

  • bezpieczne założenie: nikt nie śledził twojego bloga
  • ⇒ opisz swój projekt!

Twoje wyzwanie

Etapy konkursu (sugerowane)

  1. przejrzenie zgłoszeń innych uczestników
  2. pomysł + plan projektu ← zarządzanie czasem
  3. konkurs trwa
  4. po drodze frustracja
  5. zwycięstwo
  6. świętowanie zwycięstwa
  7. wspomnienia

Etapy konkursu (sugerowane)

  1. przejrzenie zgłoszeń innych uczestników
  2. pomysł + plan projektu ← zarządzanie czasem
  3. konkurs trwa
  4. po drodze frustracja
  5. zwycięstwo
  6. świętowanie zwycięstwa
  7. wspomnienia

Nie chcę, bo...

nie mam czasu powód? wymówka
nie chce mi się ← powód

"...nie mam kondycji"

kondycja → bieganie

bieganie ⇒ kondycja

umiejętności → udział w konkursie

udział w konkursie ⇒ umiejętności

Motywacje

  • projekt, na który nigdy nie było czasu
  • nauka
    • tech
    • podejście projektowe
    • zrozumienie ludzi (a.k.a. umiejętności miękkie)
    • język angielski?
  • "będzie miał pan do portfolio"
  • udzielić się w społeczności open source
  • "ja nie dam rady?"