Szúrjuk be a következő sort, mondjuk az Uptime alá:
${color grey}MR2:$color ${texeci 10 lua ~/scripts/radio_mr2.lua}
A texeci parancs nyit egy új szálat(t) 10 másodpercenként úgy mintha a terminálban adtuk volna ki.
Hogy ez a beállítás működjön hozzuk létre a /scripts/radio_mr2.lua szkriptet, aminek tartalma legyen.
require "curl"
require "iconv"
function write_callback(t)
return function(s, len)
table.insert(t,s)
return len, nil
end
end
-- BEGIN http://tassi.web.cs.unibo.it/lua/curl_lua_luadoc.html --
response_t = {}
c = curl.easy_init()
c:setopt(curl.OPT_URL, "http://stream001.radio.hu/xml/mr2.php")
c:setopt(curl.OPT_COOKIE, "WACIDX=efwkopEWFWFWsdwQ")
c:setopt(curl.OPT_WRITEFUNCTION, write_callback(response_t))
c:perform()
-- END --
-- BEGIN from: http://www.lua.org/pil/20.3.html --
function unescape (s)
s = string.gsub(s, "+", " ")
s = string.gsub(s, "%%(%x%x)", function (h)
return string.char(tonumber(h, 16))
end)
return s
end
-- END --
resp = response_t[1]
--[[ From: latin2 to utf-8 ----
Example in lua-iconv README or
http://code.google.com/p/scite-ru/source/browse/trunk/lualib/lua-iconv/README?spec=svn854&r=854
--]]
-- Tesztek BEGIN --
test = false
if test == true then
resp = "Corrine+Bailey+Rae+-+I%27d+Like+To"
resp = "mcim=MR2-Pet%F5fi+R%E1di%F3+%96+Nagyon+zene"
end
-- Tesztek END --
resp = string.gsub(resp, "^mcim=", "")
resp = unescape(resp)
cd = iconv.new("UTF8", "latin2")
resp = cd:iconv(resp)
print(resp)
"Kicsit" bonyolultabb mint a rubys verzió :D
P.S.: Frankó kis statisztikákat lehet gyártani, mit hányszor ismételnek...
- foofighter blogja
- A hozzászóláshoz be kell jelentkezni
- 1069 megtekintés
Hozzászólások
Ennyivel azért nem bonyolultabb szerintem ;)
Pl. a rubys verziód kb. ennyit csinál az egész luás dologból:
require "iconv"
url = require("socket.url")
resp = arg[0]
resp = url.unescape(resp)
resp = string.gsub(resp, "+", " ")
cd = iconv.new("UTF8", "latin2")
resp = cd:iconv(resp)
print(resp)
szerintem nem sokkal bonyolultabb, de ha annyira egy sorba akarsz mindent írni, egymásba ágyazva a dolgokat, erre is van mód:
print(require("iconv").new("UTF8", "latin2"):iconv(string.gsub(require("socket.url").unescape(io.read("*line") or "mcim=MR2-Pet%F5fi+R%E1di%F3+%96+Nagyon+zene"),"+"," ")))
… mondjuk jelen esetben valószínűleg maradnék sima shellscriptnél.
int getRandomNumber() { // ←ez itt már az aláírásom
return 4;//szabályos kockadobással választva.
} //garantáltan véletlenszerű. xkcd
- A hozzászóláshoz be kell jelentkezni
Bezony, a fullos ruby verzió valami ilyen lehetne:
ruby -ruri -riconv -rrubygems -e 'require "curb" and puts Iconv.conv("UTF-8", "LATIN2", URI.decode(Curl::Easy.perform("http://stream001.radio.hu/xml/mr2.php") {|c| c.cookies="WACIDX=efwkopEWFWFWsdwQ" }.body_str)).tr("+", " ").gsub(/mcim=/, "")'
- A hozzászóláshoz be kell jelentkezni
Nyertél, nem tudom három sor alá vinni:
lua -e 'results = {}; require("socket.http").request { url = "http://stream001.radio.hu/xml/mr2.php", headers = {["Set-Cookie"] = "WACIDX=efwkopEWFWFWsdwQ"}, sink = require("ltn12").sink.table(results) }; print(require("iconv").new("UTF8", "latin2"):iconv(string.gsub(require("socket.url").unescape(table.concat(results)),"+"," ")))
A Curl-t nem szeretem annyira, utálom az interfészeit, és úgy sejtem, hogy azzal még hosszabb lenne. Mondjuk ez is a socket.http miatt hosszabb, mint egy sor ☺ – sebaj, nem vagyok túl becsvágyó, nem szoktam luázni… Bár most egyre jobban tetszik.
szerk.: egyébként nekem ezzel a sütivel nem működik.
int getRandomNumber() { // ←ez itt már az aláírásom
return 4;//szabályos kockadobással választva.
} //garantáltan véletlenszerű. xkcd
- A hozzászóláshoz be kell jelentkezni
Mert a headers nem "Set-Cookie:" hanem csak "Cookie:". Akkor lenne "Set-Cookie:" ha a conky szkript lenne a szerver oldal.
- A hozzászóláshoz be kell jelentkezni
jogos, köszi
- A hozzászóláshoz be kell jelentkezni
Szerintem a shell szkripteket simán lecserélhetné a lua. Egyrészt mert könnyen hordozható, másrészt meg igen erős a library-támogatottsága.
- A hozzászóláshoz be kell jelentkezni
Lehet, de nekem valahogy nehézkesnek tűnik a shellscriptekhez képest. Persze megszokás kérdése, de shellscriptben a curl meghívása egy sor. Ezzel szemben a legtöbb más nyelven ennél többet kell vele szórakozni. Én valahogy nehezen mondok le arról, hogy a gépen lévő szoftverek kimenetét könnyedén használhassam, még akkor is, ha egy-egy részfeladatra egy másik programnyelv sokkal kényelmesebb.
Végső esetben meg még mindig indíthatok interpretert, ilyenkor Perl a jellemző, de olykor a JavaScript is befigyel.
int getRandomNumber() { // ←ez itt már az aláírásom
return 4;//szabályos kockadobással választva.
} //garantáltan véletlenszerű. xkcd
- A hozzászóláshoz be kell jelentkezni
+1. A shell egyszerűsége (butasága) előny egy egyszerű feladatnál.
Én egyébként régebben már ismertem a shell-t (+awk), perl-t, c-t, php-t, de utáltam, hogy minden feladatra egy adott nyelvet kell elővennem ha nem akarok szívni, ekkor kezdtem keresésbe. Nálam versenyben volt a python, ruby, c#, java, aztán a ruby nyert, főleg amiatt, hogy skálázható az 1 soros shellbe írható scriptektől a Qt GUI programokon át a komplex web alkalmazásokig. Manapság már csak shell + ruby, ez a kettő így olyan mint egy svájcibicska.
- A hozzászóláshoz be kell jelentkezni
én még keresés közben vagyok. Gyakran olyan nyelven írom, ami elsőre beugrik a feladattal szembesülve. Sajnos nem mindig jön be ez a módszer, előfordulnak félbehagyott scriptek. Legutóbb a delicious-hoz akartam interfészt írni, és a jelentős mennyiségű stringkezelésre való tekintettel Perllel mentem neki. Rossz ötlet volt, pont ahhoz nem volt működő library (és nem, miattam se lett… ☺)
int getRandomNumber() { // ←ez itt már az aláírásom
return 4;//szabályos kockadobással választva.
} //garantáltan véletlenszerű. xkcd
- A hozzászóláshoz be kell jelentkezni
Az arg[0] a szkript nevét dobja vissza.
- A hozzászóláshoz be kell jelentkezni
jogos. Az egysoros verzióban is már inkább a stdin-t használom, elvégre a ruby scripted működésének reprodukálása volt a cél.
int getRandomNumber() { // ←ez itt már az aláírásom
return 4;//szabályos kockadobással választva.
} //garantáltan véletlenszerű. xkcd
- A hozzászóláshoz be kell jelentkezni