Pokazywanie postów oznaczonych etykietą linuksiarstwo. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą linuksiarstwo. Pokaż wszystkie posty

czwartek, 22 listopada 2012, 21:37

web scraping dla ubogich

W poprzednim odcinku odkryłem webofstories, prawdziwą kopalnię wiedzy np. o kulisach rewolucji w biologii w drugiej połowie XX wieku. Ale lubię mieć wszystko na piśmie i cuzamen do kupy, a tam każda wypowiedź poszatkowana na sto kilka odcinków. Próbowałem sklejać na piechotę, ale od takiej głupiej roboty jest przecież maszyna. Mam sto ileś kolejnych stron, na każdej interesujący fragment jednoznacznie zaznaczony tagiem id="transcript-en", trzeba je tylko wydobyć i skleić. Byle skrypt wystarczy. A dobrzy ludzie jak zwykle zrobili już prawie wszystko za mnie, wystarczyło znaleźć i zaadoptować. Gdyby ktoś chciał skorzystać to krok po kroku:

1. zainstalować interpretator Lua, najbezpieczniej 5.15. Tak żeby jak się napisze lua w lini poleceń wyskakiwało:
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio

2. zainstalować luarocks i potem luacurl (luarocks install luacurl). Można też samo luacurl, chodzi o dostęp z lua do biblioteki curla (każdy porządny człowiek powinien go już mieć na swoim pececie).

3. ustalić na webofostories zakres interesujących stron, od pierwszej do ostatniej. Upewnić się że idą po kolei, bez dziur (nie zawsze tak jest i wtedy trzeba na raty), skoczyć na koniec załączonego skryptu i tam wpisać. Na początek warto sprawdzić na kilku czy w ogóle działa. U mnie zwykle działa. Żeby ściągnąć polskie transkrypcje (są np. przy Edelmanie i Wajdzie) trzeba zamienić transcript%-en na transcript%-pl

4. jeśli działa to puścić skrypt zapisując wszystko na dysku (lua skrypt.lua > plik.html)


-- poniżej ukradłem stąd: https://github.com/mkottman/wdm

pcall(require, 'luacurl')
assert(curl, "curl library not found (luacurl)")

function log(...)
  if verbose then
    print(...)
  end
end

-- HTTP Downloading
do
  local c=curl.new and curl.new() or curl.easy_init()

  local filters = {}
  function addFilter(f) table.insert(filters, f) end
  function clearFilters() filters = {} end

  do
    local f = io.open('cache/TEST.txt', 'w')
    if not f then
      os.execute('mkdir cache')
    else
      f:close()
      os.remove('cache/TEST.txt')
    end
  end
  
  local function open(fn, mode)
    return bz2 and bz2.open(fn, mode, 9) or io.open(fn, mode)
  end

  local function getlocal(url)
    local path = url:gsub('[^%a%d]', '_')
    local f, e = open('cache/'..path)
    if f then
      local ret = f:read('*a')
      f:close()
      return ret
    end
  end

  local function writelocal(url, s)
    local path = url:gsub('[^%a%d]', '_')
    local f = assert(open('cache/'..path, 'wb'))
    f:write(s)
    f:close()
  end

  function get(url)
    log('[http]', 'get', url)

    local cache = getlocal(url)
    if cache then return cache end

    c:setopt(curl.OPT_URL,url)
    local t = {}
    c:setopt(curl.OPT_WRITEFUNCTION, function (a, b)
      local s
      -- luacurl and Lua-cURL friendly
      if type(a) == "string" then s = a else s = b end
      table.insert(t, s)
      return #s
    end)
    assert(c:perform())
    local ret = table.concat(t)
    for _,f in ipairs(filters) do
      ret = f(ret)
    end

    writelocal(url, ret)

    return ret
  end
end

-- koniec ukradzionego 


local strona = 'http://www.webofstories.com/play/'

print ('<!DOCTYPE html>') 

-- organoleptycznie ustalone zakresy wybranych pogadanek
-- np. Brenner: 13214-13355 52393-52486 
-- Klug: 16940-17059
-- Mitchison: 13765-13843 52542-52582
-- poniżej ustawione na ściągnięcie trzech pierwszych kawałków Kluga

for i = 16940, 16942, 1 do -- tu ustaw ręcznie zakres
  nr = string.format("%01d",i) -- tu ewentualnie zera przed
  local src = get(strona .. nr)
  _, _, transc, _ = string.match(src, '(<div id="transcript%-en" class="transcriptText">)(%s+)(.-)(</div>)') 
  print(transc) 
end


DODANE: z pojedynczej strony wyłuskać transkrypt można jednym poleceniem, od tego pewnie warto zacząć, wystarczy tylko curl i lua połączone rurką, np.:

