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
recurring operations
currency exchange rates
calculate md5 hash of text or file
reminder
...everything else!
it's best to script it
something handy...
1. powtarzalne czynności
2. coś podręcznego
Proof of Concept
tekstury prosto z gry
pokombinowałem z mieszaniem kolorów
zrobiłem animację tła praktycznie taką samą jak w kłejku.
A dopiero potem dodałem parę istotnych ficzerów :)
złe rzeczy w starej wersji:
gdx window + WinAPI + window always-on-top: nieprzyjemne hacki
OpenGL i wydajność, kiedy minimaluzuję grę
drag&drop: musiałbym używać WinAPI
kopiowanie tekstu - wymagałoby to dużo czasu do zaimplementowania
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)
przejdźmy przez ficzery.
API: globalne obiekty i funkcje, których można używać w skryptach
auto-reload: nie trzeba zamykać programu albo ręcznie wczytywać plików
aliasowanie - również z argumentami
tabs - wiele zakładek, gdzie każda ma swój własny kontekst javascriptowy
completion - domyślnie jest dokańczanie ścieżek do folderów bądź plików, ale można zaimplementować własne
REPL - własna linia komend, można np. podpiąć prawdziwego Basha
The Console
to jest nowa wersja, na trochę innym doborze technologii: nadal Java 8 i Nashorn, ale do interfejsu zamiast libgdx jest JavaFx. Dodatkowo język Xtend zamiast Javy.
random, currency, wikipedia to komendy ze skryptów
alias to komenda wbudowana
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"
);
program nie ma pomocy, sami musicie sobie napisać komendę help :)
Ewentualnie Wiki
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() { }
}
}
zwykły skrypt - w całości ewaluowany za każdym wywołaniem
moduł - wczytany raz, potem żyje w środowisku JavaScript
wszystko opcjonalne - jeżeli chcemy tylko dostarczać komendy
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)
z API: assertInfo, Utils.requestUrl, console.log
`args` jest dostarczane z linii komend
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
}
}
tutaj mamy kilka komend w jednym module :)
Plus: żyjące środowisko JS, czyli ta zmienna currentDir będzie przechowywała ostatnią wartość. W tym przypadku przez komendę `cd`
innymi słowy - pojedyncze skrypty są wykonywane w całości za każdym razem kiedy jest wołana komenda, natomiast moduły - tylko podczas wczytania. Wtedy właśnie rejestrowane są komendy.
(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
dokańczanie argumentów może zwrócić jeden wynik, kilka wyników lub nic
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()
}
przykład handlera, który wykonuje po prostu działanie matematyczne w odwrotnej notacji polskiej
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
mój projekt to moja przygoda, a ten konkurs to tak naprawdę coś więcej
o projekcie usłyszało kilka mediów (prasa, radio, internet) i trochę firm
Projekty
słowem: przeróżne
aplikacje mobilne, webowe
emulatory
CMS-y (blogi)
elektronika / IoT
gry
eksperymenty z algorytmami
magisterka
meta projekt !
http://macieklesiczka.github.io/dsp/stats/
Gala Finałowa
nie rób eksperymentu, bo ja już zrobiłem. Napisz swoje imię a nie ksywkę :)
src: https://twitter.com/jskalc/status/744323100720963584
src: https://twitter.com/spotkaniait/status/744068216817860609
Prezentacje
zanim się zdecydowałem na prezentację...
https://twitter.com/maniserowicz/status/742653475096559616
Prezentacje
niektóre osoby debiutowały w prezentowaniu, "a było bardzo dobrze"
mix: tech / personal
https://twitter.com/maniserowicz/status/744174862655197184 - Piotr Nowacki (tabi)
https://twitter.com/katafrakt_pl/status/743927896356569088 "Jeszcze przed galą: kilka słów podsumowania od gościa, który nie ukończył #dajsiepoznac ale i tak chce podsumować."
https://twitter.com/maniserowicz/status/744168423735844864
mBank / Piotr Stapp
“Czy DevOps w bankowości jest możliwy? Czyli słów kilka o wdrażaniu oprogramowania”
https://twitter.com/maniserowicz/status/744070275269013505 - Piotr Stapp o pracy devopsów w mBanku
SoftwareHut / Kamil Mijacz
“M jak Mijacz. M jak mikroserwisy”
https://twitter.com/maniserowicz/status/744085849147609089 - Kamil Mijacz z SoftwareHut
Jakub Dziworski
“Własny język programowania na platformę JVM w 10 tygodni”
https://twitter.com/maniserowicz/status/744102283206529024 - Jakub Dziworski spróbował stworzyć swój język, tworząc kompilator bajtkodu pod JVM
Dariusz Pawlukiewicz
“Aurelia.io & Materialize CSS: Heaven and Hell”
https://twitter.com/maniserowicz/status/744129174172995585 - Dariusz Pawlukiewicz o frameworku Aurelia
Karol Szczepański
“URSA – It is time to rest”
https://twitter.com/maniserowicz/status/744106016351129600 Karol Szczepański - "święty grall w komunikacji frontend-backend"
Emilia Szymańska
“Logika temporalna, gry i blogowanie – czyli jak łączyć przyjemne z pożytecznym”
https://twitter.com/maniserowicz/status/744132646989668352 - Emilia Szymańska o swojej pracy magisterskiej i blogowaniu
Bartłomiej Rogowski
“So Clojure, Yet so far – RL Engine Retrospektywa”
https://twitter.com/maniserowicz/status/744135697435590656 - Bartek Rogowski - o grach rpg, rougelike'ach i Clojure
Piotr Gankiewicz
“Po co się męczyć? Warden Cię wyręczy!”
https://twitter.com/maniserowicz/status/744150078970073089 - Piotr Gankiewicz nt. swojego projektu Warden (zwycięzca)
Sebastian Gierłowski
“Od bloga do emulatora”
https://twitter.com/maniserowicz/status/744153598003646464 - Sebastian Gierłowski, emulator CHIP-8 (gameboy)
Aneta Bielska
“Ruby, react i ja”
https://twitter.com/maniserowicz/status/744161929342627840 - Aneta Bielska
Rafał Hryniewski
“SignalR: ‘R’ is for Real Time”
https://twitter.com/maniserowicz/status/744165367094849538 - Rafał Hryniewski, SignalR
Marcin Drobik
“Krótki wstęp do nauczania maszynowego”
https://twitter.com/nameczanin/status/744576409054621698 - Marcin Drobik, machine learning o rebeliantach na podstawie filmu dokumentalnego George'a Lucasa
Patryk Nowacki
“ToTu – Wizualizacja informacji pasażerskiej w czasie rzeczywistym. Projekt DSP w obcych technologiach.”
Krzysztof Jończyk
“O wychodzeniu z piwnicy zwinnymi krokami”
https://twitter.com/maniserowicz/status/744181482609119232 - Krzysztof Jończyk
Kamil Dąbrowski
“JavaScript’owalny shell dla każdego”
https://twitter.com/maniserowicz/status/744186149258825728 - ja
Piotr Wandycz
“Dlaczego jeszcze nie piszesz gier?”
https://twitter.com/maniserowicz/status/744191066375622656 - Piotr Wandycz
Marcin Kruszyński
“Mobilna dyskoteka z Android, iOS oraz Windows 10 IoT Core (Raspberry Pi) – słów kilka”
bardzo zabawne zakończenie :)
https://twitter.com/msdevpl/status/744195977020506112
https://twitter.com/maniserowicz/status/744194752124420096
Marcin Kruszyński
“Mobilna dyskoteka z Android, iOS oraz Windows 10 IoT Core (Raspberry Pi) – słów kilka”
Nagrody
https://twitter.com/maniserowicz/status/739542091026554880 - "wszyscy jesteście zwycięzcami""
Piotr Gankiewicz
https://twitter.com/spetzu/status/748152237143236609
Piotr Gankiewicz
zwyzięzca
src: https://twitter.com/maniserowicz/status/745239099049541632
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"
portfolio - czytałem o kimś kto dostał ciekawą pracę po tym projekcie :)
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 .
http://programistka.net/gala-daj-sie-poznac-czyli-pare-slow-od-zdobywczyni-drugiego-miejsca/
- Iwona Lalik
Twój Projekt
Kolejna edycja konkursu prawdopodobnie się odbędzie, zatem możesz spróbować swoich sił
https://twitter.com/Ebanz88/status/739112061721051136
Twój Projekt
nie gry
eksperymenty są OK ale szybko prototypuj
silnik bloga?
im bardziej "życiowe"/zrozumiałe tym lepsze dla nagród
blog - raczej nieoryginalny pomysł, a szczególnie nie polecam, jeśli nie masz doświadczenia i chcesz uzyskać uwagę od innych uczestników. A chcesz.
Blog
jeden język! PL / EN
zależy od Twojego celu prowadzenia bloga
https://twitter.com/maniserowicz/status/705804306826530819 "get noticed" czy inaczej
https://twitter.com/maniserowicz/status/717773047151898626
Blog
EN
Show Yourself / Get To Know / Get Yourself Known
w zasadzie pojawiło się tutaj dużo sugestii i wydaje mi się, że problem nie został ostatecznie rozwiązany.
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
na początku ludzie przeglądają swoje blogi, łatwiej zainteresować czymś ładnym
pewien polski bloger Kominek (Jason Hunt) stwierdził w swojej książce, że warto mieć swoją domenę od początku
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
nikogo nie obchodzi, że miałeś dzisiaj buga. To tak jakby zdechł ci pies. Nobody cares.
Rozwiązuj pojedyncze małe problemy i bloguj własnie o tych rzeczach.
Ewentualnie przedstawiaj fakty w ciekawy sposób.
Blog
Posty a Świat
Twitter
FB Fanpage
Reddit
HackerNews
Slack!
wzajemny feedback uczestników
sociale, które ci pasują + wspieranie się na slacku
Blog
Post podsumowujący
bezpieczne założenie: nikt nie śledził twojego bloga
⇒ opisz swój projekt!
sporo osób przedstawiało statystyki bloga w kontekście odwiedzin, liczby postów, poświęconego czasu itd. To jest OK, ale wolałbym wiedzieć co w ogóle zrobiłeś przez te 3 miesiące.
Twoje wyzwanie
Etapy konkursu (sugerowane)
przejrzenie zgłoszeń innych uczestników
pomysł + plan projektu ← zarządzanie czasem
konkurs trwa
po drodze frustracja
zwycięstwo
świętowanie zwycięstwa
wspomnienia
Etapy konkursu (sugerowane)
przejrzenie zgłoszeń innych uczestników
pomysł + plan projektu ← zarządzanie czasem
konkurs trwa
po drodze frustracja
zwycięstwo
świętowanie zwycięstwa
wspomnienia
1. inspiracje, motyka
2. rozpisać funkcjonalność, miesiące/tygodnie, nie gry, lepiej na game jam
3.
4.
5.
6.
7.
Nie chcę, bo...
nie mam czasu
← powód?
wymówka
nie chce mi się
← powód
czasami warto po prostu zastanowić się czy nie występuje taka sytuacja, że zakrywamy prawdziwy powód czymś "mądrzejszym"
"...nie mam kondycji"
kondycja → bieganie
bieganie ⇒ kondycja
umiejętności → udział w konkursie
udział w konkursie ⇒ umiejętności
jak w bieganiu:
1. bieganie -> kondycja a nie odwrotnie
2. własne zasady, ale jeśli ich nie masz:
3. jak masz iść zamiast biec przystań na chwilę
4. żeby komfortowo bez stresu stanąć w miejscu na odpoczynek musisz zarządzać czasem
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?"