curl http://www.webofstories.com/play/sydney.brenner/161|lua -e '_,_,x,_=string.match(io.read("*all"),[[(<div id="transcript%-en" class="transcriptText">)(%s+)(.-)(</div>)]]) print(x)'
czyli (to samo z zawinięciem linii, bo nie wszystkie przeglądarki zawijają):

curl http://www.webofstories.com/play/sydney.brenner/161|lua -e '_,_,x,_=string.match(io.read("*all"),[[(<div id="transcript%-en" class="transcriptText">)(%s+)(.-)(</div>)]]) print(x)'

Nie wiem dlaczego na Windows w czarnym okienku CMD to nie działa, ale jakoś mnie to nie dziwi, jak ktoś musi na Windows to jest np. bash od Git i pewnie jeszcze wiele innych, których nie sprawdzałem.

DODANE (2018): Jeśli ktoś naprawdę musi na Windows (7/8/10), to polecam MSYS2. W Windows 10 jest też Subsystem for Linux.

sobota, 14 lipca 2012, 14:25

Lua in Automator

Zmarnowałem trochę czasu na rozwiązanie zagadki "czemu nie działa i co zrobić żeby", więc może ktoś jeszcze kiedyś skorzysta (choćby po użyciu translatora). Nie będę opowiadał co Lua i co Automator, ale chodzi o to, że w Automatorze łatwo sklecić Service podpierając się językiem skryptowym (jak dodać interpreter do listy wykonawców skryptów w Automatorze da się wyguglać pod Shells.plist). A tym bardziej chodzi o to, że akurat interpreter Lua się do tego nie nadaje, bo najwyraźniej nie chwyta parametrów przekazywanych w linii polecenia po opcji -e (robi wtedy "attempt to index global 'arg' (a nil value)" — jak już ktoś zauważył, ale nie umiał mądrze zapytać tzn. sensownie zatytułować pytania).

Rozwiązanie podano na talerzu, a skompilować luę każdy może (make macosx). Nie wszystko jest cacy, na końcu każdego podawanego skryptu trzeba jeszcze cierpliwie dopisywać os.exit() — ale działa. Tylko czemu autorzy nie zrobią tego porządnie dla wszystkich? No właśnie, dla wszystkich, czyli dla kogo? Nikt tego nie potrzebuje (a ja już mam). No i druga sprawa. Trzeba umieć pytać.

Aha, patch de Figueiredo pasuje do Lua 5.1.x (najnowsza wersja dziś to 5.2.1). A do /System/Library/Automator/Run Shell Script.action/Contents/Resources/Shells.plist dopisałem małpując:

<key>/usr/local/bin/luae</key>
  <dict>
    <key>args</key>
    <array>
      <string>-e</string>
      <string>%</string>
      <string>--</string>
    </array>
    <key>script</key>
    <array>
      <string>print(arg[1]); os.exit();</string>
    </array>
  </dict>

Jak widać zmieniłem nazwę paczowanego interpretatora z lua na luae. Lepiej nie psuć oryginału.


DODANE (2014-10-24): już nie pamiętam jak było poprzednio, ale przy aktualizacji do Yosemite zmodyfikowany przez mnie Shells.plist został wymieniony na świeżutki i musiałem znowu dopisać. Nic dziwnego bo /System

DODANE (2015-10-10): El Capitan ma nowy śliniaczek - System Integrity Protection. Nie można modyfikować niczego pod /System. Chyba że się System Integrity Protection wyłączy. Wyłączyłem. Ale nikogo nie namawiam.

wtorek, 7 września 2010, 10:28

szczeniackie linuksiarstwo

Pierwszy kontakt z linuksem miałem dawno i był on traumatyczny. Ktoś mądry poradził mi użycie LaTeX-a, a ja (równie ambitny jak zielony) potraktowałem ten dowcip poważnie. Kupiłem książeczkę o LaTeX-ie i dystrybucję Slackware na kilkunastu dużych szmacianych dyskietkach, skończyło się na wielogodzinnym kernelowaniu kompila (bo coś tam nie chciało działać na moim gównianym pececie) i ogólnej frustracji. Do LaTeX-a nawet nie dotarłem (i już nigdy nie wróciłem), ale Linux mnie trwale zaintrygował. Na własne oczy zobaczyłem, że taki system operacyjny to słowa, tylko słowa. Komplikowanie kelnera nie jest wyłącznie stratą czasu.

Kilka lat później nastała moda na doklejanie cederomów do pisemek komputerowych. Na tych cederomach było (i jest) przeważnie różne badziewie, a szczególnie często pojawiały się linuksy wszelkiej maści. Spodobało mi się logo SuSE, instalacja przebiegła sprawnie, parę dni się pobawiłem, ale jakoś bez przekonania. Wrażenie raczej pozytywne, jednak na moim (kolejnym) gównianym pececie linuksowa grafika nadal działała dość ślamazarnie.

Niedawno znowu coś mnie naszło, z mniejszej lub większej potrzeby bawiłem się nie tylko kanonicznym Ubuntu, ale i kilkoma bardziej zabawnymi linuksami startującymi z cederomów (o ich zabawności za chwilę). Nawet na starych pecetach linuksowa grafika działa już sprawnie, dałoby się tego używać. Gdyby mieć jakieś ważne powody. To trochę jak z przeglądarkami, czemu mam używać Chroma albo Opery, skoro już używam Firefoksa i jestem raczej zadowolony, a tamte nie mają tego i owego (np. Zotero). Tylko że jeszcze gorzej, bo drugą przeglądarkę można sobie zawsze włączyć, a używanie dwóch systemów operacyjnych naraz jest kłopotliwe. Oprócz powodów ważne są jeszcze momenty zachwytu, czy raczej zachwyciku (ojej, jakie to fajne). Np. Chrome pozwala synchronizować zakładki z serwerem Googla, co jest bardzo fajne (a Google i tak już wie o nas wszystko). A Linux owszem działa, ale jakoś mało podnieca.

Ważne powody są dwa, Linux jest za darmo i daje ze sobą zrobić wszystko. Na przykład taki Puppy (szczeniak) jest całkowicie przenośny, można go mieć na pendrajwie razem z całym swoim dorobkiem. Idea jest genialna (wykonanie nieco gorsze, ale — degustibus). To że można uruchomić linuksa bez instalacji, tzn. z cederoma jest bezcenne, a po co to robić opisano np. tu. Osobiście za szczególnie zabawne i satysfakcjonujące uważam łamanie haseł z Windows. Apelując jednocześnie gorąco i stanowczo o używanie w Windows haseł dłuższych niż 14 znaków (tylko ignoranci i matoły mają krótsze, już lepiej nie mieć wcale). Np. XP wyświetla wtedy durny komunikat "To hasło jest dłuższe niż te, które mogą być obsługiwane przez starsze wersje systemu Windows itd." — i o to chodzi! Windows 7 na szczęście już nic nie mówi.

A co do "ojej, jakie fajne". Bawiąc się na linuksie najnowszą (niestabilną) wersją Chroma otworzyłem słynny list Jarosława Kaczyńskiego z 1 września. Fajności samego listu nie oceniam, ale choć jest on w PDF, to otworzył mi się ot tak, błyskawicznie i po prostu (jak na maku!). Słyszałem już co prawda, że Chrome pokazuje PDF bez żadnych wtyczek, ale to trzeba zobaczyć na własne oczy. Muszę jeszcze sprawdzić, jak to działa na Windowsach (o otwieraniu PDF-ów na pececie pisał kiedyś mimochodem sam Orliński — i był bliski prawdy).


W Windows też działa. Przesadą jest jednak powiedzieć "bez żadnych wtyczek", bo wtyczka jest: pdf.dll (Chrome PDF viewer). Natomiast tak jak w Linuksie Chrome czasem nie otwiera stron, więc trzeba wyłączyć DNS prefetch (to jest w opcjach Chroma).

niedziela, 8 lutego 2009, 18:45

Philips, do nogi!

Dziś mała zemsta za to, że nie umiałem podłączyć odtwarzacza DVD do telewizora Philipsa. Myślałem, że wystarczy połączyć oba urządzenia kabelkiem HDMI, a potem nacisnąć przycisk DVD na pilocie od telewizora. Jednak nie, technika poszła naprzód. Magicznym guzikiem okazał się inny guzik. Ale mniejsza z tym, nie będę pisał o moich problemach, przecież każdy ma swoje.

Bawiąc się pilotem od telewizora odkryłem wielce zagadkowy napis: "Zwolnij zapisy". Oto on na skrinszocie (czyli zdjęciu ekranu):



Z kontekstu łatwo się domyślić, że tłumacz puścił wodze fantazji. Ale jeśli już, to czemu nie spróbował przetłumaczyć "Generation date" na "Randka pokolenia"?



ps. Tytuł notki w angielskim oryginale brzmiał: "Philipsie, dbaj o polskiego klienta".
DODANE: kto by pomyślał, wszystkie nowe telewizory Philipsa mają w sobie Linuksa: Linux in the NXP TV520 Nexperia Digital TV System. Kiedyś trzeba było czekać, aż rozgrzeje się kineskop, teraz trzeba czekać, aż zbutuje się Linux. Nie mówi się "zbutuje?" A jak?

To też ciekawe, okazuje się, że wszystkimi urządzeniami połączonymi przez HDMI można sterować jednym pilotem: The Secret Feature on Your HDTV: HDMI CEC

FAQ na stronie Philipsa:
My TV makes a short clicking noise around 5 o'clock in the morning. Is this normal?
Answer
The clicking sound is produced by your TV coming out of standby for a short time in order to perform an internal check and any updates that may be necessary. This is normal behavior.